翻译工具:gemini-exp-1206
原文链接:地址
官方仓库地址(代码 sample): 仓库
说明:
本文来自 Anthropic 官网,是所有大模型厂商,唯一对 agent 和 workflow 定义做详细分析的,有兴趣的朋友,建议直接看原文。非常值得一读(原文还附带插图)
顺便记录,根据文意推测,其中的 Workflow: Parallelization 应该就是现阶段 大模型审查的方式,这也解释了,为什么模型会输出一半 然后吞回,还有各家厂商训练 base-model 开源出来 并不见自带审查功能。
背景介绍,很多人觉得 Claude 官方过于低调,非常之奇怪,其实根据一些 Anthropic 创始人,及官方团队的访谈视频,他们主要是面向 商业公司,将模型 API 作为未来网络底层的基础,这才是他们的愿景,而另一条线 对一般个人用户 只是兼顾而已。(也因此,作为开发者,多关注 Anthropic 反而更有好处)
比如 他们最近放出的协议(或标准)Model context protocol (Think of MCP like a USB-C port for AI applications.)在本土厂商还在 单纯比模型参数,刷榜的时候,人家已经开始了 工业量化的前期准备。
构建高效智能体(Building effective agents)
2024 年 12 月 20 日
过去一年,我们与各行各业数十个团队合作构建了大语言模型(LLM)智能体 (agent)。我们发现,最成功的实现案例并非采用复杂的框架或专门的库,而是运用简单、可组合的模式。
本文将分享我们在与客户合作及自行构建智能体过程中所学到的经验,并为开发者构建高效智能体提供实用建议。
什么是智能体?
“智能体”(Agent)的定义多种多样。一些客户将智能体定义为完全自主的系统,能够在长时间内独立运行,并利用各种工具完成复杂任务。另一些客户则用它来描述遵循预定义工作流、更具规范性的实现。在 Anthropic,我们将所有这些变体都归类为智能体系统(agentic system),但在架构上对工作流和智能体做出了重要区分:
* 工作流(Workflows)是指通过预定义的代码路径来编排 LLM 和工具的系统。
* 智能体(Agents)则不同,它是由 LLM 动态指导自身流程和工具使用,并掌控如何完成任务的系统。
下文将详细探讨这两种类型的智能体系统。在附录 1(“智能体的实际应用”)中,我们将介绍客户发现使用这些系统特别有价值的两个领域。
## 何时(以及何时不)使用智能体
在使用 LLM 构建应用程序时,我们建议找到尽可能简单的解决方案,并且仅在必要时才增加复杂性。这可能意味着根本不构建智能体系统。智能体系统通常会牺牲延迟和成本来换取更好的任务性能,因此您应该考虑这种权衡何时才有意义。
当需要更高的复杂性时,工作流为定义明确的任务提供了可预测性和一致性,而当需要大规模的灵活性和模型驱动的决策时,智能体是更好的选择。然而,对于许多应用程序来说,通过检索和上下文示例来优化单个 LLM 调用通常就足够了。
何时以及如何使用框架
有许多框架可以使智能体系统更容易实现,包括:
* LangChain 的 LangGraph;
* Amazon Bedrock 的 AI Agent 框架;
* Rivet,一个拖放式图形用户界面(GUI)LLM 工作流构建器;以及
* Vellum,另一个用于构建和测试复杂工作流的图形用户界面(GUI)工具。
这些框架通过简化标准的低级任务(例如调用 LLM、定义和解析工具以及将调用链接在一起)来轻松入门。然而,它们通常会创建额外的抽象层,这可能会掩盖底层的提示和响应,从而使它们更难调试。它们还可能使人们倾向于在更简单的设置就足够时增加复杂性。
我们建议开发者首先直接使用 LLM API:许多模式可以在几行代码中实现。如果您确实使用了框架,请确保您了解底层代码。对底层原理的错误假设是客户错误的常见来源。
请参阅我们的示例手册以获取一些示例实现。
构建块、工作流和智能体
在本节中,我们将探讨我们在生产中看到的智能体系统的常见模式。我们将从基础构建块(增强型 LLM)开始,并逐步增加复杂性,从简单的组合式工作流到自主智能体。
构建块:增强型 LLM (Building block: The augmented LLM)
智能体系统的基本构建块是经过增强的 LLM,增强功能包括检索(Retrieval)、工具(Tools)和记忆(Memory)。我们目前的模型可以主动使用这些功能——生成自己的搜索查询、选择适当的工具以及确定要保留的信息。
增强型 LLM
我们建议关注实现的两个关键方面:根据您的特定用例定制这些功能,并确保它们为您的 LLM 提供一个简单、文档完善的接口。虽然有许多方法可以实现这些增强功能,但其中一种方法是通过我们最近发布的模型上下文协议(Model Context Protocol),该协议允许开发者通过简单的客户端实现与不断增长的第三方工具生态系统集成。
在本文的其余部分,我们将假设每次 LLM 调用都可以访问这些增强功能。
工作流:提示链
Prompt chaining
提示链(Prompt chaining)将任务分解成一系列步骤,其中每次 LLM 调用都会处理前一次调用的输出。您可以在任何中间步骤上添加程序化检查(请参见下图中的“关卡”(gate)),以确保流程仍在正轨上。
提示链工作流
**何时使用此工作流:** 当任务可以轻松、清晰地分解为固定的子任务时,此工作流非常理想。主要目标是通过使每次 LLM 调用成为更简单的任务来以延迟换取更高的准确性。
**提示链有用的示例:**
* 生成营销文案,然后将其翻译成不同的语言。
* 编写文档大纲,检查大纲是否符合特定标准,然后根据大纲编写文档。
工作流:路由
Workflow: Routing
路由(Routing)对输入进行分类,并将其定向到专门的后续任务。此工作流允许关注点分离,并构建更专业的提示。如果没有此工作流,针对一种输入进行优化可能会损害其他输入的性能。
路由工作流
**何时使用此工作流:** 路由非常适用于存在明显类别的复杂任务,这些类别最好单独处理,并且可以通过 LLM 或更传统的分类模型/算法准确地进行分类。
**路由有用的示例:**
* 将不同类型的客户服务查询(一般问题、退款请求、技术支持)定向到不同的下游流程、提示和工具。
* 将简单/常见问题路由到较小的模型(如 Claude 3.5 Haiku),将困难/不常见问题路由到功能更强大的模型(如 Claude 3.5 Sonnet),以优化成本和速度。
工作流:并行化
Workflow: Parallelization
LLM 有时可以同时处理一项任务,并以编程方式聚合其输出。这种工作流,即并行化(Parallelization),体现在两个关键变体中:
* **分段**(Sectioning):将任务分解为并行运行的独立子任务。
* **投票**(Voting):多次运行同一任务以获得不同的输出。
并行化工作流
**何时使用此工作流:** 当划分的子任务可以并行化以提高速度,或者当需要多个视角或尝试来获得更高置信度的结果时,并行化是有效的。对于具有多个考虑因素的复杂任务,当每个考虑因素由单独的 LLM 调用处理时,LLM 通常表现更好,从而可以集中关注每个特定方面。
**并行化有用的示例:**
* **分段:**
* 实施护栏,其中一个模型实例处理用户查询,而另一个模型实例筛选查询中的不当内容或请求。这往往比让同一个 LLM 调用同时处理护栏和核心响应表现更好。
* 自动化评估 LLM 性能的评估,其中每次 LLM 调用评估模型在给定提示上的性能的不同方面。
* **投票:**
* 审查一段代码是否存在漏洞,其中多个不同的提示会审查代码,并在发现问题时标记代码。
* 评估给定内容是否不当,其中多个提示评估不同的方面或需要不同的投票阈值来平衡误报和漏报。
工作流:编排器-工作器
Workflow: Orchestrator-workers
在编排器-工作器(Orchestrator-workers)工作流中,中央 LLM 动态分解任务,将任务委派给工作器 LLM,并综合它们的结果。
编排器-工作器工作流
**何时使用此工作流:** 此工作流非常适用于您无法预测所需子任务的复杂任务(例如,在编码中,需要更改的文件数量以及每个文件中更改的性质可能取决于任务)。虽然它在拓扑上相似,但与并行化的关键区别在于其灵活性——子任务不是预先定义的,而是由编排器根据特定输入确定的。
**编排器-工作器有用的示例:**
* 每次对多个文件进行复杂更改的编码产品。
* 涉及从多个来源收集和分析信息以获取可能的相干信息的搜索任务。
工作流:评估器-优化器
Workflow: Evaluator-optimizer
在评估器-优化器(Evaluator-optimizer)工作流中,一个 LLM 调用生成响应,而另一个 LLM 调用在循环中提供评估和反馈。
评估器-优化器工作流
**何时使用此工作流:** 当我们有明确的评估标准,并且当迭代改进可以提供可衡量的价值时,此工作流特别有效。适合的两个迹象是,首先,当人类阐明他们的反馈时,LLM 响应可以得到明显的改进;其次,LLM 可以提供此类反馈。这类似于人类作家在制作精美文档时可能会经历的迭代写作过程。
**评估器-优化器有用的示例:**
* 文学翻译,其中存在翻译器 LLM 最初可能无法捕获的细微差别,但评估器 LLM 可以提供有用的批评。
* 复杂的搜索任务,需要多轮搜索和分析才能收集全面的信息,其中评估器决定是否需要进一步搜索。
智能体 Agents
随着 LLM 在关键功能(理解复杂输入、参与推理和规划、可靠地使用工具以及从错误中恢复)方面的成熟,智能体正在生产中出现。智能体通过人类用户的命令或交互式讨论开始其工作。一旦任务明确,智能体就会独立规划和运行,可能会返回给人类以获取更多信息或判断。在执行过程中,智能体在每个步骤中从环境中获取“基本事实”(例如工具调用结果或代码执行)以评估其进度至关重要。然后,智能体可以在检查点或遇到障碍时暂停以获取人类反馈。任务通常在完成后终止,但通常也会包含停止条件(例如最大迭代次数)以保持控制。
智能体可以处理复杂的任务,但它们的实现通常很简单。它们通常只是在循环中根据环境反馈使用工具的 LLM。因此,设计工具集及其文档非常重要。我们在附录 2(“提示工程您的工具”)中详细介绍了工具开发的最佳实践。
自主智能体
**何时使用智能体:** 智能体可用于难以或无法预测所需步骤数量的开放式问题,以及您无法硬编码固定路径的问题。LLM 可能会运行许多轮次,并且您必须对其决策有一定的信任度。智能体的自主性使其非常适合在受信任的环境中扩展任务。
智能体的自主性意味着更高的成本,以及错误累积的可能性。我们建议在沙盒环境中进行广泛的测试,以及适当的护栏。
**智能体有用的示例:**
以下示例来自我们自己的实现:
* 解决 SWE-bench 任务的编码智能体,该任务涉及根据任务描述对许多文件进行编辑;
* 我们的“计算机使用”参考实现,其中 Claude 使用计算机来完成任务。
编码智能体的高级流程
组合和定制这些模式
这些构建块不是规定性的。它们是开发者可以根据不同的用例进行塑造和组合的常见模式。与任何 LLM 功能一样,成功的关键在于衡量性能并迭代实现。重申一下:只有当复杂性能够明显改善结果时,您才应该考虑增加复杂性。
总结
在 LLM 领域取得成功并不是要构建最复杂的系统,而是要构建适合您需求的系统。从简单的提示开始,通过全面的评估对其进行优化,并且仅在更简单的解决方案不足时才添加多步智能体系统。
在实现智能体时,我们尝试遵循三个核心原则:
- 保持智能体设计的简单性。
- 通过明确显示智能体的规划步骤来优先考虑透明度。
- 通过全面的工具文档和测试仔细制作您的智能体-计算机接口(ACI)。
框架可以帮助您快速入门,但不要犹豫,在进入生产环境时减少抽象层并使用基本组件进行构建。通过遵循这些原则,您可以创建不仅强大而且可靠、可维护且受其用户信任的智能体。
好文!Agent这块我也在研究