原文:Agents | Chip Huyen

作者:Chip Huyen | 2025年1月7日


智能代理被许多人认为是 AI 的终极目标。Stuart Russell 和 Peter Norvig 合著的经典教材 《人工智能:一种现代方法》(Prentice Hall, 1995)将 AI 研究领域定义为”理性智能体的研究与设计”。

基础模型(Foundation Model)前所未有的能力为以往难以想象的智能体应用打开了大门。这些新能力使得开发自主的智能代理成为可能——它们可以充当我们的助手、同事和教练。它们可以帮助我们创建网站、收集数据、规划旅行、进行市场调研、管理客户账户、自动化数据录入、为面试做准备、面试候选人、协商交易等。应用场景几乎无穷无尽,这些智能体的潜在经济价值巨大。

本文将从智能体的概述开始,然后深入探讨决定智能体能力的两个关键方面:工具规划。智能体的新运作模式也带来了新的失败模式。本文将以讨论如何评估智能体以发现这些失败来收尾。

本文改编自 《AI Engineering》(2025)一书中的智能体章节,做了少量修改使其可以独立阅读。

说明:

  1. AI 驱动的智能体是一个新兴领域,尚无成熟的理论框架来定义、开发和评估它们。本文是基于现有文献构建框架的最大努力,但会随着该领域的发展而演进。相比本书的其他部分,这一章节更具实验性。我从早期审稿人那里获得了有益的反馈,也希望能从博客读者那里获得反馈。
  2. 就在本书出版前,Anthropic 发布了一篇关于构建高效智能体的博客文章(2024年12月)。我很高兴看到 Anthropic 的文章与我的智能体章节在概念上一致,虽然术语略有不同。但 Anthropic 的文章侧重于孤立的模式,而我的文章则更深入地探讨了原理和方法论。我还更加关注规划、工具选择和失败模式。
  3. 本文包含大量背景知识。如果感觉过于深入细节,请随意跳读!

智能体概述

“智能体”(Agent)这个术语在许多不同的工程领域中使用过,包括但不限于软件代理、智能代理、用户代理(User Agent)、对话代理和强化学习代理。那么,智能体到底是什么?

智能体是任何能够感知其环境并对该环境采取行动的实体。 《人工智能:一种现代方法》(1995)将智能体定义为:任何可以被视为通过传感器感知环境、并通过执行器作用于环境的实体。

这意味着智能体的特征由其所在的环境和它能执行的动作集合来定义。

智能体运行的环境由其用例定义。如果一个智能体是为玩游戏开发的(如 Minecraft、围棋、Dota),那么该游戏就是它的环境。如果你想让一个智能体从互联网上抓取文档,那么互联网就是它的环境。自动驾驶汽车智能体的环境则是道路系统及其周边区域。

AI 智能体能够执行的动作集合通过它可以访问的工具来扩展。你日常使用的许多生成式 AI 应用都是拥有工具访问权的智能体,尽管它们比较简单。ChatGPT 就是一个智能体——它可以搜索网页、执行 Python 代码和生成图像。RAG(检索增强生成)系统也是智能体——文本检索器、图像检索器和 SQL 执行器都是它们的工具。

智能体的环境和工具集之间存在很强的依赖关系。环境决定了智能体可以使用哪些工具。例如,如果环境是国际象棋游戏,智能体唯一可能的动作就是合法的棋步。然而,智能体的工具库也限制了它能运行的环境。例如,如果一个机器人唯一的动作是游泳,它就只能在水环境中活动。

图 6-8 展示了 SWE-agent(Yang et al., 2024)的可视化,这是一个基于 GPT-4 构建的智能体。它的环境是带有终端和文件系统的计算机。它的动作集包括浏览代码仓库、搜索文件、查看文件和编辑代码行。

图 6-8. SWE-agent 是一个编程智能体,其环境是计算机,动作包括导航、搜索、查看文件和编辑

图 6-8. SWE-agent 是一个编程智能体,其环境是计算机,动作包括导航、搜索、查看文件和编辑。

AI 智能体旨在完成通常由用户提出的任务。在 AI 智能体中,AI 是处理任务、规划实现任务的动作序列、并判断任务是否完成的”大脑”。

让我们回到前面提到的含有表格数据的 RAG 系统 Kitty Vogue 示例。这是一个拥有三个动作的简单智能体:

  • 响应生成
  • SQL 查询生成
  • SQL 查询执行

给定查询 "预测 Fruity Fedora 未来三个月的销售收入",智能体可能执行以下动作序列:

  1. 推理如何完成该任务。它可能决定要预测未来的销售,首先需要过去五年的销售数据。智能体的推理过程可以作为中间响应展示。
  2. 调用 SQL 查询生成,生成获取过去五年销售数据的查询。
  3. 调用 SQL 查询执行来执行该查询。
  4. 推理工具输出(SQL 查询执行的结果)以及它们对销售预测的帮助。它可能判断这些数据不足以做出可靠的预测(可能因为存在缺失值),然后决定还需要过去营销活动的信息。
  5. 调用 SQL 查询生成,生成获取过去营销活动数据的查询。
  6. 调用 SQL 查询执行
  7. 推理这些新信息足以帮助预测未来销售,然后生成预测。
  8. 推理任务已成功完成。

