构建高效的智能体

Anthropic Engineering 工具

摘要

Anthropic 发布了构建高效 AI 智能体的工程指南,倡导采用简单、可组合的模式以及直接使用 API,而非依赖复杂的框架。文章区分了工作流与自主智能体,并就何时使用每种架构提供了实用建议。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/08 09:44

# 构建高效的 AI Agent 来源:https://www.anthropic.com/engineering/building-effective-agents 过去一年里,我们与数十个跨行业的大型语言模型(LLM)Agent 团队进行了合作。我们发现,最成功的实现方案并没有使用复杂的框架或专用库,而是采用了简单、可组合的模式。 在这篇文章中,我们分享从客户合作和自身构建 Agent 过程中获得的经验,并为开发者提供构建高效 Agent 的实用建议。 ## 什么是 Agent? "Agent" 有多种定义方式。有些客户将 Agent 定义为完全自主的系统,能够在较长时间内独立运行,使用各种工具完成复杂任务。也有人用这个词来描述遵循预定义工作流的、更具规定性的实现方式。在 Anthropic,我们将所有这些变体归类为 **Agentic 系统**,但在 **工作流(Workflows)** 和 **Agent** 之间做出了重要的架构区分: - **工作流** 是通过预定义代码路径编排 LLM 和工具的系统。 - **Agent** 则是 LLM 动态指导自身过程和工具使用的系统,保持对如何完成任务的控制权。 下面,我们将详细探讨这两种 Agentic 系统。在附录 1("实践中的 Agent")中,我们描述了两个客户发现此类系统特别有价值的领域。 ## 何时(以及何时不)使用 Agent 在使用 LLM 构建应用时,我们建议寻找最简单的解决方案,仅在需要时增加复杂性。这可能意味着完全不构建 Agentic 系统。Agentic 系统通常以延迟和成本换取更好的任务性能,你应该考虑这种权衡何时合理。 当需要更多复杂性时,工作流为定义明确的任务提供可预测性和一致性,而 Agent 则是在需要大规模灵活性和模型驱动决策时的更好选择。然而,对于许多应用来说,优化单次 LLM 调用(结合检索和上下文示例)通常就足够了。 ## 何时以及如何使用框架 有许多框架可以简化 Agentic 系统的实现,包括: - Claude Agent SDK(https://platform.claude.com/docs/en/agent-sdk/overview) - AWS 的 Strands Agents SDK(https://strandsagents.com/latest/) - Rivet(https://rivet.ironcladapp.com/),一个拖放式 GUI LLM 工作流构建器 - Vellum(https://www.vellum.ai/),另一个用于构建和测试复杂工作流的 GUI 工具 这些框架通过简化调用 LLM、定义和解析工具、链式调用等标准底层任务,让入门变得容易。然而,它们往往会增加额外的抽象层,可能掩盖底层的提示和响应,使调试更加困难。它们也可能诱使你在简单设置就足够的情况下添加复杂性。 我们建议开发者从直接使用 LLM API 开始:许多模式可以用几行代码实现。如果你确实使用框架,请确保理解底层代码。对底层实现的不正确假设是客户错误的常见来源。 请查看我们的 [cookbook](https://platform.claude.com/cookbook/patterns-agents-basic-workflows) 获取一些示例实现。 ## 构建块、工作流和 Agent 在本节中,我们将探讨生产环境中 Agentic 系统的常见模式。我们从基础构建块——增强型 LLM 开始,逐步增加复杂性,从简单的组合工作流到自主 Agent。 ### 构建块:增强型 LLM Agentic 系统的基本构建块是增强了检索、工具和记忆等能力的 LLM。我们当前的模型能够主动使用这些能力——生成自己的搜索查询、选择适当的工具,以及确定保留哪些信息。 **增强型 LLM** 我们建议关注实现的两个关键方面:根据特定用例定制这些能力,以及确保它们为 LLM 提供简单、文档完善的接口。虽然实现这些增强的方式有很多,但一种方法是通过我们最近发布的 [Model Context Protocol](https://www.anthropic.com/news/model-context-protocol),它允许开发者通过简单的[客户端实现](https://modelcontextprotocol.io/tutorials/building-a-client#building-mcp-clients)与不断增长的第三方工具生态系统集成。 在本篇文章的其余部分,我们将假设每次 LLM 调用都可以访问这些增强能力。 ### 工作流:提示链(Prompt chaining) 提示链将任务分解为一系列步骤,每个 LLM 调用处理前一个步骤的输出。你可以在任何中间步骤添加程序化检查(见下图中的"gate"),以确保过程仍在正轨上。 **提示链工作流** **何时使用此工作流:** 此工作流适用于任务可以轻松、清晰地分解为固定子任务的情况。主要目标是以延迟换取更高的准确性,让每个 LLM 调用处理更简单的任务。 **提示链有用的示例:** - 生成营销文案,然后将其翻译成不同语言 - 撰写文档大纲,检查大纲是否符合某些标准,然后根据大纲撰写文档 ### 工作流:路由(Routing) 路由对输入进行分类,并将其引导至专门的后继任务。这种工作流实现了关注点分离,并允许构建更专门的提示。没有这种工作流时,针对一种输入的优化可能会损害其他输入的性能。 **路由工作流** **何时使用此工作流:** 路由适用于存在明显不同类别、分别处理效果更好,且分类可以由 LLM 或更传统的分类模型/算法准确处理的复杂任务。 **路由有用的示例:** - 将不同类型的客户服务查询(一般问题、退款请求、技术支持)引导至不同的下游流程、提示和工具 - 将简单/常见问题路由到更小、更具成本效益的模型(如 Claude Haiku 4.5),将困难/不常见问题路由到更强大的模型(如 Claude Sonnet 4.5),以优化最佳性能 ### 工作流:并行化(Parallelization) LLM 有时可以同时处理任务,并以编程方式聚合其输出。这种工作流——并行化——表现为两种关键变体: - **分段(Sectioning)**:将任务分解为独立子任务并行运行 - **投票(Voting)**:多次运行相同任务以获取多样化输出 **并行化工作流** **何时使用此工作流:** 当分解的子任务可以并行处理以提高速度,或需要多个视角或尝试以获得更高置信度结果时,并行化是有效的。对于具有多个考虑因素的复杂任务,当每个考虑因素由单独的 LLM 调用处理时,LLM 通常表现更好,使其能够专注于每个特定方面。 **并行化有用的示例:** - **分段**: - 实现防护机制,其中一个模型实例处理用户查询,另一个筛选不当内容或请求。这往往比让同一个 LLM 调用同时处理防护机制和核心响应效果更好 - 自动化评估 LLM 性能,其中每个 LLM 调用评估模型在给定提示上的不同方面性能 - **投票**: - 审查代码漏洞,多个不同提示审查代码并在发现问题时标记 - 评估给定内容是否不当,多个提示评估不同方面或需要不同的投票阈值以平衡假阳性和假阴性 ### 工作流:协调器-工作者(Orchestrator-workers) 在协调器-工作者工作流中,中心 LLM 动态分解任务,委派给工作者 LLM,并综合其结果。 **协调器-工作者工作流** **何时使用此工作流:** 此工作流适用于无法预测所需子任务的复杂任务(例如,在编码中,需要修改的文件数量和每个文件中的修改性质可能取决于任务)。虽然拓扑结构相似,但与并行化的关键区别在于其灵活性——子任务不是预先定义的,而是由协调器根据特定输入确定的。 **协调器-工作者有用的示例:** - 每次对多个文件进行复杂更改的编码产品 - 涉及从多个来源收集和分析信息以获取可能相关信息的搜索任务 ### 工作流:评估器-优化器(Evaluator-optimizer) 在评估器-优化器工作流中,一个 LLM 调用生成响应,另一个在循环中提供评估和反馈。 **评估器-优化器工作流** **何时使用此工作流:** 当我们有明确的评估标准,且迭代改进能提供可衡量的价值时,此工作流特别有效。适合的两个标志是:首先,当人类表达反馈时,LLM 响应可以得到明显改进;其次,LLM 能够提供此类反馈。这类似于人类作家在撰写润色文档时可能经历的迭代写作过程。 **评估器-优化器有用的示例:** - 文学翻译,其中存在翻译 LLM 最初可能无法捕捉的细微差别,但评估器 LLM 可以提供有用的批评 - 需要多轮搜索和分析以收集全面信息的复杂搜索任务,评估器决定是否需要进一步搜索 ### Agent 随着 LLM 在关键能力方面的成熟——理解复杂输入、进行推理和规划、可靠地使用工具以及从错误中恢复——Agent 正在生产中涌现。Agent 从人类用户的命令或交互式讨论开始工作。一旦任务明确,Agent 独立规划和运行,可能在需要进一步信息或判断时返回给人类。在执行过程中,Agent 从环境中获取每一步的" ground truth "(如工具调用结果或代码执行)以评估其进展至关重要。Agent 可以在检查点或遇到障碍时暂停以获取人类反馈。任务通常在完成时终止,但也可以包含停止条件(如最大迭代次数)以保持控制。 Agent 可以处理复杂的任务,但其实现通常很简单。它们通常只是基于环境反馈在循环中使用工具的 LLM。因此,清晰、周到地设计工具集及其文档至关重要。我们在附录 2("针对工具的提示工程")中详细阐述了工具开发的最佳实践。 **自主 Agent** **何时使用 Agent:** Agent 可用于开放式问题,其中难以或无法预测所需步骤数,且无法硬编码固定路径。LLM 可能会运行多轮,你必须对其决策有一定程度的信任。Agent 的自主性使其成为受信任环境中扩展任务的理想选择。 Agent 的自主性意味着更高的成本,以及错误累积的可能性。我们建议在沙盒环境中进行广泛测试,并设置适当的防护机制。 **Agent 有用的示例:** 以下示例来自我们自己的实现: - 用于解决 [SWE-bench](https://www.anthropic.com/research/swe-bench-sonnet) 任务的编码 Agent,涉及根据任务描述对多个文件进行编辑 - 我们的 ["computer use" 参考实现](https://github.com/anthropics/anthropic-quickstarts/tree/main/computer-use-demo),其中 Claude 使用计算机完成任务 **编码 Agent 的高级流程** ## 组合和定制这些模式 这些构建块不是规定性的。它们是开发者可以塑造和组合以适应不同用例的常见模式。成功的关键与任何 LLM 功能一样,是衡量性能并迭代实现。重申:你应该*仅*在复杂性能够证明可以改善结果时才考虑添加。 ## 总结 LLM 领域的成功不在于构建最复杂的系统,而在于构建适合你需求的*正确*系统。从简单的提示开始,通过全面评估进行优化,仅在简单解决方案不足时才添加多步骤 Agentic 系统。 在实现 Agent 时,我们努力遵循三个核心原则: 1. 保持 Agent 设计的**简洁性** 2. 通过明确展示 Agent 的规划步骤,优先考虑**透明性** 3. 通过彻底的工具**文档和测试**,精心打造你的 Agent-计算机接口(ACI) 框架可以帮助你快速入门,但在进入生产环境时,不要犹豫减少抽象层,用基本组件构建。遵循这些原则,你可以创建不仅强大,而且可靠、可维护且受用户信任的 Agent。 ### 致谢 本文由 Erik S. 和 Barry Zhang 撰写。这项工作基于我们在 Anthropic 构建 Agent 的经验以及客户分享的宝贵见解,对此我们深表感谢。 ## 附录 1:实践中的 Agent 我们与客户的合作揭示了 AI Agent 的两个特别有前景的应用,展示了上述模式的实际价值。这两个应用都说明了 Agent 在需要对话和行动、有明确成功标准、能够实现反馈循环并整合有意义的人类监督的任务中增加最大价值。 ### A. 客户支持 客户支持将熟悉的聊天机器人界面与通过工具集增强的能力相结合。这非常适合更开放式的 Agent,因为: - 支持交互自然遵循对话流程,同时需要访问外部信息和行动 - 可以集成工具来获取客户数据、订单历史记录和知识库文章 - 发放退款或更新工单等操作可以程序化地处理 - 成功可以通过用户定义的解决方案明确衡量 多家公司通过基于使用量的定价模式展示了这种方法的可行性,仅对成功的解决方案收费,显示了对其 Agent 有效性的信心。 ### B. 编码 Agent 软件开发领域已显示出 LLM 功能的显著潜力,能力从代码补全发展到自主问题解决。Agent 特别有效,因为: - 代码解决方案可以通过自动化测试验证 - Agent 可以使用测试结果作为反馈迭代解决方案 - 问题空间定义明确且结构化 - 输出质量可以客观衡量 在我们自己的实现中,Agent 现在可以仅根据拉取请求描述解决 [SWE-bench Verified](https://www.anthropic.com/research/swe-bench-sonnet) 基准中的真实 GitHub 问题。然而,虽然自动化测试有助于验证功能,但人工审查对于确保解决方案符合更广泛的系统需求仍然至关重要。 ## 附录 2:针对你的

相似文章

停止构建AI智能体。

Reddit r/AI_Agents

作者认为,大多数要求构建AI智能体的创始人实际上只需要简单的自动化流程,并辅以最少的LLM集成,理由包括生产环境故障、合规障碍,以及更简单工作流带来的更高投资回报率。文章提供了一个实用的决策框架,帮助开发者和创始人优先考虑可靠的自动化,而非复杂且不可预测的智能体。

为什么大家都觉得AI智能体很容易?🚀

Reddit r/AI_Agents

一篇反思性文章,质疑人们轻率地认为构建AI智能体很容易的想法,强调了API、RAG、工具调用、记忆和编排等复杂组件,并指出在需要真正的智能体之前,更简单的工作流往往就够了。