我们曾与多个行业中数十个构建大型语言模型(LLM)智能体的团队合作。实践表明,最成功的实施方案往往采用简单、可组合的模式,而非复杂的框架。

在过去一年里,我们与各行各业数十个构建大型语言模型(LLM)智能体的团队展开合作。始终如一的是,最成功的实施方案并未依赖复杂框架或专业库,而是采用简单、可组合的模式进行构建。

在本文中,我们将分享从客户合作及自主构建智能体过程中总结的经验,并为开发者提供构建高效智能体的实用建议。

什么是智能体?

“智能体” 的定义有多种。部分客户将其定义为能长期独立运行、借助各类工具完成复杂任务的全自主系统;另一些客户则用该术语描述遵循预定义工作流程的指令式实施方案。在 Anthropic,我们将所有这些变体归类为智能体系统,但在架构上明确区分工作流和智能体:

  • 工作流是通过预定义代码路径协调 LLM 与工具的系统;
  • 而智能体则是由 LLM 动态主导自身流程和工具使用,自主掌控任务完成方式的系统。

下文将详细探讨这两类智能体系统。在附录 1《实际应用中的智能体》中,我们将介绍两个客户已发现此类系统具有特殊价值的领域。

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

使用 LLM 构建应用时,我们建议优先采用最简单的解决方案,仅在必要时增加复杂度 —— 这可能意味着完全不构建智能体系统。智能体系统通常需要以延迟和成本为代价来换取更优的任务性能,因此需谨慎判断这种权衡是否合理。

当确实需要更高复杂度时,工作流适用于任务明确、需要可预测性和一致性的场景;而当大规模场景下需要灵活性和模型驱动的决策能力时,智能体则是更优选择。不过,对于多数应用而言,通过检索和上下文示例优化单次 LLM 调用通常已足够满足需求。

何时及如何使用框架?

目前有许多框架可简化智能体系统的实现,包括:

  • LangChain 的 LangGraph;
  • 亚马逊 Bedrock 的 AI 智能体框架;
  • Rivet(一款拖放式图形界面 LLM 工作流构建工具);
  • Vellum(另一款用于构建和测试复杂工作流的图形界面工具)。

这些框架通过简化调用 LLM、定义和解析工具、串联调用等标准底层任务,降低了入门门槛。但它们往往会增加额外的抽象层,掩盖底层的提示词和响应内容,导致调试难度加大;同时也可能诱使开发者在简单方案已足够的情况下过度增加复杂度。

我们建议开发者首先直接使用 LLM API:许多模式仅需几行代码即可实现。若确实需要使用框架,务必理解其底层代码 —— 对底层逻辑的错误假设是客户常见的出错原因之一。

如需示例实现,可参考我们的开发指南。

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

本节将探讨我们在实际应用中观察到的智能体系统常见模式。我们将从基础构建模块(增强型 LLM)入手,逐步提升复杂度,依次介绍简单的可组合工作流和自主智能体。

构建模块:增强型 LLM

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

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

我们建议重点关注实现的两个关键方面:一是根据具体用例定制这些能力;二是为 LLM 提供简洁、文档完善的接口。实现这些增强功能的方式多种多样,其中一种是通过我们最近发布的模型上下文协议(Model Context Protocol),开发者可通过简单的客户端实现与日益增长的第三方工具生态系统集成。

在本文后续内容中,我们将默认每次 LLM 调用都可使用这些增强功能。

工作流:提示词串联

提示词串联将任务分解为一系列步骤,每个 LLM 调用都处理前一个步骤的输出。你可以在任意中间步骤添加程序检查(见图中的 “网关”),确保流程按计划推进。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:该工作流适用于可轻松、清晰地分解为固定子任务的场景。其核心目标是通过将每个 LLM 调用简化为更简单的任务,以延迟换取更高的准确性。

应用示例

  • 生成营销文案后,将其翻译成其他语言;
  • 先撰写文档大纲,检查大纲是否符合特定标准,再根据大纲完成文档撰写。

工作流:路由

路由会对输入进行分类,并将其导向专门的后续任务。该工作流支持关注点分离,便于构建更具针对性的提示词。若缺少此工作流,针对某类输入的优化可能会影响对其他输入的处理性能。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:适用于任务复杂、存在需单独处理的不同类别,且可通过 LLM 或传统分类模型 / 算法准确分类的场景。

应用示例

  • 将不同类型的客户服务请求(通用问题、退款申请、技术支持)导向不同的下游流程、提示词和工具;
  • 将简单 / 常见问题分配给小型模型(如 Claude 3.5 Haiku),将复杂 / 特殊问题分配给更强大的模型(如 Claude 3.5 Sonnet),以优化成本和速度。

工作流:并行化

