AI智能体综述

译者注:下文对Chip Huyen在1月初发表在自己博客上的这篇《AI智能体综述》的文章进行了翻译,内容改编自作者刚发表的这本AI Engineering(2025)书的Agents章节。

我读了一下觉得作为一个综述是挺不错的,其价值在于展示了构建真正有用的AI智能体所需的思维方法:如何在工具和规划之间找到平衡,如何处理失败,以及最重要的,如何区分看起来有效和真正有效的方案。如果你想要理解AI智能体的本质,而不仅仅是表象,这篇文章值得你花时间。

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

基础模型的前所未有的能力为以前无法想象的智能体应用打开了大门。这些新能力使得开发自主智能体成为可能,它们可以作为我们的助手、同事和教练。它们可以帮助我们创建网站、收集数据、规划旅行、进行市场研究、管理客户账户、自动化数据输入、为面试做准备、面试候选人、谈判交易等。可能性似乎是无限的,而这些智能体的潜在经济价值也是巨大的。

本文将首先概述智能体,然后讨论决定智能体能力的两个方面:工具和规划。智能体有其新的运作模式,也就有了新的失败模式。本文最后将讨论如何评估智能体以发现这些失败。

注意

  1. AI驱动的智能体是一个新兴领域,目前还没有确立的理论框架来定义、开发和评估它们。本文是基于现有文献构建框架的最佳努力尝试,但它会随着领域的发展而演变,因此更具实验性;
  2. 不久前Anthropic发布了一篇关于构建高效智能体的文章,其中关于智能体的内容在概念上是一致的,尽管使用了略微不同的术语。然而,Anthropic的文章侧重于独立的模式本身,而本文则深入探讨了背后的原理和运作机制。此外还着重讨论了规划、工具选择以及可能出现的失败模式等方面;
  3. 本文包含大量背景信息。如果觉得太过深入,请随意跳过!

智能体概述

“智能体”这个术语在许多不同的工程环境中被使用,包括但不限于软件智能体、智能智能体、用户智能体、对话智能体和强化学习智能体。那么,什么才是智能体呢?

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

这意味着智能体的特征由它所操作的环境它可以执行的行动集合决定。

智能体可以操作的环境由其用例定义 - 如果智能体是为了玩游戏而开发的(例如,Minecraft、围棋、Dota),那么该游戏就是它的环境。如果你想要智能体从互联网抓取文档,那么环境就是互联网。自动驾驶汽车智能体的环境是道路系统及其相邻区域。

AI智能体可以执行的行动集合由它可以使用的工具来增强。你每天互动的许多生成式AI驱动的应用程序都是具有工具访问权限的智能体,尽管它们很简单。ChatGPT是一个智能体 - 它可以搜索网络、执行Python代码和生成图像。RAG系统是智能体 - 文本检索器、图像检索器和SQL执行器是它们的工具。

智能体的环境和工具集之间存在着强烈的依赖关系。环境决定了智能体可能使用的工具。例如,如果环境是国际象棋游戏,智能体唯一可能的行动就是有效的象棋移动。然而,智能体的工具库限制了它可以操作的环境。例如,如果机器人的唯一行动是游泳,它就只能在水环境中活动。

图6-8展示了SWE-agent(Yang等,2024),这是一个建立在GPT-4之上的智能体。它的环境是带有终端和文件系统的计算机。它的行动集包括导航仓库、搜索文件、查看文件和编辑行。

A coding agent

AI智能体旨在完成通常由用户提供的任务。在AI智能体中,AI是处理任务、规划实现该任务的行动序列以及确定任务是否已完成的大脑。

让我们回到之前Kitty Vogue示例中的RAG系统。这是一个具有三个行动的简单智能体:

  • 响应生成;
  • 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可以生成文本,图像生成器可以生成图像。外部工具使智能体变得更加强大。

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

智能体可以访问的工具集是其工具库。由于智能体的工具库决定了智能体能做什么,因此思考给智能体什么工具以及给多少工具很重要。更多的工具给智能体更多的能力。然而,工具越多,就越难很好地理解和利用它们。需要实验来找到正确的工具集,这将在后面的”工具选择“部分讨论。

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

知识增强

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

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

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

我使用网页浏览作为一个统称,涵盖所有访问互联网的工具,包括网页浏览器和API,如搜索API、新闻API、GitHub API或社交媒体API。

