第28章 智能体:从回答问题到完成任务
“告诉我下周去成都有哪些航班”是一个问答。“在预算内安排出差,避开冲突日程,等我确认后再订票”则是一个任务。
后者要求系统读取日历和政策,比较选项,保存中间状态,遇到满票时修改计划,还要在付款前停下来询问。任务可能持续几分钟、几小时,甚至跨越多次会话。
语言模型只负责一次次根据上下文生成输出。把它变成能完成任务的系统,还需要环境接口、状态存储、循环控制、权限、监控和停止条件。这样的系统通常被称为智能体(agent)。
这个词容易制造误解。智能体不是参数里突然出现的一个小人,也不等于给聊天模型写一句“你是自主助手”。它是一种系统组织方式:模型在反馈循环中观察、决定、行动,再根据结果继续决定。
回答与行动的差别在于环境会变化
一次回答生成后,外部世界通常没有变化。一次行动却会改变后续状态:创建文件后目录不同了,发送邮件后收件人已经收到,移动机器人后摄像机看到的画面也变了。
因此,智能体至少需要六个组件:
- 目标:要达到什么状态,哪些约束不能违反;
- 状态:已经知道什么、做过什么、还缺什么;
- 策略或模型:根据当前信息选择下一步;
- 动作接口:搜索、读写文件、调用 API 或控制设备;
- 观察:动作成功、失败或造成了什么结果;
- 停止条件:何时完成、何时求助、何时因风险或预算退出。
缺少停止条件的循环可能反复重试;缺少状态的系统会忘记已经做过什么;缺少权限边界的系统则可能把一个预测错误变成真实副作用。
智能体循环不断修正计划
一个简化循环如下:
长计划可以提供方向,但不应被当作固定剧本。网页结构会变化,工具会超时,文件内容与预期不同。每次观察都可能要求系统修改下一步。
ReAct 将推理痕迹、动作和观察交替组织,使模型能在知识问答和交互任务中利用环境反馈。(Yao 等 2023年) 关键不是必须公开长篇思维文字,而是系统要保存足够的决策依据和结构化状态,让下一步真正依赖刚得到的观察。
核心机制:目标驱动的观察 - 行动闭环
智能体把模型放进循环:从目标、状态和最新观察中选择动作,经过权限层执行,再把结果写回状态。计划不是一次性答案,而是可被新观察修正的假设。系统可靠性取决于模型之外的状态、接口、确认、恢复和停止机制。
计划应该分层而不是无限展开
“完成一次出差预订”可以先分为查政策、查日历、比较交通、请求确认、预订和归档凭证。每个高层步骤再在执行时细化。
如果一开始就生成几十步详细计划,后面的步骤会建立在尚未验证的假设上。更稳健的方式是滚动规划:只细化近期动作,执行后根据观察更新远期计划。
计划还应显式记录:
- 已满足的前置条件;
- 尚未确认的假设;
- 当前候选与放弃原因;
- 不可逆动作前的检查点;
- 剩余时间、调用次数和费用预算;
- 成功、失败与需要人类介入的判据。
这些信息若只埋在自然语言聊天记录中,很难被程序稳定读取。生产系统常使用结构化任务表、状态机或事件日志,语言摘要只作为其中一部分。
技术深潜:部分可观测状态与记忆更新
真实环境状态记为 \(s_t\),智能体通常只能看到带噪声的观察 \(o_t\):
\[ o_t\sim O(\cdot\mid s_t) \]
网页只显示当前页面,代码测试只暴露失败信息,用户也不会一次给出所有偏好。因此系统维护内部记忆或信念状态 \(m_t\):
\[ m_{t+1}=f(m_t,a_t,o_{t+1}) \]
策略根据目标 \(g\)、记忆和最新观察选择动作:
\[ a_t\sim\pi_\theta(\cdot\mid g,m_t,o_t) \]
执行后,环境转移到新状态并产生新观察。这里的 \(f\) 可以包含数据库更新、摘要、检索和规则,不必全由语言模型完成。
若记忆遗漏一次失败,模型可能重复同一动作;若摘要把“不确定”改写成“已完成”,后续计划会建立在错误状态上。状态更新因此要尽量保存可验证事件,例如工具返回码、文件哈希和任务 ID,而不是只保存模型的叙述。
部分可观测还意味着失败未必立即可见。邮件 API 返回成功不代表收件人理解正确,代码测试通过也不代表没有未覆盖缺陷。观察接口决定智能体能发现哪些错误。
工作记忆、长期记忆和技能库承担不同角色
工作记忆保存当前任务的待办、变量和最近观察。长期记忆保存跨任务可复用的信息。技能库则保存一段经过验证的操作程序,例如“运行测试并收集失败用例”。
Generative Agents 使用记忆流、反思和计划构造模拟角色行为;Voyager 在游戏环境中让语言模型产生可执行技能并积累技能库。(Park 等 2023年; Wang 等 2023年) 这些案例展示了外部记忆与技能复用的可能,也显示系统表现高度依赖环境、提示、验证器和存储设计。
不是所有历史都值得长期保留。错误操作若被总结成“成功经验”,会在未来重复;技能依赖旧版接口时需要失效;用户数据还涉及最小化保存、访问权限和删除。
因此记忆条目应带有来源、时间、适用条件、验证状态和版本。检索出来后仍需判断它是否适用于当前任务。
反思可以提供新提示,但不是错误证明器
任务失败后,可以让模型阅读轨迹并写出“哪里可能错了”,再用这段文字指导下一次尝试。Reflexion 研究了把语言反馈保存为后续试验的上下文。(Shinn 等 2023年)
这种方法在有清晰反馈的任务中可能有效,因为失败结果为模型提供了新信息。但模型也可能给出听起来合理的错误诊断。若没有单元测试、环境状态或人类反馈,自我反思只是又一次生成。
可靠恢复应优先利用外部信号:错误码、约束检查、差异比较、测试结果和可逆快照。自然语言反思适合提出修复候选,不应单独担任最终裁判。
权限层决定模型能造成什么后果
搜索网页和读取公开文件通常是低风险动作;发邮件、改权限、付款和删除数据则不是。把所有工具交给同一个高权限身份,会让一次参数误填或提示注入产生过大影响。
可以按风险建立动作层级:
| 动作级别 | 示例 | 合理控制 |
|---|---|---|
| 只读 | 搜索、读取日历 | 最小范围授权、日志 |
| 可逆写入 | 建草稿、写临时文件 | 沙箱、版本和撤销 |
| 对外影响 | 发消息、提交表单 | 展示目标与内容,执行前确认 |
| 高风险或不可逆 | 付款、删除、改权限 | 强认证、双重检查、人工批准 |
确认必须放在动作发生前,并说明对象、内容和影响。任务开始时笼统问一句“是否允许我完成所有操作”,不能替代具体高风险动作的即时确认。
人类在环也不只是弹窗。系统应让人看到足够的信息作出判断,并支持修改参数、拒绝、暂停和恢复。若每一步都要求确认,人会形成点击疲劳;若确认太少,关键边界又会消失。
长任务把小误差放大
短任务中一次误判可能只产生错误回答。长任务中,早期错误会改变环境,后续步骤又把这个错误当作事实。
例如,系统误读了项目目录,随后修改错误文件、运行无关测试,再根据失败日志继续修复。每一步在局部看似合理,整条轨迹却离目标越来越远。
技术深潜:为什么 98% 的单步成功仍不够
若任务有 \(T\) 个必要步骤,第 \(t\) 步在此前都正确的条件下成功概率为 \(p_t\),整条路径成功率为:
\[ P(\mathrm{all})=\prod_{t=1}^{T}p_t \]
若每一步成功率都为 \(0.98\),三十步全部成功的概率约为:
\[ 0.98^{30}\approx0.55 \]
这个计算假设每一步的条件成功率稳定。现实中错误会相关:一个错误状态摘要可能同时降低后面许多步骤的成功率;同一模型重试也可能重复同一误解。
恢复机制可以在检查点检测错误、回滚并选择替代路径,但恢复本身也有成功率和成本。评估时应报告首次成功率、重试后成功率、平均工具调用、回滚次数、人类介入和未恢复副作用。
提高长程可靠性通常比单纯提高单步模型分数更依赖系统设计:缩短不可检查的连续步骤,在阶段边界验证状态,对写操作保留快照,并在不确定性持续升高时停止。
自治程度是一条连续谱
系统不必在“聊天机器人”和“完全自主”之间二选一。可以按控制权划分:
- 建议模式:模型只给方案,人执行全部动作;
- 协作模式:模型执行低风险步骤,高风险步骤由人确认;
- 监督自治:系统在限定环境中连续执行,人处理异常与关键检查点;
- 高自治:系统在长时间内自行规划、执行和恢复,只在少数条件下求助。
任务风险、可逆性、环境稳定性和评估成熟度决定适合的等级。能在沙箱中自主玩游戏,不意味着适合在真实财务或医疗系统中获得相同权限。
基准必须测任务,而不只测对话
智能体评估需要真实的动作与状态变化。AgentBench 覆盖多种交互环境;WebArena 构造了带网站和任务的现实化网页环境;SWE-bench 要求系统根据真实软件仓库问题修改代码;OSWorld 则评估在真实计算机环境中的多模态操作。(Liu 等 2024年; Zhou 等 2024年; Jimenez 等 2024年; Xie 等 2024年)
这些基准比单轮问答更接近任务,但仍有边界:
- 环境版本、账号状态和网络延迟会影响复现;
- 成功判定脚本可能漏掉质量和安全问题;
- 公开任务可能进入训练数据或被针对优化;
- 一次成功不能表示重复运行稳定;
- 基准权限通常比真实部署更受限。
完整指标应包括任务成功、部分完成、总延迟、Token 与工具成本、重试、人类干预、无关改动和不可逆副作用。对于代码任务,还要检查补丁是否只通过现有测试,还是确实满足需求且没有引入回归。
智能体会在哪些地方失败
常见失败可以按循环位置分类:
- 目标失败:误解用户意图或遗漏约束;
- 计划失败:分解缺少必要步骤,顺序或前置条件错误;
- 观察失败:页面、日志或工具结果解析错误;
- 状态失败:忘记已完成动作,或把假设写成事实;
- 动作失败:选择错误工具、对象或参数;
- 恢复失败:机械重试,或错误反思引向更差方案;
- 停止失败:过早宣布完成,或在无进展时无限循环;
- 权限失败:低可信内容诱导高权限动作。
这些问题无法只靠更长提示解决。状态机、类型校验、权限隔离、确定性检查、预算和人工升级路径都属于智能体的一部分。
学习路径:在可控环境中实现任务循环
实践开发继续后置。推荐先使用本地、可重置、无真实副作用的环境:
- 构造一个模拟工单系统,提供查询、建草稿、更新状态三个受限工具;
- 明确定义目标、必要步骤、禁止动作、预算和终止条件;
- 保存结构化事件日志,不只保存聊天文本;
- 加入工具失败、矛盾信息、超时和过期记忆;
- 在写操作前建立确认和快照,测试拒绝与恢复;
- 比较固定计划、滚动规划和带检查点循环;
- 报告成功率、平均步骤、成本、人工介入和副作用。
当系统失败时,读者应能从轨迹判断是目标、状态、观察、动作还是停止机制出了问题。
本章小结
- 智能体是模型、环境接口、状态、循环、权限和停止机制组成的系统,不是一种独立模型标签。
- 观察 - 行动闭环让计划根据环境反馈持续修正,长计划不应被当作固定剧本。
- 真实任务部分可观测,结构化状态和可验证事件比纯自然语言摘要更可靠。
- 外部记忆与技能库可以支持跨步骤和跨任务复用,也需要版本、验证、权限与删除机制。
- 自我反思能提出恢复候选,但没有外部反馈时不能证明诊断正确。
- 多步任务会累积相关错误,检查点、回滚和停止策略决定长程可靠性。
- 自治程度应按风险和可逆性选择;评估必须同时报告成本、干预和副作用。
思考问题
- 为什么一个强语言模型仍需要模型之外的结构化状态?
- 反复调用同一模型重试,为什么不一定得到独立错误?
- 哪些动作适合自动执行,哪些必须在执行前由人确认?
- 一个智能体完成了任务,但修改了无关文件,应该算成功吗?
延伸阅读
- ReAct 适合理解推理、动作与观察怎样交替进入上下文。(Yao 等 2023年)
- Reflexion、Generative Agents 与 Voyager 展示了语言反馈、记忆和技能库的不同用法。(Shinn 等 2023年; Park 等 2023年; Wang 等 2023年)
- AgentBench、WebArena、SWE-bench 与 OSWorld 提供了从受控交互到真实软件和计算机任务的评估视角。(Liu 等 2024年; Zhou 等 2024年; Jimenez 等 2024年; Xie 等 2024年)
