作者|Authors: Julia Wiesinger, Patrick Marlow and Vladimir Vuskovic
原文|https://www.kaggle.com/whitepaper-agents
出品|码个蛋(ID:codeegg)
整理|陈宇明
在这份白皮书中,讨论了生成式人工智能Agent的基础构建块、它们的组成以及以认知架构的形式实现这些有效方法的方法。这份白皮书的一些关键要点包括:
Agent的未来充满了令人兴奋的进步,我们才刚刚开始触及可能存在的可能性。随着工具变得越来越复杂,并且推理能力得到增强,Agent人将被赋予解决日益复杂的难题的能力。此外,“Agent链”战略方法将继续获得动力。
重点介绍了生成式AI模型能够构建的具体类型的Agent。为了了解Agent的内部运作,首先让我们介绍驱动Agent行为、行动和决策的基础组件。这些组件的组合可以描述为认知架构,并且可以通过混合匹配这些组件来实现许多这样的架构。专注于核心功能,图1中显示了Agent的认知架构中的三个基本组件。
图1:Agent架构和组件
在Agent的范围内,模型指的是将被用作集中决策者的语言模型(LM)。Agent使用的模型可以是任何大小的小型/大型的任意数量的LM,这些LM都可以遵循基于指令的推理和逻辑框架,如ReAct、Chain-of-Thought或Tree-of-Thought。模型可以是一般用途、多模态或根据您特定Agent架构的需求进行微调的。
为了获得最佳生产结果,你应该利用最适合你所期望的应用程序的模型,并且最好是在使用计划用于认知架构中的工具的数据签名上进行了训练。值得注意的是,该模型通常不会与Agent的具体配置设置(即工具选择、编排/推理设置)一起进行培训。然而,通过向它提供展示Agent能力的例子来进一步细化模型也是可能的,包括Agent使用特定工具或各种上下文下的推理步骤实例。
基础模型,尽管其文本和图像生成令人印象深刻,但仍然受到无法与外部世界交互的限制。工具填补了这一差距,使Agent能够与外部数据和服务进行交互,并解锁了单一的基础模型所不能实现的一系列更广泛的操作。工具可以采取多种形式,并具有不同的复杂程度,但通常会遵循常见的Web API方法,如GET、POST、PATCH 和DELETE等。
例如,一个工具可以更新数据库中的客户信息或获取天气数据以影响Agent向用户提供的旅行推荐。借助工具,Agent可以访问并处理现实世界的资讯。这赋予他们支持更多专门系统的能力,如检索增强生成(RAG),该系统显著扩展了Agent在自身能力之外所能实现的可能性。我们将在下面详细讨论工具,但最重要的是要理解,工具是连接Agent内部能力和外部世界的桥梁,从而解锁了一种更广泛的可能。
协调层描述了一个循环过程,它规定了Agent如何获取信息、进行一些内部推理,并使用这种推理来告知其下一步行动或决策。一般来说,这个循环会持续到一个Agent达到目标或停止点为止。
协调层的复杂性取决于执行的任务和Agent本身。有些循环可以是简单的计算与决策规则,而其他可能包含连锁逻辑、涉及额外的机器学习算法或其他概率推理技术。在认知架构部分我们将讨论更多关于Agent协调层的具体实现细节。
Agents vs. models
为了更清楚地了解 Agent 和模型之间的区别,考虑以下图表:
Models | Agents |
---|---|
知识仅限于他们的训练数据中可用的内容。 | 知识通过工具与外部系统的连接而扩展 |
基于用户查询的单一推理/预测。除非为模型显式实现,否则不存在会话历史或连续上下文的管理。聊天记录) | 管理的会话历史(即聊天记录)允许基于用户查询和编排层做出的决策进行多轮推理/预测。在这种情况下,“回合”被定义为交互系统和Agent之间的交互。1个传入事件/查询和1个Agent响应) |
没有本地工具实现。 | 工具在Agent体系结构中本地实现。 |
没有实现本机逻辑层。用户可以将提示作为简单的问题或用户推理框架(CoT、ReAct等)来形成复杂的提示,以指导模型进行预测。 | 本机认知架构,使用推理框架,如CoT、ReAct或其他预构建Agent框架,如LangChain。 |
想象一个厨房里的厨师Agent。他们的目标是为餐厅顾客创造美味佳肴,这涉及一些计划、执行和调整的循环过程。
在每个过程中,厨师根据需要进行调整,并随着原料的耗尽或客户反馈而不断细化他们的计划。他们使用之前的成果来确定下一步行动方案。这种信息摄入、规划、执行和调整的循环描述了厨师所采用的架构,以实现其目标。
就像厨师一样,Agent可以通过迭代处理信息、做出明智的决策并根据先前输出来细化下一步行动,从而使用认知架构达到他们的最终目标。
Agent的认知架构的核心是协调层,负责维护记忆、状态、推理和计划。它利用快速发展的提示工程领域及其相关框架来引导推理和规划,使Agent人能够更有效地与环境互动,并完成任务。关于语言模型的提示工程框架和任务规划的研究正在迅速发展,产生了各种有前途的方法。虽然这不是一个详尽的列表,但这些都是在本文发表时最流行的框架和技术:
Agent可以利用上述推理技术之一,或许多其他技术来选择给定用户请求的下一个最佳操作。
例如,请考虑一个被编程为使用ReAct框架选择正确动作和工具以响应用户查询的Agent。
事件序列可能会像这样进行:
i. 这是工具选择发生的地方
Ii. 例如,一个动作可以是[航班、搜索、代码、无]之一,在前三个代表模型可以选择的已知工具中,最后一个表示“没有选择工具”
图2:Agent 案例在编排层中使用ReAct推理
如图2所示,模型、工具和Agent配置一起工作以根据用户的原始查询提供了简洁响应。尽管模型可以基于其先前知识猜测答案(幻觉),但它使用了一个工具(航班搜索),来查找实时外部信息。这些额外的信息被提供给模型,允许它基于真实事实数据做出更明智的决定,并将此信息汇总回用户。
虽然语言模型擅长处理信息,但它们缺乏直接感知和影响现实世界的能力。这限制了它们在需要与外部系统或数据交互的情况下使用性。这意味着,在某种程度上,一个语言模型只取决于它从训练数据中学习到的东西有多好。但是无论我们向模型扔多少数据,它们仍然缺乏与外界互动的基本能力。那么如何才能让我们的模型具备实时、上下文意识的对外部系统的交互能力呢?功能、扩展程序、数据存储和插件都是提供这种关键能力给模型的方法。
虽然它们有很多名字,但工具是将我们的基础模型与外部世界联系起来的东西。这个对外部系统和数据的链接允许我们的Agent执行更广泛的任务,并且更加准确可靠地完成这些任务。
例如,工具可以使得Agent能够调整智能家居设置、更新日历、从数据库中获取用户信息或根据特定指令发送电子邮件。
截至本文发布日期,谷歌模型能够与三种主要工具类型进行交互:扩展、函数和数据存储。通过为Agent配备工具,我们解锁了他们不仅理解世界而且还能行动的巨大潜力,打开了无数新的应用程序和可能性的大门。
要理解扩展,最简单的方法是将它们视为以标准化方式在API和Agent之间建立桥梁的方式,允许Agent无缝执行API而无需考虑其底层实现。假设您已经构建了一个具有帮助用户预订航班目标的Agent。你知道你想使用Google Flights API来检索航班信息,但你不确定你的Agent如何会调用这个API端点。
图3:Agent如何与外部API交互?
一种方法是实施自定义代码,该代码会处理传入的用户查询、解析查询以获取相关信息,并然后调用API。
例如,在航班预订使用案例中,用户可能会说“我想从奥斯汀预订到苏黎世的航班。”在这种情况下,我们的自定义代码解决方案需要在尝试调用API之前提取出“奥斯汀”和“苏黎世”作为相关的实体来自用户的查询。
但是,如果用户说“我想预订飞往苏黎世的航班”,并且从未提供出发城市呢?如果没有所需的必要数据,API调用将失败,并且还需要更多代码来捕获像这种情况这样的边缘和角落情况。这种方法不可扩展,并且很容易在任何超出已实现的自定义代码范围的情景下崩溃。
更好的方法是使用扩展。通过:
图4:扩展连接Agent到外部API
扩展可以独立于Agent进行构建,但应作为Agent配置的一部分提供。Agent在运行时使用模型和示例来决定是否适合解决用户的查询。这突出了扩展的关键优势之一——其内置的示例类型,允许Agent动态选择最合适的扩展以完成任务。
图5:Agent、扩展和API之间的一对一关系
想想软件开发人员在解决和解决方案时如何决定使用哪个API端点。
如果用户想预订航班,开发者可能会使用Google Flights API;
如果用户想知道离他们当前位置最近的咖啡店在哪里,开发者可能会使用Google Maps API。
同样地,在这个层面上,Agent/模型堆栈会使用一组已知扩展来决定哪一个最适合用户的查询。如果你想看看这些扩展的实际效果,你可以通过进入设置>扩展并启用你想要测试的任何内容来尝试Gemini应用程序中的它们。例如,您可以启用Google Flights扩展然后询问Gemini“显示从奥斯汀到苏黎世的航班,下周五离开。”
图7:函数如何与外部API交互?
这里的主要区别在于函数或Agent都不会直接与Google Flights API交互。那么API调用是如何发生的呢?
通过功能,调用实际API端点的逻辑和执行被从Agent卸载到客户端应用程序上,如图8和图9所示。这为开发人员提供了更精细的数据流控制权。选择使用函数而不是扩展的原因有很多,但一些常见的用例包括:
如图8所示,两种方法之间的内部架构差异微妙。但是,额外的控制和对外部基础设施的解耦依赖使函数调用成为开发人员的一个有吸引力的选择。
图8:客户界定 vs Agent侧控制扩展和功能调用
一个模型可以用来调用函数,以处理复杂的客户端执行流程,其中Agent开发人员可能不希望语言模型管理API的执行(如扩展)。让我们考虑以下示例,在该示例中,正在训练一个Agent作为旅行顾问与想要预订度假行程的用户进行交互。目标是让Agent生成我们可以在我们的中间件应用程序中下载图像、数据等的城市列表,用于用户的行程规划。用户可能会说类似的话:
我想和家人一起去滑雪,但我不知道去哪里。
在典型的提示模型中,输出可能看起来像以下内容:当然可以,这里有一份您可以考虑的家庭滑雪旅行的城市列表。
虽然上面的输出包含我们所需的数据(城市名称),但格式并不适合解析。通过函数调用,我们可以教模型以一种更方便其他系统解析的结构化风格(如JSON)来格式化此输出。
图9:显示函数调用生命周期的序列图
图9中的示例结果是,模型被用来“填补空白”,以满足客户端UI所需的参数来调用Google Places API。客户端UI使用由模型在返回的函数中提供的参数管理实际API调用。这只是一个函数调用的应用场景,但还有许多其他需要考虑的情况:
关于函数的一个关键点是,它们旨在为开发人员提供对不仅API调用的执行,而且整个应用程序的数据流的更多控制。在图9中的示例中,开发人员选择不将API信息返回给Agent,因为这与Agent可能采取的未来行动无关。然而,根据应用程序的架构,将外部API调用数据返回到Agent以影响未来的推理、逻辑和操作选择可能是有意义的。最终,应用程序开发人员需要决定什么最适合特定的应用程序。
想象一下,语言模型就像一个庞大的图书馆,包含其训练数据。但与不断获得新卷的图书馆不同,这个图书馆保持静止不动,只保留了最初培训的知识。这提出了一个问题,因为现实世界中的知识一直在不断发展。数据存储通过提供对更动态和更新信息的访问来解决这一限制,并确保模型的回答始终基于事实性和相关性。
考虑一个常见的场景,开发人员可能需要向模型提供少量额外数据,也许是以电子表格或PDF的形式。
图10:Agent如何与结构化和非结构化数据交互?
数据存储允许开发人员以原始格式向Agent提供额外的数据,从而消除了耗时的数据转换、模型重新训练或精细调整的需要。数据存储将传入文档转换为一组向量数据库嵌入,这些嵌入是Agent可以用来提取其下一步操作或对用户响应所需的信息。
图11:数据存储连接Agent到各种类型的新实时数据源
在生成型人工智能Agent的背景下,数据存储通常被实现为开发人员希望Agent在运行时访问的向量数据库。虽然我们不会在这里深入探讨向量数据库,但关键要点是它们以矢量嵌入的形式存储数据,这是一种高维向量或对提供的数据进行数学表示的方式。最近使用语言模型的一个最常见示例就是检索增强的应用程序。
基于 RAG 的应用程序。这些应用程序旨在通过向模型提供各种格式的数据,从而扩展模型知识的广度和深度,超越基础训练数据:
图12:Agent和数据存储之间的一对多关系,可以表示各种类型的预索引数据
每个用户请求和Agent响应循环的底层过程通常如图13所示进行建模。
图13:基于RAG的应用程序中用户请求和Agent响应的生命周期
最终结果是一个应用程序,允许Agent通过矢量搜索匹配用户的查询到已知的数据存储,并检索原始内容并将其提供给编排层和模型进行进一步处理。下一步可能是向用户提供最终答案,或者执行额外的矢量搜索以进一步细化结果。
一个使用ReAct推理/规划实现RAG的Agent样本交互可以在图14中看到。
图14:基于RAG的应用程序示例,带有ReAct推理和计划
总结一下,扩展、功能和数据存储构成了可供Agent在运行时使用的几种不同工具类型。每个都有自己的目的,并且可以根据Agent开发人员的意愿一起或独立使用。
扩展 | 函数调用 | 数据存储 | |
---|---|---|---|
执行 | Agent-Side 执行 | Client-Side 执行 | Agent-Side 执行 |
用例 | • 开发者希望Agent能够控制与 API 端点的交互• 在利用原生预构建扩展(例如 Vertex 搜索、代码解释器等)时很有用• 多跳规划和 API 调用(即Agent的下一个操作取决于前一个操作/ API 调用的输出) | • 安全或身份验证限制使Agent无法直接调用 API。• 时间限制或操作顺序限制使Agent无法实时调用 API。(例如:批处理操作、人工审核等)• 未向互联网公开的 API,或 Google 系统无法访问的 API。 | 开发人员希望使用以下任何一种数据类型来实现检索增强生成(RAG):• 来自预先索引的域和 URL 的网站内容• 以 PDF、Word 文档、CSV、电子表格等格式存在的结构化数据• 关系型/非关系型数据库• 以 HTML、PDF、TXT 等格式存在的非结构化数据 |
有效使用模型的关键方面之一是它们在生成输出时选择正确工具的能力,尤其是在生产中大规模使用工具的情况下。虽然一般培训有助于模型发展这种技能,但现实世界场景往往需要超出训练数据的知识。想象一下这就像基本烹饪技巧和掌握特定菜系之间的区别。两者都需要基础的烹饪知识,但是后者要求有针对性的学习以获得更细致的结果。
为了帮助模型获取这种特定知识,存在几种方法:
为了提供对每个目标学习方法的额外见解,让我们重新审视我们的烹饪类比。
这些方法在速度、成本和延迟方面都具有独特的优点和缺点。然而,通过将这些技术结合到Agent框架中,我们可以利用各种优势并最小化其劣势,从而实现更稳健且可适应性强的解决方案。
虽然这篇白皮书探讨了Agent的核心组件,但构建生产级应用程序需要将它们与用户界面、评估框架和持续改进机制等其他工具集成在一起。Google的Vertex AI平台通过提供涵盖所有早期基本要素的完全托管环境简化了这一过程。使用自然语言接口,开发人员可以快速定义其Agent的关键元素 - 目标、任务说明、工具、用于任务委派的子Agent以及示例 - 以轻松构造所需系统行为。此外,该平台还附带了一组开发工具,允许进行测试、评估、测量Agent性能、调试并提高开发Agent的整体质量。这使开发人员能够专注于构建和完善他们的Agent,而基础设施、部署和维护的复杂性则由平台本身管理。
图15:基于Vertex AI平台构建的端到端Agent架构示例
在图 15 中,我们提供了一个使用诸如 Vertex Agent Builder、Vertex 扩展程序、Vertex 函数调用和 Vertex 示例存储等特性构建的Agent的示例架构。该架构包括许多生产就绪应用程序所需的各个组件。