与非智能体用例相比,智能体通常需要更强大的模型,原因有二:

  • 复合错误:智能体通常需要执行多个步骤来完成任务,随着步骤增加,整体准确率会下降。如果模型每步准确率为 95%,经过 10 步后准确率将降至 60%,经过 100 步后准确率仅为 0.6%。
  • 更高风险:通过访问工具,智能体能够执行更高影响力的任务,但任何失败都可能带来更严重的后果。

需要多步骤的任务可能会消耗大量时间和金钱。一个常见的抱怨是,智能体只擅长烧掉你的 API 额度。然而,如果智能体能够自主运行,它们可以节省人力时间,使其成本物有所值。

给定一个环境,智能体的成功取决于它能够访问的工具AI 规划器的能力。让我们先看看模型可以使用的不同类型的工具,然后再分析 AI 的规划能力。

工具

系统不一定需要外部工具才能成为智能体。但是,没有外部工具的话,智能体的能力会非常有限。模型本身通常只能执行一种操作——LLM 可以生成文本,图像生成器可以生成图像。外部工具使智能体的能力大幅增强。

工具帮助智能体感知环境和作用于环境。允许智能体感知环境的操作是只读操作,而允许智能体作用于环境的操作是写操作

智能体可以访问的工具集合就是它的工具库(Tool Inventory)。由于工具库决定了智能体的能力,因此思考给智能体配备什么工具以及多少工具非常重要。更多的工具赋予智能体更多的能力,但工具越多,理解和有效使用它们就越困难。需要通过实验找到合适的工具组合,这将在后面的”工具选择”部分讨论。

根据智能体的环境,可能存在多种工具。以下是你可能需要考虑的三类工具:知识增强(即上下文构建)、能力扩展,以及让智能体作用于其环境的工具。

知识增强

希望本书到此为止已经让你认识到,相关上下文对于模型响应质量的重要性。一类重要的工具是帮助增强智能体知识的工具。其中一些已经讨论过:文本检索器、图像检索器和 SQL 执行器。其他潜在的工具包括内部人员搜索、返回不同产品状态的库存 API、Slack 检索、邮件阅读器等。

许多这类工具用组织的私有流程和信息来增强模型。但是,工具也可以让模型访问公开信息,特别是来自互联网的信息。

网页浏览是最早也是最受期待的被整合到 ChatGPT 中的能力之一。网页浏览可以防止模型过时。当模型的训练数据变得过时时,模型就会”过期”。如果模型的训练数据截止到上周,它将无法回答需要本周信息的问题(除非该信息在上下文中提供)。没有网页浏览功能,模型无法告诉你天气、新闻、即将到来的活动、股票价格、航班状态等信息。

这里,我用”网页浏览”作为一个总称,涵盖所有访问互联网的工具,包括网页浏览器以及搜索 API、新闻 API、GitHub API 和社交媒体 API 等各种接口。

虽然网页浏览可以让你的智能体引用最新信息以生成更好的响应并减少幻觉(Hallucination),但它也可能让你的智能体暴露于互联网上的不良内容之中。请谨慎选择你的互联网 API。

能力扩展

你还可以考虑那些解决 AI 模型固有局限性的工具。这些是提升模型性能的简便方法。例如,AI 模型在数学计算方面是出了名的差。如果你问模型 199,999 除以 292 是多少,模型可能会算错。但如果模型能够使用计算器,这个计算就是微不足道的。与其试图训练模型擅长算术,不如直接给模型一个工具——这样更节省资源。

其他可以显著提升模型能力的简单工具包括:日历、时区转换器、单位转换器(例如从磅到千克)以及翻译器(可以翻译模型不擅长的语言)。

更复杂但强大的工具是代码解释器(Code Interpreter)。与其训练模型理解代码,你可以给它一个代码解释器来执行代码、返回结果或分析代码的错误。这种能力让你的智能体可以充当编程助手、数据分析师,甚至是可以编写代码运行实验并报告结果的研究助手。但是,自动化代码执行伴随着代码注入攻击的风险。适当的安全措施对于保护你和用户的安全至关重要。

工具可以将纯文本或纯图像模型转变为多模态模型。例如,一个只能生成文本的模型可以利用文本到图像模型作为工具,从而同时生成文本和图像。给定一个文本请求,智能体的 AI 规划器决定是调用文本生成、图像生成,还是两者兼用。这就是 ChatGPT 能够同时生成文本和图像的原理——它使用 DALL-E 作为图像生成器。

智能体还可以使用代码解释器生成图表和图形,使用 LaTeX 编译器渲染数学公式,或使用浏览器渲染 HTML 代码的网页。

类似地,一个只能处理文本输入的模型可以使用图像描述工具来处理图像,使用语音转录工具来处理音频。它还可以使用 OCR(光学字符识别)工具来读取 PDF。

工具使用可以显著提升模型性能,远超仅靠提示词(Prompting)甚至微调(Fine-tuning)所能达到的效果。 Chameleon(Lu et al., 2023)表明,一个由 GPT-4 驱动、配备 13 种工具的智能体在多个基准测试中超越了单独使用的 GPT-4。该智能体使用的工具示例包括知识检索、查询生成器、图像描述器、文本检测器和 Bing 搜索。

