2026年4月11日 4 分钟阅读

点击按钮的时代结束了?用 Sierra 模式构建无界面 AI 智能体应用

tinyash 0 条评论

“The era of clicking buttons is over.” — Bret Taylor, Sierra 联合创始人

当 Sierra 的联合创始人 Bret Taylor 说出这句话时,他不是在预测未来,而是在描述正在发生的现实。作为 former Google Docs 负责人和 Salesforce 前 CEO,Taylor 对软件交互的理解远超常人。今天,我们来深入探讨 AI 智能体如何颠覆传统 UI,以及开发者如何构建”无界面”应用。

为什么 UI 正在消失?

传统软件交互的核心问题是什么?认知负荷。用户需要:

  1. 理解界面布局
  2. 找到正确的按钮/菜单
  3. 记住操作流程
  4. 处理各种弹窗和确认

而 AI 智能体模式完全不同:用户只需用自然语言描述目标,智能体自动完成所有步骤。

传统 UI vs AI 智能体交互对比

维度传统 UIAI 智能体
学习成本高(需熟悉界面)低(自然语言)
操作效率多步骤点击一句话完成
适应性固定流程动态调整
可访问性依赖视觉多模态交互

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 的预言正在成为现实。作为开发者,我们面临两个选择:

  1. 继续构建传统的点击式 UI
  2. 拥抱自然语言交互,构建智能体优先的应用

对于新应用,尤其是内部工具、客服系统、数据分析等场景,智能体模式往往能提供更好的用户体验。关键在于:

  • 从用户目标出发,而非功能列表
  • 设计清晰的意图分类体系
  • 实现可靠的任务执行层
  • 提供优雅的人工兜底方案

点击按钮的时代或许还未完全结束,但倒计时已经开始。


参考资源

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。