虽然网页浏览允许您的智能体引用最新信息来生成更好的响应并减少幻觉,但它也可能让您的智能体接触到互联网的污染池。请谨慎选择您的互联网API。

能力扩展(Capability extension)

您可能还需要考虑解决AI模型固有限制的工具。它们是提升模型性能的简单方法。例如,AI模型以不擅长数学而闻名。如果您让模型计算199,999除以292,模型很可能会失败。但是,如果模型可以使用计算器,这个计算就会变得很简单。与其试图训练模型擅长算术,不如直接让模型访问工具,这样更节省资源。

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

更复杂但功能强大的工具是代码解释器(code interpreters)。与其训练模型理解代码,您可以让它访问代码解释器来执行代码片段,返回结果,或分析代码的失败。这种能力让您的智能体可以充当编码助手、数据分析师,甚至研究助手,可以编写代码来运行实验并报告结果。然而,自动代码执行存在代码注入攻击的风险,正如第5章”防御性提示工程”部分所讨论的。适当的安全措施对于保护您和您的用户安全至关重要。

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

智能体还可以使用代码解释器来生成图表和图形,使用LaTex编译器来渲染数学方程,或使用浏览器从HTML代码渲染网页。

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

工具使用可以显著提升模型的性能,相比仅使用提示或甚至微调Chameleon(Lu等人,2023)显示,一个由GPT-4驱动的智能体,配备了13个工具,可以在几个基准测试中超越单独使用的GPT-4。这个智能体使用的工具示例包括知识检索、查询生成器、图像描述器、文本检测器和Bing搜索。

在ScienceQA(一个科学问答基准测试)上,Chameleon将最佳已发布的少样本结果提高了11.37%。在TabMWP(表格数学应用题)(Lu等人,2022)上,这是一个涉及表格数学问题的基准测试,Chameleon将准确率提高了17%。

写操作(Write actions)

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

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

然而,给予AI自动改变我们生活的能力是令人恐惧的。就像您不应该给实习生删除生产数据库的权限一样,您也不应该允许不可靠的AI发起银行转账。对系统能力和其安全措施的信任是至关重要的。您需要确保系统受到保护,防止恶意行为者试图操纵它执行有害行动。


延伸阅读:智能体和安全性

每当我向一群人谈论自主AI智能体时,经常会有人提出自动驾驶汽车的问题。”如果有人黑入汽车绑架你怎么办?“虽然自动驾驶汽车的例子因其物理性而显得很直观,但AI系统不需要在物理世界中存在就能造成危害。它可以操纵股市、窃取版权、侵犯隐私、强化偏见、传播错误信息和宣传等,正如第5章”防御性提示工程”部分所讨论的。

这些都是有效的担忧,任何想要利用AI的组织都需要认真对待安全性。然而,这并不意味着永远不应该赋予AI系统在现实世界中行动的能力。如果我们可以信任机器将我们送入太空,我希望有一天,安全措施将足以让我们信任自主AI系统。此外,人类也会失败。就我个人而言,我会更信任自动驾驶汽车而不是普通陌生人来载我一程。


就像正确的工具可以帮助人类大大提高生产力——您能想象没有Excel做生意或没有起重机建造摩天大楼吗?——工具使模型能够完成更多任务。许多模型提供商已经支持他们的模型使用工具,这个功能通常被称为函数调用(function calling)。展望未来,我预计大多数模型都会普遍支持具有广泛工具集的函数调用。

规划(Planning)

在基础模型智能体的核心是负责解决用户提供任务的模型。任务由其目标和约束定义。例如,一个任务是安排一个从旧金山到印度的两周行程,预算为5,000美元。目标是两周的旅行,约束是预算。

复杂的任务需要规划。规划过程的输出是一个计划,这是一个概述完成任务所需步骤的路线图。有效的规划通常需要模型理解任务,考虑实现这个任务的不同选项,并选择最有希望的一个。

如果您曾经参加过任何规划会议,您就知道规划是很困难的。作为一个重要的计算问题,规划已经得到了充分研究,需要几卷书才能涵盖。我在这里只能涉及表面。

规划概述

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

  1. 找到所有没有收入的公司,然后按筹集金额筛选。
  2. 找到所有筹集至少10亿美元的公司,然后按收入筛选。