在 ScienceQA(科学问答基准)上,Chameleon 将已发布的最佳少样本(Few-shot)结果提高了 11.37%。在 TabMWP(表格数学文字题)(Lu et al., 2022)基准上,Chameleon 将准确率提高了 17%。

写操作

到目前为止,我们讨论的是只读操作——允许模型从数据源读取。但工具也可以执行写操作,对数据源进行更改。SQL 执行器可以检索数据表(读)并修改或删除该表(写)。邮件 API 可以读取邮件,也可以回复邮件。银行 API 可以查询当前余额,也可以发起转账。

写操作使系统能够做更多事情。它们可以帮助你自动化整个客户拓展工作流:研究潜在客户、查找联系方式、起草邮件、发送首封邮件、阅读回复、跟进、提取订单、用新订单更新数据库等。

然而,赋予 AI 自动改变我们生活的能力是令人担忧的。正如你不应该赋予实习生删除生产数据库的权限一样,你也不应该允许不可靠的 AI 发起银行转账。对系统能力和安全措施的信任至关重要。你需要确保系统能够抵御试图操纵它执行有害操作的恶意行为者。


侧边栏:智能体与安全

每当我在一群人面前谈论自主 AI 智能体时,总会有人提到自动驾驶汽车。“如果有人入侵汽车绑架你怎么办?“虽然自动驾驶汽车的例子因为涉及实体世界而显得格外触目惊心,但 AI 系统无需存在于物理世界中也可以造成危害。它可以操纵股市、窃取版权、侵犯隐私、强化偏见、传播虚假信息和宣传等。

这些都是合理的担忧,任何想要利用 AI 的组织都需要认真对待安全问题。但这并不意味着不应该赋予 AI 系统在现实世界中行动的能力。如果我们能信任一台机器把我们送上太空,我希望有一天安全措施将足以让我们信任自主 AI 系统。况且,人类也会犯错。就个人而言,比起普通陌生人,我更信任自动驾驶汽车载我。


正如合适的工具可以让人类生产力大幅提高——你能想象没有 Excel 做生意或没有起重机建摩天大楼吗?——工具使模型能够完成更多任务。许多模型提供商已经支持在其模型中使用工具,这一特性通常被称为函数调用(Function Calling)。展望未来,我预计函数调用配合丰富的工具集将成为大多数模型的标配。

规划

基础模型智能体的核心是负责解决用户任务的模型。任务由其目标约束条件定义。例如,一个任务可能是:规划一次从旧金山到印度的两周旅行,预算为 5,000 美元。目标是两周的旅行,约束条件是预算。

复杂任务需要规划。规划过程的输出是一个计划,即概述完成任务所需步骤的路线图。有效的规划通常要求模型理解任务、考虑实现任务的不同方案,并选择最有前景的那个。

如果你曾参加过任何规划会议,你就知道规划是困难的。作为一个重要的计算问题,规划已被深入研究,需要好几卷书才能覆盖。这里我只能涉及其皮毛。

规划概述

给定一个任务,有许多可能的解决方式,但并非所有方式都能带来成功的结果。在正确的解决方案中,有些比其他方案更高效。考虑查询 "有多少没有收入的公司融资至少 10 亿美元?",以及以下两个示例解决方案:

  1. 先找出所有没有收入的公司,然后按融资金额过滤。
  2. 先找出所有融资至少 10 亿美元的公司,然后按收入过滤。

第二个方案更高效。没有收入的公司数量远多于融资超过 10 亿美元的公司。在仅有这两个方案的情况下,一个智能的智能体应该选择方案 2。

你可以在同一个提示词中将规划与执行耦合在一起。例如,给模型一个提示,让它逐步思考(如使用思维链提示),然后在一个提示中执行所有步骤。但如果模型提出了一个 1,000 步的计划,而这个计划甚至无法完成目标怎么办?在没有监督的情况下,智能体可能会运行这些步骤数小时,浪费时间和 API 调用费用,直到你意识到它毫无进展。

为了避免无效执行,规划应与执行解耦。你要求智能体先生成一个计划,只有在该计划被验证后才执行。计划可以使用启发式方法验证。例如,一个简单的启发式是排除含有无效动作的计划。如果生成的计划需要 Google 搜索,而智能体没有 Google 搜索的访问权限,则该计划无效。另一个简单的启发式是排除所有超过 X 步的计划。

计划也可以使用 AI 评判器(AI Judge)来验证。你可以让一个模型评估计划是否合理,或如何改进。

如果生成的计划被评估为不佳,你可以要求规划器生成另一个计划。如果计划是好的,则执行它。

如果计划涉及外部工具,则会调用函数调用。执行该计划的输出也需要被评估。请注意,生成的计划不必是整个任务的端到端计划,它可以是某个子任务的小计划。整个过程如图 6-9 所示。

图 6-9. 将规划与执行解耦,以便只执行经过验证的计划

图 6-9. 将规划与执行解耦,以便只执行经过验证的计划。

