本文深入探讨了生成式 AI 智能体的核心组件、工作原理、关键技术及其广泛应用。从智能体的定义到模型、工具和编排层的协同作用,再到认知架构的运作机制,本文揭示了智能体如何利用扩展、函数和数据存储等工具来执行复杂任务。此外,本文还介绍了如何通过定向学习提升模型性能,并展望了智能体在未来的发展趋势,特别是 Google 在该领域的探索和应用。
人类擅长处理复杂的模式识别任务。然而,我们往往也需要借助工具——如书籍、Google 搜索或计算器——来补充我们的先验知识,从而做出最终的判断。正如人类一样,生成式 AI 模型也可以通过训练来使用工具,以获取实时信息或建议现实世界的行动。例如,模型可以利用数据库检索工具来访问特定信息,如客户的购买历史,从而生成量身定制的购物推荐。或者,根据用户的查询,模型可以进行各种 API 调用,向同事发送电子邮件回复,或代表您完成一笔金融交易。为了做到这一点,模型不仅必须能够访问一组外部工具,还需要能够以自主的方式计划和执行任何任务。这种推理、逻辑和外部信息访问能力的结合,都与生成式 AI 模型相关联,从而引出了智能体 (Agent) 的概念,即一个扩展了生成式 AI 模型独立能力的程序。本白皮书将更详细地深入探讨所有这些方面及相关内容。
2. 什么是智能体 (Agent)?
智能体是一个应用程序,它能够通过观察周围环境,并利用其可支配的工具来尝试实现预设的目标。智能体具有自主性,可以独立于人类干预而行动,特别是在为其设定了明确的目标或任务的情况下。即使没有明确的指令,智能体也能主动地思考如何达成最终目标。虽然人工智能中智能体的概念相当宽泛且强大,但本白皮书着重于探讨在本文发表之时,生成式 AI 模型能够构建的特定类型的智能体。
尽管基础模型在文本和图像生成方面表现出色,但它们仍受限于无法与外部世界交互。工具弥合了这一差距,使智能体能够与外部数据和服务进行交互,从而解锁超越模型本身的一系列操作。工具可以有多种形式,并且具有不同的复杂程度,但通常与常见的 Web API 方法(如 GET、POST、 PATCH 和 DELETE)一致。例如,工具可以更新数据库中的客户信息,或获取天气数据以影响智能体提供的旅行建议。借助工具,智能体可以访问和处理现实世界的信息。这使它们能够支持更多专用系统,如检索增强生成 (RAG),这大大扩展了智能体的能力,使其超越了基础模型本身的能力。
扩展以标准化的方式桥接了 API 和智能体之间的鸿沟,使智能体能够无缝地执行 API,而无需考虑其底层实现。可以将扩展理解为 API 和智能体之间的桥梁,它以标准化的方式使智能体能够无缝执行 API,而无需考虑 API 的底层实现。假设您构建了一个旨在帮助用户预订航班的智能体。您知道您想使用 Google Flights API 来检索航班信息,但不确定如何让您的智能体调用此 API 端点。
图 3:智能体如何与外部 API 交互?- 该图展示了在没有扩展的情况下,智能体需要自定义代码来解析用户查询并调用 API,这种方式难以扩展且容易出错。
一种方法可以是实现自定义代码,该代码将接收传入的用户查询,解析查询以获取相关信息,然后进行 API 调用。例如,在航班预订用例中,用户可能会说“我想预订从奥斯汀到苏黎世的航班”。在这种情况下,我们的自定义代码解决方案将需要在尝试进行 API 调用之前,从用户查询中提取“奥斯汀”和“苏黎世”作为相关实体。但是,如果用户说“我想预订飞往苏黎世的航班”而没有提供出发城市怎么办?在没有所需数据的情况下,API 调用将失败,并且需要实现更多代码才能捕获这样的边缘和极端情况。这种方法不可扩展,并且在任何超出已实现自定义代码的场景中都很容易出错。
一个更具弹性的方法是使用扩展。扩展通过以下方式连接智能体和外部 API:
1. 使用示例指导智能体如何使用 API 端点。
2. 指导智能体成功调用 API 端点所需的参数。
图 4:扩展将智能体连接到外部 API - 该图展示了扩展如何通过提供示例和参数信息,帮助智能体更便捷地调用外部 API。
# The above snippet will generate the following code. # Generated Code: # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right
definvert_binary_tree(root): """ Inverts a binary tree.
Args: root: The root of the binary tree.
Returns: The root of the inverted binary tree. """ ifnotroot: returnNone
# Swap the left and right children recursively root.left, root.right = invert_binary_tree(root.right), invert_binary_tree(root.left)
returnroot
# Example usage: # Construct a sample binary tree root = TreeNode(4) root.left = TreeNode(2) root.right = TreeNode(7) root.left.left = TreeNode(1) root.left.right = TreeNode(3) root.right.left = TreeNode(6) root.right.right = TreeNode(9)
# Invert the binary tree inverted_root = invert_binary_tree(root)
图 7:函数如何与外部 API 交互?- 该图展示了函数调用与扩展的区别,其中模型输出函数名和参数,由客户端负责执行函数并调用 API。
图 8:客户端控制与智能体端控制 - 该图对比了扩展和函数调用在控制流程上的差异,其中函数调用将 API 的实际调用放在了客户端。
3.3.1 使用案例 (Use Cases)
模型可以用于调用函数,以便为最终用户处理复杂的客户端执行流程,在这种情况下,智能体开发人员可能不希望语言模型管理 API 执行(就像扩展的情况一样)。让我们考虑以下示例,其中一个智能体被训练成一个旅行礼宾员,与想要预订度假旅行的用户进行交互。目标是让智能体生成一个城市列表,我们可以在我们的中间件应用程序中使用该列表为用户的旅行计划下载图像、数据等。用户可能会说这样的话:
在生成式 AI 智能体的上下文中,数据存储通常被实现为向量数据库,它以向量嵌入的形式存储数据,这是一种高维向量或数据的数学表示。开发人员希望智能体在运行时能够访问此向量数据库。虽然我们不会在这里深入介绍向量数据库,但关键是要了解它们以向量嵌入的形式存储数据,向量嵌入是一种提供的数据的高维向量或数学表示。
•基于检索的情境学习 (Retrieval-based in-context learning):该技术通过从外部存储器(例如 Vertex AI 扩展中的“示例存储”或前面提到的基于数据存储的 RAG 架构)中检索最相关的信息、工具和相关示例来动态填充模型提示。
•基于微调的学习 (Fine-tuning based learning):在推理之前,使用更大的特定示例数据集来训练模型。这有助于模型在接收任何用户查询之前了解何时以及如何应用某些工具。
5. 使用 LangChain 快速构建智能体原型
LangChain 和 LangGraph是两个流行的开源库,允许用户通过将逻辑、推理和工具调用序列“链接”在一起来构建自定义智能体,以回答用户的查询。我们可以使用gemini-1.5-flash-001模型和一些简单的工具来快速构建一个智能体原型。例如,代码片段 8 展示了如何使用 LangChain 和 LangGraph 构建一个简单的智能体,该智能体可以利用 SerpAPI(用于 Google 搜索)和 Google Places API 来回答用户的多阶段查询。
代码片段 8. 基于 LangChain 和 LangGraph 的智能体及工具示例
执行该程序后,您可以在代码片段 9 中看到示例输出。
代码片段 9. 代码片段 8 中程序的输出
6. 生产环境中的智能体应用:Vertex AI Agents
虽然本白皮书探讨了智能体的核心组件,但构建生产级应用程序需要将它们与其他工具(如用户界面、评估框架和持续改进机制)集成。Google 的Vertex AI 平台提供了一个完全托管的环境,集成了上述所有基本元素,可以用于构建生产级的智能体应用。该平台提供了一套开发工具,可用于测试、评估、衡量智能体性能、调试和提高已开发智能体的整体质量。这使开发人员可以专注于构建和完善其智能体,而基础架构、部署和维护的复杂性则由平台本身管理。