智能体间通信(Agent-to-Agent)| Agentic Design Patterns | 智能体设计模式

内容纲要

一、核心定义

A2A(Agent-to-Agent)协议:Google推出的开放标准,使不同框架(LangGraph/CrewAI/ADK)构建的智能体能够跨平台通信与协作。

核心类比

无A2A  →  各说各话的方言,无法沟通
有A2A  →  统一的普通话,畅通交流

支持厂商

  • Atlassian, Box, LangChain, MongoDB
  • Salesforce, SAP, ServiceNow
  • Microsoft (Azure AI Foundry, Copilot Studio)
  • Auth0

二、为什么需要A2A?

痛点 影响 A2A解决方案
框架孤岛 不同框架智能体无法协作 跨框架通信标准
重复造轮子 每个系统独立开发集成 统一协议降低成本
扩展困难 添加新智能体需大量改造 插拔式集成
任务无法分解 单智能体处理复杂任务效率低 专业化分工协作
信息无法共享 智能体间无法交换信息 标准化消息传递

核心优势

  • ✅ 跨框架互操作性
  • ✅ 降低集成成本
  • ✅ 促进智能体专业化
  • ✅ 支持复杂工作流编排
  • ✅ 开源生态

三、A2A核心概念

1. 核心参与者(Core Actors)

角色 定义 职责
User(用户) 发起请求的人 提出需求
A2A Client(客户端智能体) 代表用户请求 发送任务、接收结果
A2A Server(远程智能体) 提供服务的智能体 处理任务、返回结果

工作流程

User发起请求
  ↓
Client智能体接收
  ↓
通过A2A协议调用Remote智能体
  ↓
Remote智能体处理
  ↓
返回结果给Client
  ↓
Client返回给User

2. 智能体卡片(Agent Card)

定义:智能体的"身份证",包含关键元信息,通常为JSON文件。

核心字段

{
  "name": "WeatherBot",                     // 智能体名称
  "description": "提供天气预报",             // 功能描述
  "url": "http://xxx.com/a2a",              // 端点URL
  "version": "1.0.0",                        // 版本
  "capabilities": {
    "streaming": true,                       // 支持流式传输
    "pushNotifications": false,              // 不支持推送
    "stateTransitionHistory": true           // 记录状态转换历史
  },
  "authentication": {
    "schemes": ["apiKey"]                    // 认证方式
  },
  "skills": [                                // 技能列表
    {
      "id": "get_current_weather",
      "name": "获取当前天气",
      "description": "实时天气查询",
      "examples": ["巴黎天气如何?"]
    }
  ]
}

作用

  • 自动发现智能体
  • 了解智能体能力
  • 确定调用方式
  • 声明认证需求

3. 智能体发现(Agent Discovery)

发现方式 原理 适用场景
Well-Known URI 标准路径<code>/.well-known/agent.json</code> 公共智能体、自动发现
托管注册中心 集中目录,可按条件查询 企业环境、集中管理
直接配置 硬编码或私下共享 私有系统、紧密耦合

安全考虑

  • 访问控制
  • 双向TLS(mTLS)
  • 网络限制

四、通信机制

1. 四种交互模式

模式 适用场景 工作原理
同步请求/响应 快速简单操作 发送→等待→接收完整响应
异步轮询 长时间任务 发送→获取任务ID→定期查询状态
流式更新(SSE) 实时增量结果 建立持久连接→服务器持续推送更新
推送通知(Webhook) 超长任务 注册webhook→任务完成时服务器推送

示例对比

同步请求(使用<code>sendTask</code>):

{
  &quot;jsonrpc&quot;: &quot;2.0&quot;,
  &quot;method&quot;: &quot;sendTask&quot;,
  &quot;params&quot;: {
    &quot;message&quot;: {
      &quot;role&quot;: &quot;user&quot;,
      &quot;parts&quot;: [{&quot;type&quot;: &quot;text&quot;, &quot;text&quot;: &quot;USD to EUR汇率?&quot;}]
    }
  }
}
// 等待单一完整响应