你的系统现在有三个组件:一个用于生成计划、一个用于验证计划、另一个用于执行计划。如果将每个组件视为一个智能体,这可以被视为一个多智能体系统(Multi-agent System)。由于大多数智能体工作流足够复杂,涉及多个组件,因此大多数智能体实际上都是多智能体系统。

为了加速过程,你可以并行生成多个计划(而不是依次生成),然后让评估器选择最有前景的那个。这是另一个延迟-成本权衡,因为同时生成多个计划会产生额外费用。

规划需要理解任务背后的意图:用户的查询想要做什么?通常使用意图分类器来帮助智能体规划。意图分类可以通过另一个提示词或专门训练的分类模型来完成。意图分类机制可以被视为多智能体系统中的另一个智能体。

了解意图可以帮助智能体选择正确的工具。例如,在客户支持场景中,如果查询是关于计费的,智能体可能需要访问检索用户近期付款记录的工具。但如果查询是关于如何重置密码,智能体可能需要访问文档检索。

提示: 某些查询可能超出智能体的范围。意图分类器应该能够将请求分类为 IRRELEVANT(无关),以便智能体可以礼貌地拒绝这些请求,而不是浪费算力寻找不可能的解决方案。

到目前为止,我们假设智能体自动完成三个阶段:生成计划、验证计划和执行计划。在实际中,人类可以参与任何阶段,以协助流程和降低风险。

  • 人类专家可以提供计划、验证计划或执行计划的某些部分。例如,对于智能体难以生成完整计划的复杂任务,人类专家可以提供高层计划,智能体在此基础上展开细化。
  • 如果计划涉及风险操作(如更新数据库或合并代码变更),系统可以在执行前要求明确的人工批准,或将执行权交给人类。要实现这一点,你需要为每个操作明确定义智能体的自动化级别。

总结来说,解决任务通常涉及以下过程。请注意,反思对于智能体来说不是必须的,但它能显著提升智能体的性能。

  1. 计划生成:为完成任务制定计划。计划是一系列可管理的操作,因此这个过程也称为任务分解(Task Decomposition)。
  2. 反思与纠错:评估生成的计划。如果是一个差的计划,生成一个新的。
  3. 执行:执行计划中列出的操作。这通常涉及调用特定函数。
  4. 反思与纠错:收到操作结果后,评估这些结果并判断目标是否已完成。识别并纠正错误。如果目标未完成,生成新的计划。

你已经在本书中见过一些计划生成和反思的技术。当你要求模型”逐步思考”时,你是在要求它进行任务分解。当你要求模型”验证你的答案是否正确”时,你是在要求它进行反思。

基础模型作为规划器

一个开放性问题是:基础模型的规划能力到底如何。许多研究人员认为,至少建立在自回归语言模型之上的基础模型无法进行规划。Meta 的首席 AI 科学家 Yann LeCun 明确表示,自回归 LLM 无法进行规划(2023年)。

“自回归 LLM 无法规划(也无法真正推理)。”

— Yann LeCun (@ylecun) 2023年9月13日

虽然有大量轶事证据表明 LLM 是糟糕的规划器,但目前尚不清楚这究竟是因为我们不知道如何正确使用 LLM,还是因为 LLM 在本质上就无法规划。

规划的核心是一个搜索问题。 你在通往目标的不同路径中搜索,预测每条路径的结果(奖励),然后选择最有前景的路径。通常,你可能会发现没有任何路径可以通往目标。

搜索通常需要回溯(Backtracking)。例如,假设你处于一个有两个可能动作的步骤:A 和 B。执行动作 A 后,你进入了一个不理想的状态,因此需要回溯到之前的状态来执行动作 B。

有人认为自回归模型只能生成前向操作,无法回溯生成替代操作。因此他们得出结论:自回归模型无法规划。然而,这不一定正确。执行包含动作 A 的路径后,如果模型判断该路径不合理,它可以用动作 B 替换来修改路径,实际上就是在回溯。模型还可以完全重新开始,选择另一条路径。

LLM 规划能力差也可能是因为它们缺乏规划所需的工具。要进行规划,不仅需要知道可用的动作,还需要知道每个动作的潜在结果。举个简单的例子,假设你想爬山。你可能的动作是:右转、左转、掉头或直行。然而,如果右转会让你摔下悬崖,你可能不会考虑这个动作。用技术术语说,一个动作将你从一个状态带到另一个状态,需要知道结果状态才能决定是否执行该动作。

这意味着,仅仅提示模型生成动作序列(像流行的思维链提示技术那样做的)是不够的。论文 “Reasoning with Language Model is Planning with World Model”(Hao et al., 2023)认为,LLM 通过包含大量关于世界的信息,能够预测每个动作的结果。该 LLM 可以将这种结果预测整合到生成连贯计划的过程中。

即使 AI 不能规划,它仍然可以成为规划器的一部分。可以用搜索工具和状态跟踪系统来增强 LLM,帮助它进行规划。


侧边栏:基础模型(FM)与强化学习(RL)规划器的对比

智能体 是强化学习(RL)的核心概念,维基百科将 RL 定义为一个”关注智能代理应如何在动态环境中采取行动以最大化累积奖励”的领域。