第二个选项更有效。没有收入的公司远比筹集了10亿美元的公司多。面对这两个选项,一个智能智能体应该选择选项2。

您可以在同一个提示中将规划与执行结合起来。例如,您给模型一个提示,要求它一步步思考(比如使用思维链提示),然后在一个提示中执行这些步骤。但是如果模型提出了一个1000步的计划,而这个计划甚至无法完成目标呢?如果没有监督,智能体可能会运行这些步骤数小时,在API调用上浪费时间和金钱,直到您意识到它没有任何进展。

为了避免无效的执行,规划应该与执行分离。您让智能体首先生成一个计划,只有在这个计划被验证后才执行它。可以使用启发式方法验证计划 - 例如一个简单的启发式方法是消除具有无效操作的计划。如果生成的计划需要Google搜索而智能体没有访问Google搜索的权限,这个计划就是无效的。另一个简单的启发式方法可能是消除所有超过X步的计划。

计划也可以使用AI评判器进行验证。您可以让模型评估计划是否合理或如何改进它。

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

如果计划包含外部工具,将调用函数调用。执行此计划的输出然后需要再次评估。注意,生成的计划不必是整个任务的端到端计划。它可以是子任务的小计划。整个过程如图6-9所示。

Agent pattern

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

您的系统现在有三个组件:一个生成计划,一个验证计划,另一个执行计划。如果您将每个组件视为一个智能体,这可以被认为是一个多智能体系统。因为大多数智能体工作流程都足够复杂,需要涉及多个组件,所以大多数智能体都是多智能体的。

为了加快进程,您可以并行生成几个计划,而不是顺序生成计划,并要求评估器选择最有希望的一个。这是另一个延迟-成本权衡,因为同时生成多个计划会产生额外的成本。

规划需要理解任务背后的意图:用户想用这个查询做什么?通常使用意图分类器来帮助智能体进行规划。如第5章”将复杂任务分解为更简单的子任务”部分所示,意图分类可以使用另一个提示或为此任务训练的分类模型来完成。意图分类机制可以被视为您的多智能体系统中的另一个智能体。

了解意图可以帮助智能体选择正确的工具。例如,对于客户支持,如果查询是关于账单的,智能体可能需要访问检索用户最近付款的工具。但如果查询是关于如何重置密码的,智能体可能需要访问文档检索。

提示

某些查询可能超出智能体的范围。意图分类器应该能够将请求分类为IRRELEVANT,这样智能体可以礼貌地拒绝这些请求,而不是浪费算力来想出不可能的解决方案。

到目前为止,我们假设智能体自动化了所有三个阶段:生成计划、验证计划和执行计划。在现实中,人类可以参与任何阶段来帮助这个过程并降低风险:

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

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

  1. 计划生成:提出完成这个任务的计划。计划是一系列可管理的操作,所以这个过程也被称为任务分解;
  2. 反思和错误纠正:评估生成的计划。如果是个糟糕的计划,生成一个新的;
  3. 执行:执行计划中概述的操作。这通常涉及调用特定的函数;
  4. 反思和错误纠正:在收到操作结果后,评估这些结果并确定目标是否已经实现。识别并纠正错误。如果目标未完成,生成新的计划;

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

基础模型作为规划器

一个开放的问题是基础模型能够多好地进行规划。许多研究人员认为基础模型,至少那些建立在自回归语言模型之上的模型是做不到的。Meta的首席AI科学家Yann LeCun明确表示自回归LLM不能规划(2023)。

自回归LLM不能规划 (也不能真正推理)。

“虽然我们自己有限的实验没有显示出[规划能力]通过微调有任何显著改善,但有可能通过更多的微调数据和努力,经验性能可能会…

虽然有很多轶事证据表明LLM是糟糕的规划器,但目前尚不清楚这是因为我们不知道如何正确使用LLM,还是因为LLM从根本上不能规划。

规划,本质上是一个搜索问题。你需要在通向目标的不同途径中进行搜索,预测每条路径可能带来的收益,然后选择最有希望的那条路径。而在很多情况下,你可能会发现根本就不存在能够通往目标的可行路径。

在搜索过程中,经常需要进行回溯操作。举个例子,假设你现在面临两个可选的动作:A和B。如果你选择了动作A,结果发现进入了一个不理想的状态,这时就需要回溯到之前的状态,转而选择动作B。