流式请求(使用<code>sendTaskSubscribe</code>):

{
  &quot;jsonrpc&quot;: &quot;2.0&quot;,
  &quot;method&quot;: &quot;sendTaskSubscribe&quot;,
  &quot;params&quot;: {
    &quot;message&quot;: {
      &quot;role&quot;: &quot;user&quot;,
      &quot;parts&quot;: [{&quot;type&quot;: &quot;text&quot;, &quot;text&quot;: &quot;JPY to GBP汇率?&quot;}]
    }
  }
}
// 持续接收增量更新

2. 核心通信概念

概念 定义 作用
Task(任务) 工作的基本单元 携带唯一ID和状态(submitted/working/completed)
Message(消息) 通信载体 包含attributes(元数据)和parts(实际内容)
Artifacts(产出物) 任务结果 可增量流式传输
contextId(上下文ID) 会话标识 关联多次交互,保持上下文

技术协议

  • 传输:HTTP(S)
  • 负载:JSON-RPC 2.0
  • 模态无关:支持文本、音频、视频等多种数据类型

五、A2A vs MCP

图1:A2A与MCP的互补关系

维度 A2A MCP
核心目标 智能体间通信与协作 智能体与外部数据/工具交互
关注点 任务委派、协调、信息交换 结构化上下文、工具调用
适用场景 多智能体系统编排 单智能体能力扩展
开发者 Google Anthropic
关系 互补,非竞争 互补,非竞争

实际应用

场景:企业智能客服系统

MCP层:
  - 查询知识库(RAG)
  - 调用CRM API
  - 访问工单系统

A2A层:
  - 客服智能体 ←→ 技术支持智能体
  - 客服智能体 ←→ 订单处理智能体
  - 客服智能体 ←→ 数据分析智能体

六、安全机制

机制 作用 实现方式
双向TLS(mTLS) 加密通信、防拦截 加密连接+双向认证
审计日志 追踪与问责 记录所有通信细节
智能体卡片声明 集中管理认证 在Agent Card中明确声明
安全凭证 身份验证 OAuth 2.0 / API Key (通过Header传递)

最佳实践

  • ✅ 使用HTTPS
  • ✅ 定期轮换API密钥
  • ✅ 实施最小权限原则
  • ✅ 监控异常通信模式
  • ✅ 加密敏感数据

七、典型应用场景

1. 多框架协作

场景:跨框架智能体团队
实现:ADK智能体 + LangChain智能体 + CrewAI智能体协作
价值:充分利用各框架优势

2. 自动化工作流编排

场景:企业报告生成
流程:
  数据收集智能体
    ↓ (A2A)
  数据分析智能体
    ↓ (A2A)
  报告生成智能体
价值:专业化分工,提高效率

3. 动态信息检索

场景:金融分析系统
实现:主智能体 ←(A2A)→ 市场数据智能体
     主智能体 ←(A2A)→ 新闻智能体
价值:实时获取多源信息

八、实战示例 - ADK构建A2A Server

1. 创建ADK智能体

from google.adk.agents import LlmAgent
from google.adk.tools.google_api_tool import CalendarToolset

async def create_agent(client_id, client_secret) -&gt; LlmAgent:
    &quot;&quot;&quot;构建日历管理智能体&quot;&quot;&quot;
    toolset = CalendarToolset(client_id=client_id, client_secret=client_secret)
    return LlmAgent(
        model=&#039;gemini-2.0-flash-001&#039;,
        name=&#039;calendar_agent&#039;,
        description=&quot;帮助管理用户日历的智能体&quot;,
        instruction=f&quot;&quot;&quot;
        你是日历管理智能体。
        用户会询问日历状态或请求修改。
        使用提供的工具与Calendar API交互。
        默认日历为&#039;primary&#039;。
        今天是 {datetime.datetime.now()}.
        &quot;&quot;&quot;,
        tools=await toolset.get_tools(),
    )

2. 定义智能体卡片和技能

from a2a import AgentSkill, AgentCard, AgentCapabilities

