Claude 官方发布《Agent 构建指南》(中文版) | AI工具集


本文主要讲述Anthropic公司在构建大型语言模型(LLM)和智能体(agents)方面的年度总结和设计原则。文章由Anthropic公司撰写,内容包括成功方案的特点智能体的定义何时使用智能体框架的使用构建模块与工作流工作流模式智能体的应用场景以及实践案例等板块。文章强调简单性、透明度和精心设计的agent-computer interface(ACI)接口的重要性,并提供工具开发的最佳实践和插件工具的提示词工程的详细信息。基于以上内容,Anthropic分享如何构建有价值的智能体,并为开发者提供实用的建议。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

2024年12⽉20⽇

在过去的一年里,Anthropic 与多个行业团队合作,构建大型语言模型(LLM)代理。最成功的方案并不是使用复杂的框架或专门的软件包。相反,他们使用的是简单、可组合的模块来构建的。 在这篇文章中,Anthropic 分享了从与客户合作和自身构建代理中学到的经验,并为开发者提供如何构建有效代理的相关建议。

什么是Agent?

什么是Agent? “Agent”能有多种定义。一些客户将Agent定义为完全自主的系统,它们能长期独立运行,使用各种工具完成复杂任务。其他人把Agent描述为遵循预定义工作流程且更符合规范性。在Anthropic,将所有这些变体归类为代理系统,但在工作流代理之间画了一个重要的架构区别:

  • 工作流是LLM和工具基于预定义的代码路径进行编排的系统。
  • 代理是LLM动态规划自己流程和工具使用的系统,并能控制如何完成任务的系统。

下面,我们将详细探讨这两种类型的代理系统。在附录1(“实践中的Agent”)中,介绍了客户发现使用这些系统特别有价值的两个领域。

何时(以及何时不)使用Agent?

在构建LLM应用程序时,建议寻找尽可能简单的解决方案,并只在需要时增加复杂性。这可能意味着根本不构建代理系统。代理系统通常为了更好的任务性能而延迟和消耗成本,需要考虑权衡这是否有意义。

当需要更多的复杂性时,工作流为定义明确的任务提供了可预测性和一致性,而当需要大规模的灵活性和模型驱动的决策制定时,Agent是更好的选择。然而,对于许多应用程序来说,优化单个LLM调用,配合检索和上下文示例通常就足够了。

何时以及如何使用框架?

有许多框架可以使代理系统更容易实现,包括:

  • LangChain的LangGraph;
  • 亚马逊Bedrock的AI代理框架
  • Rivet,一个拖拽式GUI LLM工作流构建器;
  • Vellum,一个用于构建和测试复杂工作流的GUI工具。

这些框架通过简化调用LLM、快速编写和解析相关工具插件、链式调用等标准化的底层任务,简化操作流程。然而,它们会创建额外的抽象层,这可能会遮盖底层的提示和响应内容,使得调试变得更加困难。它们可能让开发者在简单的设置就能完成的操作中,增加工作的复杂程度。

我们建议开发者首先直接使用LLM API:许多常用的模式只需几行代码就能实现。如果确实想要使用框架,需确保理解底层代码。对底层内容的错误假设是客户出错的常见来源。

查看我们的官方手册以获取一些示例实现。

构建模块、工作流和代理

在本节中将探讨在生产中遇到的代理系统的常见模式。我们将从基础构建模块——增强型LLM开始,逐渐增加复杂性,从简单的组合工作流到自主代理。

构建模块:增强型LLM

代理系统的基本构建模块是通过检索、工具和记忆等增强功能提升的LLM。如今的模型能自动地使用这些能力——自主生成搜索查询、选择合适的工具,并决定保留哪些信息。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集
我们建议重点关注实施的两个关键方面:根据使用场景定制特定用例,并确保为LLM提供简单且文档齐全的接口。虽然实现这些增强功能有很多方法,但其中一种方法是使用Anthropic最近发布的模型上下文协议(Model Context Protocol),它支持开发者通过简单的客户端实现与借助该协议的各种第三方工具生态进行集成。

在本文的剩余部分,将假设每次LLM调用都可以访问这些增强能力。

工作流:提示链工作流

提示链将一个任务分解成一系列步骤,其中每个LLM调用处理前一个调用的输出。您可以在任何中间步骤添加程序化的检查(见下图中的“gate”),确保流程按预期进行。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

  • 适用场景:此工作流非常适合任务可以轻松且清晰地分解为固定子任务的场景。主要目的是通过使每个LLM调用变得更容易,在回复速度和更高的准确性之间进行取舍。
  • 提示链适用示例
    • 生成营销文案,然后将其翻译成不同的语言。
    • 编写文档的大纲,检查大纲是否符合某些标准,然后根据大纲编写文档。

工作流:路由工作流