有些人认为自回归模型只能产生向前的动作序列,无法回过头来生成其他可能的动作。因此,他们认为自回归模型无法进行规划。但实际上,这种说法并不完全正确。当模型执行完包含动作A的路径后,如果发现这条路径不合理,它完全可以通过修改路径、选择动作B来实现回溯。除此之外,模型还可以随时重新开始,选择一条全新的路径。。

另一种可能是大语言模型不善于规划是因为它们没有获得规划所需的工具。要进行规划,不仅需要知道可用的操作,还需要知道每个操作可能带来的结果。举个简单的例子,假设你想要爬山。你可以选择向右转、向左转、调头或直走。但是,如果向右转会导致你从悬崖上掉下去,你可能就不会考虑这个选项。用技术术语来说,一个操作会让你从一个状态转变到另一个状态,而要决定是否采取某个操作,就必须知道最终的状态。

这意味着仅仅让模型生成一系列操作(就像流行的思维链提示技术那样)是不够的。论文《基于语言模型的推理即基于世界模型的规划》(Hao等,2023年)认为,大语言模型由于包含了大量关于世界的信息,因此能够预测每个操作的结果。这种大语言模型可以将结果预测整合进来,从而生成连贯的规划方案。

虽然AI可能无法独立完成规划,但它可以作为规划系统的重要组成部分。通过为大语言模型配备搜索工具和状态跟踪系统,可以显著提升其规划能力。


延伸阅读:基础模型(FM)与强化学习(RL)规划器

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

RL智能体和FM智能体在许多方面都很相似。它们都由它们的环境和可能的动作来表征。主要区别在于它们的规划器如何工作。

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

然而,没有什么能阻止FM智能体整合RL算法来提升其性能。我怀疑从长远来看,FM智能体和RL智能体将会融合。


计划生成

将模型转变为计划生成器最简单的方法是通过提示工程。想象您想创建一个智能体来帮助客户了解Kitty Vogue的产品。您给这个智能体访问三个外部工具的权限:按价格检索产品、检索热门产品和检索产品信息。

以下是一个用于计划生成的提示示例。这个提示仅用于说明目的。生产环境中的提示可能更复杂。

系统提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
提出解决任务的计划。您可以访问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”,智能体可以推理下一步应该用以下参数调用:

1
2
3
4
5
fetch_top_products(
start_date="2030-09-07",
end_date="2030-09-13",
num_products=1
)

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

  • 用户想看多少个畅销产品?
  • 用户想看上周、上个月还是所有时间的畅销产品?

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

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

提示:让智能体更擅长规划的方法。

编写更好的系统提示,包含更多示例;

为工具及其参数提供更好的描述,让模型更好地理解它们;

重写函数本身使其更简单,比如将一个复杂的函数重构为两个更简单的函数;

使用更强大的模型。一般来说,更强大的模型更擅长规划;

为计划生成对模型进行微调;

函数调用(Function calling)

许多模型提供商为他们的模型提供工具使用功能,有效地将他们的模型转变为智能体。工具就是函数。因此,调用工具通常被称为函数调用。不同的模型API工作方式不同,但总的来说,函数调用的工作方式如下:

  1. 创建工具库存 - 声明所有您可能想让模型使用的工具。每个工具都由其执行入口点(比如函数名)、其参数和其文档(比如函数做什么和需要什么参数)来描述;
  2. 指定智能体可以为查询使用的工具 - 因为不同的查询可能需要不同的工具,许多API让您为每个查询指定已声明工具的列表。有些还让您通过以下设置进一步控制工具使用:
    • required:模型必须使用至少一个工具。
    • none:模型不应该使用任何工具。
    • auto:模型决定使用哪些工具。

函数调用如图6-10所示。这里使用伪代码来使其能代表多个API。要使用特定的API,请参考其文档。

An example of function calling

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

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

例如,给定用户查询”40磅等于多少公斤?”,智能体可能会决定它需要使用lbs_to_kg_tool工具,参数值为40。智能体的响应可能看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)并使用其输出来生成对用户的响应。

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

规划粒度(Planning granularity)

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

