AI智能体(Agents)工程指南:从工具、规划到评估

许多人认为智能体是人工智能的终极目标。 Stuart Russell 和 Peter Norvig 合著的经典著作《人工智能:现代方法》(Prentice Hall,1995)将人工智能研究定义为“理性主体的研究与设计”。
基础模型前所未有的能力为以往难以想象的代理应用打开了大门。 这些新能力终于让我们能够开发自主智能代理,作为我们的助理、同事和教练。 他们可以帮助我们创建网站、收集数据、规划行程、进行市场调研、管理客户账户、 自动化数据录入、为面试做准备、面试候选人、谈判交易等等。 可能性似乎无穷无尽,这些代理的潜在经济价值巨大。
本节将从代理概述开始,接着介绍决定代理能力的两个方面:工具和规划。代理在新的操作模式中,也面临新的失败模式。本节将以如何评估代理以发现这些失败作结。
本文改编自特工部分人工智能工程(2025年)经过小幅修改,使其成为一篇独立的文章。
注释:
1. 人工智能驱动的智能体是一个新兴领域,尚无既定的理论框架来定义、开发和评估它们。 本节是通过现有文献构建框架的尽力尝试,但随着该领域的发展,框架将不断发展。 与书中其他部分相比,这一部分更具实验性。 我从早期评论者那里得到了有帮助的反馈,也希望能从这篇博客文章的读者那里得到反馈。
2. 就在本书出版前夕,Anthropic发表了一篇博客文章打造高效的代理(2024年12月)。 很高兴看到Anthropic的博客文章和我的经纪人部分理念一致虽然术语略有不同。 不过,Anthropic的帖子侧重于孤立的模式,而我的帖子则讲解了事物的原理和运作方式。 我也更注重规划、工具选择和失败模式。
3. 帖子包含大量背景信息。如果觉得有点过于深入,可以直接跳过!
代理概述
代理一词在许多不同的工程环境中被使用,包括但不限于软件代理、智能代理、用户代理、对话代理和强化学习代理。那么,代理人到底是什么?
智能体是指能够感知其环境并对该环境采取行动的任何事物。 《人工智能:现代方法》(1995)将智能体定义为任何可以通过传感器感知环境, 并通过执行器对环境采取行动的对象。
这意味着代理以其所处环境及其可执行的动作集合为特征。
代理可运行的环境由其使用场景定义。如果一个代理是为玩一款游戏(例如,Minecraft、 围棋、Dota)而开发的,那么该游戏就是它的环境。 如果你想让代理从互联网抓取文件,环境就是互联网。 自动驾驶汽车代理的环境是道路系统及其周边区域。
人工智能智能体能执行的一系列动作会因其可访问的工具而增强。 你每天接触的许多生成式AI应用都是代理,拥有简单的工具。 ChatGPT 是一个代理。它可以在网上搜索,执行Python代码,并生成图片。 RAG系统是代理——文本检索器、图像检索器和SQL执行器是它们的工具。
代理的环境与其工具之间存在强烈依赖关系。 环境决定了代理可能使用哪些工具。例如,如果环境是国际象棋,代理唯一可能的动作是有效的国际象棋走法。 然而,代理的工具库存限制了其可操作的环境。 例如,如果机器人唯一的动作是游泳,它将被限制在水域环境中。
图6-8展示了SWE代理(Yang 等,2024),这是基于GPT-4构建的代理。 其环境是带有终端和文件系统的计算机。 其操作包括浏览仓库、搜索文件、查看文件和编辑行。
图6-8。SWE代理是一种编码代理,其环境为计算机,其操作包括导航、搜索、查看文件和编辑
人工智能代理旨在完成通常由用户提供的任务。在人工智能代理中,人工智能是处理任务、规划一系列行动以完成任务并判断任务是否完成的大脑。
让我们回到上面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规划器的实力。我们先从模型可以使用的各种工具开始。接下来我们将分析人工智能在规划方面的能力。
工具
系统不需要访问外部工具才能成为代理。 然而,没有外部工具,代理的能力将受到限制。 单独来看,模型通常只能执行一个操作——大型语言模型可以生成文本,图像生成器可以生成图像。 外部工具能让代理能力大幅提升。
工具帮助代理既感知环境,也帮助其采取行动。允许智能体感知环境的动作是只读动作,而允许智能体对环境采取行动的动作则是写入动作。
代理能访问的工具集合就是其工具库存。 由于经纪人的工具库存决定了代理能做什么,因此考虑给经纪人提供什么以及多少工具非常重要。 工具越多,代理能力越强。然而,工具越多,理解和有效利用它们就越具有挑战性。 找到合适的工具组需要实验,正如后文“工具选择”部分所讨论的那样。
根据代理的环境,有许多可能的工具。以下是你可能想考虑的三类工具:知识增强(即上下文构建)、能力扩展,以及让你的代理在其环境中行动的工具。
知识增强
我希望这本书到目前为止能让你认识到,拥有模型响应质量所需的相关背景的重要性。 一类重要的工具包括帮助增强经纪人知识的。 其中一些已经讨论过:文本检索器、图像检索器和SQL执行器。 其他潜在工具包括内部人员搜索、返回不同产品状态的库存API、Slack检索、 电子邮件阅读器等。
许多此类工具会用组织的私有流程和信息来补充模型。然而,工具也能让模型访问公共信息,尤其是来自互联网的。
网页浏览是最早且最受期待的功能之一,被整合进ChatGPT。 网页浏览可以防止模型变得过时。当模型训练时的数据变得过时,模型就会变得陈旧。 如果模型的训练数据上周被截断,除非在上下文中提供这些信息,否则它无法回答需要本周信息的问题。 没有网页浏览,模特无法告诉你天气、新闻、即将发生的活动、股价、航班状态等信息。
我用网页浏览作为一个总称,涵盖所有访问互联网的工具,包括网页浏览器和API,如搜索API、新闻API、GitHub API或社交媒体API。
虽然网页浏览让你的经纪人能够查阅最新信息,从而获得更好的反馈并减少幻觉,但这也可能让你的经纪人暴露在互联网的污水坑中。请谨慎选择您的互联网API。
能力扩展
你也可以考虑一些针对AI模型固有局限性的工具。 它们是给模型性能提升的简单方法。例如,人工智能模型以数学能力差而闻名。 如果你问一个模型199,999除以292是多少,模型很可能会失败。 然而,如果模型能使用计算器,这种计算将变得轻而易举。 与其试图训练模型擅长算术,直接让模型使用工具会更节省资源。
其他能显著提升模型能力的简单工具包括日历、时区转换器、单位转换器(例如,从磅数到公斤),以及能够与模型不擅长语言进行翻译的翻译器。
更复杂但强大的工具是代码解释器。你无需训练模型去理解代码,而是赋予它代码解释器的访问权限, 以执行一段代码、返回结果或分析代码的失败。 这项功能使你的代理能够作为编码助理、数据分析师,甚至研究助理编写代码以运行实验并报告结果。 然而,自动化代码执行存在代码注入攻击的风险,详见第五章“防御提示工程”部分。 适当的安全措施对于保障您和用户的安全至关重要。
工具可以将纯文本或仅图像模型转变为多模态模型。 例如,一个只能生成文本的模型可以利用文本到图像模型作为工具,从而生成文本和图像。 面对文本请求,代理的AI规划器决定是否调用文本生成、图像生成,或两者兼用。 这就是ChatGPT如何同时生成文本和图像的原因——它使用DALL-E作为图像生成器。
代理还可以使用代码解释器生成图表,使用LaTex编译器渲染数学方程,或使用浏览器从HTML代码渲染网页。
同样,仅处理文本输入的模型可以使用图片说明工具处理图像,使用转录工具处理音频。它可以使用光学字符识别(OCR)工具来读取PDF。
工具的使用相比单纯提示或微调,能显著提升模型的性能。变色龙(Lu 等,2023)证明,一个由GPT-4驱动的智能体,配合13个工具,在多个基准测试中能够超越单独的GPT-4。 该代理使用的工具示例包括知识检索、查询生成器、图片说明器、文本检测器和必应搜索。
在科学问答基准测试ScienceQA中,Chameleon将最佳已发表的少量照片结果提升了11.37%。 在TabMWP(表格数学应用题)(Lu等,2022)中,Chameleon的准确率提升了17%。
写入动作
到目前为止,我们讨论了只读操作,允许模型从其数据源读取数据。 但工具也可以执行写入操作,对数据源进行修改。 SQL 执行器可以检索数据表(读取),并更改或删除表(写)。 电子邮件API可以读取邮件,也能回复邮件。 银行API可以检索您当前的余额,也可以发起银行转账。
写入动作使系统能够完成更多工作。他们可以帮助你自动化整个客户外联流程:研究潜在客户、 寻找联系人、起草邮件、发送首封邮件、阅读回复、跟进、提取订单、更新数据库添加新订单等。
然而,赋予人工智能自动改变我们生活能力的前景令人恐惧。 就像你不应该赋予实习生删除你的生产数据库的权限一样,你也不应该允许一个不可靠的人工智能发起银行转账。 对系统能力和安全措施的信任至关重要。 你需要确保系统免受不良行为者的保护,防止他们试图操控它去实施有害行为。
侧注:特工与安全
每当我和一群人谈论自动驾驶AI代理时,总会有人提到自动驾驶汽车。 “如果有人入侵车里绑架你怎么办?”虽然自动驾驶汽车的例子因其物理性而显得直观, 但人工智能系统即使不在物理世界中存在也能造成伤害。 它可以操纵股市、窃取版权、侵犯隐私、强化偏见、传播虚假信息和宣传,等等, 详见第五章“防御提示工程”章节。
这些都是合理的担忧,任何想要利用人工智能的组织都必须认真对待安全和保障。 然而,这并不意味着人工智能系统不应被赋予在现实世界中行动的能力。 如果我们能信任机器带我们进入太空,我希望有一天安全措施能足够让我们信任自主人工智能系统。 况且,人类也会失败。就我个人而言,我更信任自动驾驶汽车来载我一程。
正如合适的工具能极大提升人类生产力——你能想象没有Excel做生意,或没有起重机建造摩天大楼吗? 工具也让模型能够完成更多任务。许多模型提供商已经支持其模型中使用工具,这一功能通常称为函数调用。 未来,我预计大多数型号都会普遍使用各种工具进行函数调用。
规划
基础模型代理的核心是负责解决用户提供任务的模型。 任务由其目标和约束定义。例如,一项任务是安排一次为期两周的旧金山印度之旅, 预算为5000美元。目标是完成为期两周的旅行。 限制在于预算。
复杂的任务需要规划。规划过程的产出是一份计划,即一份规划图,列出完成任务所需的步骤。 有效的规划通常需要模型理解任务,考虑不同的选项以实现该任务,并选择最有前景的方案。
如果你参加过任何规划会议,你就会知道规划有多难。作为一个重要的计算问题,规划已被深入研究,需要几卷书才能涵盖。我只能覆盖表面。
规划概述
给定一个任务,解决的方法有很多,但并非所有方法都能带来成功的结果。 在正确的解决方案中,有些比其他的更高效。 请考虑“有多少没有收入的公司筹集了至少10亿美元? ”以及这两个示例解法:
1. 找到所有没有收入的公司,然后按筹集金额筛选。
2. 找到所有筹集至少10亿美元的公司,然后按收入筛选。
第二种选择更高效。没有收入的公司远多于筹集10亿美元的公司。在只有这两个选项的情况下,智能智能体应选择选项2。
你可以在同一个提示词里结合计划和执行。 例如,你给模型一个提示,让它一步步思考(比如用链式思维提示),然后在一个提示中执行这些步骤。 但如果模型提出一个1000步的计划,却连目标都达不到呢? 没有监督,代理可以连续运行这些步骤数小时,浪费时间和金钱在 API 调用上,直到你意识到这些步骤根本不会消失。
为避免无果执行,规划应与执行分开。你先让代理生成一个计划,只有在验证计划后才执行。 该计划可以通过启发式方法进行验证。例如,一个简单的启发式方法是消除无效行动的计划。 如果生成的套餐需要谷歌搜索,而客服无法访问谷歌搜索,该套餐无效。 另一个简单的启发式方法是排除所有超过X步的计划。
计划也可以通过AI评判进行验证。你可以请模型评估该计划是否合理,或如何改进。
如果生成的计划被评估为糟糕,你可以要求规划师生成另一个计划。如果生成的计划是好的,就执行它。
如果计划包含外部工具,则调用函数调用。 执行该计划的输出还需要再次评估。注意,生成的计划不必是整个任务的端到端计划。 它可以是一个小计划,作为一个子任务。 整个过程看起来像图6-9。
图6-9。将规划与执行脱钩,仅执行经过验证的计划
你的系统现在有三个组件:一个生成计划,一个验证计划,另一个执行计划。 如果你把每个组件都看作代理,这也可以看作多代理系统。 由于大多数代理工作流程足够复杂,涉及多个组件,因此大多数代理是多代理的。
为了加快流程,你可以同时生成多个计划,而不是顺序生成,然后请评估者挑选最有前景的方案。这又是一个延迟与成本的权衡,因为同时生成多个套餐会产生额外成本。
规划需要理解任务背后的意图:用户想通过这个查询做什么? 意图分类器常用于帮助代理进行规划。如第5章“将复杂任务拆分为更简单的子任务”部分所示, 意图分类可以通过其他提示词或专门训练的分类模型来完成。 意图分类机制可以被视为你多智能体系统中的另一个代理。
了解意图可以帮助经纪人选择合适的工具。 例如,对于客户支持,如果查询是关于账单的,客服可能需要访问工具来获取用户最近的付款记录。 但如果查询是关于如何重置密码,代理可能需要访问文档检索。
提示:
有些查询可能超出了代理的权限。意图分类器应能将请求分类为无关,这样代理才能礼貌地拒绝这些请求,而不是浪费FLOP去想出不可能的解决方案。
到目前为止,我们假设代理自动化了三个阶段:生成计划、验证计划和执行计划。实际上,人类可以在任何阶段参与,协助过程并降低风险。
• 人类专家可以提供计划、验证计划或执行计划的部分内容。例如,对于代理难以生成完整计划的复杂任务,人类专家可以提供一个高级计划,代理可以进一步扩展。
• 如果计划涉及风险操作,如更新数据库或合并代码变更,系统可以在执行前明确请求人工批准, 或将这些操作交由人工执行。为了实现这一点,你需要明确定义代理对每个动作可以实现的自动化程度。
总之,解决一项任务通常包括以下几个过程。注意,反射对智能体来说不是强制的,但会显著提升智能体的性能。
1. 计划生成:制定完成该任务的计划。计划是一系列可管理的行动,因此这个过程也称为任务分解。
2. 反思与纠错:评估生成的计划。如果是个糟糕的计划,就重新制定一个。
3. 执行:执行生成计划中列出的行动。这通常涉及调用特定的函数。
4. 反思与错误纠正:在收到行动结果后,评估这些结果并判断目标是否已达成。识别并纠正错误。如果目标未完成,制定新的计划。
你已经在这本书中见过一些计划生成和反思的技巧。当你让模型“一步步思考”时,你是在让它拆解一个任务。当你让模型“验证你的答案是否正确”时,你是在让它反映出来。
作为规划者的基础模型
一个悬而未决的问题是基础模型的规划能力如何。 许多研究者认为,基础模型,至少是建立在自回归语言模型上的模型,无法做到这一点。 Meta首席人工智能科学家Yann LeCun明确表示自回归型LLM无法规划(2023).
自动回归型大型语言模型无法规划 (而且也没法讲理)。
“虽然我们有限的实验未显示通过微调在规划能力上有显著提升,但通过更多微调数据和努力,实证表现很可能......t.co/rHA5QHi90C —— 扬·勒昆(@ylecun)2023年9月13日 虽然有很多轶事证据表明LLM不擅长规划,但目前尚不清楚这是因为我们不知道如何正确使用LLMs,还是因为它们根本无法规划。
规划本质上是一个搜索难题。你在不同的路径中寻找目标,预测每条路径的结果(奖励),并选择结果最有希望的路径。你可能会发现没有一条能带你到达目标的路径。
搜索常常需要回溯。举个例子,假设你处于一个阶段,有两个可能的行动:A和B。采取行动A后,你进入了一个没有前景的状态,因此你需要回溯到之前的状态来采取行动B。
有人认为自回归模型只能产生前向动作。 它不能回溯生成替代动作。因此,他们得出结论,自回归模型无法进行规划。 然而,这并不一定正确。在用动作A执行路径后,如果模型判断该路径不合理,可以用动作B来修正路径, 实际上是回溯。模型也可以重新开始,选择另一条路径。
也有可能大型语言模型不擅长规划,因为他们没有获得规划所需的工具。 要制定计划,不仅要了解可用的行动,还要了解每个行动的潜在结果。 举个简单的例子,假设你想走上一座山。 你可能的动作是右转、左转、掉头或直行。 不过,如果右转会导致你从悬崖上掉下去,你可能不会考虑这个动作。 从技术上讲,一个动作会让你从一个状态跳到另一个状态,了解结果状态是决定是否采取行动的必要条件。
这意味着,像流行的思维链提示技术那样,只让模型生成一系列动作是不够的。 那张纸”用语言模型推理就是用世界模型规划(Hao 等,2023)认为,大型语言模型(LLM)通过包含大量关于世界的信息,能够预测每一个动作的结果。 该大型语言模型可以将结果预测纳入构建连贯的计划。
即使人工智能不能规划,它仍然可以成为规划工具的一部分。也许可以用搜索工具和状态追踪系统来辅助LLM规划。
侧边栏:基础模型(FM)与强化学习(RL)规划器
代理是强化学习(RL)的核心概念,定义如下维基百科作为一个“关注智能代理在动态环境中应如何采取行动以最大化累积回报的领域”。
强化学习代理和FM代理在许多方面相似。它们都由环境和可能的动作所定义。主要区别在于他们的规划本工作方式。
• 在强化学习代理中,规划者由强化学习算法训练。培训这个强化学习计划器可能需要大量时间和资源。
• 在FM代理中,模型是规划者。该模型可以被提示或微调以提升规划能力,通常所需时间和资源更少。
然而,FM代理完全可以利用强化学习算法来提升性能。我怀疑从长远来看,FM代理和现实学习代理会合并。
计划生成
将模型转化为计划生成器的最简单方法是使用即时工程。 想象一下,你想创建一个代理人,帮助客户了解Kitty Vogue的产品。你赋予该代理三种外部工具的访问权限:按价格检索产品、检索顶级产品和获取产品信息。 这里有一个计划生成提示的示例。此提示仅供插图使用。 制作提示可能更复杂。
系统提示:
关于这个例子,有两点需要注意:
• 这里使用的计划格式——由代理推断参数的函数列表——只是构建代理控制流程的众多方式之一。
• generate_query函数会根据任务当前历史和最新的工具输出生成查询,输入响应生成器。每一步的工具输出会被添加到任务历史中。
鉴于用户输入“上周最畅销产品的价格是多少”,生成的计划可能如下:
1. get_time()
2. fetch_top_products()
3. fetch_product_info()
4. generate_query()
5. generate_response()
你可能会想,“每个函数需要的参数呢? ”具体参数难以提前预测,因为它们通常是从之前的工具输出中提取的。 如果第一步 get_time(), 输出“2030-09-13”,智能体可以推断下一步的参数应调用以下参数:
通常,信息不足以确定函数的精确参数值。例如,如果用户问“畅销产品的平均价格是多少?”,以下问题的答案就不明确:
• 用户想看多少畅销产品?
• 用户想要的是上周、上个月还是历来最畅销的产品?
这意味着模型经常需要做出猜测,而猜测可能出错。
由于动作序列及相关参数均由AI模型生成,它们可能会产生幻觉。 幻觉可能导致模型调用无效函数,或调用参数错误的有效函数。 提升模型性能的技术可以用来提升模型的规划能力。
提升经纪人规划能力的建议。
• 写出包含更多示例的更好系统提示。
• 对工具及其参数提供更详细的描述,使模型更好地理解它们。
• 重写函数本身使其更简单,例如将复杂函数重构为两个更简单的函数。
• 使用更强的模型。一般来说,更强的模型更擅长规划。
• 精细调整计划生成模型。
函数调用
许多模型提供商为其模型提供工具使用,实际上将模型转化为代理。 工具是一种功能。因此,调用工具通常被称为函数调用。 不同模型的API工作方式不同,但一般来说,函数调用的工作方式如下:
1. 创建工具清单。 声明你可能想让模型使用的所有工具。每个工具通过其执行入口点(例如函数名称)、参数和文档(例如函数的功能和所需参数)来描述。
2. 指定代理可以使用哪些工具来完成查询。
因为不同的查询可能需要不同的工具,许多API允许你指定每个查询使用的声明工具列表。有些还允许你通过以下设置进一步控制工具的使用:
• 要求:模型必须至少使用一种工具。
• 无:模型不应使用任何工具。
• 自动:模型决定使用哪些工具。
函数调用如图6-10所示。它用伪代码编写,以代表多个 API。如需使用特定API,请参考其文档。
图6-10。一个使用两个简单工具的模型示例
给定查询时,如图6-10定义的代理会自动生成使用工具及其参数。一些调用函数的API会确保只生成有效的函数,尽管它们无法保证参数值是正确的。
例如,针对用户查询“40磅是多少公斤?”,代理可能决定需要一个参数值为40的工具lbs_to_kg_tool。代理人的回复可能如下。
通过这个响应,你可以调用函数lbs_to_kg(lbs=40),并用其输出生成对用户的响应。
提示:使用代理时,务必要求系统报告每次函数调用使用的参数值。检查这些数值以确保正确。
规划细分
计划是一份路线图,列出完成任务所需的步骤。路线图可以有不同的细度层次。要规划一年,季度计划比月度计划更高级,月度计划又高于周周计划。
这需要在规划和执行之间权衡。详细的计划更难生成,但执行起来更容易。 更高级的计划更容易生成,但执行起来更难。 规避这种权衡的方法是采取分层规划。首先,使用规划工具生成一个高层次的计划, 比如季度对季度计划。然后,每个季度使用相同或不同的计划本生成月度计划。
到目前为止,所有生成的计划示例都使用了完全相同的函数名称,非常细致。 这种方法的问题在于,经纪人的工具库存可能会随时间变化。 例如,获取当前日期的函数 get_time() 可以重命名为 get_current_time()。 当工具发生变化时,你需要更新提示词和所有示例。 使用完全相同的函数名称也使得在不同用例和不同工具API中重复使用规划器变得更困难。
如果你之前微调过模型,基于旧工具库存生成计划,你需要在新工具库存中再次微调模型。
为避免此问题,也可以使用更自然的语言生成计划,这比域特定函数名更为高级。例如,给定查询“上周最畅销产品的价格是多少”,客服可以被指示输出如下图:
1. 获取当前日期
2. 取回上周最畅销的产品
3. 检索产品信息
4. 生成查询
5. 激发回应
使用更多自然语言有助于你的计划生成器对工具API的变化更具稳定性。如果你的模型主要用自然语言训练,它更擅长理解和生成自然语言的计划,也不太可能出现幻觉。
这种方法的缺点是你需要一个翻译器来将每个自然语言动作翻译成可执行的命令。变色龙 (Lu et al., 2023)将此翻译器称为程序生成器。 然而,翻译是一项比计划简单得多的任务,并且可以通过幻觉风险较低的较弱模型来完成。
复杂的计划
到目前为止的计划示例都是连续的:计划中的下一个操作总是在上一个操作完成后执行。 执行操作的顺序称为控制流。 顺序形式只是控制流的一种类型。 其他类型的控制流包括并行、if 语句和 for 循环。 下面的列表提供了每个控制流的概述,包括用于比较的顺序:
• 顺序
在任务 A 完成后执行任务 B,可能是因为任务 B 依赖于任务 A。例如,SQL 查询只能在从自然语言输入翻译后才能执行。
• 平行线
同时执行任务A和B。 例如,给定查询“查找 100 美元以下的最畅销产品”,代理可能首先检索前 100 个最畅销产品,然后针对其中的每种产品检索其价格。
• 如果语句
根据上一步的输出执行任务 B 或任务 C。 例如,代理商首先检查 NVIDIA 的收益报告。 根据这份报告,它可以决定出售或购买 NVIDIA 股票。 人类的帖子 将这种模式称为“路由”。
• For循环
重复执行任务A,直到满足特定条件。 例如,继续生成随机数,直到出现素数。
这些不同的控制流如图 6-11 所示。
图 6-11。执行计划的不同顺序的示例
在传统的软件工程中,控制流的条件是精确的。 借助人工智能驱动的代理,人工智能模型可以确定控制流。 具有非顺序控制流的计划更难以生成和转换为可执行命令。
提示:
在评估代理框架时,请检查它支持哪些控制流。 例如,如果系统需要浏览十个网站,是否可以同时浏览?并行执行可以显着减少用户感知的延迟。
反思与纠错
即使是最好的计划也需要不断评估和调整,以最大限度地提高成功的机会。 虽然反思对于代理的运作来说并不是严格必要的,但对于代理的成功却是必要的。
在任务过程中有很多地方可以利用反思:
• 收到用户查询后评估该请求是否可行。
• 初始计划生成后评估该计划是否有意义。
• 在每个执行步骤之后评估它是否走在正确的轨道上。
• 整个计划执行完毕后,判断任务是否完成。
反射和纠错是两种齐头并进的不同机制。 反思产生的见解有助于发现需要纠正的错误。
反思可以由同一个代理人通过自我批评提示来完成。 它还可以使用单独的组件来完成,例如专门的评分器:为每个结果输出具体分数的模型。
最先提出者 反应 (Yao et al., 2022),交叉推理和行动已经成为智能体的常见模式。 姚等人。使用“推理”一词来涵盖计划和反思。 在每一步中,智能体都被要求解释其想法(计划),采取行动,然后分析观察结果(反思), 直到智能体认为任务完成。 通常会使用示例提示代理生成以下格式的输出:
图 6-12 显示了遵循 ReAct 框架的代理响应 HotpotQA 问题的示例(杨等人, 2018),多跳问答的基准。
图 6-12:运行中的 ReAct 代理。
您可以在多代理设置中实施反射:一个代理计划并采取行动,另一个代理在每个步骤或多个步骤之后评估结果。
如果座席的响应未能完成任务,您可以提示座席反思失败原因以及如何改进。 根据此建议,代理会生成一个新计划。 这使得代理能够从错误中吸取教训。
例如,给定一个编码生成任务,评估者可能会评估生成的代码未通过 1/3 的测试用例。 然后,代理反映它失败了,因为它没有考虑所有数字均为负数的数组。 然后,参与者会生成新代码,同时考虑全负数组。
这就是反射(Shinn 等人,2023)采取了。在这个框架中,反思分为两个模块:评估结果的评估器和分析问题所在的自我反思模块。 图 6-13 显示了运行中的反射代理的示例。 作者使用“轨迹”一词来指代计划。 在每一步中,经过评估和自我反思后,智能体都会提出一条新的轨迹。
图 6-13。反射代理如何工作的示例。
与计划生成相比,反射相对容易实现,并且能够带来令人惊讶的良好性能提升。 这种方法的缺点是延迟和成本。 想法、观察甚至有时行动可能需要大量令牌才能生成,这会增加成本和用户感知的延迟, 特别是对于具有许多中间步骤的任务。 为了促使他们的代理遵循这种格式,ReAct 和 Reflexion 的作者在他们的提示中使用了大量的例子。 这增加了计算输入标记的成本并减少了可用于其他信息的上下文空间。
工具选择
由于工具通常对任务的成功起着至关重要的作用,因此工具的选择需要仔细考虑。 为代理提供的工具取决于环境和任务,但也取决于为代理提供支持的 AI 模型。
关于如何选择最佳工具集,没有万无一失的指南。 代理文献包含各种工具清单。 例如:
• 工具成形者 (Schick et al., 2023) 对 GPT-J 进行了微调以学习 5 种工具。
• 变色龙 (Lu et al., 2023)使用 13 种工具。
• 大猩猩 (Patil 等人,2023)尝试提示代理在 1,645 个 API 中选择正确的 API 调用。
更多工具赋予代理更多能力。 然而,工具越多,有效使用它们就越困难。 这类似于人类掌握大量工具的难度。 添加工具还意味着增加工具描述,这可能不适合模型的上下文。
与构建人工智能应用程序时的许多其他决策一样,工具选择需要实验和分析。 您可以采取以下一些措施来帮助您做出决定:
• 比较代理使用不同工具集的表现。
• 进行消融研究,看看如果某个工具从其库存中移除,代理的性能会下降多少。 如果可以删除某个工具而不会降低性能,则将其删除。
• 寻找代理经常犯错误的工具。 如果一个工具被证明对代理来说太难使用——例如,大量的提示甚至微调都无法让模型学会使用它——那么就改变这个工具。
• 绘制工具调用的分布图,以查看哪些工具使用最多,哪些工具使用最少。 图6-14展示了GPT-4和ChatGPT工具使用模式的差异变色龙 (Lu 等人,2023)。
图 6-14。不同的模型和任务表达了不同的工具使用模式。
实验通过 变色龙 (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)。
由于您的需求可能会随着时间的推移而发生变化,因此请评估扩展代理以合并新工具的难易程度。
作为人类,我们不仅通过使用我们获得的工具来提高工作效率,还通过从简单的工具逐渐创建更强大的工具来提高工作效率。 人工智能能否从最初的工具中创造出新的工具?
变色龙(Lu 等, 2023) 提出了工具转换的研究:在使用工具 X 之后,代理调用工具 Y 的可能性有多大?图 6-15 显示了一个工具转换的示例。如果两个工具经常一起使用,它们可以组合成一个更大的工具。 如果代理了解这一信息,代理本身可以将初始工具组合起来,不断构建更复杂的工具。
图 6-15. Chameleon 的工具转换树 (Lu 等, 2023)。航行者号(Wang et al., 2023)提出了一个技能管理器来跟踪代理获得的新技能(工具)以供以后重用。 每个技能都是一个编码程序。 当技能管理器确定新创建的技能有用时(例如,因为它成功帮助代理完成任务), 它会将此技能添加到技能库(概念上类似于工具库存)。 稍后可以检索该技能以用于其他任务。
在本节前面,我们提到代理在环境中的成功取决于其工具库存和规划能力。 任何一个方面的失败都可能导致代理失败。 下一节将讨论代理的不同故障模式以及如何评估它们。
代理失效模式和评估
评估是关于检测故障。 代理执行的任务越复杂,可能的故障点就越多。 除了第 3 章和第 4 章讨论的所有人工智能应用程序共有的故障模式之外,代理还存在由规划、工具执行和效率引起的独特故障。 有些失败比其他失败更容易发现。
要评估代理,请识别其故障模式并测量每种故障模式发生的频率。
计划失败
规划是困难的,并且可能在很多方面失败。 计划失败最常见的模式是工具使用失败。 代理生成的计划可能包含一个或多个这些错误。
• 无效工具
例如,它生成一个包含 bing 的计划_搜索,该工具不在工具清单中。
• 有效的工具,无效的参数。
例如,它调用 lbs_到_kg 有两个参数,但该函数只需要一个参数 lbs。
• 有效的工具,不正确的参数值
例如,它调用 lbs_到_kg 具有一个参数 lbs,但在 lbs 应为 120 时使用值 100。
计划失败的另一种模式是目标失败:代理未能实现目标。 这可能是因为计划没有解决任务,或者它在不遵循约束的情况下解决了任务。 为了说明这一点,假设您要求模型计划从旧金山到印度为期两周的旅行,预算为 5,000 美元。代理人可能会计划从旧金山到越南的旅行,或者为您计划从旧金山到印度的为期两周的旅行, 这将远远超出您的预算。
代理评估经常忽视的一个常见约束是时间。 在许多情况下,客服人员花费的时间并不重要,因为您可以将任务分配给客服人员, 并且只需要在完成后签入。 然而,在许多情况下,随着时间的推移,代理的用处会变得越来越小。 例如,如果您要求代理人准备拨款提案,而代理人在拨款截止日期后完成,那么代理人就没有多大帮助。
计划失败的一个有趣模式是由反思错误引起的。 智能体确信它已经完成了任务,但实际上它还没有完成。 例如,您要求代理将 50 人分配到 30 个酒店房间。 代理可能只指派 40 人,并坚称任务已完成。
要评估代理的规划失败情况,一种选择是创建一个规划数据集,其中每个示例都是一个元组(任务、工具清单)。对于每个任务,使用代理生成 K 个计划。 计算以下指标:
1. 在所有生成的计划中,有多少是有效的?
2. 对于给定的任务,代理必须生成多少个计划才能获得有效的计划?
3. 在所有工具调用中,有多少是有效的?
4. 无效工具多久被调用一次?
5. 使用无效参数调用有效工具的频率如何?
6. 使用不正确的参数值调用有效工具的频率如何?
分析代理的输出模式。 代理在哪些类型的任务上失败较多?你有一个假设吗? 模型使用哪些工具经常出错?有些工具对于代理来说可能更难使用。 您可以通过更好的提示、更多的示例或微调来提高代理使用具有挑战性的工具的能力。 如果全部失败,您可能会考虑将此工具更换为更易于使用的工具。
工具故障
当使用正确的工具但工具输出错误时,就会发生工具故障。 一种故障模式是工具给出错误的输出。 例如,图像字幕生成器返回错误的描述,或者 SQL 查询生成器返回错误的 SQL 查询。
如果代理仅生成高级计划,并且转换模块参与将每个计划操作转换为可执行命令,则可能会因转换错误而发生失败。
工具故障与工具相关。 每个工具都需要独立测试。 始终打印出每个工具调用及其输出,以便您可以检查和评估它们。 如果您有翻译人员,请创建基准来评估它。
检测缺失的工具故障需要了解应该使用哪些工具。 如果您的代理经常在特定域上失败,这可能是因为它缺少适用于该域的工具。 与人类领域专家合作并观察他们会使用哪些工具。
效率
代理可能会使用正确的工具生成有效的计划来完成任务,但这可能效率低下。 您可能需要跟踪以下一些内容来评估代理的效率:
• 智能体平均需要多少步才能完成任务?
• 代理完成一项任务的平均成本是多少?
• 每个动作通常需要多长时间?是否有任何操作特别耗时或昂贵?
您可以将这些指标与您的基线进行比较,该基线可以是另一个代理或人工操作员。 在将人工智能代理与人类代理进行比较时,请记住,人类和人工智能的操作模式非常不同, 因此对人类有效的操作可能对人工智能无效,反之亦然。 例如,对于一次只能访问一个页面的人类代理来说,访问 100 个网页可能效率很低,但对于可以一次访问所有网页的人工智能代理来说,访问 100 个网页可能是微不足道的。
结论
从本质上讲,代理的概念相当简单。 代理是由它运行的环境和它可以访问的工具集定义的。 在人工智能驱动的代理中,人工智能模型是利用其工具和环境反馈来规划如何最好地完成任务的大脑。 对工具的访问使模型的能力大大增强,因此代理模式是不可避免的。
虽然“代理人”的概念听起来很新颖,但它们是建立在法学硕士早期以来使用的许多概念之上的,包括自我批评、思想链和结构化输出。
这篇文章从概念上介绍了代理如何工作以及代理的不同组件。 在以后的文章中,我将讨论如何评估代理框架。
代理模式通常处理超出模型上下文限制的信息。 在处理信息时补充模型上下文的记忆系统可以显着增强代理的能力。 由于这篇文章已经很长了,我将在以后的博客文章中探讨内存系统的工作原理。