有效 Agent
Anthropic 在 2024 年底发布的《Building Effective Agents》中总结了一个朴素但很重要的经验:成功的 Agent 系统通常不是靠复杂框架堆出来的,而是靠简单、可组合、可测试的模式逐步搭起来的。
什么是 Agent
“Agent”这个词有很多用法。有些团队把它理解为长时间独立运行、使用多种工具完成复杂任务的自主系统;也有团队把它用来描述遵循预设流程的 LLM 应用。
Anthropic 把这些实现都归为 agentic systems,但在架构上区分两类:
- Workflow:LLM 和工具通过预定义的代码路径被编排。
- Agent:LLM 动态指导自己的流程和工具使用,并保持对任务完成方式的控制。
下面的模式都围绕这条分界展开:什么时候应该把控制流写进代码,什么时候才应该把更多决策交给模型。
何时使用 Agent,何时不要
构建 LLM 应用时,优先寻找能解决问题的最简单方案,只有在确实需要时才增加复杂度。很多场景并不需要 agentic system;一个优化过的 LLM 调用,加上检索和上下文示例,通常已经足够。
Agentic system 往往用更高延迟和更多成本换取更好的任务表现,所以必须判断这种交换是否值得:
- 对于边界清晰、流程稳定的任务,Workflow 能提供更好的可预测性和一致性。
- 对于需要大规模灵活性、步骤数不可预测、必须由模型根据中间结果决策的任务,Agent 更合适。
关键原则是:当 Workflow 就够用时,不要急着构建 Agent。
何时使用框架
很多框架可以降低 agentic system 的起步成本,例如调用 LLM、定义工具、解析工具调用、串联多步流程、搭建可视化工作流等。这些能力能帮助团队更快做出原型。
但框架也会增加抽象层。它可能隐藏真实 prompt、模型响应、工具输入输出和中间状态,让调试变难;也可能诱导团队在简单结构足够时过早引入复杂编排。
Anthropic 的建议是:尽量先理解底层 API 和基本组件。很多模式只需要少量代码就能实现。如果使用框架,也要知道框架底下真实发生了什么;对底层行为的错误假设,是很多生产问题的来源。
构建块:增强型 LLM
Agentic system 的基本构建块,是一个通过检索、工具和记忆增强的 LLM。当前模型可以主动使用这些能力:生成搜索查询、选择合适工具、决定保留哪些信息。
实现增强型 LLM 时,重点是两件事:
- 这些能力是否针对具体用例做了裁剪,比如检索范围、工具权限、记忆类型是否真的服务当前任务。
- 这些能力是否为 LLM 提供了清晰、稳定、文档充分的接口。
后面的模式默认每次 LLM 调用都能访问这些增强能力。
Workflow:提示链
提示链把任务拆成一串顺序步骤。每次 LLM 调用处理上一步的输出;必要时,可以在中间步骤加入程序化检查,也就是 gate,确保流程仍在正确轨道上。
结构:LLM → gate → LLM → gate → LLM
何时使用:任务能被清楚拆成固定子任务,并且愿意用更高延迟换取更高准确度。拆分后的每个 LLM 调用都应该更简单、更容易完成。
例子:
- 先生成营销文案,再翻译成另一种语言。
- 先写文档大纲,检查大纲是否符合要求,再根据大纲写正文。
Workflow:路由
路由先对输入分类,再把它导向专门的后续任务。这样可以分离关注点,为不同类别设计更专门的 prompt、工具甚至模型。否则,为一种输入优化 prompt,可能会伤害另一种输入的表现。
结构:输入 → 分类器 → 专用处理器 A | B | C
何时使用:任务有清晰的类别,不同类别最好分开处理,并且分类本身足够可靠。分类可以由 LLM 完成,也可以由传统分类模型或算法完成。
例子:
- 客服系统:把一般咨询、退款请求、技术支持导向不同下游流程、prompt 和工具。
- 模型分层:简单常见问题交给成本更低的模型,困难或罕见问题交给能力更强的模型。
Workflow:并行化
并行化让多个 LLM 调用同时处理任务,然后用程序聚合结果。它有两个常见变体:
- 分段:把任务拆成独立子任务,并行运行。
- 投票:对同一任务运行多次,得到更多样的输出。
何时使用:子任务可以并行提速,或者需要多个视角、多次尝试来提高置信度。对于有多重考虑的复杂任务,让每个 LLM 调用专注一个方面,通常比一次调用同时处理所有要求更可靠。
例子:
- 分段:一个模型实例处理用户问题,另一个模型实例检查不当内容或请求,用于实现 guardrails。
- 分段:自动化 evals 时,让不同 LLM 调用分别评估模型表现的不同方面。
- 投票:代码审查时,用多个 prompt 检查漏洞,只要任一调用发现问题就标记出来。
- 投票:内容安全评估时,用多个 prompt 检查不同风险,并用不同投票阈值平衡误报和漏报。
Workflow:编排器-工作者
在编排器-工作者模式中,中央 LLM 动态拆解任务,把子任务委派给 worker LLM,再综合结果。
结构:输入 → 编排器 → [worker₁, worker₂, ...workerₙ] → 编排器 → 输出
何时使用:任务复杂,而且无法提前预测需要哪些子任务。它和并行化在形态上相似,但关键区别在灵活性:并行化的子任务通常预先定义好,而编排器-工作者的子任务由编排器根据具体输入动态决定。
例子:
- 代码产品需要根据任务说明修改多个文件,每次涉及的文件数量和修改性质都不同。
- 搜索任务需要从多个来源收集、分析可能相关的信息。
Workflow:评估器-优化器
评估器-优化器模式让一个 LLM 生成答案,另一个 LLM 在循环中评估并给出反馈。
结构:生成器 ⇄ 评估器(循环直到通过)
何时使用:有清晰的评估标准,而且迭代优化能带来可衡量的价值。两个适配信号是:人类给出反馈后,LLM 的回答确实能明显变好;同时,LLM 自己也能提供这类有用反馈。这类似人类写作者反复打磨一篇文档的过程。
例子:
- 文学翻译:初版可能遗漏细微语气或文化含义,评估器可以给出有用批评。
- 复杂搜索:需要多轮搜索和分析来收集完整信息,评估器判断是否还需要继续搜索。
Agent
随着模型在理解复杂输入、推理规划、可靠使用工具、从错误中恢复等方面变强,Agent 正在进入生产环境。
Agent 通常从人类用户的一条命令,或一段交互式讨论开始。任务明确后,它会独立规划和执行;必要时,也会回到人类那里请求更多信息或判断。
执行过程中,Agent 必须不断从环境获得 ground truth,例如工具调用结果、代码执行结果、用户反馈。它用这些反馈评估进展、规划下一步,并在检查点或遇到阻塞时暂停请求人类帮助。任务通常在完成时结束,但也应设置停止条件,例如最大迭代次数,来保持控制。
Agent 的实现常常很朴素:本质上就是一个 LLM 根据环境反馈,在循环中使用工具。
while not done:
observe environment
decide next action
execute action via tools
evaluate result
何时使用:问题开放、很难或不可能预测所需步骤数,也无法硬编码固定路径。LLM 可能运行很多轮,因此你必须对它的决策有一定信任。Agent 的自主性适合在可信环境中扩展任务执行。
关键风险:
- 成本更高:开放式循环会消耗更多 token。
- 错误可能累积:前一步错误会影响后续决策。
- 需要充分测试:尤其要在沙箱环境中测试,并配合合适的 guardrails。
例子:
- 代码 Agent:根据任务描述修改多个文件,解决 SWE-bench 这类任务。
- Computer use:让 Claude 使用计算机完成任务的参考实现。
组合和定制这些模式
这些构建块不是固定模板,而是常见模式。开发者应该根据用例塑形、组合和裁剪它们。
和所有 LLM 功能一样,关键是测量表现并持续迭代。只有当复杂度能明显改善结果时,才应该增加复杂度。
总结
构建 LLM 系统的目标,不是做出最复杂的系统,而是做出满足需求的正确系统。
一个稳妥的复杂度阶梯是:
- 从简单 prompt 开始。
- 用系统化 eval 优化 prompt。
- 在单次调用不够时,引入多步 Workflow。
- 只有当 Workflow 处理不了所需灵活性时,才使用自主 Agent。
实现 Agent 时,Anthropic 强调三条原则:
- 保持设计简单。
- 优先保证透明度,明确展示 Agent 的规划步骤。
- 认真设计 Agent-Computer Interface,也就是工具文档和工具测试。
框架可以帮助快速起步;但进入生产时,不要害怕减少抽象层,回到更基本的组件。这样构建出来的 Agent 才更可靠、更可维护,也更容易获得用户信任。
附录 1:实践中的 Agent
Anthropic 观察到两类特别有价值的 Agent 应用。它们共同说明:Agent 最适合那些同时需要对话和行动、有清晰成功标准、能形成反馈循环、并能引入有意义人类监督的任务。
客户支持
客户支持把熟悉的聊天界面和工具集成结合起来,很适合更开放的 Agent:
- 支持对话天然是连续交互,同时又需要访问外部信息和执行动作。
- 工具可以拉取客户数据、订单历史和知识库文章。
- 退款、更新工单等动作可以由程序处理。
- 成功可以通过用户定义的解决结果来衡量。
一些公司采用按成功解决结果计费的模式,说明它们对 Agent 效果有足够信心。
代码 Agent
软件开发领域从代码补全走向自主解决问题,显示出很大的潜力。Agent 在这里特别有效,因为:
- 代码方案可以通过自动化测试验证。
- Agent 可以根据测试结果迭代方案。
- 问题空间定义清晰、结构化。
- 输出质量可以客观衡量。
自动化测试能验证功能是否正确,但人类审查仍然重要,因为它能判断方案是否符合更广泛的系统要求。
附录 2:为工具做 Prompt Engineering
无论构建哪种 agentic system,工具通常都是关键部分。工具定义和工具规格,应该像整体 prompt 一样被认真设计。
同一个动作常常有多种表达方式。比如编辑文件,可以写 diff,也可以重写整个文件;结构化输出可以放在 Markdown 代码块里,也可以放进 JSON。对软件工程师来说,这些格式差异可能只是表面差异,可以无损转换;但对 LLM 来说,有些格式明显更难写对。
例如,写 diff 需要先知道 chunk header 中有多少行会变化;把代码写进 JSON,比写进 Markdown 多了换行和引号转义负担。
选择工具格式时,可以遵循这些建议:
- 给模型足够 token 先思考,避免它在写到一半时把自己逼进格式死角。
- 让格式接近模型在互联网文本中自然见过的形态。
- 避免格式开销,比如要求模型精确维护几千行代码的行数,或对大段代码做字符串转义。
Anthropic 建议像重视 HCI 一样重视 ACI:过去我们会投入大量精力设计人机接口,现在也应该投入同样精力设计 Agent-计算机接口。
具体做法包括:
- 站在模型角度看工具:只看描述和参数,是否显而易见该怎么用?好的工具定义通常包含示例、边界情况、输入格式要求,以及与其他工具的清晰区别。
- 调整参数名和描述,让正确用法更明显。可以把工具说明当成写给团队里初级工程师的优秀 docstring。
- 用大量样例测试模型如何使用工具,观察它会犯什么错,然后迭代工具定义。
- 用 poka-yoke 的思路设计工具参数,让错误更难发生。
Anthropic 在构建 SWE-bench Agent 时,花在优化工具上的时间甚至超过了整体 prompt。一个具体经验是:相对文件路径会在 Agent 离开仓库根目录后造成错误;要求工具始终使用绝对路径后,这类错误就消失了。
来源
Building Effective Agents — Anthropic, 2024.12。