这里存在一个规划与执行之间的权衡。详细的计划制定起来比较困难,但执行起来较为容易。高层次的计划制定起来比较容易,但执行起来较为困难。一种化解这种权衡的方法是采用分层规划。首先,使用规划系统生成高层次的计划,比如按季度制定的计划。然后,对于每个季度,使用相同或不同的规划系统来制定具体的月度计划。

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

如果您之前基于旧工具库存对模型进行了微调以生成计划,您将需要在新工具库存上重新微调模型。

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

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

使用更自然的语言有助于您的计划生成器适应工具API的变化。如果您的模型主要是在自然语言上训练的,它可能会更好地理解和生成自然语言计划,并且产生幻觉的可能性更小。

这种方法的缺点是您需要一个翻译器来将每个自然语言动作转换为可执行命令。Chameleon(Lu等人,2023)将这个翻译器称为程序生成器。然而,翻译是一个比规划简单得多的任务,可以由更弱的模型来完成,幻觉的风险也更低。

复杂计划(Complex plans)

到目前为止的计划示例都是顺序的:计划中的下一个动作总是在前一个动作完成后执行。动作可以执行的顺序被称为控制流。顺序形式只是控制流的一种类型。其他类型的控制流包括并行、if语句和for循环。以下列表提供了每种控制流的概述,包括顺序以供比较:

  • 顺序

    在任务A完成后执行任务B,可能是因为任务B依赖于任务A。例如,只有在将自然语言输入转换为SQL查询后,才能执行SQL查询;

  • 并行

    同时执行任务A和任务B。例如,给定查询”找到价格低于100美元的最畅销产品”,智能体可能首先检索前100个最畅销产品,然后对这些产品中的每一个检索其价格;

  • If语句

    根据前一步的输出执行任务B或任务C。例如,智能体首先检查NVIDIA的收益报告。根据这个报告,它可以决定卖出或买入NVIDIA的股票。Anthropic的文章将这种模式称为”路由”;

  • For循环

    重复执行任务A直到满足特定条件。例如,不断生成随机数直到得到一个质数;

这些不同的控制流如图6-11所示。

Agent control flow

图6-11. 关于方案可按不同顺序执行的示例

在传统软件工程中,流程控制的条件是精确的。而在 AI 智能体中,流程控制是由 AI 模型来决定的。包含非顺序流程控制的方案,无论是在生成过程中还是在转换为可执行命令时,都会面临更大的难度。

提示

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

反思和错误纠正

即使是最好的计划也需要不断评估和调整以最大化其成功的机会。虽然反思对智能体的运行并非严格必要,但对智能体的成功是必要的。

在任务过程中有许多地方可以进行反思:

  • 在接收到用户查询后,评估请求是否可行;
  • 在初始计划生成后,评估计划是否有意义;
  • 在每个执行步骤后,评估是否在正确的轨道上;
  • 在整个计划执行完成后,确定任务是否已完成;

反思和错误纠正是携手并进的两个不同机制。反思产生的见解有助于发现需要纠正的错误。

反思可以通过同一个智能体使用自我批评提示来完成。它也可以通过一个单独的组件来完成,比如专门的评分器:一个为每个结果输出具体分数的模型。

最初由ReAct(Yao等人,2022)提出的推理和行动交织已经成为智能体的一个常见模式。Yao等人使用”推理”一词来包含规划和反思。在每一步,要求智能体解释其思考(规划),采取行动,然后分析观察结果(反思),直到智能体认为任务完成。通常通过示例提示智能体生成以下格式的输出:

1
2
3
4
5
6
7
8
思考1:…
行动1:…
观察1:…

… [继续直到反思确定任务已完成] …

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

图6-12显示了一个遵循ReAct框架的智能体响应HotpotQA(Yang等人,2018)的问题的示例,HotpotQA是一个多跳问答基准测试。

ReAct example

图6-12:ReAct智能体实例

您可以在多智能体设置中实现反思:一个智能体进行规划和采取行动,另一个智能体在每一步或几步后评估结果。

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

例如,给定一个代码生成任务,评估器可能评估生成的代码在⅓的测试用例中失败。然后智能体反思它失败是因为没有考虑所有数字都是负数的数组。然后行动者生成新的代码,考虑到全负数组。

