A2A 协议与 Agent 间通信——把对方当黑盒,而不是把对方的工具搬过来

T3-5模块 3 · Agent 开发面试权重 更新于 2026-08-19
前置T3-4
关联题目Q3-11

这篇学完你能回答什么

  1. A2A 协议解决什么问题?它和 MCP 是竞争还是互补?
  2. Agent Card、Task 状态机、Artifact 分别在解决什么工程问题?
  3. 什么情况下不该上 A2A?

从一个真实故障讲起

一家公司里有两个独立团队各自做了 Agent:差旅团队做了「行程助手」,财务团队做了「报销助手」。业务上很自然的需求是:订完机票能直接把行程转给报销侧生成预支申请。

第一版集成方案是最直觉的那种——把报销侧的工具全部挂到行程助手上。财务团队导出了 20 个工具的 schema,行程助手把它们和自己的 12 个工具一起塞进模型的 tools 参数里。

三周后这个集成成了两个团队共同的痛点:

  • 上下文被撑爆:32 个工具的定义每轮常驻约 5000 token,行程助手的工具选择准确率从 91% 掉到 74%,开始把「查报销标准」和「查差旅标准」搞混;
  • 发版互相阻塞:财务团队改一个工具的参数,行程助手不同步更新 schema 就直接调用失败。两边被迫开始对齐发版窗口;
  • 凭证要不来:报销工具需要财务系统的写权限。财务团队不愿意把服务账号交给另一个团队的进程——这个顾虑完全合理,但技术方案没给出第二条路;
  • 业务逻辑泄漏:报销的审批规则(什么金额需要总监批、什么科目不能报)本来封装在财务 Agent 内部,现在为了让行程助手"用对工具",这些规则被抄进了行程助手的 system prompt。同一套业务规则出现在两个代码库里,且注定会不同步。

问题的根源是一个建模错误:他们把另一个 Agent 当成了一堆工具,而不是当成一个能接活的对等实体。

正确的建模是:行程助手不需要知道报销怎么做,它只需要说"这是行程单,请生成预支申请",然后等对方交付结果。对方内部用什么模型、挂了几个工具、审批规则怎么写,都不关它的事,也不该关它的事

这就是 A2A 协议的全部出发点。

把 Agent 当工具挂,是个建模错误
行程助手要接报销助手,第一版把对方 20 个工具全搬了过来,三周后两边都受不了

  1. 订完机票转报销

    两个团队各自做了 Agent,业务上要打通

  2. 把 20 个工具全挂过来断点

    和自己的 12 个一起塞进 tools 参数

  3. 32 个工具常驻上下文

    每轮约 5000 token 只用来放定义

  4. 工具选错了

    把「查报销标准」和「查差旅标准」搞混

  5. 审批规则被抄走

    同一套规则出现在两个代码库,注定不同步

工具定义的常驻开销自己的 12 个工具32 个,每轮约 5000 token
行程助手的选择准确率91%74%
发版节奏两队各发各的改一个参数就得对齐发版窗口
财务系统写权限服务账号留在财务侧要交给另一个团队的进程
正确的建模是:行程助手不需要知道报销怎么做,它只需要说「这是行程单,请生成预支申请」,然后等对方交付。对方内部用什么模型、挂了几个工具、审批规则怎么写,都不该关它的事 —— 这就是 A2A 的全部出发点。

核心概念:先打比方,再给定义

比喻:MCP 是给自己配工具,A2A 是给外部发外包合同。

你买一把电钻(MCP 接工具),你要懂怎么用它、什么时候用它、它的每个档位是干嘛的。你委托一家装修公司做吊顶(A2A 委派任务),你只需要说清楚要什么、什么时候要、验收标准是什么——你不需要知道他们用哪个牌子的电钻,也不该拿到他们的工具箱钥匙。

定义A2A(Agent2Agent Protocol,智能体间协议) 是一个开放协议,规定不同厂商、不同框架、不同组织构建的 AI Agent 之间如何互相发现、委派任务、协调工作。它由 Google 在 2025 年 4 月发布,同年 6 月捐赠给 Linux Foundation;v1.0 稳定版于 2026 年 4 月 9 日发布(截至 2026-08)。

协议规范里有个反复出现的关键词值得记住:opaque(不透明)。A2A 明确把对端 Agent 建模为不透明的智能体应用——你看不见也不需要看见它的内部状态、工具、提示词。这个设计取舍决定了它的一切:

