以下是网页 www.anthropic.com/engineering... 内容的完整中文翻译:
在过去一年中,我们与数十个跨行业的团队合作,帮助他们构建基于大语言模型(LLM)的智能体(agents)。我们发现,最成功的实现往往并未使用复杂的框架或专用库,而是采用简单、可组合的模式进行构建。
在本文中,我们将分享与客户合作以及自行构建智能体过程中所学到的经验,并为开发者提供构建高效智能体的实用建议。
什么是智能体?
"智能体"可以有多种定义。一些客户将其定义为能够长时间独立运行、使用各种工具完成复杂任务的全自动系统;另一些客户则用该术语描述遵循预定义工作流的更规范化的实现。在 Anthropic,我们将这些变体统称为智能体系统(agentic systems) ,但在架构上明确区分了工作流(workflows)与智能体(agents):
- 工作流:通过预定义代码路径编排 LLM 与工具的系统。
- 智能体:由 LLM 动态主导自身流程和工具使用的系统,对如何完成任务拥有控制权。
下文将详细探讨这两类智能体系统。附录 1("智能体的实际应用")中,我们描述了客户在两个领域中特别受益于这类系统的案例。
何时(以及何时不)使用智能体
在使用 LLM 构建应用时,我们建议始终寻找最简单的解决方案,仅在必要时才增加复杂性。这意味着你可能根本不需要构建智能体系统。智能体系统通常以延迟和成本为代价换取更好的任务性能,因此你需要仔细权衡这种取舍是否值得。
当确实需要更高复杂度时,对于定义清晰的任务,工作流能提供可预测性和一致性;而当需要灵活性和由模型驱动的大规模决策能力时,智能体则是更好的选择。然而,对于许多应用场景,通过检索增强和上下文示例优化单次 LLM 调用通常就已足够。
何时以及如何使用框架
有许多框架可简化智能体系统的实现,包括:
- LangChain 的 LangGraph;
- Amazon Bedrock 的 AI 智能体框架;
- Rivet,一个拖拽式 GUI LLM 工作流构建器;
- Vellum,另一个用于构建和测试复杂工作流的 GUI 工具。
这些框架通过简化调用 LLM、定义和解析工具、串联调用等底层任务,帮助开发者快速上手。但它们也常常引入额外的抽象层,掩盖了底层提示(prompt)和响应,使调试变得更加困难。此外,它们还可能诱使开发者在简单方案已足够的情况下过度增加复杂性。
我们建议开发者先直接使用 LLM API:许多模式只需几行代码即可实现。如果你确实使用框架,请确保你理解其底层代码。对框架内部机制的错误假设是客户常见错误的根源。
可参阅我们的示例代码库(cookbook)获取一些实现样例。
构建模块、工作流与智能体
本节将探讨我们在生产环境中观察到的智能体系统常见模式。我们将从基础构建模块------增强型 LLM 开始,逐步提升复杂度,从简单的组合式工作流到自主智能体。
构建模块:增强型 LLM
智能体系统的基本构建模块是一个经过增强的 LLM,其增强能力包括检索(retrieval)、工具(tools)和记忆(memory)。我们当前的模型能够主动使用这些能力------生成自己的搜索查询、选择合适的工具,并决定保留哪些信息。

我们建议重点关注两个关键方面:一是根据具体用例定制这些能力,二是确保它们为 LLM 提供简单、文档完善的接口。虽然这些增强功能有多种实现方式,但一种方法是使用我们最近发布的 Model Context Protocol(模型上下文协议) ,它允许开发者通过简单的客户端实现,集成不断增长的第三方工具生态系统。
在本文后续内容中,我们假设每次 LLM 调用都具备这些增强能力。
工作流:提示链(Prompt Chaining)
提示链将任务分解为一系列步骤,每个 LLM 调用处理前一步的输出。你可以在任何中间步骤添加程序化检查(见下图中的"gate"),以确保流程仍在正确轨道上。

适用场景:当任务可以清晰、干净地分解为固定子任务时,提示链尤为理想。其主要目标是以延迟为代价换取更高准确性,因为每个 LLM 调用只需处理更简单的任务。
典型用例:
- 生成营销文案,然后将其翻译成另一种语言;
- 先撰写文档大纲,检查大纲是否符合特定标准,再基于大纲撰写完整文档。
工作流:路由(Routing)
路由对输入进行分类,并将其导向专门的后续任务。这种工作流实现了关注点分离,便于构建更专业的提示。若不使用路由,针对某一类输入的优化可能会损害其他类型输入的性能。