这就是Reflexion(Shinn等人,2023)采用的方法。在这个框架中,反思被分为两个模块:评估结果的评估器和分析错误的自我反思模块。图6-13显示了Reflexion智能体在行动中的示例。作者使用”轨迹”一词来指代计划。在每一步,经过评估和自我反思后,智能体提出一个新的轨迹。

Reflexion example

图6-13. Reflexion智能体工作实例

与计划生成相比,反思相对容易实现,并且可以带来令人惊讶的性能改进。这种方法的缺点是延迟和成本。思考、观察,有时还有行动可能需要大量标记来生成,这增加了成本和用户感知到的延迟,特别是对于有许多中间步骤的任务。为了推动他们的智能体遵循格式,ReAct和Reflexion的作者在他们的提示中使用了大量示例。这增加了计算输入标记的成本,并减少了可用于其他信息的上下文空间。

工具选择

因为工具通常在任务的成功中起着关键作用,工具选择需要仔细考虑。给智能体的工具不仅取决于环境和任务,还取决于驱动智能体的AI模型。

关于如何选择最佳工具集没有万无一失的指南。智能体文献包含各种工具库存。例如:

  • Toolformer(Schick等人,2023)微调GPT-J以学习5个工具;
  • Chameleon(Lu等人,2023)使用13个工具;
  • Gorilla(Patil等人,2023)尝试提示智能体在1,645个API中选择正确的API调用;

更多的工具给予智能体更多的能力。然而,工具越多,有效使用它们就越困难。这类似于人类更难掌握大量工具的情况。增加工具也意味着增加工具描述,这可能无法适应模型的上下文。

像构建AI应用程序时的许多其他决策一样,工具选择需要实验和分析。以下是一些可以帮助您决定的事项:

  • 比较智能体使用不同工具集的表现;
  • 进行消融研究,看看如果从其库存中移除一个工具,智能体的性能会下降多少。如果移除一个工具而不会导致性能下降,就移除它;
  • 寻找智能体经常犯错的工具。如果一个工具对智能体来说证明太难使用——例如,大量提示甚至微调都不能让模型学会使用它——就更换工具;
  • 绘制工具调用的分布图,看看哪些工具最常用,哪些工具最少用。图6-14显示了GPT-4和ChatGPT在Chameleon(Lu等人,2023)中的工具使用模式的差异;

Different models have different tool preferences

图6-14. 不同的模型和任务表现出不同的工具使用模式

Chameleon(Lu等人,2023)的实验还证明了两点:

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

提示

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

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

作为人类,我们变得更有效率不仅是通过使用我们获得的工具,还通过从更简单的工具中创造出逐渐更强大的工具。AI能否从其初始工具创建新工具?

Chameleon(Lu等人,2023)提出研究工具转换:在工具X之后,智能体调用工具Y的可能性有多大?图6-15显示了一个工具转换的例子。如果两个工具经常一起使用,它们可以被组合成一个更大的工具。如果智能体意识到这些信息,智能体本身可以组合初始工具以持续构建更复杂的工具。

Tool transition

图6-15. Chameleon(Lu等人,2023)提出工具转换树

Vogager(Wang等人,2023)提出了一个技能管理器来跟踪智能体获取的新技能(工具)以供后续重用。每个技能都是一个编码程序。当技能管理器确定一个新创建的技能是有用的(例如,因为它成功地帮助智能体完成了一个任务),它就将这个技能添加到技能库(在概念上类似于工具库存)中。这个技能可以在以后被检索用于其他任务。

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

智能体失败模式和评估(Agent Failure Modes and Evaluation)

评估的核心在于发现故障。AI 智能体执行的任务越复杂,潜在的故障点就越多。除了第 3 章和第 4 章中讨论的 AI 应用常见故障模式外,智能体还存在着由规划过程、工具使用以及运行效率等方面引发的特有故障。这些故障中,有些容易被发现,有些则较难识别。

评估一个 AI 智能体时,需要识别其所有可能的故障模式,并统计每种故障模式的发生频率。

规划失败(Planning failures)

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

  • 无效工具

    例如,它生成了一个包含bing_search的计划,而这个工具并不在工具库存中;

  • 有效工具,无效参数

    例如,它调用lbs_to_kg时带有两个参数,但这个函数只需要一个参数lbs

  • 有效工具,不正确的参数值

    例如,它调用lbs_to_kg时带有一个参数lbs,但使用了100这个值,而应该是120;