MCP A2A
方向 纵向:Agent → 工具/数据 横向:Agent ↔ Agent
对端是什么 一组可调用的能力(透明) 一个能接活的实体(不透明)
交互单元 一次工具调用(tool call) 一个任务(Task,可长时、可多轮)
谁做决策 调用方决定每一步怎么做 受托方自己决定怎么做
典型边界 同一信任域内 跨团队、跨厂商、跨组织

所以 Q3-11 的标准答案很明确:互补,不是竞争。 一纵一横,共同构成 Agent 的连接层。两者现在都在 Linux Foundation 治理之下,这一点本身就说明生态没打算让它们二选一。

买电钻要懂档位,发包只谈验收
同样是连外部,一个要你懂它的每个档位,一个只要你说清要什么、怎么验收

买一把电钻

你得懂怎么用、什么时候用、每个档位干嘛

钻头在你手里,转速开错、墙钻穿了都算你的

对应
MCP · 纵向连工具

一次工具调用,调用方决定每一步

对端是一组可调用的能力,透明;典型边界在同一信任域内

tool call同一信任域
委托装修公司做吊顶

说清要什么、什么时候要、怎么验收

不需要知道他们用哪个牌子的电钻,也不该拿到他们的工具箱钥匙

对应
A2A · 横向连 Agent

一个 Task,受托方自己决定怎么做

规范反复出现的关键词是 opaque(不透明);典型边界跨团队、跨厂商、跨组织

Agent CardTaskArtifact
Q3-11 的标准答案很明确:互补,不是竞争。一纵一横,共同构成 Agent 的连接层。两者现在都在 Linux Foundation 治理之下 —— 这一点本身就说明生态没打算让它们二选一。

原理拆解

一次派单,四个耦合全断掉
工具不进对方上下文、schema 不再耦合、凭证留在财务侧、审批规则只存一处

① 先读卡片,再决定派不派
GET /.well-known/agent-card.jsonAgent Card声明 skills 与鉴权方式
② 信任任何一条声明之前
JWS 验签防的是发现层的卡片伪造
③ 派的是任务,不是工具
Task · 唯一 ID{行程单, 要预支申请}
对端不透明,内部随它怎么做
SSE 流式进度WORKING
缺成本中心INPUT_REQUIRED补完信息接着跑
④ 补完信息,终态才交付
COMPLETEDArtifact 预支申请单按 Part 类型化,不是自由文本
Task 状态机:九个状态,三组语义
状态语义
RunningSUBMITTED WORKING已受理 / 正在做
PausedINPUT_REQUIRED AUTH_REQUIRED我缺信息 / 你得补授权
FinishedCOMPLETED FAILED CANCELED REJECTED终态,返回 Artifact(另有 UNSPECIFIED 占位)

Paused 这一组是设计意图,不是异常。协议在状态机层面给「人在环中」和「二次授权」留了一等公民的位置,动机和 MCP 2026-07-28 引入 MRTR 是同一件事:真实业务里,长任务执行到一半需要问一句,是常态。

签名是 v1.0 的关键升级:Agent Card 支持 JWS 签名(RFC 7515),对卡片的规范化形式(JSON Canonicalization Scheme, RFC 8785)计算。跨组织时你和对方根本没有预先建立集成关系,验签是刚需。

「返回 Artifact 而不是聊天记录」逼你把 Agent 之间的交付定义成契约。Part 类型化(文本 / 文件 / 结构化数据)意味着调用方不必去解析一段自由文本 —— 这和多 Agent 编排里「子 Agent 必须返回结构化摘要」是同一条工程纪律(T3-8)。

三个核心对象

原文示意
① Agent Card(能力名片)—— 放在 /.well-known/agent-card.json
   {
     "name": "ExpenseAgent",
     "description": "根据行程与票据生成预支/报销申请",
     "url": "https://expense.corp.internal/a2a",
     "version": "1.0.0",
     "capabilities": { "streaming": true, "pushNotifications": true },
     "securitySchemes": { ... },        ← 声明怎么鉴权(OAuth / API Key / OIDC)
     "skills": [ { "id": "create-advance", "name": "生成预支申请", ... } ],
     "signature": { ... }               ← v1.0 的签名字段
   }

