A2A 简介¶
当你构建更复杂的智能体系统时,你会发现单个智能体通常是不够的。你会想要创建专门的智能体,它们可以协作解决问题。智能体到智能体(A2A)协议是允许这些智能体相互通信的标准。
何时使用 A2A vs. 本地子智能体¶
-
本地子智能体:这些智能体与你的主智能体在同一个应用程序进程中运行。它们就像内部模块或库,用于将你的代码组织成逻辑的、可重用的组件。主智能体与其本地子智能体之间的通信非常快,因为它直接在内存中发生,没有网络开销。
-
远程智能体(A2A):这些是作为独立服务运行的智能体,通过网络进行通信。A2A 定义了这种通信的标准协议。
考虑在以下情况使用 A2A:
- 你需要与之交谈的智能体是一个独立的、独立的服务(例如,专门的金融建模智能体)。
- 智能体由不同的团队或组织维护。
- 你需要连接用不同编程语言或智能体框架编写的智能体。
- 你想要在你的系统组件之间强制执行强、正式的合同(A2A 协议)。
何时使用 A2A:具体示例¶
- 与第三方服务集成:你的主智能体需要从外部金融数据提供商获取实时股票价格。该提供商通过 A2A 兼容的智能体暴露其数据。
- 微服务架构:你有一个大型系统分解为更小的、独立的服务(例如,订单处理智能体、库存管理智能体、运输智能体)。A2A 非常适合这些服务跨网络边界相互通信。
- 跨语言通信:你的核心业务逻辑在 Python 智能体中,但你有一个遗留系统或用 Java 编写的专门组件,你想要将其集成为智能体。A2A 提供标准化的通信层。
- 正式 API 执行:你正在构建一个平台,不同的团队贡献智能体,你需要一个严格的合同来规定这些智能体如何交互,以确保兼容性和稳定性。
何时不使用 A2A:具体示例(首选本地子智能体)¶
- 内部代码组织:你正在将单个智能体中的复杂任务分解为更小、可管理的函数或模块(例如,在处理前清理输入数据的
DataValidator
子智能体)。这些最好作为本地子智能体处理,以获得性能和简单性。 - 性能关键的内部操作:子智能体负责与主智能体执行紧密耦合的高频、低延迟操作(例如,在同一应用程序内处理数据流的
RealTimeAnalytics
子智能体)。 - 共享内存/上下文:当子智能体需要直接访问主智能体的内部状态或共享内存以提高效率时,A2A 的网络开销和序列化/反序列化会产生反效果。
- 简单辅助函数:对于不需要独立部署或复杂状态管理的小型、可重用逻辑片段,同一智能体内的简单函数或类比单独的 A2A 智能体更合适。
ADK 中的 A2A 工作流:简化视图¶
智能体开发工具包(ADK)简化了使用 A2A 协议构建和连接智能体的过程。以下是它如何工作的简单分解:
-
使智能体可访问(暴露):你从一个现有的 ADK 智能体开始,你希望其他智能体能够与之交互。ADK 提供了一种简单的方法来"暴露"这个智能体,将其转换为 A2AServer。这个服务器充当公共接口,允许其他智能体通过网络向你的智能体发送请求。将其想象为为你的智能体设置一个网络服务器。
-
连接到可访问的智能体(消费):在单独的智能体(可能在同一台机器或不同的机器上运行)中,你将使用一个特殊的 ADK 组件,称为
RemoteA2aAgent
。这个RemoteA2aAgent
充当一个客户端,知道如何与你之前暴露的 A2AServer 通信。它在幕后处理网络通信、身份验证和数据格式化的所有复杂性。
从你作为开发者的角度来看,一旦你建立了这个连接,与远程智能体交互就像与本地工具或函数交互一样。ADK 抽象了网络层,使分布式智能体系统与本地系统一样易于使用。
可视化 A2A 工作流¶
为了进一步澄清 A2A 工作流,让我们看看暴露和消费智能体的"前后"对比,然后是组合系统。
暴露智能体¶
暴露前: 你的智能体代码作为独立组件运行,但在这种情况下,你想要暴露它,以便其他远程智能体可以与你的智能体交互。
暴露后:
你的智能体代码与 A2AServer
(ADK 组件)集成,使其可以通过网络被其他远程智能体访问。
+-----------------+
| A2A Server |
| (ADK Component) |<--------+
+-----------------+ |
| |
v |
+-------------------+ |
| Your Agent Code | |
| (Now Accessible) | |
+-------------------+ |
|
| (Network Communication)
v
+-----------------------------+
| Remote Agent(s) |
| (Can now communicate) |
+-----------------------------+
消费智能体¶
消费前: 你的智能体(在此上下文中称为"根智能体")是你正在开发的应用程序,需要与远程智能体交互。在消费之前,它缺乏这样做的直接机制。
+----------------------+ +-------------------------------------------------------------+
| Root Agent | | Remote Agent |
| (Your existing code) | | (External Service that you want your Root Agent to talk to) |
+----------------------+ +-------------------------------------------------------------+
消费后:
你的根智能体使用 RemoteA2aAgent
(一个充当远程智能体客户端代理的 ADK 组件)与远程智能体建立通信。
+----------------------+ +-----------------------------------+
| Root Agent | | RemoteA2aAgent |
| (Your existing code) |<------->| (ADK Client Proxy) |
+----------------------+ | |
| +-----------------------------+ |
| | Remote Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
(Now talks to remote agent via RemoteA2aAgent)
最终系统(组合视图)¶
此图显示了消费和暴露部分如何连接以形成完整的 A2A 系统。
Consuming Side:
+----------------------+ +-----------------------------------+
| Root Agent | | RemoteA2aAgent |
| (Your existing code) |<------->| (ADK Client Proxy) |
+----------------------+ | |
| +-----------------------------+ |
| | Remote Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (Network Communication)
v
Exposing Side:
+-----------------+
| A2A Server |
| (ADK Component) |
+-----------------+
|
v
+-------------------+
| Your Agent Code |
| (Exposed Service) |
+-------------------+
具体用例:客户服务和产品目录智能体¶
让我们考虑一个实际示例:一个客户服务智能体需要从单独的产品目录智能体检索产品信息。
A2A 之前¶
最初,你的客户服务智能体可能没有直接、标准化的方式来查询产品目录智能体,特别是如果它是一个单独的服务或由不同的团队管理的情况下。
+-------------------------+ +--------------------------+
| Customer Service Agent | | Product Catalog Agent |
| (Needs Product Info) | | (Contains Product Data) |
+-------------------------+ +--------------------------+
(No direct, standardized communication)
A2A 之后¶
通过使用 A2A 协议,产品目录智能体可以将其功能暴露为 A2A 服务。你的客户服务智能体然后可以使用 ADK 的 RemoteA2aAgent
轻松消费此服务。
+-------------------------+ +-----------------------------------+
| Customer Service Agent | | RemoteA2aAgent |
| (Your Root Agent) |<------->| (ADK Client Proxy) |
+-------------------------+ | |
| +-----------------------------+ |
| | Product Catalog Agent | |
| | (External Service) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (Network Communication)
v
+-----------------+
| A2A Server |
| (ADK Component) |
+-----------------+
|
v
+------------------------+
| Product Catalog Agent |
| (Exposed Service) |
+------------------------+
在此设置中,首先,产品目录智能体需要通过 A2A 服务器暴露。然后,客户服务智能体可以简单地调用 RemoteA2aAgent
上的方法,就像它是一个工具一样,ADK 处理与产品目录智能体的所有底层通信。这允许清晰的关注点分离和专门智能体的轻松集成。
下一步¶
现在你了解了 A2A 的"为什么",让我们深入探讨"如何"。
- 继续下一个指南: 快速入门:暴露你的智能体