路由对输入进行分类,并将输入引导至后续的专门任务。工作流允许分离关注点,并构建更专业的提示。如果没有这种工作流,针对一种输入的优化可能会损害其他输入的性能。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

  • 适用场景:路由适用于复杂任务,这些任务具有明确的类别,适合分别处理,并且分类可以由LLM或更传统的分类模型/算法准确处理。
  • 适用示例
    • 将不同类型的客户服务查询(一般问题、退款请求、技术支持)引导到不同的下游流程、提示和工具中。
    • 将简单/常见问题路由到较小的模型,如Claude 3.5 Haiku,将困难/不寻常的问题路由到更强大的模型,如Claude 3.5 Sonnet,以优化成本和速度。

工作流:并行化工作流

LLM有时可以同时完成一项任务,并将它们的输出以编程方式汇总输出。这种工作流体现在两个关键变体中:

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

Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

  • 适用场景:当分割的子任务可以并行化以提高速度,或者当需要多个视角进行尝试来获得更可靠的结果时,并行化是有效的。对于具有多重考虑因素的复杂任务,把每个考虑因素都用单独的LLM调用处理时,LLM表现更好。
  • 适用示例
    • Sectioning(任务拆解)
      • 安全防护,其中一个模型处理用户查询,而另一个筛选查找不适当的内容或请求。这通常比让同一个LLM调用同时安全防护和核心响应表现得更好。
      • 自动化评估用来评估LLM在给定提示下的表现,每个LLM用在评估模型表现的不同方面。
    • Voting(投票)
      • 审查代码中的漏洞,如果发现他们有问题,多个不同的提示审查并标记代码。
      • 评估给定内容是否不当,使用多个提示评估不同方面或设置不同的投票阈值来平衡测试的准确性。

工作流:协调者-执行者工作流

在协调者-执行者工作流中,一个中心LLM动态地分解任务,将它们委托给worker LLMs(工人LLM),并综合考虑他们的结果。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

  • 适用场景:适合无法预测所需子任务的复杂任务(例如,在编码中,需要更改的文件数量以及每个文件中内部的更改,可能取决于任务本身)。虽然它的流程图跟 Parallelization 很像,但关键区别在于其更灵活——子任务不是预定义的,而是由Orchestrator指挥家根据特定输入确定。
  • 适用示例
    • 每次对多个文件进行复杂更改的编码产品。
    • 涉及从多个来源收集和分析信息以寻找可能相关信息的搜索任务。

工作流:评估器-优化器工作流

在这个工作流中,一个LLM调用负责生成响应,而另一个在循环中提供评估和反馈。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

  • 适用场景:当有明确的评估标准,并且迭代细化的价值能被衡量时,这种工作流特别有效。良好的适应性有两个标志,第一,当人类表达反馈时,LLM的响应可以明显改善;第二,LLM能够提供这样的反馈。这类似于人类作家在撰写精炼的文档时,可能经历的迭代写作过程。
  • 适用示例
    • 文学翻译,其中有一些细微之处翻译LLM最初可能无法捕捉到,但评估LLM可以提供有用的改善建议。
    • 复杂的搜索任务,需要多轮搜索和分析来收集全面的信息,负责评估的 LLM 决定是否需要进一步搜索。

代理

随着LLM在理解复杂输入、进行推理和规划、使用工具及从错误中纠错等关键能力的成熟,代理开始在生产中兴起。

代理工作的开始,来自人类用户的命令,或与人类用户进行互动讨论。一旦任务明确,代理就会独立规划和行动,可能需要反问人类,来获取更多信息或判断。在执行过程中,对于代理来说,每一步从环境中获得“真实情况”(例如工具调用结果或代码执行)以评估其进度至关重要。然后,代理可以在遇到阻碍时暂停以获取人类反馈。任务通常在完成时终止,但也常常包括终止条件(例如最大迭代次数)以保持控制。