② Task(任务)—— 委派的基本单元,有唯一 ID,状态机驱动
③ Artifact(产出物)—— 任务的交付结果,由若干 Part(文本/文件/结构化数据)组成

Agent Card 的定位相当于 Agent 版的 OpenAPI 描述:调用方先读卡片,判断"这个 Agent 能不能干这活、我该怎么向它鉴权",再决定要不要派任务。

签名是 v1.0 的关键升级(截至 2026-08):Agent Card 支持 JWS 签名(RFC 7515),对卡片的规范化形式(JSON Canonicalization Scheme, RFC 8785)计算。调用方在信任任何一条声明的能力或鉴权方式之前先验签,防的是发现层的卡片伪造——这在跨组织场景里是刚需,因为你根本没有和对方预先建立集成关系。

Task 状态机:九个状态,三组语义

原文示意
      ┌── Running ──┐        ┌──── Paused ─────┐      ┌──── Finished ─────┐
      │  SUBMITTED  │        │ INPUT_REQUIRED  │      │    COMPLETED      │
      │  WORKING    │        │ AUTH_REQUIRED   │      │    FAILED         │
      └─────────────┘        └─────────────────┘      │    CANCELED       │
             │                        │                │    REJECTED       │
             └────────────────────────┴────────────────┴───────────────────┘
                                                        (UNSPECIFIED 为未定义占位)

这张图里最值得讲的是 Paused 这一组INPUT_REQUIRED 表示"我需要更多信息才能继续",AUTH_REQUIRED 表示"我需要你补授权"。协议在状态机层面为「人在环中」和「二次授权」留了一等公民的位置,而不是把它当成异常。这和 MCP 2026-07-28 引入 MRTR 的动机是同一件事:真实业务里,长任务执行到一半需要问一句,是常态。

面试里能把这一点说出来,比背九个状态名有价值得多。

传输与交付

  • 传输:HTTP(S) + JSON-RPC 2.0;实时进度用 SSE 流式推送;长任务/断连场景用 push notification(服务端 POST 到客户端提供的 webhook)。
  • 版本与扩展:请求头 A2A-Version 声明协议版本,A2A-Extensions 声明要启用的扩展 URI——扩展机制让能力可以增长而不破坏兼容。
  • 交付:任务进入终态时返回一个或多个 Artifact,内容按 Part 类型化(文本 / 文件 / 结构化数据),而不是让调用方去解析一段自由文本。

"返回 Artifact 而不是聊天记录"是 A2A 一个容易被忽略的工程价值:它逼你把 Agent 之间的交付定义成契约。这和多 Agent 编排里"子 Agent 必须返回结构化摘要而非完整 transcript"(T3-8)是同一条工程纪律。

回到开篇的故障

用 A2A 重做那个集成:

原文示意
行程助手                                     报销助手(不透明)
   │                                              │
   │ ① GET /.well-known/agent-card.json  ────────→│
   │←──── 卡片(含 skills、鉴权方式、签名)─────────│
   │ ② 验签 + 按声明的方式取令牌                    │
   │ ③ 派任务:{行程单, 期望产出:"预支申请"} ──────→│  内部爱怎么做怎么做:
   │←──── SSE: WORKING ───────────────────────────│  挂几个工具、什么审批规则、
   │←──── INPUT_REQUIRED: "缺成本中心" ────────────│  用什么模型,调用方一概不知
   │ ④ 补充信息 ─────────────────────────────────→│
   │←──── COMPLETED + Artifact(预支申请单) ────────│

四个原问题一次性解决:工具不再进对方上下文(准确率回来了);schema 不再耦合(只依赖卡片声明的 skill);凭证留在财务侧(跨信任边界鉴权);审批规则只存在于一处。

工程实践(截至 2026-08)

生态现状

  • v1.0 于 2026-04-09 在 Linux Foundation 下发布,150+ 组织参与,主流云平台均已集成(Microsoft 侧 Azure AI Foundry / Copilot Studio,AWS 侧 Bedrock AgentCore Runtime,Google Cloud 提供 A2A 编排 + MCP 工具执行的参考架构)。
  • 同期还有 AP2(Agent Payments Protocol,智能体支付协议),处理 Agent 驱动的交易场景,与 A2A 配套。
  • 生态里还存在 ACP(IBM/AGNTCY 系,REST 原生)等替代方案。2026 年最值得讲的结构性变化不是"又出了个协议",而是MCP 与 A2A 都进了 Linux Foundation,治理层面开始收敛

