点击按钮的时代结束了?用 Sierra 模式构建无界面 AI 智能体应用
“The era of clicking buttons is over.” — Bret Taylor, Sierra 联合创始人
当 Sierra 的联合创始人 Bret Taylor 说出这句话时,他不是在预测未来,而是在描述正在发生的现实。作为 former Google Docs 负责人和 Salesforce 前 CEO,Taylor 对软件交互的理解远超常人。今天,我们来深入探讨 AI 智能体如何颠覆传统 UI,以及开发者如何构建”无界面”应用。
为什么 UI 正在消失?
传统软件交互的核心问题是什么?认知负荷。用户需要:
- 理解界面布局
- 找到正确的按钮/菜单
- 记住操作流程
- 处理各种弹窗和确认
而 AI 智能体模式完全不同:用户只需用自然语言描述目标,智能体自动完成所有步骤。
传统 UI vs AI 智能体交互对比
| 维度 | 传统 UI | AI 智能体 |
|---|---|---|
| 学习成本 | 高(需熟悉界面) | 低(自然语言) |
| 操作效率 | 多步骤点击 | 一句话完成 |
| 适应性 | 固定流程 | 动态调整 |
| 可访问性 | 依赖视觉 | 多模态交互 |
Sierra 模式的核心架构
Sierra 的成功并非偶然,它建立在一套清晰的架构之上:
1. 意图理解层
from typing import List, Optional
from pydantic import BaseModel
class UserIntent(BaseModel):
action: str # 用户想要做什么
entities: List[str] # 涉及的对象
constraints: Optional[dict] # 限制条件
confidence: float # 置信度
def parse_intent(user_message: str) -> UserIntent:
"""
使用 LLM 解析用户意图
示例:'帮我预订明天下午 3 点与张三的会议'
输出:UserIntent(
action='schedule_meeting',
entities=['张三'],
constraints={'time': 'tomorrow 3pm'},
confidence=0.95
)
"""
# 实际实现会调用 LLM API
pass
2. 任务规划层
意图解析后,智能体需要将高层目标拆解为可执行步骤:
class TaskPlan(BaseModel):
steps: List[dict]
dependencies: List[tuple] # 步骤间的依赖关系
def create_plan(intent: UserIntent) -> TaskPlan:
"""
将意图转换为执行计划
示例:schedule_meeting → [
{'action': 'check_calendar', 'params': {'time': 'tomorrow 3pm'}},
{'action': 'find_contact', 'params': {'name': '张三'}},
{'action': 'send_invite', 'params': {'attendees': ['张三'], 'time': '...'}}
]
"""
pass
3. 工具执行层
这是智能体与实际系统交互的地方:
class ToolExecutor:
def __init__(self):
self.tools = {
'calendar': CalendarAPI(),
'email': EmailAPI(),
'crm': CRMAPI(),
'slack': SlackAPI(),
}
async def execute(self, step: dict) -> dict:
tool_name = step['action']
tool = self.tools.get(tool_name)
if not tool:
raise ValueError(f"Unknown tool: {tool_name}")
return await tool.run(**step['params'])
实战:构建一个客服智能体
让我们用 Sierra 模式构建一个电商客服智能体,能够处理退货、查询订单、修改地址等任务。
步骤 1:定义领域意图
from enum import Enum
class CustomerServiceIntent(Enum):
CHECK_ORDER_STATUS = "check_order_status"
INITIATE_RETURN = "initiate_return"
UPDATE_SHIPPING_ADDRESS = "update_address"
TRACK_PACKAGE = "track_package"
CANCEL_ORDER = "cancel_order"
CONTACT_HUMAN = "contact_human"
INTENT_EXAMPLES = {
CustomerServiceIntent.CHECK_ORDER_STATUS: [
"我的订单到哪了",
"查询订单 12345 的状态",
"什么时候能收到货",
],
CustomerServiceIntent.INITIATE_RETURN: [
"我要退货",
"这个商品不合适,想退掉",
"申请退款",
],
# ... 更多示例
}
步骤 2:实现意图分类器
import openai
class IntentClassifier:
def __init__(self, api_key: str):
self.client = openai.OpenAI(api_key=api_key)
def classify(self, user_message: str) -> CustomerServiceIntent:
prompt = f"""
你是一个电商客服意图分类器。将用户消息分类到以下意图之一:
{', '.join([i.value for i in CustomerServiceIntent])}
用户消息:{user_message}
只返回意图名称,不要其他内容。
"""
response = self.client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.1, # 低温度保证稳定性
)
intent_name = response.choices[0].message.content.strip()
return CustomerServiceIntent(intent_name)
步骤 3:构建任务执行器
class CustomerServiceAgent:
def __init__(self, db_connection, shipping_api):
self.db = db_connection
self.shipping = shipping_api
self.classifier = IntentClassifier(api_key="...")
async def handle_request(self, user_id: str, message: str) -> str:
# 1. 分类意图
intent = self.classifier.classify(message)
# 2. 执行对应任务
if intent == CustomerServiceIntent.CHECK_ORDER_STATUS:
return await self._check_order_status(user_id, message)
elif intent == CustomerServiceIntent.INITIATE_RETURN:
return await self._initiate_return(user_id, message)
elif intent == CustomerServiceIntent.UPDATE_SHIPPING_ADDRESS:
return await self._update_address(user_id, message)
# ... 处理其他意图
return "抱歉,我没理解您的需求。我可以帮您查询订单、办理退货、修改地址等。"
async def _check_order_status(self, user_id: str, message: str) -> str:
# 提取订单号(如果用户提供了)
order_id = self._extract_order_id(message)
if not order_id:
# 获取用户最近订单
orders = await self.db.get_recent_orders(user_id, limit=1)
if not orders:
return "您还没有任何订单。"
order_id = orders[0]['id']
# 查询订单状态
order = await self.db.get_order(order_id)
if not order:
return f"未找到订单 {order_id}"
# 查询物流信息
tracking = await self.shipping.get_tracking(order['tracking_number'])
return f"""
订单 {order_id} 状态:{order['status']}
物流信息:{tracking['current_status']}
预计送达:{tracking['estimated_delivery']}
""".strip()
步骤 4:添加对话记忆
好的智能体需要记住上下文:
from typing import Dict, List
class ConversationMemory:
def __init__(self, max_turns: int = 10):
self.sessions: Dict[str, List[dict]] = {}
self.max_turns = max_turns
def add_message(self, session_id: str, role: str, content: str):
if session_id not in self.sessions:
self.sessions[session_id] = []
self.sessions[session_id].append({
'role': role,
'content': content,
'timestamp': datetime.now().isoformat()
})
# 保持会话长度限制
if len(self.sessions[session_id]) > self.max_turns:
self.sessions[session_id] = self.sessions[session_id][-self.max_turns:]
def get_context(self, session_id: str) -> List[dict]:
return self.sessions.get(session_id, [])
最佳实践与技巧
1. 渐进式确认
对于高风险操作(如退款、取消订单),不要一次性执行,而是分步确认:
async def _initiate_return(self, user_id: str, message: str) -> str:
order_id = self._extract_order_id(message)
order = await self.db.get_order(order_id)
if not order:
return "未找到订单,请提供正确的订单号。"
# 第一步:确认退货商品
items = order['items']
confirm_msg = f"""
您要为订单 {order_id} 申请退货,包含以下商品:
{chr(10).join([f"- {item['name']} (¥{item['price']})" for item in items])}
请回复要退货的商品编号,或说"全部退货"。
"""
return confirm_msg
# 等待用户确认后继续下一步
2. 优雅降级
当智能体无法处理时,平滑转接人工客服:
async def handle_request(self, user_id: str, message: str) -> str:
try:
intent = self.classifier.classify(message)
# ... 正常处理
except Exception as e:
# 记录错误
logger.error(f"Intent classification failed: {e}")
# 转接人工
ticket_id = await self._create_support_ticket(user_id, message)
return f"""
抱歉,这个问题我需要人工客服协助您。
已为您创建工单 #{ticket_id},客服将在 24 小时内联系您。
您也可以直接拨打客服热线:400-XXX-XXXX
"""
3. 多轮对话状态管理
使用状态机管理复杂流程:
from enum import Enum
class ReturnFlowState(Enum):
INITIAL = "initial"
CONFIRMING_ITEMS = "confirming_items"
CONFIRMING_REASON = "confirming_reason"
CONFIRMING_ADDRESS = "confirming_address"
COMPLETED = "completed"
class ReturnFlowManager:
def __init__(self):
self.states: Dict[str, ReturnFlowState] = {}
def transition(self, session_id: str, current_state: ReturnFlowState,
user_input: str) -> tuple[ReturnFlowState, str]:
# 状态转移逻辑
if current_state == ReturnFlowState.INITIAL:
# 解析用户要退货的商品
items = self._parse_items(user_input)
self.states[session_id] = ReturnFlowState.CONFIRMING_ITEMS
return self.states[session_id], self._confirm_items_message(items)
# ... 其他状态转移
工具推荐
构建 AI 智能体应用,以下工具值得考虑:
- LangChain – 流行的 LLM 应用开发框架,提供链条、代理、记忆等组件
- LlamaIndex – 专注于数据索引和检索,适合 RAG 场景
- AutoGen (Microsoft) – 多智能体协作框架
- CrewAI – 基于角色的智能体编排
- Sierra – 企业级客服智能体平台(商业方案)
结语
Bret Taylor 的预言正在成为现实。作为开发者,我们面临两个选择:
- 继续构建传统的点击式 UI
- 拥抱自然语言交互,构建智能体优先的应用
对于新应用,尤其是内部工具、客服系统、数据分析等场景,智能体模式往往能提供更好的用户体验。关键在于:
- 从用户目标出发,而非功能列表
- 设计清晰的意图分类体系
- 实现可靠的任务执行层
- 提供优雅的人工兜底方案
点击按钮的时代或许还未完全结束,但倒计时已经开始。
参考资源: