谷歌在 2024 年至 2025 年期间发布了多份关于 AI Agent(智能体)的重磅白皮书和技术指南,并迅速成为热门话题。
去年9月,作者 Julia Wiesinger、Patrick Marlow 和 Vladimir Vuskovic 发布了一份名为《Agents(智能体)》的开创性白皮书。它深入探讨了什么是 AI 智能体(AI Agent),它与 AI 模型(AI Model)有何不同,以及如何着手编写你自己的智能体。
以下是该白皮书的翻译整理,机翻简校,仅供参考!
智能体 (Agents)
作者:Julia Wiesinger, Patrick Marlow 和 Vladimir Vuskovic
— 第 1 页 —
致谢
内容贡献者
Evan Huang, Emily Xue, Olcan Sercinoglu, Sebastian Riedel, Satinder Baveja, Antonio Gulli, Anant Nawalgaria
策划与编辑
Antonio Gulli, Anant Nawalgaria, Grace Mollison
技术文档撰写
Joey Haymaker
设计
Michael Lanning
2025年2月
— 第 2 页 —
目录
- 简介 - 4
- 什么是智能体? - 5
- 模型 - 6
- 工具 - 7
- 编排层 - 7
- 智能体 vs. 模型 - 8
- 认知架构:智能体如何运作 - 8
- 工具:我们通往外部世界的钥匙 - 12
- 扩展 (Extensions) - 13
- 扩展示例 - 15
- 函数 (Functions) - 18
- 用例 - 21
- 函数代码示例 - 24
- 数据存储 (Data stores) - 27
- 实现与应用 - 28
- 工具回顾 - 32
- 通过针对性学习提升模型性能 - 33
- 使用 LangChain 快速启动智能体 - 35
- 使用 Vertex AI Agents 的生产级应用 - 38
- 总结 - 40
- 尾注 - 42
— 第 3 页 —
简介
这种推理、逻辑和访问外部信息的结合,所有这些都连接到一个生成式AI模型上,引出了“智能体”的概念。
人类非常擅长处理复杂的模式识别任务。然而,在得出结论之前,他们经常依赖书籍、谷歌搜索或计算器等工具来补充先验知识。就像人类一样,生成式 AI 模型也可以经过训练使用工具来获取实时信息或建议现实世界的行动。例如,模型可以利用数据库检索工具访问特定信息(如客户的购买历史记录),从而生成量身定制的购物建议。或者,根据用户的查询,模型可以进行各种 API 调用,向同事发送电子邮件回复,或代表您完成一笔金融交易。要做到这一点,模型不仅必须能够访问一组外部工具,还需要具备以自我导向的方式规划和执行任何任务的能力。这种推理、逻辑和访问外部信息的结合,所有这些都连接到一个生成式 AI 模型上,引出了智能体 (Agent)的概念,即一种超越生成式 AI 模型独立能力的程序。本白皮书将详细深入探讨所有这些及相关方面。
— 第 4 页 —
什么是智能体?
在其最基本的形式中,生成式 AI 智能体可以定义为一个应用程序,它试图通过观察世界并使用其掌握的工具对其采取行动来实现目标。智能体是自主的,可以独立于人类干预行动,尤其是当提供了它们旨在实现的适当目标或目的时。智能体在实现目标的方法上也可以是主动的。即使在没有来自人类的明确指令集的情况下,智能体也可以推理接下来应该做什么来实现其最终目标。虽然 AI 中智能体的概念非常广泛且强大,但本白皮书主要关注在发布时生成式 AI 模型能够构建的特定类型的智能体。
为了理解智能体的内部运作,我们首先介绍驱动智能体行为、行动和决策的基础组件。这些组件的组合可以描述为认知架构 (cognitive architecture),通过混合和匹配这些组件可以实现许多这样的架构。着眼于核心功能,智能体的认知架构中有三个基本组件,如图 1 所示。
— 第 5 页 —
[图 1:通用智能体架构及组件]
包含:用户查询 -> 智能体运行时 (编排[用户画像, 目标, 指令], 记忆[短期, 长期], 基于模型的推理/规划) <-> 模型 <-> 工具 -> 智能体响应
模型
在智能体的范围内,模型指的是作为智能体流程的中心决策者的语言模型 (LM)。智能体使用的模型可以是任意大小(小型/大型)的一个或多个 LM,它们能够遵循基于指令的推理和逻辑框架,如 ReAct、思维链 (Chain-of-Thought) 或思维树 (Tree-of-Thoughts)。模型可以是通用的、多模态的,或者是根据您特定智能体架构的需求进行微调的。为了获得最佳的生产效果,您应该利用最适合您期望的最终应用的模型,理想情况下,该模型应该在与您计划在认知架构中使用的工具相关的数据特征上进行过训练。值得注意的是,模型通常没有针对智能体的特定配置设置(即工具选择、编排/推理设置)进行训练。但是,可以通过向模型提供展示智能体能力的示例(包括智能体在各种上下文中使用特定工具或推理步骤的实例)来针对智能体任务进一步优化模型。
— 第 6 页 —
工具
基础模型尽管在文本和图像生成方面令人印象深刻,但仍受到无法与外部世界交互的限制。工具弥合了这一差距,使智能体能够与外部数据和服务进行交互,同时解锁超出底层模型本身能力的更广泛的行动范围。工具可以采取多种形式,复杂程度各不相同,但通常与常见的 Web API 方法(如 GET、POST、PATCH 和 DELETE)保持一致。例如,工具可以更新数据库中的客户信息,或者获取天气数据以影响智能体向用户提供的旅行建议。有了工具,智能体可以访问和处理现实世界的信息。这使它们能够支持更专业的系统,如检索增强生成 (RAG),这极大地扩展了智能体的能力,超出了基础模型自身所能实现的范围。我们将在下文中更详细地讨论工具,但最重要的一点是,工具弥合了智能体内部能力与外部世界之间的差距,解锁了更广泛的可能性。
编排层
编排层描述了一个循环过程,它管理智能体如何接收信息、执行一些内部推理,并利用该推理来告知其下一步行动或决策。通常,这个循环将持续进行,直到智能体达到其目标或停止点。编排层的复杂性可能因智能体及其执行的任务而有很大差异。有些循环可以是带有决策规则的简单计算,而另一些可能包含链式逻辑,涉及额外的机器学习算法,或实现其他概率推理技术。我们将在认知架构部分详细讨论智能体编排层的具体实现。
— 第 7 页 —
智能体 vs. 模型
为了更清楚地理解智能体和模型之间的区别,请参考下表:
| 模型 (Models) | 智能体 (Agents) |
|---|---|
| 知识仅限于其训练数据中可用的内容。 | 通过工具与外部系统连接,知识得以扩展。 |
| 基于用户查询的单次推理/预测。除非为模型明确实现,否则不管理会话历史或连续上下文(即聊天记录)。 | 管理会话历史(即聊天记录),允许基于用户查询和编排层做出的决策进行多轮推理/预测。在此语境下,“一轮”定义为交互系统与智能体之间的一次交互(即 1 个传入事件/查询和 1 个智能体响应)。 |
| 没有原生工具实现。 | 工具在智能体架构中原生实现。 |
| 没有实现原生逻辑层。用户可以将提示 (prompts) 构造成简单的问题,或使用推理框架(CoT, ReAct 等)形成复杂的提示来指导模型进行预测。 | 拥有原生认知架构,使用推理框架如 CoT, ReAct,或其他预构建的智能体框架如 LangChain。 |
认知架构:智能体如何运作
想象一位繁忙厨房里的厨师。他们的目标是为餐厅顾客制作美味的菜肴,这涉及规划、执行和调整的循环。
— 第 8 页 —
- 他们收集信息,比如顾客的订单以及储藏室和冰箱里有什么食材。
- 他们根据刚刚收集的信息,对可以制作什么菜肴和风味进行内部推理。
- 他们采取行动制作菜肴:切菜、混合香料、煎肉。
在这个过程的每个阶段,厨师都会根据需要进行调整,随着食材的消耗或收到顾客反馈来完善他们的计划,并利用之前的一系列结果来确定下一步的行动计划。这个信息摄入、规划、执行和调整的循环描述了厨师用来实现其目标的独特认知架构。
就像厨师一样,智能体可以使用认知架构来实现最终目标,方法是迭代地处理信息、做出明智的决策并根据之前的输出完善下一步行动。智能体认知架构的核心是编排层,负责维护记忆、状态、推理和规划。它使用快速发展的提示工程 (prompt engineering) 领域及相关框架来指导推理和规划,使智能体能够更有效地与其环境交互并完成任务。关于语言模型的提示工程框架和任务规划的研究正在迅速发展,产生了各种有前途的方法。虽然并未详尽列出,但以下是出版时可用的一些最流行的框架和推理技术:
ReAct
:一种提示工程框架,为语言模型提供一种思维过程策略,以便在有或没有上下文示例的情况下对用户查询进行推理 (Reason) 并采取行动 (Act)。ReAct 提示已显示出优于多个 SOTA 基线,并提高了 LLM 的人类互操作性和可信度。
— 第 9 页 —
思维链 (Chain-of-Thought, CoT)
:一种通过中间步骤实现推理能力的提示工程框架。CoT 有多种子技术,包括自洽性 (self-consistency)、主动提示 (active-prompt) 和多模态 CoT,根据具体的应用,每种技术都有其优缺点。
思维树 (Tree-of-thoughts, ToT)
:一种非常适合探索或战略性前瞻任务的提示工程框架。它概括了思维链提示,并允许模型探索各种思维链,作为语言模型一般问题解决的中间步骤。
智能体可以利用上述推理技术之一,或许多其他技术,来为给定的用户请求选择最佳的下一步行动。例如,让我们考虑一个被编程为使用 ReAct 框架为用户查询选择正确行动和工具的智能体。事件序列可能如下所示:
- 用户向智能体发送查询。
- 智能体开始 ReAct 序列。
- 智能体向模型提供提示,要求其生成下一个 ReAct 步骤及其相应的输出之一:
这是发生工具选择的地方。
例如,一个行动可以是 [Flights, Search, Code, None] 中的一个,前 3 个代表模型可以选择的已知工具,最后一个代表“不选择工具”。
Question (问题)
:用户查询的输入问题,随提示提供。
Thought (思维)
:模型关于下一步该做什么的想法。
Action (行动)
:模型决定采取的下一步行动。
— 第 10 页 —
- d.Action input (行动输入):模型决定提供给工具的输入(如果有)。
- e.Observation (观察):行动/行动输入序列的结果。
- 这个思维/行动/行动输入/观察的循环可以根据需要重复 N 次。
- f.Final answer (最终答案):模型提供给原始用户查询的最终答案。
- ReAct 循环结束,最终答案被反馈给用户。
[图 2:编排层中使用 ReAct 推理的智能体示例]
流程:用户 -> 智能体运行时 (问题: “我想预订航班…”) -> 模型 (思维: 我应该搜索航班… 行动: 航班工具) -> 工具 (输入: 奥斯汀到苏黎世) -> 观察 (返回选项) -> 模型 (思维: 我应该展示这些… 最终答案: 这里有一些航班…) -> 用户
如图 2 所示,模型、工具和智能体配置协同工作,根据用户的原始查询提供接地气、简洁的回复。虽然模型可以根据其先验知识猜测答案(产生幻觉),但它通过使用工具(Flights)来搜索实时的外部信息。这些额外的信息被提供给模型,使其能够根据真实的事实数据做出更明智的决定,并将这些信息总结反馈给用户。
— 第 11 页 —
总之,智能体响应的质量直接取决于模型对这些各种任务进行推理和行动的能力,包括选择正确工具的能力,以及该工具定义的完善程度。就像厨师用新鲜食材烹饪菜肴并关注顾客反馈一样,智能体依靠合理的推理和可靠的信息来提供最佳结果。在下一节中,我们将深入探讨智能体连接新鲜数据的各种方式。
工具:我们通往外部世界的钥匙
虽然语言模型擅长处理信息,但它们缺乏直接感知和影响现实世界的能力。这限制了它们在需要与外部系统或数据交互的情况下的实用性。这意味着,从某种意义上说,语言模型的好坏取决于它从训练数据中学到了什么。但是,无论我们向模型投入多少数据,它们仍然缺乏与外部世界交互的基本能力。那么,我们如何赋予模型与外部系统进行实时、上下文感知交互的能力呢?函数 (Functions)、扩展 (Extensions)、数据存储 (Data Stores) 和插件 (Plugins) 都是向模型提供这一关键能力的方式。
虽然它们有许多名称,但工具是在我们的基础模型和外部世界之间建立链接的东西。这种与外部系统和数据的链接使我们的智能体能够执行更广泛的任务,并且更准确、更可靠地执行。例如,工具可以使智能体调整智能家居设置、更新日历、从数据库获取用户信息,或根据特定指令集发送电子邮件。
截至本出版物发布之日,Google 模型能够交互的三种主要工具类型是:扩展、函数和数据存储。通过为智能体配备工具,我们释放了巨大的潜力,使它们不仅能理解世界,还能对其采取行动,为无数新的应用和可能性打开大门。
— 第 12 页 —
扩展 (Extensions)
理解扩展最简单的方法是将它们视为以标准化方式弥合 API 和智能体之间差距的桥梁,允许智能体无缝执行 API,而不管其底层实现如何。假设您构建了一个智能体,目标是帮助用户预订航班。您知道您想使用 Google Flights API 来检索航班信息,但不确定如何让您的智能体调用此 API 端点。
[图 3:智能体如何与外部 API 交互?]
智能体 <–> ? <–> Google Flights API
一种方法是实现自定义代码,该代码将接收传入的用户查询,解析查询以获取相关信息,然后进行 API 调用。例如,在航班预订用例中,用户可能会说“我想预订一张从奥斯汀到苏黎世的机票”。在这种情况下,我们的自定义代码解决方案需要在尝试进行 API 调用之前从用户查询中提取“奥斯汀”和“苏黎世”作为相关实体。但是,如果用户说“我想预订去苏黎世的机票”而从未提供出发城市,会发生什么?如果没有所需的数据,API 调用将失败,并且需要实施更多代码来捕获像这样的边缘和角落情况。这种方法不可扩展,并且在任何超出已实现的自定义代码范围的情况下都很容易崩溃。
— 第 13 页 —
一种更有弹性的方法是使用扩展。扩展通过以下方式弥合智能体和 API 之间的差距:
- 使用示例教智能体如何使用 API 端点。
- 教智能体成功调用 API 端点需要哪些参数或变量。
[图 4:扩展连接智能体与外部 API]
智能体 <–> 扩展 (定义了方法、示例、输入参数) <–> Google Flights API
扩展可以独立于智能体制作,但应作为智能体配置的一部分提供。智能体在运行时使用模型和示例来决定哪种扩展(如果有)适合解决用户的查询。这突出了扩展的一个关键优势,即它们内置的示例类型,允许智能体动态选择最适合任务的扩展。
[图 5:智能体、扩展和 API 之间的一对多关系]
智能体 (推理循环) <–> 工具 (Flights Extension, Maps Extension, Weather Extension) <–> API (Flights API, Maps API, Weather API)
— 第 14 页 —
这就像软件开发人员在为用户的问题寻找解决方案时决定使用哪些 API 端点一样。如果用户想预订航班,开发人员可能会使用 Google Flights API。如果用户想知道最近的咖啡店相对于他们的位置在哪里,开发人员可能会使用 Google Maps API。同样,智能体/模型堆栈使用一组已知的扩展来决定哪一个最适合用户的查询。如果您想看看扩展的实际效果,您可以在 Gemini 应用程序上尝试它们,方法是转到设置 > 扩展,然后启用任何您想测试的扩展。例如,您可以启用 Google Flights 扩展,然后问 Gemini“显示下周五从奥斯汀到苏黎世的航班”。
扩展示例
为了简化扩展的使用,Google 提供了一些开箱即用的扩展,可以快速导入您的项目并以最少的配置使用。例如,代码片段 1 中的代码解释器 (Code Interpreter) 扩展允许您从自然语言描述生成并运行 Python 代码。
— 第 15 页 —
Python 代码示例 (Snippet 1):代码解释器扩展生成并运行 Python 代码
Python import vertexai import pprint PROJECT_ID = "YOUR_PROJECT_ID" REGION = "us-central1" vertexai.init(project=PROJECT_ID, location=REGION) from vertexai.preview.extensions import Extension extension_code_interpreter = Extension.from_hub("code_interpreter") CODE_QUERY = """Write a python method to invert a binary tree in O(n) time.""" response = extension_code_interpreter.execute( operation_id = "generate_and_execute", operation_params = {"query": CODE_QUERY} ) print("Generated Code:") pprint.pprint({response['generated_code']}) # The above snippet will generate the following code.Generated Code:
class TreeNode:
definit(self, val=0, left=None, right=None(:
self.val = val
self.left = left
self.right = right
```code-snippet__js Python def invert_binary_tree(root): """ Inverts a binary tree. Args: root: The root of the binary tree. Returns: The root of the inverted binary tree. """ if not root: return None # Swap the left and right children recursively root.left, root.right = invert_binary_tree(root.right), invert_binary_tree(root.left) return root # 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)— 第 16 & 17 页 —
总而言之,扩展为智能体提供了一种以多种方式感知、交互和影响外部世界的方法。这些扩展的选择和调用由示例的使用来指导,所有这些都定义为扩展配置的一部分。
函数 (Functions)
在软件工程的世界里,函数被定义为完成特定任务并可以根据需要重复使用的自包含代码模块。当软件开发人员编写程序时,他们通常会创建许多函数来执行各种任务。他们还会定义何时调用 function_a 与 function_b 的逻辑,以及预期的输入和输出。
函数在智能体世界中的工作方式非常相似,但我们可以用模型代替软件开发人员。模型可以获取一组已知的函数,并根据其规范决定何时使用每个函数以及该函数需要什么参数。函数在几个方面与扩展不同,最明显的是:
- 模型输出一个函数及其参数,但不进行实时 API 调用。
- 函数在客户端 (Client-side)执行,而扩展在智能体端 (Agent-side)执行。
再次使用我们的 Google Flights 示例,函数的简单设置可能如图 7 所示。
— 第 18 页 —
[图 7:函数如何与外部 API 交互?]
智能体 (1. 已知函数规范 / 2. 用户想搜航班… / 3. 返回函数名及参数) -> 客户端 ? -> Google Flights API
请注意,这里的主要区别在于,函数和智能体都不直接与 Google Flights API 交互。那么 API 调用实际上是如何发生的呢?
使用函数时,调用实际 API 端点的逻辑和执行从智能体卸载回客户端应用程序,如下图 8 和图 9 所示。这为开发人员提供了对应用程序中数据流的更细粒度控制。开发人员选择使用函数而不是扩展的原因有很多,但一些常见的用例是:
- API 调用需要在应用程序堆栈的另一层进行,在直接智能体架构流程之外(例如中间件系统、前端框架等)。
- 安全或身份验证限制阻止智能体直接调用 API(例如 API 未暴露给互联网,或智能体基础设施无法访问)。
- 阻止智能体实时进行 API 调用的时间或操作顺序限制(即批处理操作、人在回路审查等)。
— 第 19 页 —
- 需要对 API 响应应用智能体无法执行的额外数据转换逻辑。例如,考虑一个不提供限制返回结果数量的过滤机制的 API 端点。在客户端使用函数为开发人员提供了进行这些转换的额外机会。
- 开发人员希望在不部署额外的 API 端点基础设施的情况下迭代智能体开发(即函数调用可以像 API 的“桩 (stubbing)”一样)。
虽然如图 8 所示,这两种方法在内部架构上的差异很微妙,但额外的控制和与外部基础设施的解耦使得函数调用成为开发人员的一个有吸引力的选择。
[图 8:区分扩展和函数调用的客户端与智能体端控制]
A (扩展): UI/中间件 -> 智能体 -> 扩展 -> Google Flights API (智能体端控制)
B (函数): UI/中间件 -> 智能体 -> 函数 (返回指令) -> UI/中间件 -> Google Flights API (客户端控制)
— 第 20 页 —
用例
模型可用于调用函数来为最终用户处理复杂的客户端执行流,在这种情况下,智能体开发人员可能不希望语言模型管理 API 执行(如扩展的情况)。让我们考虑以下示例:一个智能体被训练为旅行礼宾,与想要预订度假旅行的用户进行交互。目标是让智能体生成一个城市列表,我们可以在中间件应用程序中使用该列表为用户的旅行计划下载图像、数据等。用户可能会说:
我想带家人去滑雪旅行,但不确定去哪里。
在给模型的典型提示中,输出可能如下所示:
当然,这里有一些您可以考虑用于家庭滑雪旅行的城市:
Crested Butte, Colorado, USA
Whistler, BC, Canada
Zermatt, Switzerland
虽然上面的输出包含了我们需要的数据(城市名称),但格式并不理想,不便于解析。通过函数调用,我们可以教模型以结构化样式(如 JSON)格式化此输出,这对于另一个系统来说解析起来更方便。给定用户的相同输入提示,函数的示例 JSON 输出可能类似于片段 5。
function_call { name: "display_cities" args: { "cities": ["Crested Butte", "Whistler", "Zermatt"], "preferences": "skiing" } }— 第 21 页 —
片段 5. 用于显示城市列表和用户偏好的示例函数调用负载
这个 JSON 负载由模型生成,然后发送到我们的客户端服务器以执行我们想要执行的任何操作。在这个特定案例中,我们将调用 Google Places API 来获取模型提供的城市并查找图像,然后将它们作为格式化的丰富内容提供给我们的用户。请考虑图 9 中的序列图,详细展示了上述交互的步骤。
— 第 22 页 —
[图 9:展示函数调用生命周期的序列图]
用户 -> 客户端 UI -> 智能体 (发送提示/示例) -> 模型 (生成 JSON) -> 智能体 (返回 JSON) -> 客户端 UI (拦截 JSON 并调用 API) -> Google Places API -> 客户端 UI -> 用户 (展示结果)
图 9 中示例的结果是,模型被利用来通过返回的函数中模型提供的参数,为客户端 UI“填补空白”,以便调用 Google Places API。客户端 UI 使用模型提供的参数管理实际的 API 调用。这只是函数调用的一个用例,但还有许多其他场景需要考虑,例如:
- 您希望语言模型建议一个可以在代码中使用的函数,但您不想在代码中包含凭据。因为函数调用不运行函数,所以您不需要在代码中包含凭据和函数信息。
— 第 23 页 —
- 您正在运行可能需要几秒钟以上的异步操作。这些场景非常适合函数调用,因为它是异步操作。
- 您希望在与产生函数调用及其参数的系统不同的设备上运行函数。
关于函数需要记住的一个关键点是,它们旨在为开发人员提供更多控制权,不仅是对 API 调用执行的控制,而且是对整个应用程序中数据流的控制。在图 9 的示例中,开发人员选择不将 API 信息返回给智能体,因为它与智能体可能采取的未来行动无关。但是,根据应用程序的架构,将外部 API 调用数据返回给智能体以影响未来的推理、逻辑和行动选择可能是有意义的。最终,由应用程序开发人员选择适合特定应用程序的内容。
函数代码示例
为了实现我们的滑雪度假场景的上述输出,让我们构建每个组件以使其与我们的gemini-2.0-flash-001模型一起工作。
首先,我们将定义我们的display_cities函数作为一个简单的 Python 方法。
— 第 24 页 —
Python 代码示例 (Snippet 6)
Python from typing import Optional def display_cities(cities: list[str], preferences: Optional[str] = None): """Provides a list of cities based on the user's search query and preferences. Args: preferences (str): The user's preferences for the search, like skiing, beach, restaurants, bbq, etc. cities (list[str]): The list of cities being recommended to the user. Returns: list[str]: The list of cities being recommended to the user. """ return cities片段 6. 用于显示城市列表的函数的示例 Python 方法。
接下来,我们将实例化我们的模型,构建工具,然后将我们的用户查询和工具传递给模型。执行下面的代码将产生代码片段底部所示的输出。
— 第 25 页 —
Python 代码示例 (Snippet 7)
Python from google.genai import Client, types client = Client( vertexai=True, project="PROJECT_ID", location="us-central1" ) res = client.models.generate_content( model="gemini-2.0-flash-001", model="I'd like to take a ski trip with my family but I'm not sure where to go?", config=types.GenerateContentConfig( tools=[display_cities], automatic_function_calling=types.AutomaticFunctionCallingConfig(disable=True), tool_config=types.ToolConfig( function_calling_config=types.FunctionCallingConfig(mode='ANY') ) ) ) print(f"Function Name: {res.candidates[0].content.parts[0].function_call.name}") print(f"Function Args: {res.candidates[0].content.parts[0].function_call.args}") > Function Name: display_cities > Function Args: {'preferences': 'skiing', 'cities': ['Aspen', 'Park City', 'Whistler']}片段 7. 构建工具,连同用户查询发送给模型,并允许发生函数调用 --- 第 26 页 --- 总之,函数提供了一个简单的框架,赋予应用程序开发人员对数据流和系统执行的细粒度控制,同时有效地利用智能体/模型进行关键输入生成。开发人员可以根据特定的应用程序架构要求,选择是通过返回外部数据将智能体保留在“循环中”,还是将其省略。 数据存储 (Data stores) ------------------ 将语言模型想象成一个巨大的图书馆,里面包含其训练数据。但与不断获取新书的图书馆不同,这个图书馆保持静态,只保存最初训练时的知识。这带来了一个挑战,因为现实世界的知识在不断发展。数据存储通过提供对更动态和最新信息的访问来解决这一限制,并确保模型的响应保持基于事实和相关性。 考虑一个常见的场景,开发人员可能需要向模型提供少量额外数据,可能是以电子表格或 PDF 的形式。  [图 10:智能体如何与结构化和非结构化数据交互?] 私有文档 / 网站 / 结构化数据 -> ? -> 智能体 --- 第 27 页 --- 数据存储允许开发人员以原始格式向智能体提供额外数据,从而无需进行耗时的数据转换、模型再训练或微调。数据存储将传入的文档转换为一组向量数据库嵌入 (embeddings),智能体可以使用这些嵌入来提取所需的信息,以补充其下一步行动或对用户的响应。  [图 11:数据存储将智能体连接到各种类型的新实时数据源] 智能体 <--> 数据存储 <--> (私有文档 / 网站 / 结构化数据) ### 实现与应用 在生成式 AI 智能体的上下文中,数据存储通常实现为开发人员希望智能体在运行时有权访问的向量数据库。虽然我们不会在这里深入介绍向量数据库,但需要理解的关键点是,它们以向量嵌入的形式存储数据,这是所提供数据的一种高维向量或数学表示。最近数据存储与语言模型结合使用的最典型的例子之一是基于**检索增强生成 (RAG)** 的应用程序的实现。这些应用程序旨在通过让模型访问各种格式的数据来扩展模型知识的广度和深度,超出基础训练数据的范围,例如: * 网站内容 * PDF, Word Docs, CSV, Spreadsheets 等格式的结构化数据 * HTML, PDF, TXT 等格式的非结构化数据  [图 12:智能体与数据存储之间的一对多关系] 智能体 <--> 工具 (非结构化数据存储, 网站数据存储, 结构化数据存储) --- 第 28 页 --- 每个用户请求和智能体响应循环的底层过程通常建模如图 13 所示。 1. 用户查询被发送到嵌入模型以生成查询的嵌入。 2. 查询嵌入随后使用匹配算法(如 SCANN)与向量数据库的内容进行匹配。 3. 匹配的内容以文本格式从向量数据库中检索出来,并发送回智能体。 4. 智能体接收用户查询和检索到的内容,然后制定响应或行动。 --- 第 29 页 --- 5. 最终响应发送给用户。  [图 13:RAG 应用程序中用户请求和智能体响应的生命周期] 用户查询 -> (1. 嵌入) -> 向量数据库 (2. 匹配 / 3. 检索内容) -> 智能体 (4. 制定响应) -> 响应 (5) 最终结果是一个应用程序,允许智能体通过向量搜索将用户的查询与已知数据存储匹配,检索原始内容,并将其提供给编排层和模型以进行进一步处理。下一步行动可能是向用户提供最终答案,或者执行额外的向量搜索以进一步细化结果。 图 14 展示了一个实现 RAG 并带有 ReAct 推理/规划的智能体的交互示例。  [图 14:基于 RAG 并带有 ReAct 推理/规划的示例应用程序] 用户: "我们的育儿假政策是什么?" 智能体 (思维: 我应该搜索最佳数据存储匹配... 行动: 向量搜索) -> 工具 (pdf\_dstore) -> 观察 (返回片段) -> 模型 (思维: 总结并呈现给用户... 最终答案: Google 的休假政策...) -> 用户 --- 第 30 页 --- 工具回顾 ---- 总而言之,扩展、函数和数据存储构成了智能体在运行时可用的几种不同工具类型。每种都有其用途,并且可以在智能体开发人员的酌情决定下一起使用或独立使用。 | | 扩展 (Extensions) | 函数调用 (Function Calling) | 数据存储 (Data Stores) | | --- | --- | --- | --- | | **执行** | 智能体端执行 | 客户端执行 | 智能体端执行 | | **用例** | * 开发人员希望智能体控制与 API 端点的交互 * 利用原生预构建扩展(如 Vertex Search, Code Interpreter 等)时很有用 * 多跳规划和 API 调用(即下一个智能体行动取决于前一个行动/API 调用的输出) | * 安全或身份验证限制阻止智能体直接调用 API * 阻止智能体实时进行 API 调用的时间限制或操作顺序限制(即批处理操作、人在回路审查等) * API 未暴露给互联网,或 Google 系统无法访问 | * 开发人员希望实现检索增强生成 (RAG),使用以下任何数据类型: + 来自预索引域和 URL 的网站内容 + PDF, Word Docs, CSV, Spreadsheets 等格式的结构化数据 + 关系/非关系数据库 + HTML, PDF, TXT 等格式的非结构化数据 | --- 第 31 & 32 页 --- 通过针对性学习提升模型性能 ------------- 有效使用模型的一个关键方面是它们在生成输出时选择正确工具的能力,特别是在生产中大规模使用工具时。虽然通用训练有助于模型发展这项技能,但现实世界的场景通常需要超出训练数据的知识。这就像基本烹饪技能和掌握特定菜系之间的区别。两者都需要基础烹饪知识,但后者需要针对性学习才能获得更细致的结果。 为了帮助模型获得这种特定知识,存在几种方法: * **上下文学习 (In-context learning)** :此方法在推理时为通用模型提供提示、工具和少样本示例 (few-shot examples),这允许它“即时”学习如何以及何时为特定任务使用这些工具。自然语言中的 ReAct 框架就是这种方法的一个例子。 * **基于检索的上下文学习 (Retrieval-based in-context learning)** :此技术通过从外部存储器检索最相关的信息、工具和相关示例,动态地填充模型提示。这方面的一个例子是 Vertex AI 扩展中的“示例存储 (Example Store)”或前面提到的基于 RAG 的数据存储架构。 * **基于微调的学习 (Fine-tuning based learning)** :此方法涉及在推理之前使用更大的特定示例数据集训练模型。这有助于模型在接收任何用户查询之前了解何时以及如何应用某些工具。 为了提供关于每种针对性学习方法的更多见解,让我们回顾一下我们的烹饪类比。 --- 第 33 页 --- * 想象一位厨师从顾客那里收到了一份特定的食谱(提示)、一些关键食材(相关工具)和一些示例菜肴(少样本示例)。基于这些有限的信息和厨师的通用烹饪知识,他们将需要弄清楚如何“即时”准备最符合食谱和顾客偏好的菜肴。这就是**上下文学习**。 * 现在,让我们想象我们的厨师在一个储备充足的食品储藏室(外部数据存储)的厨房里,里面装满了各种食材和食谱(示例和工具)。厨师现在能够从储藏室动态选择食材和食谱,并更好地适应顾客的食谱和偏好。这使得厨师能够利用现有和新知识创造出更明智和精致的菜肴。这就是**基于检索的上下文学习**。 * 最后,让我们想象我们把厨师送回学校学习一种新的菜系或一套菜系(在更大的特定示例数据集上进行预训练)。这使得厨师能够以更深刻的理解来处理未来未见过的顾客食谱。如果我们希望厨师在特定菜系(知识领域)中表现出色,这种方法是完美的。这就是**基于微调的学习**。 这些方法中的每一种在速度、成本和延迟方面都具有独特的优点和缺点。然而,通过在智能体框架中结合这些技术,我们可以利用各种优势并最大限度地减少其弱点,从而实现更强大和适应性更强的解决方案。 --- 第 34 页 --- 使用 LangChain 快速启动智能体 -------------------- ```code-snippet__js Python from langgraph.prebuilt import create_react_agent from langchain_core.tools import tool from langchain_community.utilities import SerpAPIWrapper from langchain_community.tools import GooglePlacesTool os.environ["SERPAPI_API_KEY"] = "XXXXX" os.environ["GPLACES_API_KEY"] = "XXXXX" @tool def search(query: str): """Use the SerpAPI to run a Google Search.""" search = SerpAPIWrapper() return search.run(query) @tool def places(query: str): """Use the Google Places API to run a Google Places Query.""" places = GooglePlacesTool() return places.run(query) model = ChatVertexAI(model="gemini-2.0-flash-001") tools = [search, places] query = "Who did the Texas Longhorns play in football last week? What is the address of the other team's stadium?" agent = create_react_agent(model, tools) input = {"messages": [("human", query)]} for s in agent.stream(input, stream_mode="values"): message = s["messages"][-1] if isinstance(message, tuple): print(message) else: message.pretty_print()为了提供一个智能体实际运行的可执行示例,我们将使用 LangChain 和 LangGraph 库构建一个快速原型。这些流行的开源库允许用户通过“链接”逻辑、推理和工具调用的序列来构建自定义智能体,以回答用户的查询。我们将使用我们的gemini-2.0-flash-001模型和一些简单的工具来回答用户的多阶段查询,如代码片段 8 所示。
我们使用的工具是 SerpAPI(用于 Google 搜索)和 Google Places API。执行代码片段 8 中的程序后,您可以在代码片段 9 中看到示例输出。
— 第 35 页 —
Python 代码示例 (Snippet 8)
片段 8. 使用 LangChain 和 LangGraph 构建的带有工具的智能体示例
— 第 36 页 —
输出示例 (Snippet 9)
============================== Human Message ================================ Who did the Texas Longhorns play in football last week? What is the address of the other team's stadium? ================================= Ai Message ================================= Tool Calls: search Args: query: Texas Longhorns football schedule ================================ Tool Message ================================ Name: search {...Results: "NCAA Division I Football, Georgia, Date..."} ================================= Ai Message ================================= The Texas Longhorns played the Georgia Bulldogs last week. Tool Calls: places Args: query: Georgia Bulldogs stadium ================================ Tool Message ================================ Name: places {...Sanford Stadium Address: 100 Sanford...} ================================= Ai Message ================================= The address of the Georgia Bulldogs stadium is 100 Sanford Dr, Athens, GA 30602, USA.片段 9. 片段 8 中程序的输出
虽然这是一个相当简单的智能体示例,但它展示了模型、编排和工具共同协作以实现特定目标的基础组件。在最后一部分中,我们将探索这些组件如何在 Google 规模的托管产品(如 Vertex AI Agents 和 Generative Playbooks)中结合在一起。
— 第 37 页 —
使用 Vertex AI Agents 的生产级应用
虽然本白皮书探讨了智能体的核心组件,但构建生产级应用程序需要将它们与其他工具(如用户界面、评估框架和持续改进机制)集成。Google 的 Vertex AI 平台通过提供包含前面涵盖的所有基本元素的完全托管环境,简化了这一过程。使用自然语言界面,开发人员可以快速定义智能体的关键元素——目标、任务指令、工具、用于任务委派的子智能体以及示例,以轻松构建所需的系统行为。此外,该平台还附带一套开发工具,允许测试、评估、测量智能体性能、调试和提高已开发智能体的整体质量。这使得开发人员可以专注于构建和完善他们的智能体,而基础设施、部署和维护的复杂性则由平台本身管理。
在图 15 中,我们提供了一个基于 Vertex AI 平台构建的智能体架构示例,该架构使用了各种功能,如 Vertex Agent Builder, Vertex Extensions, Vertex Function Calling 和 Vertex Example Store 等。该架构包含了生产就绪应用程序所需的许多组件。
— 第 38 页 —
[图 15:基于 Vertex AI 平台构建的端到端智能体架构示例]
流程包含:自定义 UI (1. 输入) -> 智能体 (2. 提示) -> 模型 (3. 函数) -> 函数执行循环 (4) -> 扩展 (5) -> Google Places/Vector Search API (6) -> 返回结果
您可以从我们的官方文档中尝试这种预构建智能体架构的示例。
— 第 39 页 —
总结
在本白皮书中,我们讨论了生成式 AI 智能体的基础构建模块、它们的组成以及以认知架构形式实现它们的有效方法。本白皮书的一些主要收获包括:
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。