进阶技术三段式:A2A

  • 解决什么:跨团队/跨组织的 Agent 协作。把"能力不透明的对端"变成可发现、可委派、可验收的合同关系;避免把对方的工具、凭证和业务规则搬进自己的上下文。
  • 代价是什么:① 多一层协议与网络跳数,延迟增加;② 需要维护 Agent Card、签名与密钥轮换;③ 分布式故障模型——对端超时、任务卡在 WORKING、webhook 丢失,都要有超时与补偿策略;④ 端到端可观测性变难,跨组织的 trace 需要显式传递关联 ID;⑤ 责任边界模糊:对端把事办砸了,你的用户只会找你。
  • 什么时候不该用同一进程 / 同一代码库里的"子 Agent"根本不需要 A2A——那是框架内的 handoff 或函数调用,套协议纯属自找麻烦;只有一个 Agent 的系统更不需要;对延迟极敏感的同步链路;以及——你其实需要的只是一个工具而不是一个 Agent 时,用 MCP。

判据:什么时候对端应该是 Agent 而不是工具

信号 建议
对端逻辑固定、输入输出确定 做成 工具(MCP)
对端有自己的判断、可能反问、可能耗时很久 做成 Agent(A2A)
对端归属另一个团队/公司,凭证不能外泄 A2A(信任边界)
对端的业务规则会独立演进 A2A(避免规则复制)
你和对端在同一个进程里 都不用,直接函数调用

避坑清单

  • 别把 A2A 当成"多 Agent 架构"的通行证。协议解决的是跨边界通信,不解决"你到底该不该拆成多个 Agent"(那是 T3-8 的问题,答案通常是"不该")。
  • 务必验签。不验签的 Agent Card 等同于把发现层暴露给中间人。
  • 给每个派出去的 Task 设超时与终态兜底,别指望对端一定会把状态推到终态。
  • INPUT_REQUIRED 要有人或有策略去响应,否则任务会永久悬挂。
  • 跨边界传的数据要做最小化:别把整个用户上下文当作任务输入甩过去。
对端会不会反问,决定它是工具还是 Agent
同一进程里的子 Agent 不需要 A2A;你需要的只是一个工具时,用 MCP

什么时候对端该是 Agent
对端的样子做成什么为什么
逻辑固定、输入输出确定做成工具(MCP)你其实需要的只是一个工具,而不是一个 Agent
有自己的判断、可能反问、可能耗时很久A2A 的正位做成 Agent(A2A)状态机里的 INPUT_REQUIRED 就是给反问留的位置
归属另一个团队或公司,凭证不能外泄A2A(信任边界)凭证留在对方侧 —— 开篇那个「要不来」的顾虑,技术上终于有第二条路
业务规则会独立演进A2A(避免规则复制)审批规则只存在于一处,不会被抄进两个代码库
你和对端在同一个进程里都不用,直接函数调用那是框架内的 handoff,套协议纯属自找麻烦
生态现状与避坑
版本与治理
v1.0 于 2026-04-09 在 Linux Foundation 下发布,150+ 组织参与,主流云平台均已集成
传输与推送
HTTP(S) + JSON-RPC 2.0;进度用 SSE,长任务与断连用 push notification 打 webhook
版本与扩展头
请求头 A2A-Version 声明协议版本,A2A-Extensions 声明要启用的扩展 URI
务必验签
不验签的 Agent Card 等同于把发现层暴露给中间人
别让任务悬挂
每个派出去的 Task 设超时与终态兜底;INPUT_REQUIRED 要有人或有策略去响应
跨边界最小化
别把整个用户上下文当任务输入甩过去;也别把 A2A 当成「多 Agent 架构」的通行证
别忘了把代价一起报出来 —— 多一跳网络、要维护卡片签名与密钥轮换、跨组织 trace 得显式传关联 ID。最扎心的一条是责任边界模糊:对端把事办砸了,你的用户只会来找你。

面试视角

说「没上 A2A」也能加分,只要说得出为什么
面试官会往这四处追:你们用了吗、没用为什么、卡片怎么防伪、任务卡住怎么办

  1. 一句话定位MCP 纵向连工具,A2A 横向连 Agent,互补
  2. 讲 opaque 这个设计建模成不透明实体,所以适合跨信任边界
  3. 举反例故事把 Agent 当工具挂 → 上下文膨胀 + 规则复制
  4. 主动给反向判断「同一个服务里,我走的是框架内 handoff」