RL 智能体和 FM 智能体在很多方面相似。它们都以环境和可能的动作为特征。主要区别在于规划器的工作方式。

  • 在 RL 智能体中,规划器通过 RL 算法训练。训练这个 RL 规划器可能需要大量的时间和资源。
  • 在 FM 智能体中,模型本身就是规划器。这个模型可以通过提示词或微调来提升其规划能力,通常需要更少的时间和资源。

然而,没有任何理由阻止 FM 智能体整合 RL 算法来提升性能。我猜测长远来看,FM 智能体和 RL 智能体将会融合。


计划生成

将模型变成计划生成器的最简单方式是通过提示工程(Prompt Engineering)。假设你想创建一个智能体来帮助 Kitty Vogue 的客户了解产品。你给这个智能体提供三个外部工具:按价格检索产品、检索热门产品和检索产品信息。以下是计划生成的提示示例(仅作说明用途,生产环境的提示可能更复杂)。

系统提示词:

请提出一个解决任务的计划。你可以使用 5 个操作:

* get_today_date()
* fetch_top_products(start_date, end_date, num_products)
* fetch_product_info(product_name)
* generate_query(task_history, tool_output)
* generate_response(query)

计划必须是一系列有效的操作。

示例
任务:"告诉我关于 Fruity Fedora 的信息"
计划:[fetch_product_info, generate_query, generate_response]

任务:"上周最畅销的产品是什么?"
计划:[fetch_top_products, generate_query, generate_response]

任务:{用户输入}
计划:

关于这个示例有两点需要注意:

  • 这里使用的计划格式——一个函数列表,其参数由智能体推断——只是构建智能体控制流的众多方式之一。
  • generate_query 函数接收任务的当前历史和最近的工具输出,生成一个查询,供响应生成器使用。每一步的工具输出都会添加到任务历史中。

给定用户输入”上周最畅销产品的价格是多少”,生成的计划可能如下:

  1. get_time()
  2. fetch_top_products()
  3. fetch_product_info()
  4. generate_query()
  5. generate_response()

你可能会问:“每个函数需要的参数呢?” 精确的参数很难提前预测,因为它们通常是从前一步工具输出中提取的。如果第一步 get_time() 输出 “2030-09-13”,智能体可以推理出下一步应使用以下参数调用:

fetch_top_products(
    start_date="2030-09-07",
    end_date="2030-09-13",
    num_products=1
)

通常,信息不足以确定函数的精确参数值。例如,如果用户问”最畅销产品的平均价格是多少?“,以下问题的答案是不明确的:

  • 用户想查看多少个最畅销产品?
  • 用户想要的是上周、上个月还是有史以来的最畅销产品?

这意味着模型经常需要进行猜测,而猜测可能是错误的。

由于动作序列和相关参数都是由 AI 模型生成的,它们可能会产生幻觉(Hallucination)。幻觉可能导致模型调用无效函数,或调用有效函数但使用错误的参数。用于提升模型整体性能的技术也可以用来改善模型的规划能力。

提升智能体规划能力的技巧:

  • 编写更好的系统提示词并提供更多示例。
  • 为工具及其参数编写更好的描述,使模型更好地理解它们。
  • 重写函数本身使其更简单,例如将一个复杂函数重构为两个更简单的函数。
  • 使用更强大的模型。通常,更强的模型规划能力更好。
  • 针对计划生成对模型进行微调。

函数调用

许多模型提供商为其模型提供工具使用功能,有效地将模型转变为智能体。工具就是函数。因此,调用工具通常被称为函数调用(Function Calling)。不同的模型 API 工作方式不同,但通常函数调用的流程如下:

  1. 创建工具库。 声明所有你可能希望模型使用的工具。每个工具通过其执行入口(如函数名称)、参数和文档(如函数功能描述及所需参数)来描述。
  2. 指定智能体可以用于查询的工具。 由于不同查询可能需要不同的工具,许多 API 允许你为每个查询指定已声明工具的列表。有些允许通过以下设置进一步控制工具使用:
    • required:模型必须使用至少一个工具。
    • none:模型不应使用任何工具。
    • auto:由模型决定使用哪些工具。

图 6-10 展示了函数调用的示例。这里使用伪代码以适用于多种 API。使用特定 API 时,请参考其文档。

图 6-10. 一个模型使用两个简单工具的示例

图 6-10. 一个模型使用两个简单工具的示例。

给定一个查询,如图 6-10 中定义的智能体将自动生成要使用的工具及其参数。某些函数调用 API 会确保只生成有效函数,但无法保证参数值正确。

例如,给定用户查询”40 磅是多少千克?“,智能体可能决定需要使用 lbs_to_kg_tool 工具,参数值为 40。智能体的响应可能如下:

response = ModelResponse(
    finish_reason='tool_calls',
    message=chat.Message(
        content=None,
        role='assistant',
        tool_calls=[
            ToolCall(
                function=Function(
                    arguments='{"lbs":40}',
                    name='lbs_to_kg'),
                type='function')
        ])
)

从这个响应中,你可以调用函数 lbs_to_kg(lbs=40) 并使用其输出来为用户生成响应。

提示: 在使用智能体时,始终让系统报告每个函数调用使用的参数值。检查这些值以确保它们正确。

规划粒度

计划是概述完成任务所需步骤的路线图。路线图可以有不同的粒度级别。在规划一年时,按季度的计划比按月的计划更高层次,按月的计划又比按周的计划更高层次。

存在一个规划/执行的权衡。详细的计划更难生成,但更容易执行。高层次的计划更容易生成,但更难执行。一种规避这种权衡的方法是分层规划(Hierarchical Planning)。首先,使用一个规划器生成高层次的计划(如按季度的计划),然后对每个季度,使用相同或不同的规划器生成按月的计划。

目前为止,所有生成计划的示例都使用了精确的函数名称,这是非常细粒度的。这种方法的一个问题是智能体的工具库可能会随时间变化。例如,获取当前日期的函数 get_time() 可能被重命名为 get_current_time()。当工具发生变化时,你需要更新提示词和所有示例。使用精确函数名也使得在不同用例和不同工具 API 之间复用规划器变得更困难。

如果你之前已经基于旧的工具库对模型进行了微调,当工具库变更时你需要再次微调。

为了避免这个问题,计划也可以使用更接近自然语言的方式生成,这比领域特定的函数名更高层次。例如,给定查询”上周最畅销产品的价格是多少”,智能体可以被指示输出如下格式的计划:

  1. 获取当前日期
  2. 检索上周最畅销的产品
  3. 检索产品信息
  4. 生成查询
  5. 生成响应

使用更自然的语言有助于你的计划生成器应对工具 API 的变化。如果你的模型主要在自然语言上训练,它可能更擅长理解和生成自然语言计划,产生幻觉的可能性也更低。

这种方法的缺点是你需要一个翻译器,将每个自然语言操作翻译为可执行命令。Chameleon(Lu et al., 2023)称这个翻译器为程序生成器(Program Generator)。然而,翻译是比规划简单得多的任务,可以由较弱的模型以较低的幻觉风险完成。

复杂计划

到目前为止的计划示例都是顺序执行的:计划中的下一个动作总是在前一个动作完成后执行。动作执行的顺序称为控制流(Control Flow)。顺序形式只是控制流的一种类型。其他类型的控制流包括并行、条件语句和循环。以下是每种控制流的概述:

  • 顺序执行(Sequential):在任务 A 完成后执行任务 B,可能因为任务 B 依赖于任务 A。例如,SQL 查询只有在从自然语言输入翻译完成后才能执行。

  • 并行执行(Parallel):同时执行任务 A 和 B。例如,给定查询”找出 100 美元以下的最畅销产品”,智能体可能先检索前 100 个最畅销产品,然后对每个产品同时检索其价格。

  • 条件语句(If Statement):根据前一步的输出决定执行任务 B 还是任务 C。例如,智能体先查看 NVIDIA 的财报。基于该报告,它可以决定是卖出还是买入 NVIDIA 股票。Anthropic 的文章将此模式称为”路由”(Routing)。

  • 循环(For Loop):重复执行任务 A 直到满足特定条件。例如,持续生成随机数直到产生一个质数。

图 6-11. 计划可以执行的不同顺序的示例

图 6-11. 计划可以执行的不同顺序的示例。

在传统软件工程中,控制流的条件是精确的。在 AI 驱动的智能体中,AI 模型决定控制流。具有非顺序控制流的计划更难生成和转换为可执行命令。

提示: 在评估智能体框架时,检查它支持哪些控制流。例如,如果系统需要浏览十个网站,它能同时浏览吗?并行执行可以显著降低用户感知到的延迟。

反思与纠错

即使是最好的计划也需要不断评估和调整,以最大化成功概率。虽然反思不是智能体运行的严格必要条件,但它是智能体成功的必要条件。

在任务处理过程中,有很多地方反思是有用的:

  • 收到用户查询后,评估请求是否可行。
  • 初始计划生成后,评估计划是否合理。
  • 每个执行步骤后,评估是否在正确的轨道上。
  • 整个计划执行完毕后,判断任务是否已完成。

反思和纠错是两种相辅相成的机制。反思产生洞察,帮助发现需要纠正的错误。

反思可以由同一个智能体通过自我批评提示(Self-critique Prompts)完成,也可以由单独的组件完成,例如专门的评分器:一个为每个结果输出具体分数的模型。

由 ReAct(Yao et al., 2022)首先提出的推理与行动交替(Interleaving Reasoning and Action)已成为智能体的常见模式。Yao 等人使用”推理”一词来涵盖规划和反思。在每一步,智能体被要求解释其思考过程(规划)、执行动作,然后分析观察结果(反思),直到智能体认为任务已完成。通常通过示例提示智能体以如下格式生成输出:

思考 1: …
行动 1: …
观察 1: …

… [持续直到反思认为任务完成] …

思考 N: … 
行动 N: 完成 [对查询的响应]

图 6-12. 一个 ReAct 智能体在回答 HotpotQA 多跳问答基准中的问题时的运行示例

图 6-12. 一个 ReAct 智能体在回答 HotpotQA(Yang et al., 2018)多跳问答基准中的问题时的运行示例。

