构建高效的智能体

最成功的效果并没有使用复杂的框架或专门的库。相反,它们是用简单、可组合的模式构建出来的。

构建高效的智能体

过去一年,我们与数十个跨行业、正在构建大语言模型(LLM)智能体的团队开展了合作。我们发现,最成功的效果并没有使用复杂的框架或专门的库。相反,它们是用简单、可组合的模式构建出来的。

在这篇文章中,我们分享从服务客户和自行构建智能体的过程中学到的经验,并为开发者提供关于构建高效智能体的实用建议。

什么是智能体?

“Agent”(智能体)可以用几种方式来定义。一些客户将智能体定义为完全自主的系统,它们在较长时间内独立运行,使用各种工具来完成复杂任务。另一些客户则用这个词来描述遵循预定义工作流的、更具规定性的实现。在 Anthropic,我们将所有这些变体都归类为智能体系统(agentic systems),但在架构上明确区分工作流(workflows)和智能体(agents):

  • 工作流是通过预定义代码路径来编排 LLM 和工具的系统。
  • 智能体,则相反,是 LLM 动态主导自身流程和工具使用、并对如何完成任务保持控制的系统。

下面,我们将详细探讨这两类智能体系统。在附录 1(“实践中的智能体”)中,我们描述了客户发现这类系统特别有价值的两个领域。

何时(以及何时不)使用智能体

在用 LLM 构建应用时,我们建议尽可能寻找最简单的解决方案,仅在确有需要时再增加复杂度。这可能意味着根本不需要构建智能体系统。智能体系统常常以更高的延迟和成本为代价换取更好的任务表现,你应该想清楚这种权衡在何时是值得的。

当确实需要更高复杂度时,工作流为定义良好的任务提供可预测性和一致性;而当需要大规模的灵活性和模型驱动的决策时,智能体是更好的选择。不过,对许多应用而言,用检索和上下文示例来优化单一的 LLM 调用通常就已足够。

何时以及如何使用框架

有许多框架让构建智能体系统变得更容易,包括:

这些框架通过简化调用 LLM、定义和解析工具、将调用串联起来等标准底层任务,让你轻松上手。然而,它们常常制造额外的抽象层,掩盖了底层的提示词与响应,使其更难调试。它们还容易让人产生"加复杂度"的冲动,而其实更简单的设置就足够了。

我们建议开发者先用 LLM API 直接上手:许多模式只需几行代码就能实现。如果你确实使用框架,请确保理解其底层代码。对"引擎盖下"是什么的错误假设,是客户出错的一大常见来源。

查看我们的 cookbook 获取一些示例实现。

构建模块、工作流与智能体

在本节,我们将探讨在生产中见过的智能体系统常见模式。我们从基础的构建模块——增强型 LLM——开始,逐步提升复杂度,从简单的组合式工作流一直到自主智能体。

构建模块:增强型 LLM

智能体系统的基础构建模块,是叠加了检索、工具、记忆等增强能力的 LLM。我们当前的模型能够主动使用这些能力——生成自己的搜索查询、选择合适的工具、并决定保留哪些信息。

The augmented LLM

图:增强型 LLM

我们建议把实现的重点放在两个关键方面:让这些能力贴合你的具体用例,并确保它们为你的 LLM 提供简单易用、文档完善的接口。尽管实现这些增强有多种方式,其中一种途径是通过我们近期发布的 Model Context Protocol(模型上下文协议),它让开发者只需一个简单的 客户端实现,就能与不断增长的第三方工具生态集成。

本文余下部分,我们假设每次 LLM 调用都能访问这些增强能力。

工作流:提示词链(Prompt chaining)

提示词链将任务分解为一系列步骤,每一次 LLM 调用处理上一次的输出。你可以在任意中间步骤上添加程序化检查(见下图中的"gate"门槛),确保流程仍在正轨上。

The prompt chaining workflow

图:提示词链工作流

何时使用此工作流: 当任务能够被轻松、干净地拆解为固定的子任务时,这个工作流最理想。其主要目标是通过让每次 LLM 调用都成为更简单的任务,以延迟换取更高的准确率。

提示词链有用的例子:

  • 生成营销文案,再将其翻译成另一种语言。
  • 先写文档大纲,检查大纲是否满足某些标准,再基于大纲撰写文档。

工作流:路由(Routing)

路由对输入进行分类,并将其导向专门的后续任务。这一工作流实现了关注点分离,并能构建更具针对性的提示词。没有它,针对某一类输入的优化可能会损害对其他输入的表现。

The routing workflow

图:路由工作流

何时使用此工作流: 当任务复杂、且存在最好分别处理的明显类别,同时分类可由 LLM 或更传统的分类模型/算法准确完成时,路由表现良好。

路由有用的例子:

  • 将不同类型的客服查询(一般问题、退款请求、技术支持)导向不同的下游流程、提示词和工具。
  • 将简单/常见的问题路由给更小、更具成本效益的模型(如 Claude Haiku 4.5),而将困难/少见的问题路由给能力更强的模型(如 Claude Sonnet 4.5),以优化最佳性能。