代理可以处理复杂的任务,但它们的实现通常很简单。它们通常只是根据环境反馈在循环中使用工具的LLM。因此,设计周全且清晰的工具集和文档至关重要。附录2(”Prompt Engineering your Tools”(提示工程你的工具)中详细介绍了工具开发的最佳实践。

Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

(自主代理)

  • 适用场景:代理可用于难以或无法预测所需的步骤数量,并且无法规定好固定路径的开放式问题。LLM可能会运行多个循环,你必须对其决策能力有一定程度的信任感。代理的自主性使其成为在受信任环境中执行任务时特别理想。代理的自主性质意味着成本更高,并且有可能出现不断积累的错误。建议在沙盒环境中进行广泛的测试,并设置适当的安全防护。
  • 适用示例:以下是我们自己的实现中的一些示例:

Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

(编码代理的高级流程)

组合和定制

这些范式不是严格规定好的。它们是开发者可以搭建和组合以适应不同用例的常见模式。和任何LLM功能一样,成功的关键,是衡量性能并迭代落地。重复一遍:只有能明显改善结果时,才应该考虑增加复杂性。

总结

在LLM领域取得成功并不是关于构建最复杂的系统。而在于为需求构建合适的系统。从简单的提示开始,用全面的评估进行优化,只有当更简单的解决方案不足以应对时,才添加多步骤的代理系统。

在实现代理时,我们尝试遵循三个核心原则:

  • 确保代理设计简单
  • 通过明确显示代理的规划步骤来优先考虑透明度
  • 通过全面的工具文档和测试,精心打造你的代理-计算机界面(ACI)接口。

框架可以帮助你快速入手,但在进入生产环境时,不要犹豫减少抽象层,并尽量使用基本组件构建。遵循这些原则,你可以创建不仅强大而且可靠、可维护并被用户信任的代理。

 

致谢

由Erik Schluntz和Barry Zhang撰写。这项工作借鉴了我们在Anthropic构建代理的经验以及我们的客户分享的宝贵见解,我们对此深表感激。
Claude 官方发布《Agent 构建指南》(中文版) | AI工具集

获取《Agent 构建指南》PDF原文件,扫码关注回复:241222

 

附录1:实践中的代理

我们与客户的合作揭示了AI代理特别有前景的两个应用,展示了上述模式的实际价值。这两个应用都说明了代理对于需要对话和行动、有明确成功标准、能够反馈循环并整合有价值的人类监督的任务中最有价值。

A. 客户支持

客户支持结合了熟悉的聊天机器人界面,并通过工具集成增强了能力。这对于更开放式的代理来说是自然的场景,因为:

  • 遵循对话流程,互动自然,同时需要访问外部信息和操作;
  • 可以集成工具来提取客户数据、订单历史和知识库文章;
  • 可以以程序化的方式处理如发放退款或更新工单等操作;
  • 通过用户定义的解决方案,明确的地衡量agents 是否解决了该问题。

一些公司通过基于使用量的定价模型证明了这种方法的可行性,这些模型仅对成功的解决方案收费,展示了对他们代理有效性的信心。

B. 编码代理

软件开发领域显示出LLM功能的显著潜力,功能从代码补全演变到自主问题解决。代理特别有效,因为:

  • 代码问题的解决可以通过自动化测试来验证;
  • 代理可以使用测试结果作为反馈迭代解决方案;
  • 问题定义明确且结构化;
  • 输出质量可以客观衡量。

在我们自己的实现中,代理基于SWE-bench验证基准,能单独解决真实的GitHub问,。然而,尽管自动化测试有助于验证功能,但人类审查仍然至关重要,以确保解决方案符合更广泛的系统要求。

附录2:提示工程你的工具

无论您正在构建哪种代理系统,工具插件都可能是您代理的重要组成部分。工具使Claude能够通过在我们的API中指定它们的确切结构和定义来与外部服务和API交互。当Claude响应时,如果它计划调用工具,它将在API响应中包含一个工具使用块。工具定义和规范应该和整体提示一样,获得同样的提示工程关注。在这个简短的附录中,描述了如何对工具进行提示工程。

通常有几种方式可以指定相同的操作。例如,可以通过编写差异(diff)或重写整个文件来指定文件编辑。对于结构化输出,可以在Markdown或JSON中返回代码。在软件工程中,这些差异是表面的,并且可以无损地从一种格式转换为另一种格式。

然而,有些格式对于LLM来说比其他格式更难编写。编写差异(diff)需要在新代码编写之前就知道块头部有多少行在更改。在JSON中编写代码(与Markdown相比)需要对换行符和引号进行转义额外的转义。

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

  • 给模型足够的令牌,在它进入死胡同之前“思考”。
  • 保持格式接近在互联网上自然出现的文本。
  • 确保没有格式化“开销”,例如必须准确计算数千行代码,或对它编写的任何代码进行字符串转义。

一个经验是在人机界面(HCI)上投入了多少精力,就要投入同样的精力来创建良好的代理-计算机界面(ACI)。以下是如何做到这一点的一些想法:

  • 设身处地为模型着想。根据描述和参数,使用这个工具是否明显,还是需要仔细思考?一个好的工具定义通常包括示例用法、边界情况、输入格式要求以及与其他工具的明确界限。
  • 如何更改参数名称或描述以使任务更明显?将此视为为您团队的初级开发人员编写易读的说明文档那样。当使用许多类似的工具时,这一点尤其重要。
  • 测试模型如何使用您的工具:在我们的工作台上运行多个示例输入,来查模型犯了哪些错误,并进行迭代。
  • 为您的工具实施防错措施。更改参数,使其更难犯错误。

在构建SWE-bench代理时,Anthropic 实际上花在优化工具上的时间比优化整体提示还要多。例如,Anthropic 发现模型在使用相对文件路径的工具时会出错,尤其是在代理移出根目录之后。为了解决这个问题,将工具更改为始终要求使用绝对文件路径,我们发现模型完美地使用了这种方法。

© 版权声明

相关文章

暂无评论

暂无评论...