许多人认为智能代理是人工智能的最终目标。 Stuart Russell 和 Peter Norvig 的经典著作《人工智能:一种现代方法》 (Prentice Hall,1995)将人工智能研究领域定义为“理性主体的研究和设计”。 ”
基础模型前所未有的功能为以前难以想象的代理应用程序打开了大门。这些新功能最终使开发自主智能代理成为我们的助手、同事和教练成为可能。他们可以帮助我们创建网站、收集数据、计划旅行、进行市场研究、管理客户帐户、自动输入数据、为面试做准备、采访我们的候选人、谈判交易等。可能性似乎无穷无尽,而且这些药剂的潜在经济价值是巨大的。
本节将从代理概述开始,然后继续介绍决定代理功能的两个方面:工具和规划。代理以其新的运作模式,也有新的失败模式。本节最后将讨论如何评估代理以捕获这些故障。
这篇文章改编自《人工智能工程》 (2025)的代理部分,经过少量编辑,使其成为独立的文章。
注意事项:
- 人工智能驱动的代理是一个新兴领域,目前还没有用于定义、开发和评估它们的既定理论框架。本节是尽最大努力从现有文献中构建一个框架,但它会随着该领域的发展而发展。与本书的其余部分相比,这一部分更具实验性。我从早期审稿人那里收到了有用的反馈,我也希望从这篇博文的读者那里得到反馈。
- 就在这本书出版之前,Anthropic 发表了一篇关于构建有效代理的博客文章(2024 年 12 月 19 日)。我很高兴看到 Anthropic 的博客文章和我的代理部分在概念上是一致的,尽管术语略有不同。然而,Anthropic 的帖子侧重于孤立的模式,而我的帖子则涵盖了事物运作的原因和方式。我还更关注规划、工具选择和故障模式。
- 该帖子包含大量背景信息。如果感觉有点过于杂草,请随意跳过!
代理概览
术语“代理”已用于许多不同的工程环境中,包括但不限于软件代理、智能代理、用户代理、会话代理和强化学习代理。那么,到底什么是代理呢?
代理是任何可以感知其环境并对该环境采取行动的东西。人工智能:现代方法(1995)将代理定义为任何可以被视为通过传感器感知其环境并通过执行器对该环境采取行动的东西。
这意味着代理的特征在于它运行的环境和它可以执行的一组操作。
代理可以运行的环境由其用例定义。如果开发代理来玩游戏(例如, Minecraft、 Go、 Dota ),则该游戏就是其环境。如果您希望代理从互联网上抓取文档,那么环境就是互联网。自动驾驶汽车代理的环境是道路系统及其邻近区域。
人工智能代理可以执行的操作集通过它可以访问的工具得到增强。您日常交互的许多由人工智能驱动的生成应用程序都是可以访问工具的代理,尽管这些工具很简单。 ChatGPT 是一个代理。它可以搜索网络、执行Python代码并生成图像。 RAG 系统是代理——文本检索器、图像检索器和 SQL 执行器是它们的工具。
代理的环境与其工具集之间存在很强的依赖性。环境决定了代理可以使用哪些工具。例如,如果环境是国际象棋游戏,则代理唯一可能的动作就是有效的国际象棋动作。然而,智能体的工具库存限制了它可以运行的环境。例如,如果机器人的唯一动作是游泳,那么它将被限制在水环境中。
图 6-8 显示了SWE-agent (Yang 等人,2024)的可视化,它是一个构建在 GPT-4 之上的代理。它的环境是带有终端和文件系统的计算机。其操作集包括导航存储库、搜索文件、查看文件和编辑行。
图 6-8。 SWE-agent 是一个编码代理,其环境是计算机,其操作包括导航、搜索、查看文件和编辑
人工智能代理旨在完成通常由用户提供的任务。在人工智能代理中,人工智能是处理任务的大脑,计划一系列行动来完成该任务,并确定任务是否已完成。
让我们回到上面 Kitty Vogue 示例中带有表格数据的 RAG 系统。这是一个简单的代理,具有三个操作:
- 响应生成,
- SQL 查询生成,以及
- SQL 查询执行。
给定查询"Project the sales revenue for Fruity Fedora over the next three months"
,代理可能会执行以下操作序列:
- 关于如何完成此任务的原因。它可能会决定,为了预测未来的销售,首先需要过去五年的销售数据。代理的推理可以显示为中间响应。
- 调用 SQL 查询生成来生成查询以获取过去五年的销售数据。
- 调用 SQL 查询执行来执行此查询。
- 关于工具输出(SQL 查询执行的输出)的原因以及它们如何帮助销售预测。它可能会认为这些数字不足以做出可靠的预测,可能是因为缺少值。然后,它决定还需要有关过去营销活动的信息。
- 调用 SQL 查询生成来生成过去营销活动的查询。
- 调用 SQL 查询执行。
- 原因是这些新信息足以帮助预测未来的销售情况。然后它生成一个投影。
- 任务已成功完成的原因。
与非代理用例相比,代理通常需要更强大的模型,原因有两个:
- 复合错误:智能体通常需要执行多个步骤来完成一项任务,并且整体准确率随着步骤数的增加而降低。如果模型每步的准确率是95%,超过10步,准确率会下降到60%,超过100步,准确率只有0.6%。
- 更高的风险:通过使用工具,代理能够执行更有影响力的任务,但任何失败都可能产生更严重的后果。
需要许多步骤的任务可能需要时间和金钱来运行。一个常见的抱怨是,代理只会消耗您的 API 积分。然而,如果代理可以实现自主,他们就可以节省人类时间,从而使他们的成本变得值得。
在给定的环境中,代理在环境中的成功取决于它可以使用的工具及其人工智能规划器的强度。让我们首先研究模型可以使用的不同类型的工具。接下来我们将分析AI的规划能力。
工具
系统不需要访问外部工具即可成为代理。然而,如果没有外部工具,代理的能力将受到限制。模型本身通常可以执行一项操作——法学硕士可以生成文本,图像生成器可以生成图像。外部工具使代理的能力大大增强。
工具可以帮助智能体感知环境并对其采取行动。允许代理感知环境的操作是只读操作,而允许代理对环境进行操作的操作是写入操作。
代理可以访问的工具集是其工具库存。由于代理的工具库存决定了代理可以做什么,因此考虑向代理提供什么工具以及多少工具非常重要。更多的工具为代理提供了更多的能力。然而,工具越多,理解和利用它们的难度就越大。需要进行实验才能找到合适的工具集,如稍后“工具选择”部分中所述。
根据代理的环境,有许多可能的工具。您可能需要考虑以下三类工具:知识增强(即上下文构建)、功能扩展以及让代理根据其环境采取行动的工具。
知识扩充
我希望到目前为止,这本书已经让您相信拥有模型响应质量的相关背景的重要性。一类重要的工具包括那些有助于增强代理知识的工具。其中一些已经讨论过:文本检索器、图像检索器和 SQL 执行器。其他潜在的工具包括内部人员搜索、返回不同产品状态的库存 API、Slack 检索、电子邮件阅读器等。
许多此类工具使用组织的私有流程和信息来增强模型。然而,工具也可以让模型访问公共信息,尤其是来自互联网的信息。
Web 浏览是 ChatGPT 中最早、最受期待的功能之一。 Web 浏览可以防止模型过时。当模型所训练的数据过时时,模型就会过时。如果模型的训练数据上周被切断,它将无法回答需要本周信息的问题,除非在上下文中提供了该信息。如果没有网页浏览,模型将无法告诉您天气、新闻、即将发生的事件、股票价格、航班状态等。
我使用网络浏览作为一个总称,涵盖所有访问互联网的工具,包括网络浏览器和 API,例如搜索 API、新闻 API、GitHub API 或社交媒体 API。
虽然网络浏览允许您的代理参考最新信息以产生更好的响应并减少幻觉,但它也可以让您的代理进入互联网的污水池。谨慎选择您的 Internet API。
能力扩展
您还可以考虑解决人工智能模型固有局限性的工具。它们是提高模型性能的简单方法。例如,人工智能模型因数学不佳而臭名昭著。如果您询问模型 199,999 除以 292 等于多少,该模型可能会失败。但是,如果模型可以使用计算器,则此计算将变得微不足道。与其尝试训练模型擅长算术,不如让模型访问工具,这样可以更加节省资源。
其他可以显着提高模型能力的简单工具包括日历、时区转换器、单位转换器(例如,从磅到千克)以及可以在模型不擅长的语言之间进行互译的翻译器。
更复杂但更强大的工具是代码解释器。您可以让模型访问代码解释器来执行一段代码、返回结果或分析代码的故障,而不是训练模型来理解代码。此功能使您的代理可以充当编码助理、数据分析师甚至研究助理,可以编写代码来运行实验并报告结果。然而,自动化代码执行伴随着代码注入攻击的风险,正如第 5 章“防御提示工程”部分中所讨论的。适当的安全措施对于确保您和用户的安全至关重要。
工具可以将纯文本或纯图像模型转变为多模态模型。例如,只能生成文本的模型可以利用文本到图像模型作为工具,使其能够生成文本和图像。给定文本请求,代理的人工智能规划器决定是否调用文本生成、图像生成或两者都调用。这就是 ChatGPT 生成文本和图像的方式 – 它使用 DALL-E 作为图像生成器。
代理还可以使用代码解释器生成图表和图形,使用 LaTex 编译器渲染数学方程,或使用浏览器从 HTML 代码渲染网页。
同样,只能处理文本输入的模型可以使用图像字幕工具来处理图像,使用转录工具来处理音频。它可以使用 OCR(光学字符识别)工具来读取 PDF。
与仅仅提示甚至微调相比,工具的使用可以显着提高模型的性能。 Chameleon (Lu 等人,2023)表明,由 GPT-4 驱动的代理,加上一组 13 个工具的增强,可以在多个基准测试中优于单独的 GPT-4。该代理使用的工具示例包括知识检索、查询生成器、图像字幕生成器、文本检测器和 Bing 搜索。
在科学问答基准 ScienceQA 上,Chameleon 将最佳已发表的少数结果提高了 11.37%。在涉及表格数学问题的基准 TabMWP(表格数学应用题)(Lu et al., 2022)上,Chameleon 将准确性提高了 17%。
写入动作
到目前为止,我们已经讨论了允许模型从其数据源读取的只读操作。但工具还可以执行写入操作,对数据源进行更改。 SQL 执行器可以检索数据表(读)并更改或删除表(写)。电子邮件 API 可以读取电子邮件,但也可以对其进行回复。银行 API 可以检索您的当前余额,但也可以发起银行转账。
写入操作使系统能够执行更多操作。它们可以使您自动化整个客户外展工作流程:研究潜在客户、查找他们的联系人、起草电子邮件、发送第一封电子邮件、阅读回复、跟进、提取订单、使用新订单更新数据库等。
然而,让人工智能自动改变我们生活的前景令人恐惧。正如您不应该授予实习生删除生产数据库的权限一样,您也不应该允许不可靠的人工智能发起银行转账。对系统功能及其安全措施的信任至关重要。您需要确保系统免受不良行为者的侵害,他们可能会试图操纵系统执行有害操作。
边栏:代理和安全
每当我向一群人谈论自主人工智能代理时,经常有人会提到自动驾驶汽车。 “如果有人闯入车内绑架你怎么办?虽然自动驾驶汽车的例子因其物理性而显得发自内心,但人工智能系统即使不存在于物理世界中也可能造成伤害。它可以操纵股票市场、窃取版权、侵犯隐私、强化偏见、传播错误信息和宣传等等,如第 5 章“防御性提示工程”部分所述。
这些都是合理的担忧,任何想要利用人工智能的组织都需要认真对待安全问题。然而,这并不意味着人工智能系统永远不应该被赋予在现实世界中行动的能力。如果我们可以信任一台机器将我们带入太空,我希望有一天,安全措施足以让我们信任自主人工智能系统。此外,人类也可能会失败。就我个人而言,我会比一般的陌生人更信任自动驾驶汽车载我一程。
正如正确的工具可以帮助人类大大提高工作效率一样,您能想象没有 Excel 做生意或没有起重机建造摩天大楼吗?工具使模型能够完成更多任务。许多模型提供商已经支持在其模型中使用工具,这一功能通常称为函数调用。展望未来,我预计大多数模型都可以使用多种工具进行函数调用。
规划
基础模型代理的核心是负责解决用户提供的任务的模型。任务由其目标和约束来定义。例如,一项任务是安排从旧金山到印度的为期两周的旅行,预算为 5,000 美元。目标是为期两周的旅行。限制是预算。
复杂的任务需要规划。规划过程的输出是一个计划,它是概述完成任务所需步骤的路线图。有效的规划通常需要模型理解任务,考虑实现该任务的不同选项,并选择最有希望的一个。
如果您参加过任何计划会议,您就会知道计划是很难的。作为一个重要的计算问题,规划已得到充分研究,需要几卷书才能涵盖。我在这里只能覆盖表面。
规划概览
对于一项任务,有很多可能的方法来解决它,但并非所有方法都会带来成功的结果。在正确的解决方案中,有些比其他解决方案更有效。考虑这样一个问题: "How many companies without revenue have raised at least $1 billion?"
,以及两个示例解决方案:
- 查找所有没有收入的公司,然后按筹集的金额过滤它们。
- 找到所有筹集了至少 10 亿美元的公司,然后按收入过滤它们。
第二种选择更有效。没有收入的公司比筹集了 10 亿美元的公司要多得多。仅给出这两个选项,智能代理应该选择选项 2。
您可以在同一提示中将计划与执行结合起来。例如,您给模型一个提示,要求它逐步思考(例如使用思路链提示),然后在一个提示中全部执行这些步骤。但是,如果模型提出了 1,000 步计划,但根本无法实现目标怎么办?如果没有监督,代理可能会运行这些步骤几个小时,在 API 调用上浪费时间和金钱,然后您才意识到它不会有任何进展。
为了避免执行无果而终,计划应该与执行脱钩。您要求代理首先生成一个计划,只有在该计划经过验证后才会执行。该计划可以使用启发式方法进行验证。例如,一种简单的启发法是消除具有无效操作的计划。如果生成的计划需要 Google 搜索,而代理无权访问 Google 搜索,则该计划无效。另一个简单的启发式方法可能是消除所有具有超过 X 个步骤的计划。
还可以使用人工智能法官来验证计划。您可以要求模型来评估该计划是否合理或如何改进。
如果生成的计划被评估为不好,您可以要求规划器生成另一个计划。如果生成的计划良好,则执行它。
如果计划由外部工具组成,则将调用函数调用。然后需要再次评估执行该计划的输出。请注意,生成的计划不必是整个任务的端到端计划。它可以是子任务的一个小计划。整个流程如图6-9所示。
图 6-9。将计划和执行分离,以便仅执行经过验证的计划
您的系统现在具有三个组件:一个用于生成计划,一个用于验证计划,另一个用于执行计划。如果将每个组件视为一个代理,则可以将其视为多代理系统。由于大多数代理工作流程都非常复杂,涉及多个组件,因此大多数代理都是多代理。
为了加快这一过程,您可以并行生成多个计划,并要求评估者选择最有希望的一个,而不是按顺序生成计划。这是另一个延迟与成本的权衡,因为同时生成多个计划会产生额外的成本。
规划需要理解任务背后的意图:用户试图用这个查询做什么?意图分类器通常用于帮助代理进行计划。如第 5 章“将复杂任务分解为更简单的子任务”部分所示,可以使用另一个提示或为此任务训练的分类模型来完成意图分类。意图分类机制可以被视为多代理系统中的另一个代理。
了解意图可以帮助代理选择正确的工具。例如,对于客户支持,如果查询与计费有关,则代理可能需要访问工具来检索用户最近的付款。但如果查询是关于如何重置密码,代理可能需要访问文档检索。
提示:
某些查询可能超出代理的范围。意图分类器应该能够将请求分类为
IRRELEVANT
以便代理可以礼貌地拒绝这些请求,而不是浪费时间来提出不可能的解决方案。
到目前为止,我们假设代理自动执行所有三个阶段:生成计划、验证计划和执行计划。事实上,人类可以在任何阶段参与以帮助完成该过程并降低风险。
- 人类专家可以提供计划、验证计划或执行计划的一部分。例如,对于代理难以生成整个计划的复杂任务,人类专家可以提供代理可以扩展的高级计划。
- 如果计划涉及有风险的操作,例如更新数据库或合并代码更改,系统可以在执行之前请求明确的人工批准或推迟人工执行这些操作。为了实现这一点,您需要明确定义代理对每个操作可以拥有的自动化级别。
总而言之,解决一个任务通常涉及以下过程。请注意,反射对于代理来说不是强制性的,但它会显着提高代理的性能。
- 计划生成:提出完成此任务的计划。计划是一系列可管理的操作,因此这个过程也称为任务分解。
- 反思和纠错:评估生成的计划。如果这是一个糟糕的计划,就制定一个新的计划。
- 执行:采取生成的计划中概述的行动。这通常涉及调用特定函数。
- 反思和纠错:收到行动结果后,评估这些结果并确定目标是否已实现。识别并纠正错误。如果目标没有完成,则制定新的计划。
您已经在本书中看到了一些计划生成和反思的技术。当您要求模型“逐步思考”时,您是在要求它分解任务。当你要求模型“验证你的答案是否正确”时,你是在要求它进行反思。
基金会模型作为规划者
一个悬而未决的问题是基础模型的规划效果如何。许多研究人员认为基础模型,至少是那些建立在自回归语言模型之上的模型,不能。 Meta 的首席人工智能科学家 Yann LeCun 明确表示,自回归法学硕士无法制定计划(2023 年)。
自回归法学硕士无法制定计划
(并且无法真正推理)。“虽然我们自己的有限实验没有显示出通过微调[规划能力]有任何显着改善,但通过更多的微调数据和努力,经验性能可能会很好…… https://t.co/rHA5QHi90C
— Yann LeCun (@ylecun) 2023 年 9 月 13 日
虽然有很多轶事证据表明法学硕士是糟糕的规划者,但尚不清楚这是因为我们不知道如何以正确的方式使用法学硕士,还是因为法学硕士从根本上无法规划。
规划的核心是一个搜索问题。您在实现目标的不同路径中进行搜索,预测每条路径的结果(奖励),并选择最有希望结果的路径。通常,您可能会确定不存在可以带您到达目标的路径。
搜索常常需要回溯。例如,假设您处于有两个可能操作的步骤:A 和 B。采取操作 A 后,您进入一个没有希望的状态,因此您需要回溯到之前的状态以采取操作 B。
有些人认为自回归模型只能产生前向动作。它无法回溯以生成替代操作。因此,他们得出结论,自回归模型无法进行规划。然而,这并不一定是真的。使用动作 A 执行路径后,如果模型确定该路径没有意义,则可以使用动作 B 修改路径,从而有效回溯。该模型也可以随时重新开始并选择另一条路径。
法学硕士也可能是糟糕的规划者,因为他们没有获得规划所需的工具。为了制定计划,不仅需要了解可用的行动,还需要了解每个行动的潜在结果。举一个简单的例子,假设您想步行上山。您可能采取的行动是右转、左转、转身或直行。然而,如果右转会导致你从悬崖上掉下来,你可能不会考虑这个动作。用技术术语来说,一个操作会将您从一种状态带到另一种状态,并且有必要知道结果状态才能确定是否采取操作。
这意味着提示模型仅生成一系列操作(如流行的思维链提示技术所做的那样)是不够的。论文“用语言模型进行推理就是用世界模型进行规划”(Hao et al., 2023)认为,法学硕士通过包含大量有关世界的信息,能够预测每个动作的结果。该法学硕士可以结合这一结果预测来生成连贯的计划。
即使人工智能无法计划,它仍然可以成为计划者的一部分。或许可以通过搜索工具和状态跟踪系统来增强法学硕士的能力,以帮助其进行规划。
侧边栏:基础模型 (FM) 与强化学习 (RL) 规划器
代理是强化学习的核心概念,维基百科将其定义为“关注智能代理如何在动态环境中采取行动以最大化累积奖励的领域”。 ”
RL 智能体和 FM 智能体在很多方面都很相似。它们的特征都在于它们的环境和可能的行动。主要区别在于他们的计划者的工作方式。在 RL 代理中,规划器由 RL 算法进行训练。训练这个强化学习规划器可能需要大量的时间和资源。在 FM 代理中,模型是规划者。这种模型可以通过提示或微调来提高其规划能力,并且通常需要更少的时间和资源。
然而,没有什么可以阻止 FM 代理结合 RL 算法来提高其性能。我怀疑从长远来看,FM 智能体和 RL 智能体将会合并。
计划生成
将模型转变为计划生成器的最简单方法是快速工程。想象一下,您想要创建一个代理来帮助客户了解 Kitty Vogue 的产品。您允许该代理访问三个外部工具:按价格检索产品、检索热门产品和检索产品信息。以下是计划生成提示的示例。此提示仅用于说明目的。生产提示可能更复杂。
SYSTEM PROMPT Propose a plan to solve the task. You have access to 5 actions: * 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) The plan must be a sequence of valid actions. Examples Task: "Tell me about Fruity Fedora" Plan: [fetch_product_info, generate_query, generate_response] Task: "What was the best selling product last week?" Plan: [fetch_top_products, generate_query, generate_response] Task: {USER INPUT} Plan:
这个例子有两点需要注意:
- 这里使用的计划格式(其参数由代理推断的函数列表)只是构建代理控制流的多种方法之一。
-
generate_query
函数接收任务的当前历史记录和最新的工具输出,以生成要输入响应生成器的查询。每个步骤的工具输出都会添加到任务历史记录中。
鉴于用户输入“上周最畅销产品的价格是多少”,生成的计划可能如下所示:
-
get_time()
-
fetch_top_products()
-
fetch_product_info()
-
generate_query()
-
generate_response()
您可能想知道,“每个函数所需的参数怎么样?”确切的参数很难提前预测,因为它们通常是从以前的工具输出中提取的。如果第一步get_time()
输出“2030-09-13”,代理可以推断下一步的参数应使用以下参数调用:
retrieve_top_products( start_date="2030-09-07", end_date="2030-09-13", num_products=1 )
通常,没有足够的信息来确定函数的确切参数值。例如,如果用户询问“畅销产品的平均价格是多少?”,以下问题的答案是不清楚的:
- 用户想看多少畅销产品?
- 用户想要上周、上个月还是一直以来最畅销的产品?
这意味着模型经常需要做出猜测,而猜测可能是错误的。
由于动作序列和相关参数都是由人工智能模型生成的,因此它们可能会产生幻觉。幻觉可能导致模型调用无效函数或调用有效函数但参数错误。一般而言,提高模型性能的技术可用于提高模型的规划能力。
提示:以下是一些可以帮助代理更好地进行规划的提示。
- 通过更多示例编写更好的系统提示。
- 对工具及其参数进行更好的描述,以便模型更好地理解它们。
- 重写函数本身以使其更简单,例如将一个复杂的函数重构为两个更简单的函数。
- 使用更强的模型。一般来说,更强的模型更擅长规划。
- 微调计划生成的模型。
函数调用
许多模型提供商为他们的模型提供工具使用,有效地将他们的模型转变为代理。工具就是功能。因此,调用工具通常称为函数调用。不同模型的API工作原理不同,但一般来说,函数调用的工作原理如下:
- 创建工具清单。声明您可能希望模型使用的所有工具。每个工具都由它的执行入口点(例如,它的函数名称)、它的参数和它的文档(例如,函数做什么以及它需要什么参数)来描述。
- 指定代理可以使用哪些工具进行查询。
由于不同的查询可能需要不同的工具,因此许多 API 允许您指定每个查询要使用的已声明工具的列表。有些允许您通过以下设置进一步控制工具的使用:-
required
:模型必须至少使用一种工具。 -
none
:模型不应使用任何工具。 -
auto
:模型决定使用哪些工具。
-
函数调用如图6-10所示。这是用伪代码编写的,以使其代表多个 API。要使用特定的API,请参阅其文档。
图 6-10。使用两个简单工具的模型示例
给定一个查询,如图 6-10 中定义的代理将自动生成要使用的工具及其参数。某些函数调用 API 将确保仅生成有效的函数,但它们无法保证正确的参数值。
例如,假设用户查询“40 磅等于多少千克?”,代理可能会决定需要参数值为 40 的工具lbs_to_kg_tool
。代理的响应可能如下所示。
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)
,并使用其输出来生成对用户的响应。
提示:与代理合作时,请始终要求系统报告其用于每个函数调用的参数值。检查这些值以确保它们是正确的。
计划粒度
计划是一个路线图,概述完成任务所需的步骤。路线图可能具有不同水平的粒度。为了计划一年,一个四分之一的计划比一个月的计划更高,这反过来又比每周一周的计划更高。
有计划/执行权衡。详细的计划很难生成,但更容易执行。更高级别的计划更容易生成,但更难执行。规避这种权衡的一种方法是按层次进行计划。首先,使用计划者制定高级计划,例如季度到季度的计划。然后,对于每个季度,使用相同或不同的计划者生成一个月的计划。
到目前为止,生成计划的所有示例都使用确切的功能名称,这是非常细粒的。这种方法的一个问题是代理商的工具库存可以随着时间的推移而变化。例如,获得当前日期get_time()
功能可以重命名为get_current_time()
。当工具更改时,您需要更新您的提示和所有示例。使用确切的函数名称也使使用具有不同工具API的不同用例中的计划者更难重复使用。
如果您以前对模型进行了修订,以基于旧工具清单生成计划,则需要在新工具清单上再次对模型进行修复。
为了避免此问题,也可以使用更自然的语言制定计划,该语言比特定于域的功能名称更高。例如,鉴于查询“上周最畅销产品的价格是多少”,可以指示代理商输出看起来像这样的计划:
-
get current date
-
retrieve the best-selling product last week
-
retrieve product information
-
generate query
-
generate response
使用更多的自然语言有助于您的计划生成器对工具API的变化变得强大。如果您的模型主要接受了自然语言的培训,那么它可能会更好地理解和制定自然语言的计划,而且幻觉的可能性较小。
这种方法的缺点是,您需要翻译器将每个自然语言动作转换为可执行的命令。 Chameleon (Lu等,2023)称此翻译器为程序生成器。但是,翻译比计划要简单得多,并且可以通过较低的幻觉风险来完成。
复杂的计划
到目前为止,计划示例是顺序的:在完成上一项操作后,计划中的下一个操作始终执行。可以执行操作的顺序称为控制流。顺序形式只是一种控制流。其他类型的控制流包括平行,if语句和循环。下面的列表提供了每个控制流的概述,包括进行比较的顺序:
-
顺序
执行任务B完成A后完成,可能是因为任务B取决于任务A。例如,仅在从自然语言输入中转换后,SQL查询才能执行。
-
平行线
同时执行任务A和B。例如,鉴于查询“找到我最畅销的产品100美元”,代理商可能首先取回前100个最畅销的产品,并且对于每种产品,都可以检索其价格。
-
如果语句
执行任务B或任务C取决于上一步的输出。例如,代理商首先检查NVIDIA的收益报告。基于此报告,它可以决定出售或购买NVIDIA股票。 Anthropic的帖子称此模式为“路由”。
-
用于循环
重复执行任务A直到满足特定条件。例如,继续生成随机数直至质数。
这些不同的对照流在图6-11中可视化。
图6-11。可以执行计划的不同订单的示例
在传统的软件工程中,控制流的条件是精确的。使用AI驱动的代理,AI模型确定了控制流。具有非序列控制流的计划更难生成和转化为可执行命令。
评估代理框架时,请检查其支持的控制。例如,如果系统需要浏览十个网站,可以同时这样做吗?并行执行可以大大减少用户感知的延迟。
反射和误差校正
即使是最佳计划,也需要对其进行评估和调整,以最大程度地提高其成功机会。尽管代理商进行操作并不是严格必要的,但代理人取得成功是必要的。
在任务过程中,有很多地方可以有用:
- 收到用户查询以评估请求是否可行之后。
- 在最初的计划生成之后,评估计划是否有意义。
- 在执行步骤之后,评估是否在正确的轨道上。
- 在执行整个计划之后,确定是否已完成任务。
反射和误差校正是两种不同的机制。反射产生洞察力,有助于发现错误以纠正。
可以使用自称提示的同一代理进行反射。它也可以使用单独的组件(例如专业得分手:一个为每个结果输出混凝土得分的模型)来完成。
首先是由React提出的(Yao等,2022),交织的重点和交流已成为代理的常见模式。 Yao等。使用“推理”一词来涵盖计划和反思。在每个步骤中,要求代理商解释其思维(计划),采取行动,然后分析观察值(反思),直到代理人将任务视为完成为止。通常使用示例提示代理以以下格式生成输出:
Thought 1: … Act 1: … Observation 1: … … [continue until reflection determines that the task is finished] … Thought N: … Act N: Finish [Response to query]
图6-12显示了反应框架之后的代理的一个示例,该示例响应了HotPotQA( Yang等,2018 )的问题,这是多跳问题回答的基准。
图6-12:动作中的反应剂。
您可以在多代理设置中实现反射:一个代理计划并采取行动,另一个代理会在每个步骤之后或多个步骤之后评估结果。
如果代理人的响应未能完成任务,则可以提示代理人反思为什么失败以及如何改进。基于此建议,代理商生成了一个新计划。这使代理商可以从错误中学习。
例如,给定编码生成任务,评估器可能会评估生成的代码失败测试用例。然后,代理反映出它失败了,因为它没有考虑所有数字为负的数组。然后,考虑到全负阵列,该演员将生成新的代码。
这是反射( Shinn等,2023 )采用的方法。在此框架中,反射分为两个模块:评估结果和一个自我反射模块的评估器,该模块分析了出了问题所在。图6-13显示了作用中反射剂的示例。作者使用“轨迹”一词来指代计划。在每个步骤中,在评估和自我反射之后,代理提出了一个新的轨迹。
图6-13。反射剂的工作方式的示例。
与计划产生相比,反射相对易于实施,并且可以带来令人惊讶的良好性能改善。这种方法的缺点是延迟和成本。思想,观察和有时动作可能需要大量代币才能产生,这增加了成本和用户感知的延迟,尤其是对于具有许多中间步骤的任务。为了推动他们的代理人遵循格式,React和Reflexion作者都在提示中使用了很多示例。这增加了计算输入令牌的成本,并减少了可用于其他信息的上下文空间。
工具选择
由于工具通常在任务的成功中起着至关重要的作用,因此工具选择需要仔细考虑。给您的代理商的工具取决于环境和任务,但也取决于为代理提供动力的AI模型。
没有关于如何选择最佳工具的万无一失的指南。代理文献包括广泛的工具清单。例如,工具形式(Schick等人,2023年)对GPT-J进行了填充,以学习五个工具。 Chameleon (Lu等,2023)使用13个工具。另一方面, Gorilla (Patil等,2023)试图提示代理在1,645个API中选择正确的API调用。
更多的工具为代理提供了更多的功能。但是,工具越多,有效使用它们就越难。这类似于人类难以掌握大量工具的困难。添加工具还意味着增加工具描述,这可能不适合模型的上下文。
像构建AI应用程序时的许多其他决定一样,工具选择需要实验和分析。您可以做一些可以帮助您决定的事情:
- 比较代理商如何使用不同的工具集。
- 进行消融研究,以查看如果从库存中删除了工具,则代理商的性能下降了多少。如果可以在没有性能下降的情况下卸下工具,请将其删除。
- 寻找代理商经常犯错误的工具。如果某个工具证明了代理商不难使用的工具,例如,广泛的提示甚至填充无法使模型学习使用它,则可以改变工具。
- 绘制工具调用的分布,以查看哪些工具最使用的工具以及最少使用的工具。图6-14显示了变色龙中GPT-4和CHATGPT的工具使用模式的差异(Lu等,2023)。
图6-14。不同的模型和任务表示不同的工具使用模式。来自变色龙的图像(Lu等,2023)。
Chameleon的实验(Lu等,2023)也证明了两个点:
- 不同的任务需要不同的工具。科学问题回答任务的科学QA比TABMWP更依赖于知识检索工具,而TABMWP是一项标签数学解决问题的任务。
- 不同的模型具有不同的工具偏好。例如,GPT-4似乎选择了比ChatGpt更宽的工具。 Chatgpt似乎赞成图像字幕,而GPT-4似乎偏爱知识检索。
提示:
评估代理框架时,请评估其支持的计划者和工具。不同的框架可能专注于不同类别的工具。例如,AutoGPT专注于社交媒体API(Reddit,X和Wikipedia),而Composio专注于企业API(Google Apps,Github和Slack)。
随着您的需求可能会随着时间的流逝而改变,请评估扩展代理以合并新工具的容易性。
作为人类,我们不仅通过使用我们提供的工具,而且通过从更简单的工具中创建更强大的工具来提高效率。 AI可以从其初始工具创建新工具吗?
Chameleon (Lu等,2023)提出了工具转换的研究:工具X后,代理调用工具y的可能性有多大?图6-15显示了工具转换的示例。如果经常一起使用两个工具,则可以将它们组合成更大的工具。如果代理知道此信息,则代理本身可以将初始工具组合起来,以不断构建更复杂的工具。
图6-15。 Chameleon的工具过渡树(Lu等,2023)。
Vogager (Wang等,2023)提出了一位技能经理,以跟踪代理商将获得以后再利用的新技能(工具)。每个技能都是一个编码程序。当技能经理确定新创建的技能是有用的(例如,因为它成功地帮助代理完成了任务),它将此技能添加到技能库中(概念上类似于工具清单)。以后可以检索此技能以用于其他任务。
在本节的早期,我们提到,环境中代理的成功取决于其工具库存及其计划功能。在任何方面,失败都会导致代理失败。下一节将讨论代理商的不同故障模式以及如何评估它们。
代理故障模式和评估
评估是关于检测失败的。代理执行的任务越复杂,就越可能的故障点。除了第3章和第4章中讨论的所有AI应用程序共有的故障模式外,代理还具有由计划,工具执行和效率引起的独特失败。某些失败比其他故障更容易捕获。
要评估代理,请确定其故障模式并测量这些故障模式中的每一种。
计划失败
规划很困难,并且可能在许多方面失败。最常见的计划故障方式是工具使用故障。代理商可能会生成一个或多个这些错误的计划。
-
无效的工具
例如,它生成一个包含
bing_search
的计划,该计划不在工具清单中。 -
有效工具,无效参数。
例如,它将带有两个参数的
lbs_to_kg
,但是此功能仅需要一个参数,lbs
。 -
有效工具,不正确的参数值
例如,它将
lbs_to_kg with
称为一个参数lbs
,但在应为120时使用值100的值。
计划失败的另一种方式是目标失败:代理无法实现目标。这可能是因为计划无法解决任务,或者它在不遵循约束的情况下解决了任务。为了说明这一点,请想象您要求模型计划从旧金山到印度的两周旅行,预算为5,000美元。代理商可能会计划从旧金山到越南的旅行,或计划从旧金山到印度进行两周的旅行,这将使您超过预算。
经纪人评估通常会忽略的一个常见约束是时间。在许多情况下,代理商的时间较小,因为您可以将任务分配给代理商,并且只需要在完成何时完成任务。但是,在许多情况下,代理会随着时间的推移而有用。例如,如果您要求代理商准备赠款提案,并且代理在赠款截止日期后完成该提案,则代理商并不是很有帮助。
一种有趣的计划失败方式是由反思中的错误引起的。代理商坚信它没有完成任务。例如,您要求代理商将50个人分配到30个酒店房间。代理商可能只分配40个人,并坚持已经完成了任务。
为了评估计划失败的代理,一个选项是创建一个计划数据集,每个示例都是元素(task, tool inventory)
。对于每个任务,使用代理生成K数量的计划。计算以下指标:
- 在所有生成的计划中,有多少有效?
- 对于给定的任务,代理必须平均生成多少计划才能获得有效计划?
- 在所有工具调用中,有多少有效?
- 一次无效的工具称一次?
- 有效的工具多久使用无效参数调用?
- 有效的工具多久用不正确的参数值调用一次?
分析代理的输出的模式。代理商更多地完成了哪些类型的任务?你有假设为什么吗?该模型经常犯错误?某些工具对于代理来说可能更难使用。您可以通过更好的提示,更多示例或填充来提高代理商使用具有挑战性的工具的能力。如果全部失败,您可以考虑将此工具换成更容易使用的工具。
工具故障
使用正确的工具时,工具故障发生,但是工具输出是错误的。一个故障模式是工具只给出错误的输出时。例如,图像字幕器返回错误的描述,或者SQL查询生成器返回错误的SQL查询。
如果代理仅生成高级计划,并且涉及翻译模块从每个计划的操作转换为可执行命令,则由于翻译错误而可能发生故障。
工具故障是依赖工具的。每个工具都需要独立测试。始终打印出每个工具调用及其输出,以便您可以检查和评估它们。如果您有翻译器,请创建基准来评估它。
检测缺失的工具故障需要了解应该使用哪些工具。如果您的代理经常在特定域上失败,则可能是因为它缺少该域的工具。与人类领域专家合作,并观察他们将使用哪些工具。
效率
代理可以使用正确的工具来生成有效的计划来完成任务,但效率可能降低。您可能想跟踪以下几件事来评估代理商的效率:
- 代理人平均需要多少个步骤来完成任务?
- 代理人平均要花多少钱才能完成一项任务?
- 每个动作通常需要多长时间?是否有特别耗时或昂贵的动作?
您可以将这些指标与基线进行比较,这可以是另一个代理商或人类操作员。当将AI代理与人类代理人进行比较时,请记住,人类和AI具有非常不同的操作方式,因此对人类的有效效率可能对AI效率低,反之亦然。例如,访问100页的网页可能对人类代理人效率低下,后者一次只能访问一个页面,但对于可以一次访问所有网页的AI代理来说,这是微不足道的。
结论
从本质上讲,代理的概念非常简单。代理是由其操作的环境和它可以访问的一组工具定义的。在AI驱动的代理中,AI模型是利用其工具和反馈环境的大脑,以计划如何最好地完成任务。使用工具可以使模型更有能力,因此代理模式是不可避免的。
虽然“代理人”的概念听起来很新颖,但它们却建立在自LLM早期以来使用的许多概念,包括自我批评,经营链和结构化输出。
从概念上讲,这篇文章涵盖了代理商的工作方式和代理商的不同组成部分。在以后的帖子中,我将讨论如何评估代理框架。
代理模式通常处理超过模型上下文限制的信息。在处理信息中补充模型上下文的存储系统可以显着增强代理的功能。由于这篇文章已经很长,因此我将探讨记忆系统在未来的博客文章中的工作方式。