微信扫码
与创始人交个朋友
我要投稿
Datawhale干货
作者:Anthropic团队,编辑:PaperAgent
2025年将是Agentic系统之年。一切正在就位:Computer Use、MCP(模型上下文协议)、改进的工具使用。是时候开始考虑构建这些系统了。
Anthropic总结了2024年一些最佳实践,并分享了“如何构建有效的智能体(Building effective agents)”:
在过去的一年中,Anthropic与数十个跨行业的团队合作构建大型语言模型 (LLM) 智能体。最成功的实现始终没有使用复杂的框架或专门的库。相反,他们使用简单、可组合的模式进行构建。
什么是智能体(Agents)?
“Agent” 有多种定义。一些客户将Agent定义为完全自主的系统,它们可以在较长时间内独立运行,使用各种工具来完成复杂的任务。其他人则使用该术语来描述遵循预定义工作流程的更具规范性的实现。在 Anthropic,我们将所有这些变体归类为Agent系统,但在工作流程和Agent之间划出了一个重要的架构区别:
工作流是通过预定义的代码路径协调 LLM 和工具的系统。
另一方面,Agent是 LLM 动态指导其自身流程和工具使用情况的系统,从而保持对其完成任务的方式的控制。
使用 LLM 构建应用程序时,我们建议找到尽可能简单的解决方案,并且只在需要时增加复杂性。这可能意味着根本不要构建Agent系统。Agent系统通常会牺牲延迟和成本来换取更好的任务性能,您应该考虑这种权衡何时是合理的。
当需要更多复杂性时,工作流可以为明确定义的任务提供可预测性和一致性,而当需要大规模灵活性和模型驱动的决策时,Agent是更好的选择。然而,对于许多应用程序来说,使用检索和上下文示例优化单个 LLM 调用通常就足够了。
有许多框架可以使Agent系统更易于实现,其中包括:
LangChain 的LangGraph ;
Amazon Bedrock 的AI Agent 框架;
Rivet,一个拖放式 GUI LLM 工作流构建器;
Vellum,另一个用于构建和测试复杂工作流程的 GUI 工具。
这些框架简化了调用 LLM、定义和解析工具以及链接调用等标准低级任务,使入门变得容易。但是,它们通常会创建额外的抽象层,从而掩盖底层提示和响应,使调试变得更加困难。当更简单的设置就足够时,它们还会让人忍不住增加复杂性。
我们建议开发人员直接使用 LLM API:许多模式只需几行代码即可实现。如果您确实使用框架,请确保您了解底层代码。对底层内容的错误假设是客户错误的常见来源。
在本节中,我们将探讨在生产中看到的Agent系统的常见模式。我们将从基础构建块(增强型 LLM)开始,并逐步增加复杂性,从简单的组合工作流到自主Agent。
Agent系统的基本构建块是 LLM,它通过检索、工具和记忆等增强功能得到增强。我们当前的模型可以主动使用这些功能 — 生成自己的搜索查询、选择合适的工具并确定要保留哪些信息。
增强型LLM
我们建议重点关注实施的两个关键方面:根据您的具体用例定制这些功能,并确保它们为您的 LLM 提供简单、有据可查的界面。虽然有很多方法可以实现这些增强功能,但其中一种方法是通过我们最近发布的模型上下文协议,它允许开发人员通过简单的客户端实施与不断增长的第三方工具生态系统集成。
对于本文的其余部分,我们假设每个 LLM 调用都可以访问这些增强功能。
提示链将任务分解为一系列步骤,其中每个 LLM 调用都会处理前一个调用的输出。您可以在任何中间步骤上添加程序检查(参见下图中的“门”),以确保流程仍在正常进行。
提示链工作流程
何时使用此工作流程:此工作流程非常适合可以轻松、干净地将任务分解为固定子任务的情况。主要目标是通过使每次 LLM 调用都成为更简单的任务,以牺牲延迟换取更高的准确度。
提示链有用的示例:
生成营销文案,然后将其翻译成不同的语言。
撰写文档大纲,检查大纲是否符合某些标准,然后根据大纲撰写文档。
路由将输入分类并将其定向到专门的后续任务。此工作流程允许分离关注点并构建更专业的提示。如果没有此工作流程,针对一种输入进行优化可能会损害其他输入的性能。
路由工作流程
何时使用此工作流程:路由适用于复杂任务,其中存在不同的类别,最好分别处理,并且可以通过 LLM 或更传统的分类模型/算法准确处理分类。
路由有用的示例:
将不同类型的客户服务查询(一般问题、退款请求、技术支持)引导到不同的下游流程、提示和工具中。
将简单/常见问题路由到较小的模型(如 Claude 3.5 Haiku),将困难/不寻常的问题路由到功能更强大的模型(如 Claude 3.5 Sonnet),以优化成本和速度。
LLM 有时可以同时执行一项任务,并以编程方式汇总其输出。这种工作流程(并行化)体现在两个关键变化中:
分段:将任务分解为并行运行的独立子任务。
投票:多次运行相同的任务以获得不同的输出。
并行化工作流程
何时使用此工作流程:当划分的子任务可以并行化以提高速度,或者当需要多个视角或尝试以获得更高置信度的结果时,并行化是有效的。对于具有多个考虑因素的复杂任务,当每个考虑因素由单独的 LLM 调用处理时,LLM 通常会表现得更好,从而可以集中注意力于每个特定方面。
并行化有用的示例:
切片:
实施护栏,其中一个模型实例处理用户查询,而另一个模型实例则筛选不适当的内容或请求。这往往比让同一个 LLM 调用处理护栏和核心响应效果更好。
自动评估 LLM 性能,其中每个 LLM 调用都会根据给定提示评估模型性能的不同方面。
投票:
审查一段代码是否存在漏洞,其中几个不同的提示会审查该代码,如果发现问题则标记该代码。
评估给定的内容是否不适当,使用多个提示评估不同的方面或需要不同的投票阈值来平衡误报和误报。
在 orchestrator-workers 工作流中,中央 LLM 动态地分解任务,将其委托给 worker LLM,并综合其结果。
Orchestrator-workers 工作流程
何时使用此工作流程:此工作流程非常适合无法预测所需子任务的复杂任务(例如,在编码中,需要更改的文件数量以及每个文件中更改的性质可能取决于任务)。虽然它在拓扑上相似,但与并行化的主要区别在于其灵活性 - 子任务不是预先定义的,而是由编排器根据特定输入确定。
orchestrator-workers 有用的示例:
每次对多个文件进行复杂更改的编码产品。
搜索任务涉及收集和分析来自多个来源的信息以获取可能相关的信息。
在评估器-优化器工作流中,一个 LLM 调用生成一个响应,而另一个调用在循环中提供评估和反馈。
评估器-优化器工作流程
何时使用此工作流程:当我们有明确的评估标准,并且迭代改进提供可衡量的价值时,此工作流程特别有效。良好契合的两个标志是,首先,当人类表达他们的反馈时,LLM 的响应可以明显改善;其次,LLM 可以提供这样的反馈。这类似于人类作家在制作精美文档时可能经历的迭代写作过程。
评估器-优化器有用的示例:
文学翻译中存在译者 LLM 最初可能无法捕捉到的细微差别,但评估者 LLM 可以提供有用的批评。
复杂的搜索任务需要多轮搜索和分析才能收集全面的信息,然后评估人员决定是否有必要进行进一步搜索。
智能体Agents
随着 LLM 在关键功能(理解复杂输入、进行推理和规划、可靠地使用工具以及从错误中恢复)方面的日趋成熟,智能体正在投入生产。智能体通过人类用户的命令或与人类用户的互动讨论开始工作。一旦任务明确,智能体就会独立规划和操作,并可能返回人类那里获取更多信息或判断。在执行过程中,智能体必须从每个步骤(例如工具调用结果或代码执行)的环境中获得“基本事实”以评估其进度。然后,智能体可以在检查点或遇到阻碍时暂停以等待人类的反馈。任务通常在完成后终止,但通常也会包含停止条件(例如最大迭代次数)以保持控制。
智能体可以处理复杂的任务,但它们的实现通常很简单。它们通常只是使用基于环境反馈的工具的 LLM。因此,清晰、周到地设计工具集及其文档至关重要。
自主智能体
何时使用智能体:智能体可用于开放式问题,在这些问题中,很难或不可能预测所需的步骤数,并且您无法硬编码固定路径。LLM 可能会运行很多轮,您必须对其决策有一定程度的信任。智能体的自主性使其成为在受信任环境中扩展任务的理想选择。
智能体的自主性意味着更高的成本,以及出现复合错误的可能性。我们建议在沙盒环境中进行广泛的测试,并采用适当的防护措施。
智能体有用的例子:
以下示例来自我们自己的实现:
一个编码智能体,用于解决SWE-bench 任务,该任务涉及根据任务描述对许多文件进行编辑;
我们的“计算机使用”参考实现,其中 Claude 使用计算机来完成任务。
编码智能体的高级流程
组合和定制这些模式
这些构建块不是规定性的。它们是开发人员可以塑造和组合以适应不同用例的常见模式。与任何 LLM 功能一样,成功的关键是衡量性能和迭代实现。重复一遍:只有当它明显改善结果时,您才应该考虑增加复杂性。
在 LLM 领域取得成功并不在于构建最复杂的系统。而是在于构建适合您需求的系统。从简单的提示开始,通过综合评估对其进行优化,并且仅在较简单的解决方案不足时才添加多步骤智能体系统。
在实施智能体时,我们尝试遵循三个核心原则:
保持智能体设计的简单性。
通过明确展示智能体的计划步骤来优先考虑透明度。
通过全面的工具文档和测试精心设计您的智能体-计算机接口 (ACI) 。
框架可以帮助您快速入门,但在投入生产时,请毫不犹豫地减少抽象层并使用基本组件进行构建。通过遵循这些原则,您可以创建不仅功能强大而且可靠、可维护且受用户信任的智能体。
附录 1:实践中的Agent
我们与客户合作发现了两种特别有前景的人工智能智能体应用,它们证明了上述模式的实用价值。这两种应用都说明了智能体如何为需要对话和行动、具有明确的成功标准、启用反馈循环并集成有意义的人工监督的任务增加最大价值。
客户支持通过工具集成将熟悉的聊天机器人界面与增强的功能相结合。这对于更开放的智能体来说是自然而然的选择,因为:
支持交互自然遵循对话流,同时需要访问外部信息和操作;
可以集成工具来提取客户数据、订单历史记录和知识库文章;
退款或更新机票等操作可以通过编程方式处理;
可以通过用户定义的分辨率明确地衡量成功。
多家公司已通过基于使用情况的定价模式证明了此方法的可行性,该模式仅对成功的解决方案收费,显示出对其智能体效率的信心。
软件开发领域已显示出 LLM 功能的巨大潜力,其功能从代码完成发展到自主解决问题。Agent特别有效,因为:
代码解决方案可通过自动化测试进行验证;
Agent可以使用测试结果作为反馈来迭代解决方案;
问题空间定义明确、结构清晰;
输出质量可以客观衡量。
在我们自己的实现中,Agent现在可以仅根据拉取请求描述来解决SWE-bench Verified基准中的真实 GitHub 问题。然而,尽管自动化测试有助于验证功能,但人工审核对于确保解决方案符合更广泛的系统要求仍然至关重要。
无论您构建的是哪种Agent系统,工具都可能是Agent的重要组成部分。通过在我们的 API 中指定外部服务和 API 的确切结构和定义,工具使 Claude 能够与外部服务和 API 进行交互。当 Claude 响应时,如果它计划调用工具,它将在 API 响应中包含一个工具使用块。工具定义和规范应该像您的整体提示一样受到及时工程的关注。在这个简短的附录中,我们描述了如何及时工程您的工具。
通常有几种方法可以指定相同的操作。例如,您可以通过编写 diff 或重写整个文件来指定文件编辑。对于结构化输出,您可以在 markdown 或 JSON 中返回代码。在软件工程中,这些差异是表面的,可以无损地从一种格式转换为另一种格式。但是,对于 LLM 来说,某些格式比其他格式更难编写。编写 diff 需要知道在编写新代码之前块头中有多少行发生了变化。在 JSON 中编写代码(与 markdown 相比)需要额外转义换行符和引号。
我们对决定工具格式的建议如下:
在模型陷入困境之前,给予模型足够的标记来“思考”。
保持格式与模型在互联网上文本中自然出现的格式接近。
确保没有格式化“开销”,例如必须准确计数数千行代码,或者对其编写的任何代码进行字符串转义。
一个经验法则是考虑在人机界面 (HCI) 上投入了多少精力,并计划投入同样多的精力来创建良好的Agent-计算机界面 (ACI)。以下是一些关于如何做到这一点的想法:
站在模型的角度思考。根据描述和参数,这个工具的使用方法是否显而易见,还是需要仔细考虑?如果是这样,那么模型可能也是如此。良好的工具定义通常包括示例用法、极端情况、输入格式要求以及与其他工具的明确界限。
如何更改参数名称或描述以使事情更加明显?可以将其视为为团队中的初级开发人员编写出色的文档字符串。在使用许多类似工具时,这一点尤为重要。
测试模型如何使用您的工具:在我们的工作台中运行许多示例输入,以查看模型犯了哪些错误,然后进行迭代。
防错法。改变论据,这样就很难犯错误。
在为SWE-bench构建Agent时,我们花在优化工具上的时间实际上比花在整体提示上的时间还要多。例如,我们发现在Agent移出根目录后,模型在使用相对文件路径的工具时会出错。为了解决这个问题,我们将工具更改为始终需要绝对文件路径 — 我们发现模型完美地使用了这种方法。
https://github.com/anthropics/anthropic-cookbook/tree/main/patterns/agentshttps://www.anthropic.com/research/building-effective-agents
一起“点赞”三连↓
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-13
2024-08-21
2024-07-09
2024-08-04
2024-04-11
2024-06-13
2024-07-18
2024-07-01
2024-12-21
2024-12-21
2024-12-21
2024-12-16
2024-12-06
2024-12-03
2024-12-01
2024-11-29