你可以在多智能体设置中实现反思:一个智能体负责规划和执行操作,另一个智能体在每一步或若干步后评估结果。

如果智能体的响应未能完成任务,你可以提示智能体反思为什么失败以及如何改进。基于这个建议,智能体生成新的计划。这使得智能体能够从错误中学习

例如,给定一个代码生成任务,评估器可能评估出生成的代码在三分之一的测试用例上失败。然后智能体反思出失败原因是没有考虑到数组中所有数字都是负数的情况。智能体随后生成新代码,将全负数数组考虑在内。

这就是 Reflexion(Shinn et al., 2023)采取的方法。在这个框架中,反思被分为两个模块:一个评估器用于评估结果,一个自我反思模块用于分析出了什么问题。作者使用”轨迹”(Trajectory)一词来指代计划。在每一步,经过评估和自我反思后,智能体提出一条新的轨迹。

图 6-13. Reflexion 智能体工作方式的示例

图 6-13. Reflexion 智能体工作方式的示例。

与计划生成相比,反思实现起来相对容易,并且可以带来惊人的性能提升。这种方法的缺点是延迟和成本。思考过程、观察结果和操作有时会生成大量的 Token,增加了成本和用户感知延迟,尤其是对于中间步骤很多的任务。为了促使智能体遵循格式,ReAct 和 Reflexion 的作者都在提示词中使用了大量的示例。这增加了输入 Token 的计算成本,减少了可用于其他信息的上下文空间。

工具选择

由于工具通常在任务成功中起着关键作用,工具选择需要仔细考虑。给智能体配备什么工具取决于环境和任务,也取决于驱动智能体的 AI 模型。

没有万无一失的工具选择指南。智能体文献中展示了各种各样的工具库规模。例如:

  • Toolformer(Schick et al., 2023)微调 GPT-J 学习了 5 种工具。
  • Chameleon(Lu et al., 2023)使用了 13 种工具。
  • Gorilla(Patil et al., 2023)尝试提示智能体从 1,645 个 API 中选择正确的 API 调用。

更多的工具赋予智能体更多能力。然而,工具越多,有效使用它们就越困难。这类似于人类要掌握大量工具也更困难。增加工具也意味着增加工具描述,这可能超出模型的上下文长度限制。

与构建 AI 应用时的许多其他决策一样,工具选择需要实验和分析。以下是帮助你做决定的一些方法:

  • 比较智能体在不同工具组合下的表现。
  • 进行消融实验(Ablation Study),看看移除某个工具后智能体的性能下降多少。如果移除某个工具后性能不下降,就移除它。
  • 寻找智能体经常犯错的工具。如果某个工具对智能体来说太难使用——例如大量提示和微调都无法让模型学会使用它——就更换该工具。
  • 绘制工具调用的分布图,查看哪些工具最常用、哪些最少用。

图 6-14. Chameleon 中 GPT-4 和 ChatGPT 工具使用模式的差异

图 6-14. Chameleon(Lu et al., 2023)中 GPT-4 和 ChatGPT 工具使用模式的差异。

Chameleon(Lu et al., 2023)的实验还证明了两点:

  1. 不同任务需要不同的工具。 ScienceQA(科学问答任务)比 TabMWP(表格数学问题求解任务)更依赖知识检索工具。
  2. 不同模型有不同的工具偏好。 例如,GPT-4 似乎选择更广泛的工具集,而 ChatGPT 似乎偏好图像描述。ChatGPT 倾向于图像描述工具,而 GPT-4 倾向于知识检索。

提示: 在评估智能体框架时,评估它支持哪些规划器和工具。不同框架可能专注于不同类别的工具。例如,AutoGPT 专注于社交媒体 API(Reddit、X 和 Wikipedia),而 Composio 专注于企业 API(Google Apps、GitHub 和 Slack)。

由于你的需求可能会随时间变化,评估将智能体扩展以整合新工具的难易程度。

作为人类,我们不仅通过使用已有的工具变得更高效——我们还能用简单工具创造出越来越强大的工具。AI 能否从初始工具中创建新工具?

Chameleon(Lu et al., 2023)提出了工具转换(Tool Transition)的研究:使用工具 X 后,智能体调用工具 Y 的概率有多大?如果两个工具经常一起使用,它们可以被合并为一个更大的工具。如果智能体知道这一信息,它本身就可以组合初始工具,持续构建更复杂的工具。

图 6-15. Chameleon 的工具转换树

图 6-15. Chameleon(Lu et al., 2023)的工具转换树。

Voyager(Wang et al., 2023)提出了一个技能管理器(Skill Manager),用于跟踪智能体获得的新技能(工具)以供后续复用。每个技能都是一个编程程序。当技能管理器判断新创建的技能有用时(例如因为它成功帮助智能体完成了一项任务),它会将该技能添加到技能库(概念上类似于工具库)中。以后可以检索该技能用于其他任务。

前面我们提到,智能体在某个环境中的成功取决于其工具库和规划能力。任一方面的失败都可能导致智能体失败。下一节将讨论智能体的不同失败模式以及如何评估它们。

智能体的失败模式与评估

