Google ADK 与 A2A 协议:跨语言多智能体团队构建实战
Google 这篇教程把跨语言多智能体协作说得很实,A2A 协议像代理世界的 HTTP,不过整套方案还是绑在 Google 生态上,自己玩的话迁移成本不低。
一篇技术博客展示了如何用 Google Agent Development Kit (ADK) 与 Agent2Agent (A2A) 协议搭建跨语言多智能体流水线:Python agent 调用 Gemini 解析合同条款,Go agent 用纯确定性逻辑校验合规性。A2A 协议通过 Agent Card 实现能力发现、JSON-RPC 2.0 完成通信、Task 状态机管理任务生命周期;ADK 的 RemoteA2aAgent 抽象可将任意 A2A 兼容服务封装成本地子智能体。文中强调将单体提示词分解为专业化微智能体,以解决上下文退化、故障爆炸半径和不可测试性问题。完整源码已在 GitHub 发布。
使用 Google 智能体开发工具包和 A2A 协议构建跨语言多智能体团队
一个 Python 智能体和一个 Go 智能体如何通过 Agent2Agent 协议协作完成合同合规性检查
你的合同合规性管线存在一个问题。数据科学团队用 Python 编写了一个出色的提取智能体。它使用 Gemini 解析法律合同,提取所有关键条款。安全工程团队用 Go 构建了一个极速合规性验证器,全部采用确定性逻辑,无需大语言模型。两者各自独立运行时都完美无缺。但现在你需要它们协同工作,作为一个统一的管线运行,而两个团队都不愿意用另一种语言重写自己的服务。
这就是生产级 AI 系统的现实:不同的团队、不同的语言、不同的部署目标。问题不在于你是否会遇到这种情况,而在于你将如何解决它。
在本文中,我们将构建一个合同合规性多智能体管线,其中由 Python 智能体使用 Gemini 提取合同条款,再由 Go 智能体根据公司政策对其进行验证。这两个服务通过 Agent2Agent 协议连接,并由 Google 智能体开发工具包进行编排。
在此过程中,你将学到三种将生产级多智能体系统与单语言演示区分开来的架构模式:
- 使用 A2A 协议实现的跨语言智能体协作,这样团队就能以最适合工作的语言构建智能体,而无需重写代码。
- ADK 的 RemoteA2aAgent 抽象,它能够通过几行代码将任何远程兼容 A2A 的服务转化为本地子智能体。
- 多智能体管线编排,让职责专注的专业化智能体取代试图包揽一切的庞大提示词。
完整源代码可在 GitHub 上获取。
当一个智能体不够用时
大多数 AI 项目都是从同样的方式开始的:一个庞大的智能体、一个庞大的提示词、将所有工具塞进一个上下文窗口。这对于演示来说没问题,但在生产环境中会因三个关键原因而失败:
- 上下文退化:当工具数量超过 10-15 个时,模型开始遗漏指令、调用错误的工具或幻觉参数。每增加一个工具,都会让模型在更广的表面积上稀释注意力。一个既处理合同提取、又处理翻译、摘要和邮件草拟的智能体,最终会搞不清何时该调用哪个工具。
- 爆炸半径:一个次要功能中未处理的异常就会导致整个智能体的交互轮次崩溃。翻译 API 的速率限制不应该拖垮你的整个工作流。但在单体智能体中,每一次失败都是全面失败。
- 不可测试:你无法干净地对一个包含 50 个纠缠职责的系统进行单元测试。当每一次提示词改动都可能影响所有下游行为时,评估回归就变成了猜测。
解决方案与十年前改变后端工程的模式相同:将单体拆分为专门的微服务。每个智能体承担一项任务、一份聚焦的提示词和一套最小的工具集。
A2A 协议:智能体如何发现并相互通信
智能体间(A2A)协议是一种开放标准,使任何语言或框架构建的智能体都能互操作。可以把它想象成智能体世界的 HTTP:一份共享契约,让任意两个智能体无论内部如何构建都能通信。
A2A 解决了三个根本性问题:
- 发现:智能体通过 Agent Cards(智能体卡片)宣传自身能力,该卡片是位于 `/.well-known/agent.json` 的 JSON 元数据。类似于 REST API 的 OpenAPI 规范,卡片声明了智能体的名称、URL、版本、技能以及支持的输入/输出格式。调用方智能体会先获取卡片,以了解远程智能体能够做什么。
- 通信:所有数据交换均通过 JSON-RPC 2.0 进行,经由单一端点路由。智能体通信的核心方法是 `message/send`(我们的实现用它来提交合同数据并同步接收结果),以及任务提交和检索的其他协议方法,如 `tasks/send` 和 `tasks/get`。数据在类型化的 Message Parts(消息部件)中传输:TextPart 用于自然语言,DataPart 用于结构化 JSON。
- 任务生命周期:每一次交互都封装在一个任务(Task)中,该任务会经历定义好的状态:已提交、执行中、已完成或失败。这种状态机意味着智能体可以用同一套协议处理同步工作流(立即审查这份合同)和异步工作流(在48小时内验证这份文档)。
这种方案的精妙之处在于,两个智能体完全无需了解对方的实现细节。Python 智能体无需导入 Go 包,Go 智能体也无需运行 Python 代码。它们只需通过 HTTP 共享同一套协议进行通信。
智能体卡片(Agent Card)的实际样子
以下是 Go 合规服务在 `/.well-known/agent.json` 暴露的 Agent Card:
// go-compliance-agent/internal/agentcard/card.go
func GetCard() AgentCard {
agentURL := os.Getenv("AGENT_URL")
if agentURL == "" {
agentURL = "http://localhost:8888"
}
return AgentCard{
Name: "Security Compliance Validator",
Description: "Go-based validation engine that checks vendor contracts against corporate compliance policy rules.",
Version: "1.0.0",
SupportedInterfaces: []AgentInterface{
{
URL: agentURL,
ProtocolBinding: "JSONRPC",
ProtocolVersion: "1.0",
},
},
Capabilities: Capabilities{
ExtendedAgentCard: false,
},
DefaultInputModes: []string{"application/json"},
DefaultOutputModes: []string{"application/json"},
Skills: []Skill{
{
ID: "contract_compliance_check",
Name: "Contract Compliance Check",
Description: "Validates extracted contract fields against corporate policy rules.",
Tags: []string{"compliance", "contract", "validation"},
Examples: []string{
"Check this contract for compliance violations",
"Validate vendor agreement terms against policy",
},
},
},
}
} 该 URL 从环境变量中读取,因此同一份代码既能在本地(`localhost:8888`)运行,也能在容器中(`go-compliance-agent:8888`)运行。Skills 数组意味着单个智能体可以宣告多种能力。
代码实现详解
下面展示如何使用 Python 中的 ADK 以及 Go 中的标准 HTTP 服务器,如此轻松地组建这支跨语言团队。
共享状态:智能体之间的数据总线
在深入单个智能体之前,理解它们如何通信至关重要。ADK 的 ToolContext.state 提供了一个共享字典,管道中的所有子智能体都可以读取和写入。智能体之间不是通过函数参数或返回值来传递数据,而是通过共享的会话状态进行通信。
合规管道中的每一步都对应一个特定的检查点:
class ComplianceStep(str, Enum):
INGESTED = "INGESTED" # Contract uploaded, awaiting extraction
EXTRACTED = "EXTRACTED" # Fields parsed by Gemini
COMPLIANCE_PENDING = "COMPLIANCE_PENDING" # Sent to Go agent, awaiting result
COMPLIANCE_COMPLETE = "COMPLIANCE_COMPLETE"# Go agent returned verdict
MANUAL_REVIEW = "MANUAL_REVIEW" # Timeout or error, routed to human
REVIEW_READY = "REVIEW_READY" # Report generated, violations found
APPROVED = "APPROVED" # All checks passed MANUAL_REVIEW 状态值得强调。如果 Go 合规智能体因服务器崩溃、网络超时、容器未启动等原因无法访问,管道并不会直接失败。它会转变为 MANUAL_REVIEW 状态,将案件转交给人工法务审核。这种故障安全模式对于下游服务可能间歇性不可用的生产环境至关重要。
1. 完整多智能体管道:在 Python 中封装 Go 智能体
使用 ADK,你可以通过 `RemoteA2aAgent` 在本地定义一个远程 A2A 兼容的智能体。SDK 会在后台自动处理 Agent Card 握手、参数序列化以及 JSON-RPC 网络请求。
# python-extraction-agent/app/agent.py
from google.adk.agents import Agent, SequentialAgent
from google.adk.agents.remote_a2a_agent import RemoteA2aAgent
from google.adk.models import Gemini
# Sub-Agent 1: Ingests & extracts details using LLM reasoning
extractor_agent = Agent(
name="extractor_agent",
model=Gemini(model="gemini-3.5-flash"),
instruction="You are a Legal Data Extraction Agent. Extract contract fields: value, contractor, dates, insurance...",
tools=[read_contract_text, save_extracted_fields, classify_risk_level]
)
# Sub-Agent 2: Go A2A Compliance Service wrapped as a local agent
compliance_agent = RemoteA2aAgent(
name="compliance_agent",
agent_card=GO_AGENT_CARD_URL,
description="Validates extracted contract fields against corporate policies."
)
# Sub-Agent 3: Generates the final audit summary report
report_agent = Agent(
name="report_agent",
model=Gemini(model="gemini-3.5-flash"),
instruction="Generate the final compliance report and Markdown summary.",
tools=[generate_summary_report]
)
# Coordinator: Chains them together sequentially
root_agent = SequentialAgent(
name="contract_compliance_coordinator",
description="Orchestrates contract parsing, A2A compliance validation, and final reporting in sequence.",
sub_agents=[extractor_agent, compliance_agent, report_agent],
) 2. Go 合规端点
在 Go 一侧,合规智能体是一个实现 A2A 协议的标准 HTTP 服务器。它公开一个用于发现的 Agent Card,以及一个接受 message/send 请求的 JSON-RPC 端点,该端点对提取的合同字段执行确定性策略检查,并返回通过/未通过的裁决。不需要任何 AI 框架或 SDK——仅需 Go 标准库。
以下是简化流程(完整实现在仓库中):
// Simplified pseudo-code — see GitHub repository for full implementation
func HandleJSONRPC(w http.ResponseWriter, r *http.Request) {
var req JSONRPCRequest
json.NewDecoder(r.Body).Decode(&req)
// Extract contract details from the A2A message
var details compliance.ContractDetails
extractContractFromMessage(req.Params, &details)
// Run deterministic policy checks
result := compliance.CheckCompliance(details, policy)
// Return verdict as a JSON-RPC response
writeJSONRPCResult(w, req.ID, result)
} 开源应用:合同合规引擎
完整管道以一个开源应用形式提供,您可以部署并扩展。仓库中包含一个由 FastAPI 服务提供的全功能运维控制台。
- 三面板运维控制台:左侧面板允许操作员选择或上传合同。中央面板显示实时结果:通过合同的合规证书和未通过合同的违规报告。右侧面板是一个开发者控制台,包含策略控制、网络模拟以及两个智能体之间数据流动的实时视图。
- 网络故障模拟:一个开关可以让您将 Go 智能体切换为正常、延迟或崩溃状态。设置为崩溃时展示故障安全机制的工作方式:Python 智能体检测到宕机,暂停管道,并将合同转交人工审核,而非静默失败。
- 实时智能体交接检查器:右侧面板显示从 Python 发送到 Go 的确切请求以及返回的响应,因此您可以实时看到结构化的合同数据跨越语言边界。
ADK 与 A2A 方法的优势
- 技术自由:您的数据科学团队可以用 Python 编写复杂的认知智能体,而您的系统团队可以用 Go、Rust 或 C++ 编写高性能、安全的合规验证器。
- 集成简化:Python 编排器与 Go 智能体通信时,如同与本地类交互。您无需编写自定义 HTTP 客户端或手动处理 JSON-RPC 有效负载封装。
- 弹性:由于智能体是解耦的,您可以配置精细的超时和重试逻辑。如果 Go 验证器宕机,Python 智能体会保存当前状态检查点,并等待手动批准。
- 隔离审计:Go 合规性验证器是完全确定性的。出于审计目的,您可以传入相同的输入,并验证它们产生相同的策略判定,从而绕过 LLM 的非确定性。
结论
多智能体编排不仅仅是串联提示词,而是构建健壮的跨语言分布式系统。
通过使用 Google ADK 和开放的 A2A 协议,桥接 Python 的 AI 生态系统和 Go 的运行可靠性,您获得了两全其美的效果:在存在歧义时进行认知推理,在存在策略时进行确定性执行。
准备好自己运行了吗?
- 克隆 contract-compliance-engine 并在本地运行实时演示
- 查阅 ADK 文档,了解会话管理、多智能体模式和评估框架
- 查阅 Agent2Agent 协议文档以了解更多详情。
- AI
- 云计算
- 公告
- 最佳实践
- 学习
- 探索
- Python
- ADK
- 影响力
- 开源
- AI 智能体
- Go
- Typescript
- java
- 多智能体