另一种规划失败模式是目标失败:智能体未能达到目标。这可能是因为计划没有解决任务,或者在解决任务时没有遵循约束。为了说明这一点,假设您要求模型规划一个从旧金山到印度的两周行程,预算为5,000美元。智能体可能会规划一个从旧金山到越南的行程,或者规划一个从旧金山到印度的两周行程,但花费远超预算。

在评估 AI 智能体时,一个经常被忽视的常见约束条件是时间。在许多情况下,AI 智能体完成任务所需的时间并不那么重要,因为你可以给它分配任务,然后只需要在任务完成时查看结果即可。然而,在很多情况下,AI 智能体会随着时间的推移而失去其使用价值。举个例子,如果你让 AI 智能体准备一份资助金申请书,而它在申请截止日期之后才完成,那么这个 AI 智能体就没什么帮助了。

另一种有趣的任务失败情况是由自我评估错误导致的。也就是说,AI 智能体会误以为自己已经完成了任务,而实际上并没有。比如说,当你让 AI 智能体将50人分配到30个酒店房间时,它可能只完成了40人的分配,却坚持认为任务已经圆满完成了。

为了评估 AI 智能体的规划失效情况,一种方法是创建一个规划数据集,其中每个样本都是一个(任务、工具库)二元组。对于每个任务,使用 AI 智能体生成共 K 个规划方案。计算以下指标:

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

分析智能体输出的模式。智能体在什么类型的任务上失败更多?您对此有什么假设?智能体经常在哪些工具上犯错?有些工具可能对智能体来说更难使用。您可以通过更好的提示、更多示例或微调来改善智能体使用具有挑战性的工具的能力。如果都失败了,您可能需要考虑用更容易使用的工具来替换这个工具。

工具失败(Tool failures)

工具故障是指在使用了正确的工具时,工具输出却出现错误的情况。其中一种故障模式是工具直接给出错误的输出。例如,图像描述器返回了错误的描述,或者 SQL 查询生成器返回了错误的 SQL 查询。

如果 AI 智能体只生成高层次的计划,并且需要通过指令转换模块将每个计划动作转换为可执行命令,那么由于转换错误也可能导致故障。

工具故障是与具体工具相关的。每个工具都需要独立测试。你需要始终打印出每个工具调用及其输出,这样才能进行检查和评估。如果你使用了转换器,要建立相应的基准测试来评估它。

要检测由于缺少必要工具导致的故障,你需要先理解应该使用哪些工具。如果你的 AI 智能体在某个特定领域经常失败,很可能是因为它缺少该领域所需的工具。这时候应该与该领域的人类专家合作,观察他们在实际工作中会使用哪些工具。

效率(Efficiency)

智能体可能会生成有效的计划,使用正确的工具来完成任务,但它可能效率不高。以下是一些您可能想要跟踪的内容来评估智能体的效率:

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

你可以将这些指标与你的基线进行对比,基线可以是另一个 AI 智能体或人类操作员。在将 AI 智能体与人类进行比较时,需要注意的是,人类和 AI 具有非常不同的操作方式,因此对人类来说高效的方式对 AI 来说可能是低效的,反之亦然。比如说,访问100个网页对于一次只能访问一个页面的人类来说可能效率很低,但对于能够同时访问所有网页的 AI 智能体来说却能轻松完成。

结论

从本质上讲,AI 智能体的概念相当简单。AI 智能体由其运行环境和可使用的工具集来定义。在 AI 驱动的智能体中,AI 模型就像大脑一样,利用其工具和来自环境的反馈来规划最佳完成任务的方式。工具的使用使模型的能力大大提升,因此智能体模式是不可避免的。

虽然”AI 智能体”的概念听起来很新颖,但它们是建立在许多早期大语言模型就开始使用的概念之上的,包括自我批评、chain-of-thought(思维链)和结构化输出。

这篇文章从概念上介绍了 AI 智能体的工作原理和不同组成部分。在未来的文章中,我会讨论如何评估智能体框架。

智能体模式经常需要处理超出模型上下文窗口限制的信息。一个能够补充模型上下文信息处理的”记忆系统”可以显著提升智能体的能力。由于这篇文章已经很长了,我会在未来的博客文章中探讨”记忆系统”是如何工作的。

英文原文链接 - https://huyenchip.com//2025/01/07/agents.html