评估就是检测失败。智能体执行的任务越复杂,可能的失败点就越多。除了所有 AI 应用共有的失败模式外,智能体还有由规划、工具执行和效率引起的独特失败。有些失败比其他的更容易被发现。

要评估智能体,需要识别其失败模式并衡量每种失败模式发生的频率。

规划失败

规划是困难的,可以以多种方式失败。最常见的规划失败模式是工具使用失败。智能体可能生成包含以下一个或多个错误的计划:

  • 无效工具:例如,生成了一个包含 bing_search 的计划,但该工具不在工具库中。
  • 有效工具,无效参数:例如,调用 lbs_to_kg 时传入了两个参数,但该函数只需要一个参数 lbs
  • 有效工具,参数值错误:例如,调用 lbs_to_kg 时使用了正确的参数 lbs,但值为 100,而正确值应该是 120。

另一种规划失败模式是目标失败:智能体未能达成目标。这可能是因为计划无法解决任务,或者解决了任务但未遵守约束条件。举例来说,假设你要求模型规划一次从旧金山到印度的两周旅行,预算 5,000 美元。智能体可能规划了一次从旧金山到越南的旅行,或者规划了一次费用远超预算的两周印度旅行。

一个经常被智能体评估忽略的常见约束条件是时间。在很多情况下,智能体花多长时间不太重要,因为你可以把任务分配给智能体,等它完成再查看。但在很多情况下,智能体的价值会随时间递减。例如,如果你让智能体准备一份基金申请书,而智能体在截止日期之后才完成,那它就没什么帮助了。

一种有趣的规划失败是由反思错误引起的。智能体确信自己已经完成了任务,但实际上并没有。例如,你要求智能体将 50 人分配到 30 个酒店房间。智能体可能只分配了 40 人,却坚持说任务已完成。

要评估智能体的规划失败,一种方法是创建一个规划数据集,其中每个样本是一个 (任务, 工具库) 元组。对每个任务,使用智能体生成 K 个计划。计算以下指标:

  1. 在所有生成的计划中,有多少是有效的?
  2. 对于给定任务,智能体需要生成多少个计划才能得到一个有效计划?
  3. 在所有工具调用中,有多少是有效的?
  4. 调用无效工具的频率是多少?
  5. 用无效参数调用有效工具的频率是多少?
  6. 用错误参数值调用有效工具的频率是多少?

分析智能体输出中的模式。智能体在哪些类型的任务上失败更多?你对原因有假设吗?模型在哪些工具上经常犯错?某些工具可能对智能体来说更难使用。你可以通过更好的提示词、更多示例或微调来提升智能体使用困难工具的能力。如果都不行,你可能需要考虑换一个更易使用的工具。

工具失败

工具失败发生在使用了正确的工具,但工具输出错误时。一种失败模式是工具直接给出了错误的输出。例如,图像描述器返回了错误的描述,或 SQL 查询生成器返回了错误的 SQL 查询。

如果智能体只生成高层次的计划,并且有一个翻译模块将每个计划中的操作翻译为可执行命令,那么翻译错误也可能导致失败。

工具失败是工具相关的。每个工具需要独立测试。始终打印出每个工具调用及其输出,以便你可以检查和评估它们。如果你有翻译器,创建基准测试来评估它。

检测缺少工具的失败需要了解应该使用哪些工具。如果你的智能体在某个特定领域频繁失败,可能是因为它缺少该领域的工具。与人类领域专家合作,观察他们会使用什么工具。

效率

智能体可能生成了一个有效的计划,使用了正确的工具来完成任务,但它可能是低效的。以下是你可能想要跟踪以评估智能体效率的一些指标:

  • 智能体平均需要多少步才能完成一个任务?
  • 智能体平均完成一个任务的成本是多少?
  • 每个操作通常需要多长时间?是否有特别耗时或昂贵的操作?

你可以将这些指标与你的基准进行比较,基准可以是另一个智能体或人类操作者。在比较 AI 智能体与人类智能体时,请记住人类和 AI 有非常不同的运作模式,所以对人类而言高效的方式对 AI 可能是低效的,反之亦然。例如,访问 100 个网页对于一次只能访问一个页面的人类来说可能效率很低,但对于可以同时访问所有网页的 AI 智能体来说却是微不足道的。

总结

智能体的概念本质上相当简单。智能体由其运行的环境和可以访问的工具集合定义。在 AI 驱动的智能体中,AI 模型是”大脑”,它利用工具和来自环境的反馈来规划如何最好地完成任务。工具使模型的能力大幅增强,因此智能体模式是不可避免的趋势。

虽然”智能体”这个概念听起来新颖,但它们建立在 LLM 早期就已使用的许多概念之上,包括自我批评(Self-critique)、思维链(Chain-of-Thought)和结构化输出(Structured Output)。

本文从概念上介绍了智能体的工作原理和不同组件。在未来的文章中,我将讨论如何评估智能体框架。

智能体模式通常处理超出模型上下文限制的信息量。一个补充模型上下文以处理信息的记忆系统(Memory System)可以显著增强智能体的能力。由于本文已经很长,我将在未来的博客文章中探讨记忆系统的工作原理。