工作流:并行化(Parallelization)

LLM 有时可以同时对一项任务工作,并将其输出以编程方式聚合。并行化这一工作流体现为两个关键变体:

  • 分块(Sectioning):将任务拆分为并行运行的独立子任务。
  • 投票(Voting):多次运行同一任务以获得多样化输出。

The parallelization workflow

图:并行化工作流

何时使用此工作流: 当拆分的子任务可以并行以提速,或需要多个视角/多次尝试以获得更高置信度的结果时,并行化很有效。对于带有多个考量的复杂任务,当每个考量由单独的 LLM 调用处理、从而能对每一具体方面聚焦注意力时,LLM 通常表现更好。

并行化有用的例子:

  • 分块
    • 实现护栏:一个模型实例处理用户查询,另一个实例筛查其中的不当内容或请求。这往往比让同一次 LLM 调用同时处理护栏和核心响应表现更好。
    • 自动化评估(evals)以评测 LLM 性能,其中每次 LLM 调用评估模型在给定提示下表现的不同方面。
  • 投票
    • 审查一段代码是否存在漏洞,由多个不同提示词审查并在发现问题时标记代码。
    • 评估某段内容是否不当,由多个提示词评估不同方面,或要求不同的投票阈值来平衡误报与漏报。

工作流:编排者—工作者(Orchestrator-workers)

在编排者—工作者工作流中,一个中心 LLM 动态拆分任务,将其委派给工作者 LLM,并综合它们的结果。

The orchestrator-workers workflow

图:编排者—工作者工作流

何时使用此工作流: 这个工作流非常适合你无法预知所需子任务(例如在编程中,需要改动的文件数量以及每个文件改动的性质很可能取决于具体任务)的复杂任务。尽管在形态上相似,它与并行化的关键区别在于其灵活性——子任务并非预定义,而是由编排者根据具体输入动态决定。

编排者—工作者有用的例子:

  • 每次都对多个文件进行复杂改动的编程产品。
  • 涉及从多个来源收集并分析信息以寻找可能相关内容的搜索任务。

工作流:评估者—优化器(Evaluator-optimizer)

在评估者—优化器工作流中,一个 LLM 调用生成响应,另一个则在一个循环中提供评估与反馈。

The evaluator-optimizer workflow

图:评估者—优化器工作流

何时使用此工作流: 当我们拥有清晰的评估标准,且迭代式精炼能带来可衡量价值时,这个工作流特别有效。两个适配良好的标志是:第一,当人类阐明反馈时,LLM 的响应能得到明显改善;第二,LLM 自身能够提供这样的反馈。这类似于人类作者在产出精修文档时可能经历的迭代写作过程。

评估者—优化器有用的例子:

  • 文学翻译,其中存在译者 LLM 起初可能捕捉不到的细微差别,但评估者 LLM 能提供有用的批评。
  • 需要多轮搜索与分析以收集全面信息的复杂搜索任务,由评估者决定是否值得进一步搜索。

智能体(Agents)

随着 LLM 在关键能力上的成熟——理解复杂输入、进行推理与规划、可靠地使用工具、并从错误中恢复——智能体正在生产中涌现。智能体以来自人类用户的指令或交互式讨论开始工作。一旦任务明确,智能体便独立规划与运行,并可能返回人类处获取更多信息或判断。在执行过程中,智能体在每一步都从环境获得"真实情况"(ground truth,如工具调用结果或代码执行)以评估进展,这一点至关重要。智能体随后可在检查点,或遇到阻碍时暂停以征询人类反馈。任务通常于完成时终止,但加入停止条件(如最大迭代次数)以保持控制也很常见。

智能体能处理复杂的任务,但它们的实现往往直截了当。它们通常只是 LLM 在一个循环中根据环境反馈使用工具。因此,清晰而审慎地设计工具集及其文档至关重要。我们在附录 2(“对你的工具做提示词工程”)中详述工具开发的最佳实践。

Autonomous agent

图:自主智能体

何时使用智能体: 智能体可用于难以或无法预测所需步骤数量、且无法硬编码固定路径的开放式问题。LLM 可能会运行很多轮,你必须对其决策有一定程度的信任。智能体的自主性使其非常适合在可信环境中扩展任务。

智能体的自主本质意味着更高的成本,以及错误累积的潜在风险。我们建议在沙箱环境中进行充分测试,并配置恰当的护栏。

智能体有用的例子:

以下例子来自我们自己的实现:

High-level flow of a coding agent

图:编程智能体的高层流程

组合与定制这些模式

这些构建模块并非规定性的。它们是开发者可以按需塑造和组合以适应不同用例的常见模式。与任何 LLM 功能一样,成功的关键在于衡量性能并迭代实现。重申一遍:你应当只在复杂度能明显改善结果时,才考虑增加它。

总结