适用场景:当任务复杂且存在明显可区分的类别、且分类可以被 LLM 或传统分类模型/算法准确完成时,路由效果良好。
典型用例:
- 将不同类型的客户服务请求(一般咨询、退款申请、技术支持)分别导向不同的下游流程、提示和工具;
- 将简单/常见问题路由给较小模型(如 Claude 3.5 Haiku),将复杂/罕见问题路由给更强模型(如 Claude 3.5 Sonnet),以优化成本和速度。
工作流:并行化(Parallelization)
LLM 有时可以同时处理任务,并通过程序化方式聚合输出。这种工作流有两种主要变体:
- 分段(Sectioning):将任务拆分为可并行执行的独立子任务;
- 投票(Voting):多次运行相同任务以获得多样化的输出。

适用场景:当子任务可并行加速,或需要多个视角/尝试以提高结果置信度时,并行化非常有效。对于涉及多方面考量的复杂任务,LLM 通常在每个方面由单独的 LLM 调用专注处理时表现更佳。
典型用例:
-
分段:
- 实现防护机制:一个模型实例处理用户查询,另一个筛查不当内容或请求。这通常比单次 LLM 调用同时处理核心响应和防护效果更好;
- 自动化评估 LLM 性能,每个 LLM 调用评估模型在给定提示下表现的不同方面。
-
投票:
- 审查代码漏洞,多个不同提示分别审查并标记问题;
- 评估内容是否不当,多个提示从不同角度评估,或设置不同投票阈值以平衡误报与漏报。
工作流:协调器-工作者(Orchestrator-Workers)
在此工作流中,一个中心 LLM 动态分解任务,委派给多个"工作者" LLM,并综合其结果。

适用场景:适用于无法预知所需子任务的复杂任务(例如编程中,需要修改的文件数量和每处修改的性质取决于具体任务)。虽然拓扑结构与并行化相似,但关键区别在于其灵活性------子任务不是预定义的,而是由协调器根据具体输入动态决定。
典型用例:
- 编程产品,每次执行都对多个文件进行复杂修改;
- 涉及从多个来源收集和分析信息的搜索任务。
工作流:评估器-优化器(Evaluator-Optimizer)
在此工作流中,一个 LLM 调用生成响应,另一个提供评估和反馈,形成循环。

适用场景:当你有明确的评估标准,且迭代优化能带来可衡量的价值时,此工作流尤为有效。两个良好适用的标志是:第一,当人类明确反馈时,LLM 响应确实能得到改进;第二,LLM 能够提供此类反馈。这类似于人类作家在撰写精炼文档时所经历的迭代写作过程。
典型用例:
- 文学翻译:初始翻译可能遗漏细微之处,但评估器 LLM 可提供有用的批评;
- 复杂搜索任务:需要多轮搜索与分析以获取全面信息,评估器决定是否需要进一步搜索。
智能体(Agents)
随着 LLM 在理解复杂输入、推理规划、可靠使用工具和错误恢复等关键能力上的成熟,智能体正逐步投入生产应用。智能体通常从人类用户的指令或交互式讨论开始。一旦任务明确,智能体便能独立规划和执行,必要时再返回向人类请求更多信息或判断。执行过程中,智能体必须在每一步从环境中获取"真实反馈"(如工具调用结果或代码执行结果)以评估进展。智能体可在检查点或遇到障碍时暂停,等待人类反馈。任务通常在完成后终止,但也常设置停止条件(如最大迭代次数)以保持控制。
智能体虽能处理复杂任务,其实现往往非常直接:通常只是 LLM 在循环中根据环境反馈调用工具。因此,清晰、周到地设计工具集及其文档至关重要。附录 2("为工具进行提示工程")将进一步阐述工具开发的最佳实践。

适用场景:智能体适用于开放式问题,即无法预知所需步骤数量、也无法硬编码固定路径的任务。LLM 可能会运行多个回合,因此你必须对其决策能力有一定信任。智能体的自主性使其非常适合在可信环境中规模化任务。
但自主性也意味着更高成本和错误累积的风险。我们建议在沙盒环境中进行充分测试,并设置适当的防护机制。
典型用例(来自我们自身的实现):
- 用于解决 SWE-bench 任务的编码智能体,该任务涉及根据任务描述对多个文件进行编辑;
- 我们的"计算机使用"参考实现,其中 Claude 使用计算机完成任务。