# 定义技能
skill = AgentSkill(
    id=&#039;check_availability&#039;,
    name=&#039;检查空闲时间&#039;,
    description=&quot;使用Google Calendar检查用户空闲状态&quot;,
    tags=[&#039;calendar&#039;],
    examples=[&#039;明天10点到11点我有空吗?&#039;],
)

# 创建智能体卡片
agent_card = AgentCard(
    name=&#039;Calendar Agent&#039;,
    description=&quot;管理用户日历的智能体&quot;,
    url=f&#039;http://{host}:{port}/&#039;,
    version=&#039;1.0.0&#039;,
    defaultInputModes=[&#039;text&#039;],
    defaultOutputModes=[&#039;text&#039;],
    capabilities=AgentCapabilities(streaming=True),
    skills=[skill],
)

3. 设置A2A服务器

from a2a.adk import ADKAgentExecutor
from a2a.starlette import A2AStarletteApplication, DefaultRequestHandler
from starlette.applications import Starlette

# 创建ADK运行器
adk_agent = asyncio.run(create_agent(
    client_id=os.getenv(&#039;GOOGLE_CLIENT_ID&#039;),
    client_secret=os.getenv(&#039;GOOGLE_CLIENT_SECRET&#039;),
))
runner = Runner(
    app_name=agent_card.name,
    agent=adk_agent,
    artifact_service=InMemoryArtifactService(),
    session_service=InMemorySessionService(),
)

# 包装为A2A执行器
agent_executor = ADKAgentExecutor(runner, agent_card)

# 创建请求处理器
request_handler = DefaultRequestHandler(
    agent_executor=agent_executor,
    task_store=InMemoryTaskStore()
)

# 创建A2A应用
a2a_app = A2AStarletteApplication(
    agent_card=agent_card,
    http_handler=request_handler
)

# 启动服务
app = Starlette(routes=a2a_app.routes())
uvicorn.run(app, host=host, port=port)

核心步骤

  1. 创建ADK智能体(配置工具和指令)
  2. 定义智能体卡片(声明能力和技能)
  3. 包装为A2A执行器
  4. 暴露HTTP端点

九、优势与挑战

✅ 核心优势

优势 说明
互操作性 不同框架智能体无缝协作
模块化 智能体独立开发和部署
可扩展性 轻松添加新智能体
专业化 每个智能体专注特定领域
开放标准 社区驱动,厂商支持

⚠️ 挑战

挑战 影响 缓解方案
网络延迟 跨服务通信增加耗时 异步设计+缓存
复杂性 多智能体协调复杂 清晰的编排逻辑
调试困难 分布式系统难排查 完善的日志和追踪
版本兼容 协议演进可能不兼容 语义化版本控制
安全风险 多端点增加攻击面 mTLS+审计+最小权限

十、常见问题

Q1:A2A与MCP如何选择?

  • A2A: 多智能体协作、任务委派、跨框架通信
  • MCP: 单智能体扩展、外部工具接入、数据源集成
  • 通常一起使用:MCP扩展单个智能体能力,A2A编排多个智能体

Q2:如何处理A2A通信失败?

1) 重试机制;2) 超时设置;3) 降级策略;4) 错误日志;5) 熔断器模式。

Q3:A2A支持哪些数据类型?
模态无关,支持文本、JSON、音频、视频、图像等。

Q4:如何管理智能体版本?
在Agent Card中声明版本号,客户端根据兼容性选择。

Q5:A2A性能如何优化?

1) 使用流式传输;2) 实施缓存;3) 异步处理;4) 批量请求;5) 负载均衡。

Q6:如何监控A2A系统?

  • 追踪每个任务的状态转换
  • 记录通信延迟
  • 监控失败率
  • 分析审计日志

十一、参考资源

官方文档

图片资源

  • chapter15_fig1A2A vs MCP

原文章节

  • <code>21-Chapter-15-Inter-Agent-Communication.md</code>

相关章节

  • 第 7 章:多智能体协作 - A2A的应用基础
  • 第 10 章:模型上下文协议(MCP) - A2A的互补协议

滚动至顶部