在 LLM 领域的成功,不在于构建最复杂的系统,而在于为你的需求构建合适的系统。从简单的提示词开始,用全面的评估优化它们,并仅在更简单的方案力有不逮时,才加入多步智能体系统。

在实现智能体时,我们力求遵循三条核心原则:

  1. 在智能体的设计中保持简洁(simplicity)。
  2. 通过显式展示智能体的规划步骤来优先保证透明(transparency)。
  3. 通过彻底的工具文档与测试,精心打造你的智能体—计算机接口(ACI)。

框架能帮你快速起步,但当你走向生产时,不要犹豫去削减抽象层、用基础组件构建。遵循这些原则,你就能创建出不仅强大,而且可靠、可维护、并为其用户所信任的智能体。

致谢

由 Erik S. 和 Barry Zhang 撰写。这项工作借鉴了我们在 Anthropic 构建智能体的经验,以及客户分享的宝贵见解,我们对此深表感激。

附录 1:实践中的智能体

我们与客户的合作揭示了两个特别有前景的 AI 智能体应用,它们展示了上述模式的实际价值。两个应用都说明:对于既需要对话又需要行动、拥有清晰的成功标准、能启用反馈循环、并整合有意义的人工监督的任务,智能体创造的价值最大。

A. 客户支持

客户支持将熟悉的聊天机器人界面与通过工具集成增强的能力结合起来。这对于更开放的智能体而言是天然契合的,因为:

  • 支持交互天然遵循对话流,同时需要访问外部信息与动作;
  • 可集成工具来获取客户数据、订单历史和知识库文章;
  • 诸如发放退款或更新工单等动作可以程序化地处理;并且
  • 成功与否可通过用户定义的解决结果清晰衡量。

数家公司已通过基于用量的定价模式(仅对成功解决的结果收费)证明了这种方法的可行性,显示出对其智能体有效性的信心。

B. 编程智能体

软件开发领域已展现出 LLM 功能的惊人潜力,其能力从代码补全演进到了自主解决问题。智能体特别有效,因为:

  • 代码解决方案可通过自动化测试验证;
  • 智能体可以用测试结果作为反馈对方案迭代;
  • 问题空间定义明确且结构化;并且
  • 输出质量可被客观衡量。

在我们自己的实现中,智能体现在已能仅凭拉取请求的描述,在 SWE-bench Verified 基准上解决真实的 GitHub issue。然而,尽管自动化测试有助于验证功能,人工审查对于确保方案符合更广泛的系统需求仍然至关重要。

附录 2:对你的工具做提示词工程

无论你在构建哪种智能体系统,工具都可能是你智能体的重要组成部分。工具通过在我们的 API 中指定其确切结构与定义,让 Claude 能与外部服务和 API 交互。当 Claude 响应时,如果它打算调用某个工具,会在 API 响应中包含一个 tool use block(工具使用块)。工具的定义与规范,应当像你的总体提示词一样,得到同等程度的提示词工程关注。在这篇简短的附录中,我们描述如何对你的工具做提示词工程。

同一动作常常有几种指定方式。例如,你可以写一段 diff(差异)来指定文件编辑,也可以重写整个文件。对于结构化输出,你可以把代码返回在 markdown 内或 JSON 内。在软件工程中,这类差异只是表面性的,可以无损地互相转换。然而,某些格式对 LLM 来说远比其他格式更难书写。写 diff 需要在写出新代码前,先在块头(chunk header)中知道有多少行在改动。在 JSON 内写代码(相比 markdown)需要对换行和引号做额外的转义。

我们关于决定工具格式的建议如下:

  • 给模型足够的 token 让它在"走进死胡同"之前先"思考"。
  • 让格式贴近模型在互联网文本中自然见到的样子。
  • 确保没有格式上的"开销",例如必须精确数出成千上万行代码,或对其写的任何代码做字符串转义。

一条经验法则是:想想在人机界面(HCI)上要投入多少精力,并计划投入同样多的精力来创建良好的智能体—计算机界面(ACI)。以下是一些如何做到的想法:

  • 设身处地为模型着想。基于描述和参数,它的用法是否一目了然,还是你也需要仔细思考?如果是后者,那么对模型大概也一样。一个好的工具定义通常包含示例用法、边界情况、输入格式要求,以及与其他工具的清晰界限。
  • 如何修改参数名或描述,让事情更一目了然?把这当作为你团队里初级开发者写一份出色的文档字符串(docstring)。在使用许多相似工具时,这尤其重要。
  • 测试模型如何使用你的工具:在我们的 workbench 中运行许多示例输入,看看模型会犯什么错,并迭代改进。
  • 对你的工具做 Poka-yoke(防呆)设计。修改参数,使其更难出错。

在为 SWE-bench 构建智能体时,我们实际上在优化工具上花的时间比优化总体提示词还多。例如,我们发现,在智能体移出根目录后,模型会对使用相对文件路径的工具犯错。为修复此问题,我们将工具改为始终要求绝对文件路径——结果发现模型完美地使用了这一方法。

KEEP READING