组合与定制这些模式
这些构建模块并非强制规定,而是开发者可根据不同用例灵活塑造和组合的常见模式。与任何 LLM 功能一样,成功的关键在于衡量性能并持续迭代实现。再次强调:只有当增加复杂性确实能显著提升结果时,才应考虑这样做。
总结
在 LLM 领域的成功,不在于构建最复杂的系统,而在于构建最适合你需求的系统。从简单提示开始,通过全面评估进行优化,仅在简单方案不足时才引入多步骤智能体系统。
在实现智能体时,我们遵循三个核心原则:
- 简洁性:保持智能体设计的简洁;
- 透明性:明确展示智能体的规划步骤;
- 精心设计智能体-计算机接口(ACI):通过详尽的工具文档和测试来实现。
框架可助你快速起步,但在迈向生产环境时,不要犹豫减少抽象层,直接使用基础组件构建。遵循这些原则,你就能构建出不仅强大,而且可靠、可维护、并赢得用户信任的智能体。
致谢
本文由 Erik Schluntz 与 Barry Zhang 撰写。我们的工作基于在 Anthropic 构建智能体的经验,以及客户分享的宝贵见解,对此我们深表感谢。
附录 1:智能体的实际应用
我们与客户的合作揭示了两个特别有前景的 AI 智能体应用场景,充分展示了上述模式的实用价值。这两个应用都表明,当任务同时需要对话与行动、具备明确的成功标准、支持反馈循环,并整合有意义的人类监督时,智能体能发挥最大价值。
A. 客户支持
客户支持结合了熟悉的聊天机器人界面与通过工具集成增强的能力。这对开放式智能体而言是天然契合的场景,因为:
- 支持交互天然具有对话流程,同时需要访问外部信息和执行操作;
- 工具可集成以获取客户数据、订单历史和知识库文章;
- 退款发放或工单更新等操作可程序化处理;
- 成功可通过用户定义的解决方案清晰衡量。
多家公司已通过按成功解决计费的定价模型验证了该方法的可行性,显示出对其智能体有效性的信心。
B. 编码智能体
软件开发领域在 LLM 功能方面展现出巨大潜力,能力已从代码补全演进到自主解决问题。智能体在此尤其有效,因为:
- 代码解决方案可通过自动化测试验证;
- 智能体可利用测试结果作为反馈迭代优化方案;
- 问题空间定义清晰且结构化;
- 输出质量可客观衡量。
在我们自己的实现中,智能体现已能仅凭拉取请求描述,解决 SWE-bench Verified 基准中的真实 GitHub 问题。然而,尽管自动化测试有助于验证功能,人类审查对于确保解决方案符合更广泛的系统需求仍至关重要。
附录 2:为工具进行提示工程
无论你构建哪种智能体系统,工具很可能都是重要组成部分。工具使 Claude 能通过指定其精确结构和定义来与外部服务和 API 交互。当 Claude 响应时,若计划调用工具,API 响应中将包含一个工具使用块。工具的定义和规范应获得与整体提示同等的提示工程关注。本附录简要说明如何为工具进行提示工程。
同一操作常有多种指定方式。例如,你可以通过写 diff 或重写整个文件来指定文件编辑;对于结构化输出,你可以将代码放在 Markdown 或 JSON 中。在软件工程中,这些差异只是形式上的,可无损转换。但对 LLM 而言,某些格式远比其他格式更难生成。例如,写 diff 需要在写出新代码前就知道块头中要更改多少行;在 JSON 中写代码(相比 Markdown)则需额外转义换行符和引号。
我们对工具格式选择的建议如下:
- 为模型留出足够 token 用于"思考",避免过早陷入格式限制;
- 尽量采用模型在互联网文本中常见到的格式;
- 避免格式"开销",例如要求准确计数千行代码,或对所写代码进行字符串转义。
一个经验法则是:想想人类-计算机界面(HCI)投入了多少精力,你就应为构建良好的 智能体-计算机界面(ACI) 投入同等精力。以下是一些建议:
- 站在模型的角度思考:仅凭描述和参数,工具用法是否显而易见?还是需要仔细思考?如果是后者,模型很可能也有同样困难。好的工具定义通常包含使用示例、边界情况、输入格式要求,以及与其他工具的清晰区分。
- 如何修改参数名或描述使其更直观?想象你是在为团队中的初级开发者写优秀的文档字符串。当你使用多个相似工具时,这一点尤为重要。
- 测试模型如何使用你的工具:在我们的工作台中运行大量示例输入,观察模型犯哪些错误,并持续迭代。
- 对工具进行"防错设计(Poka-yoke)":调整参数,使错误更难发生。
在构建 SWE-bench 智能体时,我们实际上花在优化工具上的时间超过了整体提示。例如,我们发现当智能体离开根目录后,使用相对路径的工具常出错。为解决此问题,我们将工具改为始终要求绝对路径------结果模型使用该方法毫无差错。