只读过:这些回答会暴露你
  • 说 A2A 和 MCP 是竞品、二选一
  • 只会背 Agent Card、Task、Artifact 三个名词,说不出各自解决什么
  • 认为 A2A 是「多 Agent 架构」的必需品
  • 不知道 v1.0 已经发布,还停留在「Google 出了个新协议」的印象
  • 谈安全只说「要鉴权」,不知道卡片签名这一层
真做过:这些细节骗不了人
  • 一纵一横讲清互补,并点出两者同在 Linux Foundation 治理下
  • 卡片管发现与鉴权、Task 管长时委派、Artifact 管类型化交付
  • 给得出「我们在同一进程里,所以没上」这类反向判断
  • 知道 v1.0 在 2026-04-09 发布,也知道 AP2 这类配套协议
  • 提到 Agent Card 验签(JWS + 规范化)防的是发现层伪造
这题的隐藏考点是「你有没有跨团队集成的真实经验」—— 没踩过「把对方工具搬过来」这个坑的人,答案会停在名词层面。另一个便宜的加分点:注意到 INPUT_REQUIRED / AUTH_REQUIRED 是给人机协同留的位置,并和 MCP 的 MRTR 对照着讲。

面试官怎么问

Q3-11 常见于头部 AI 公司和有多团队 Agent 落地的公司的二面。问法通常是「A2A 解决什么问题?和 MCP 是竞争还是互补?」——这题的隐藏考点是"你有没有跨团队集成的真实经验",因为没踩过"把对方工具搬过来"这个坑的人,答案会停留在名词层面。

追问方向:你们用了吗?没用为什么?(说"没用"并给出理由是加分的)Agent Card 怎么防伪?任务卡住怎么办?

答题结构建议

  1. 一句话定位:MCP 纵向连工具,A2A 横向连 Agent,互补关系,现在都在 Linux Foundation 下。
  2. 讲 opaque 这个关键设计:A2A 把对端建模成不透明实体,这决定了它适合跨信任边界。
  3. 举反例故事:讲你(或你见过的团队)把 Agent 当工具挂导致的上下文膨胀 + 规则复制。
  4. 主动给反向判断:"我们内部两个 Agent 在同一个服务里,我没上 A2A,直接走的框架内 handoff——协议是给跨边界准备的。"

分水岭信号

只读过资料的回答

  • 说 A2A 和 MCP 是竞品、二选一。
  • 只会背"Agent Card、Task、Artifact"三个名词,说不出各自解决什么。
  • 认为 A2A 是"多 Agent 架构"的必需品。
  • 不知道 v1.0 已经发布,还停留在"Google 出了个新协议"的印象。
  • 谈安全只说"要鉴权",不知道卡片签名这一层。

真做过的回答

  • 说得出 opaque / 信任边界是 A2A 的设计核心,并能对比"把工具搬过来"的失败模式。
  • 提到 Agent Card 验签(JWS + 规范化)防发现层伪造。
  • 注意到状态机里 INPUT_REQUIRED / AUTH_REQUIRED 是给人机协同留的位置,并能和 MCP 的 MRTR 对照。
  • 提到 返回 Artifact 而非自由文本是一条工程纪律。
  • 能给出"我们没上,因为在同一进程里"这类反向判断
  • 知道 AP2 之类的配套协议,或知道 MCP/A2A 同在 Linux Foundation 治理下的生态收敛趋势。

小结与延伸

  • A2A 解决跨团队/跨厂商的 Agent 委派,把对端建模为不透明实体;MCP 解决工具接入。一横一纵,互补。
  • 三个核心对象:Agent Card(发现 + 鉴权声明 + 签名)、Task(九态状态机)、Artifact(类型化交付物)。
  • 状态机里的 Paused 组(INPUT_REQUIRED / AUTH_REQUIRED)把人机协同做成了一等公民。
  • 同进程内的子 Agent 不需要 A2A;需要的是工具时用 MCP。

延伸:拆不拆多 Agent、怎么编排、什么时候是灾难,见 T3-8。跨 Agent 的 trace 串联见 T3-11。跨边界的高危动作确认见 T3-10

继续深入

本篇归属第 3 章「Agent 开发」,去做这一章的题