大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之路不迷路,2024我们一起变强。
AI领域正在、已经兴起一股AI Agent的潮流。
老粉们对于AI Agent这个词应该不陌生。这一年来我写过太多关于AI Agent的文章,有技术向的介绍,如:
-
万字长文!AI Agent架构概况:关于推理、规划和工具调用 -
『深度长文』吴恩达:AI Agent 4种最常见的设计模式 -
让LLM和AI Agent更聪明:微软开源基于知识图谱的GraphRAG!
也有应用向的,如:
-
字节开发的Coze进阶使用:用免费的GPT4打造一个专属的新闻播报机器人!附教程及提示词Prompt -
Kimi智能体平台——Kimi+的正确打开方式! -
这12个AI Agent平台,专为被字节跳动Coze“封号”的你!
更多的文章可以在公众号搜索栏里搜索关键词AI Agent
或智能体
。
AI Agent在即将过去的2024年发展迅猛。站在2024年底的这个时间点,看过去一年AI Agent的发展,会有不同的感悟。今天就以Anthropic(开发Claude大模型以及Claude.ai的公司)最近一篇关于AI Agent的研究文章为引,再来聊一聊AI Agent。文末我也会附上Anthropic这篇文章的中文版全文。
什么是AI Agent?
AI Agent,国内又名智能体,比较书面的定义为:一种具备自主性、灵活性和控制力的AI系统,它能够根据环境反馈动态地指导自身流程和工具使用,以完成复杂的、开放式的任务。
在Anthropic看来,智能体(Agents)和工作流(Workflows)是两个概念。工作流通过预定义的代码路径编排大模型(LLMs)和工具(tools)。在工作流中,任务执行的步骤是事先设定好的,LLM按照固定流程执行。
智能体则由LLM动态地指导其自身流程和工具使用。这意味着,智能体能够根据任务的需要,自主决定执行的步骤、选择和使用工具,并对整个过程进行控制,而不需要预先设定好的执行路径。确切来说,智能体相较工作流是一种更高级、更灵活自主的系统。
Less is more
Anthropic多次强调了“Less is more”这个观点。
“Less is more”(少即是多)是德国建筑师路德维希·密斯·凡德罗(Ludwig Mies van der Rohe)于1928年提出的设计理念。在AI Agent领域,则有两重含义。
-
智能体的必要性
一切不基于实际应用场景的需求都是耍流氓。智能体虽然听起来高大上,但它的实现通常会牺牲延迟(响应速度)和成本,这也就意味着,并不是所有的任务都需要构建智能体来解决。
-
智能体并不是越复杂越好
简单,简单,还是简单。在过去的一年里,Anthropic构建了多个跨行业的智能体。一致的是,最成功的实现并没有使用复杂的框架或专门的库。相反,他们使用的是简单 (Simple)、可组合 (composable) 的模式进行构建。
基于此,Anthropic建议开发人员首先直接使用LLM API进行智能体的构建,许多模式可以用几行代码实现。
工作流和智能体的主流设计模式
1. 增强型 LLM
我在之前的文章中强调过,大模型和Agents之间最大的区别之一就是“工具调用”(Tool Use)。最典型的例子:大模型本身没有联网搜索的能力,有了工具调用的加持,大模型能够换身为Agent智能体,先搜索,后回答。某种意义上来说,大多数AI搜索工具本质上都是一个大号的AI Agent。
2. 提示链 (Prompt chaining)
如果一个复杂任务能够被明确拆分为多个子任务,提示链(Prompt chaining) 就非常适合了。Coze中的工作流(Workflow)编排就是属于这种,先将多步任务分解,每一步的输出(Output)可能成为下一步的输入(Input),由大模型整合得到最终答案。
3. 路由 (Routing)
Anthropic的路由(Routing) 这一分类从学科或者更容易理解的角度来说,对应的其实是Agent的规划(Planning) 能力。在路由中,基于预定义的规则将复杂问题进行分类,然后把各个任务分配,可以理解为“分流”。
4. 并行化 (Parallelization)
一个任务由多个大模型同时进行处理,或分段同时处理,或整体同时处理,这个技术称为并行化(Parallelization)。并行化的好处不言而喻,首先是响应速度快,其次是质量高。分段并行可以简单理解为现实世界中的流水线作业,效率必然是优于单体作业的。
5. 编排器-工作器 (Orchestrator-workers)
编排看起来和前面提过的“路由”很像,都是将复杂问题拆解、分类这么一种方法,但其实大有区别。路由是基于预定义的规则进行分类,这个规则是提前确定的(静态的)。而编排则是由LLM动态地将任务分解成多个子任务,并将这些子任务分配给不同的工作器LLM,这个决策是高度动态的。这里不难联想到我在之前的文章里介绍过的Agent设计中常见的“多智能体”(Multi Agent Architectures)架构。
6. 评估器-优化器 (Evaluator-optimizer)
评估器-优化器则对应着Agent的反馈(Reflection)能力。这种设计由一个额外增加的反馈器LLM实现,遵循人类真实世界中的“反馈-优化”流程,最终能够实现AI Agent的自我反思,从而优化了输出结果。
7. 智能体(Agents)
智能体,以上各种工作流的进阶版本。智能体(Agents)是一个高度自主的系统,其核心特征在于能够动态规划任务路径并灵活使用工具完成任务。
Anthropic在这里提到的智能体并不是当前大多数只能完成简单任务的“单智能体”,而是描绘了一幅更加宏大的蓝图。从人类用户的指令或互动中明确任务目标;自主制定计划,动态调用工具完成任务;根据工具结果或环境反馈调整任务路径,可在人类协助下优化;完成任务后返回结果,或在设定条件下停止操作。
从Anthropic近几个月更新的两项新技术就能看出些许端倪:能直接操控电脑的Computer Use功能以及能直接和第三方应用交互的MCP(Model Context Protocol)协议。
以下是Anthropic研究文章全文的中文翻译版本,供小伙伴们学习交流使用。
由于文章本身很长,附上一张总结图。
Building effective agents
构建高效智能体 (Agents)
在过去的一年里,我们与数十个团队合作,构建了跨行业的大型语言模型 (LLM) 智能体。一致的是,最成功的实现并没有使用复杂的框架或专门的库。相反,他们使用的是简单 (Simple)、可组合 (composable) 的模式进行构建。
在这篇文章中,我们将分享从与客户合作和自己构建智能体中学到的经验,并为开发人员提供构建高效智能体的实用建议。
什么是智能体 (Agents)?
“智能体” 可以有多种定义方式。一些客户将智能体定义为完全自主的系统,它们可以独立运行很长时间,使用各种工具来完成复杂的任务。另一些客户则使用该术语来描述遵循预定义工作流程的更规范的实现。在 Anthropic,我们将所有这些变体都归类为智能体系统,但在工作流程和智能体之间做了一个重要的架构区分:
-
工作流程是指 LLM 和工具通过预定义的代码路径进行编排的系统。 -
另一方面,智能体是指 LLM 动态指导其自身流程和工具使用,并保持对如何完成任务的控制的系统。
下面,我们将详细探讨这两种类型的智能体系统。在附录 1(“实践中的智能体”)中,我们描述了客户发现使用这些系统特别有价值的两个领域。
何时(以及何时不)使用智能体
在使用 LLM 构建应用程序时,我们建议找到尽可能简单的解决方案,并且仅在需要时才增加复杂性。这可能意味着根本不构建智能体系统。智能体系统通常会牺牲延迟和成本来换取更好的任务性能,您应该考虑这种权衡何时有意义。
当需要更多复杂性时,工作流程为定义明确的任务提供可预测性和一致性,而当需要大规模的灵活性和模型驱动的决策时,智能体是更好的选择。然而,对于许多应用程序来说,使用检索和上下文示例优化单个 LLM 调用通常就足够了。
何时以及如何使用框架
有许多框架可以使智能体系统更容易实现,包括:
-
LangChain 的 LangGraph; -
Amazon Bedrock 的 AI Agent 框架; -
Rivet,一个拖放式 GUI LLM 工作流程构建器;以及 -
Vellum,另一个用于构建和测试复杂工作流程的 GUI 工具。
这些框架通过简化标准底层任务(如调用 LLM、定义和解析工具以及将调用链接在一起)来轻松入门。然而,它们通常会创建额外的抽象层,这可能会模糊底层的提示和响应,使它们更难调试。它们还可能诱使您在更简单的设置就足够的情况下增加复杂性。
我们建议开发人员首先直接使用 LLM API:许多模式可以用几行代码实现。如果您确实使用了框架,请确保您了解底层代码。对幕后情况的错误假设是客户错误的常见来源。
有关一些示例实现,请参阅我们的示例代码库 (https://github.com/anthropics/anthropic-cookbook)。
构建块、工作流程和智能体
在本节中,我们将探讨我们在生产中看到的智能体系统的常见模式。我们将从我们的基础构建块——增强型 LLM——开始,并逐步增加复杂性,从简单的组合工作流程到自主智能体。
构建块:增强型 LLM
智能体系统的基本构建块是增强了检索、工具和内存等功能的 LLM。我们当前的模型可以主动使用这些功能——生成自己的搜索查询、选择适当的工具以及确定要保留的信息。
我们建议重点关注实现的两个关键方面:根据您的特定用例定制这些功能,并确保它们为您的 LLM 提供一个简单、文档齐全的接口。虽然有很多方法可以实现这些增强功能,但一种方法是通过我们最近发布的模型上下文协议 (https://docs.anthropic.com/claude/docs/model-context-protocol),该协议允许开发人员通过简单的客户端实现与不断增长的第三方工具生态系统集成。
在本文的其余部分,我们将假设每个 LLM 调用都可以访问这些增强功能。
工作流程:提示链 (Prompt chaining)
提示链将任务分解为一系列步骤,其中每个 LLM 调用都处理前一个调用的输出。您可以在任何中间步骤上添加程序检查(参见下图中的“门”),以确保流程仍在轨道上。
何时使用此工作流程: 当任务可以轻松、干净地分解为固定的子任务时,此工作流程非常理想。主要目标是通过使每个 LLM 调用成为更简单的任务来权衡延迟以获得更高的准确性。
提示链有用的示例:
-
生成营销文案,然后将其翻译成不同的语言。 -
撰写文档大纲,检查大纲是否符合特定标准,然后根据大纲撰写文档。
工作流程:路由 (Routing)
路由对输入进行分类并将其定向到专门的后续任务。此工作流程允许关注点分离,并构建更专业的提示。没有此工作流程,针对一种输入进行优化可能会损害其他输入的性能。
何时使用此工作流程: 路由非常适合处理存在不同类别的复杂任务,这些类别最好单独处理,并且可以通过 LLM 或更传统的分类模型/算法准确处理分类。
路由有用的示例:
-
将不同类型的客户服务查询(一般问题、退款请求、技术支持)定向到不同的下游流程、提示和工具。 -
将简单/常见的问题路由到较小的模型(如 Claude 3.5 Haiku),将困难/不常见的问题路由到功能更强大的模型(如 Claude 3.5 Sonnet),以优化成本和速度。
工作流程:并行化 (Parallelization)
LLM 有时可以同时处理一项任务,并以编程方式聚合其输出。这种工作流程,即并行化,体现在两个关键变体中:
-
分段 (Sectioning): 将任务分解为并行运行的独立子任务。 -
投票 (Voting): 多次运行同一任务以获得不同的输出。
何时使用此工作流程: 当可以并行化划分的子任务以提高速度时,或者当需要多个视角或尝试以获得更高置信度的结果时,并行化是有效的。对于具有多个考虑因素的复杂任务,当每个考虑因素都由单独的 LLM 调用处理时,LLM 通常表现更好,从而可以集中精力处理每个特定方面。
并行化有用的示例:
-
分段: -
实施护栏,其中一个模型实例处理用户查询,而另一个模型实例筛选它们是否存在不当内容或请求。这往往比让同一个 LLM 调用同时处理护栏和核心响应表现更好。 -
自动化评估 LLM 性能的评估,其中每个 LLM 调用评估模型在给定提示上的性能的不同方面。 -
投票: -
审查一段代码是否存在漏洞,其中几个不同的提示会审查代码并在发现问题时标记代码。 -
评估给定内容是否不适当,多个提示评估不同的方面或需要不同的投票阈值来平衡误报和漏报。
工作流程:编排器-工作器 (Orchestrator-workers)
在编排器-工作器工作流程中,中央 LLM 动态分解任务,将它们委派给工作器 LLM,并综合它们的结果。
何时使用此工作流程: 此工作流程非常适合您无法预测所需子任务的复杂任务(例如,在编码中,需要更改的文件数量和每个文件中更改的性质可能取决于任务)。虽然它在拓扑上相似,但与并行化的关键区别在于它的灵活性——子任务不是预定义的,而是由编排器根据特定输入确定的。
编排器-工作器有用的示例:
-
编码产品,每次对多个文件进行复杂的更改。 -
搜索任务,涉及从多个来源收集和分析信息以获取可能的相关信息。
工作流程:评估器-优化器 (Evaluator-optimizer)
在评估器-优化器工作流程中,一个 LLM 调用生成响应,而另一个 LLM 调用在循环中提供评估和反馈。
何时使用此工作流程: 当我们有明确的评估标准,并且当迭代改进提供可衡量价值时,此工作流程特别有效。适合的两个迹象是,首先,当人类阐明他们的反馈时,LLM 的响应可以得到明显改善;其次,LLM 可以提供此类反馈。这类似于人类作家在制作精美文档时可能经历的迭代写作过程。
评估器-优化器有用的示例:
-
文学翻译,其中存在翻译 LLM 最初可能无法捕捉到的细微差别,但评估器 LLM 可以提供有用的批评。 -
复杂的搜索任务,需要多轮搜索和分析才能收集到全面的信息,由评估器决定是否需要进一步搜索。
智能体 (Agents)
随着 LLM 在关键功能(理解复杂输入、进行推理和规划、可靠地使用工具以及从错误中恢复)方面的成熟,智能体正在生产中出现。智能体通过人类用户的命令或交互式讨论开始工作。一旦任务明确,智能体就会独立计划和运行,可能会返回给人类以获取更多信息或判断。在执行过程中,智能体在每个步骤中从环境中获取“基本事实”(例如工具调用结果或代码执行)以评估其进度至关重要。然后,智能体可以在检查点或遇到障碍时暂停以获取人类反馈。任务通常在完成后终止,但通常也包括停止条件(例如最大迭代次数)以保持控制。
智能体可以处理复杂的任务,但它们的实现通常很简单。它们通常只是在循环中使用基于环境反馈的工具的 LLM。因此,清晰、周到地设计工具集及其文档至关重要。我们在附录 2(“提示工程化您的工具”)中扩展了工具开发的最佳实践。
何时使用智能体: 智能体可用于开放式问题,在这些问题中难以或无法预测所需的步骤数,并且您无法硬编码固定路径。LLM 可能会运行多次,并且您必须对其决策制定有一定程度的信任。智能体的自主性使其非常适合在受信任的环境中扩展任务。
智能体的自主性意味着更高的成本,以及潜在的复合错误。我们建议在沙盒环境中进行广泛的测试,以及适当的护栏。
智能体有用的示例:
以下示例来自我们自己的实现:
-
一个解决 SWE-bench 任务的编码智能体,该任务涉及根据任务描述对许多文件进行编辑; -
我们的“计算机使用”参考实现,其中 Claude 使用计算机来完成任务。
组合和定制这些模式
这些构建块不是规定性的。它们是开发人员可以根据不同用例进行调整和组合的常见模式。与任何 LLM 功能一样,成功的关键在于衡量性能和迭代实现。重复一遍:只有在能够显著改善结果时,您才应该考虑增加复杂性。
总结
在 LLM 领域取得成功并不是要构建最复杂的系统。而是要为您的需求构建合适的系统。从简单的提示开始,通过全面的评估对其进行优化,并且仅在更简单的解决方案不足时才添加多步智能体系统。
在实现智能体时,我们尝试遵循三个核心原则:
-
保持智能体设计的简单性。 -
通过明确显示智能体的规划步骤来优先考虑透明度。 -
通过全面的工具文档和测试来精心设计您的智能体-计算机接口 (ACI)。
框架可以帮助您快速入门,但在转向生产时,不要犹豫,减少抽象层并使用基本组件进行构建。通过遵循这些原则,您可以创建不仅强大而且可靠、可维护且受用户信任的智能体。
致谢
由 Erik Schluntz 和 Barry Zhang 撰写。这项工作借鉴了我们在 Anthropic 构建智能体的经验以及客户分享的宝贵见解,我们对此深表感谢。
附录 1:实践中的智能体
我们与客户的合作揭示了 AI 智能体的两个特别有前途的应用,这些应用证明了上述模式的实用价值。这两个应用都说明了智能体如何为需要对话和操作、具有明确成功标准、启用反馈循环以及集成有意义的人类监督的任务增加最大价值。
A. 客户支持
客户支持将熟悉的聊天机器人界面与通过工具集成增强的功能相结合。这非常适合更开放式的智能体,因为:
-
支持交互自然地遵循对话流程,同时需要访问外部信息和操作; -
可以集成工具来提取客户数据、订单历史记录和知识库文章; -
可以以编程方式处理诸如发放退款或更新工单之类的操作;并且 -
可以通过用户定义的解决方案明确衡量成功。
一些公司已经通过仅对成功解决收费的基于使用量的定价模式证明了这种方法的可行性,这表明了他们对智能体有效性的信心。
B. 编码智能体
软件开发领域已经展现出 LLM 功能的巨大潜力,其能力从代码完成发展到自主解决问题。智能体特别有效,因为:
-
可以通过自动化测试验证代码解决方案; -
智能体可以使用测试结果作为反馈来迭代解决方案; -
问题空间是明确定义的和结构化的;并且 -
可以客观地衡量输出质量。
在我们自己的实现中,智能体现在可以根据拉取请求描述单独解决 SWE-bench Verified 基准测试中的实际 GitHub 问题。然而,尽管自动化测试有助于验证功能,但人工审查对于确保解决方案与更广泛的系统要求保持一致仍然至关重要。
附录 2:提示工程化您的工具
无论您正在构建哪种智能体系统,工具都可能是您智能体的重要组成部分。工具使 Claude 能够通过在我们的 API 中指定其确切结构和定义来与外部服务和 API 进行交互。当 Claude 响应时,如果它计划调用工具,它将在 API 响应中包含一个工具使用块。工具定义和规范应该像您的总体提示一样受到提示工程的重视。在这个简短的附录中,我们将介绍如何提示工程化您的工具。
通常有几种方法可以指定相同的操作。例如,您可以通过编写差异或重写整个文件来指定文件编辑。对于结构化输出,您可以在 Markdown 或 JSON 中返回代码。在软件工程中,像这样的差异是表面上的,并且可以无损地从一个转换为另一个。然而,某些格式对于 LLM 来说比其他格式要困难得多。编写差异需要在编写新代码之前知道块头中更改的行数。在 JSON 中编写代码(与 Markdown 相比)需要对换行符和引号进行额外的转义。
我们对决定工具格式的建议如下:
-
在模型陷入困境之前,给它足够的标记来“思考”。 -
使格式接近模型在互联网上的文本中自然看到的内容。 -
确保没有格式“开销”,例如必须准确计算数千行代码,或对其编写的任何代码进行字符串转义。
一个经验法则是考虑在人机界面 (HCI) 中投入了多少精力,并计划在创建良好的智能体-计算机接口 (ACI) 方面投入同样多的精力。以下是一些关于如何做到这一点的想法:
-
设身处地为模型着想。根据描述和参数,使用此工具是否显而易见,或者您是否需要仔细考虑?如果是这样,那么对于模型来说可能也是如此。一个好的工具定义通常包括示例用法、边缘情况、输入格式要求以及与其他工具的明确界限。 -
您如何更改参数名称或描述以使事情更明显?将此视为为您团队中的初级开发人员编写一个出色的文档字符串。当使用许多类似的工具时,这一点尤其重要。 -
测试模型如何使用您的工具:在我们的工作台中运行许多示例输入以查看模型犯了哪些错误,并进行迭代。 -
防呆您的工具。更改参数,使其更难犯错误。
在构建我们的 SWE-bench 智能体时,我们实际上花了更多时间来优化我们的工具而不是总体提示。例如,我们发现在智能体移出根目录后,使用相对文件路径的工具会出现错误。为了解决这个问题,我们将工具更改为始终需要绝对文件路径——我们发现模型完美地使用了这种方法。
原文地址
https://www.anthropic.com/research/building-effective-agents
(文:AI信息Gap)