LLM 有时可同时处理某项任务,并通过程序聚合输出结果。这种并行化工作流主要有两种形式:

  • 分段处理:将任务拆分为独立子任务并行执行;
  • 投票机制:多次执行同一任务以获取多样化输出。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:当拆分后的子任务可通过并行化提升速度,或需要多视角、多次尝试以获得更可靠结果时,并行化非常有效。对于涉及多方面考量的复杂任务,让每个 LLM 调用专注处理一个特定方面,通常能获得更优性能。

应用示例

  • 分段处理:
    • 实现安全防护机制,由一个模型实例处理用户查询,另一个实例筛选不当内容或请求 —— 这种方式比单一 LLM 同时处理防护和核心响应的效果更好;
    • 自动化评估 LLM 性能,每个 LLM 调用评估模型在特定提示词下的不同性能维度。
  • 投票机制:
    • 审查代码漏洞,通过多个不同提示词审查代码并标记问题;
    • 评估内容是否不当,由多个提示词从不同维度进行评估,或设置不同投票阈值以平衡误报和漏报。

工作流:协调者 – 执行者模式

在协调者 – 执行者工作流中,中央 LLM 动态拆分任务,将其分配给执行者 LLM,并综合它们的结果。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:适用于无法预测所需子任务的复杂场景(例如编程中,需要修改的文件数量和每个文件的修改内容往往取决于具体任务)。与并行化相比,其核心区别在于灵活性 —— 子任务并非预定义,而是由协调者根据具体输入动态确定。

应用示例

  • 每次需对多个文件进行复杂修改的编程产品;
  • 需要从多个来源收集和分析相关信息的搜索任务。

工作流:评估者 – 优化者模式

在评估者 – 优化者工作流中,一个 LLM 生成响应,另一个 LLM 提供评估和反馈,形成循环迭代。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:当存在明确的评估标准,且迭代优化能带来可衡量的价值时,该工作流尤为有效。判断是否适用的两个关键特征是:一是人类明确反馈后,LLM 响应能显著改善;二是 LLM 具备提供此类有效反馈的能力。这类似于人类作者撰写高质量文档时的迭代写作过程。

应用示例

  • 文学翻译 —— 翻译 LLM 最初可能无法捕捉到细微差异,但评估者 LLM 可提供有用的修改建议;
  • 需要多轮搜索和分析以收集全面信息的复杂搜索任务,由评估者决定是否需要进一步搜索。

智能体

随着 LLM 在理解复杂输入、推理规划、可靠使用工具和错误恢复等关键能力上的成熟,智能体已开始投入实际应用。智能体的工作始于人类用户的指令或交互式讨论。任务明确后,智能体将自主规划和执行操作,必要时会向人类寻求更多信息或判断。在执行过程中,智能体必须在每个步骤从环境中获取 “真实数据”(如工具调用结果或代码执行情况),以评估进展。智能体可在检查点或遇到障碍时暂停,等待人类反馈。任务通常在完成后终止,但设置停止条件(如最大迭代次数)以保持控制也很常见。

智能体能够处理复杂任务,但其实现往往较为简洁 —— 通常是 LLM 在循环中根据环境反馈使用工具。因此,精心设计工具集及其文档至关重要。我们在附录 2《工具的提示词工程》中详细阐述了工具开发的最佳实践。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

适用场景:适用于步骤数量难以预测、无法硬编码固定路径的开放式问题。LLM 可能需要多次交互,因此你必须对其决策能力有一定程度的信任。智能体的自主性使其非常适合在可信环境中规模化处理任务。

智能体的自主性意味着更高的成本,且可能出现累积错误。我们建议在沙盒环境中进行全面测试,并设置适当的安全防护机制。

应用示例

以下示例来自我们的自主实现:

  • 用于解决 SWE-bench 任务的编程智能体,可根据任务描述修改多个文件;
  • “计算机使用” 参考实现,Claude 可通过操作计算机完成任务。

输入 → LLM → 输出

(检索 / 工具 / 记忆:查询 / 响应 调用 / 读取 / 写入 结果)

组合与定制这些模式

这些构建模块并非强制性标准,而是开发者可根据不同用例调整和组合的常见模式。与所有 LLM 功能一样,成功的关键在于衡量性能并迭代优化实现。再次强调:仅当复杂度的提升能显著改善结果时,才考虑增加复杂度。

总结

在 LLM 领域取得成功的关键并非构建最复杂的系统,而是打造符合自身需求的系统。从简单提示词入手,通过全面评估进行优化,仅在简单解决方案无法满足需求时,再添加多步骤智能体系统。

实现智能体时,我们尝试遵循三项核心原则:

  1. 保持智能体设计的简洁性;
  2. 通过明确展示智能体的规划步骤,优先保证透明度;
  3. 通过详尽的工具文档和测试,精心设计智能体 – 计算机接口(ACI)。

框架可帮助你快速入门,但在推向生产环境时,不妨减少抽象层,使用基础组件进行构建。遵循这些原则,你将能够创建出不仅功能强大,而且可靠、可维护且能获得用户信任的智能体。

文章来源:https://www.anthropic.com/engineering/building-effective-agents

网站页脚示例