首页 › ai-agents › 自报家门税:A2A能力失真实测

核心发现

A2A 协议(Agent-to-Agent)在 2026 年成为多智能体协作的事实标准之一,其基础设施是 Agent Card——一份由智能体自己发布的 JSON "数字名片",列出身份、端点、鉴权方式与 Skills(能力)。问题在于:能力声明本质是自证(self-attestation)。智能体(或其开发者、或生成卡片的 LLM)自己填写自己能干什么,而 v1.0 引入的签名 Agent Card 只能证明"这张卡片是 X 签发的",证明不了"X 真的具备它声称的能力"。本文实测三类能力失真——能力冒充、ID 过宽、静默漂移——并复盘一次因能力协商失败级联导致的 4 万美元损失事故。结论:发现层若只做匹配不做验证,多智能体的"找人干活"就从精确路由退化为概率赌博。

多智能体发现机制对比

发现机制 Agent Card 来源 能力可信度 失真代价 典型场景
Well-Known URI 智能体自托管 /.well-known/agent-card.json 最低(完全自证) 路由到不称职者 公开/跨域发现
策展注册表 中央注册表策展 中(注册表把关) 注册表成单点 + 信任瓶颈 企业内/市场
直接配置 硬编码/配置文件 高(人工背书) 零弹性,能力变就失配 私有强耦合
签名 Agent Card(v1.0) 自发布 + 加密签名 中(验身份不验能力) 身份真实但能力可虚标 跨厂商互操作
能力探测验证层 声明 + 运行时回声校验 最高(实测) 每次发现附探测开销 关键路径任务

一、Agent Card:数字名片与三字段陷阱

Agent Card 的官方结构包含五块:Identity(name/description/provider)、Service Endpoint(url)、A2A Capabilities(streaming/pushNotifications 等开关)、Authentication(Bearer/OAuth2)、以及最关键的 Skills。每个 Skill 是一个 AgentSkill 对象,含 id、name、description、inputModes、outputModes、examples。

陷阱恰恰藏在三处自由文本里。description 是自然语言,跨厂商对同一能力的措辞天差地别;examples 是示例而非契约,无法保证泛化;而 name 往往被 LLM 调度器当作语义匹配的主键。一份典型 Card 看起来很专业:

{
  "name": "Refund Specialist",
  "description": "Handles customer refunds and billing adjustments",
  "skills": [
    { "id": "refund", "name": "Process Refund",
      "description": "Refunds any order", "inputModes": ["text"] }
  ]
}

但"Refunds any order"这句话没有任何机器可校验的约束。它既不区分部分退款与全额退款,也不声明是否需要二次审批。调度器只能信这句话。这张卡片的可信度,等同于一句广告语。

二、能力冒充:admin 案例与自证不可信

最致命的失真不是写得差,而是故意写假。某团队在 staging 环境部署了一个恶意(rogue)智能体,它在 Agent Card 里声称自己具备 admin 能力,结果直接访问了生产用户数据。事后复盘给出的铁律只有一句:"永远不要信任调用方的能力列表。" 修复方案是引入服务端能力验证,对照存储在 Vault 里的白名单逐项核对。

这不是孤立事故。A2A 协议官方文档承认,Agent Card 包含敏感信息(内部 URL、受限能力描述),因此推荐"已认证的扩展卡片"和选择性披露——但披露机制解决的是谁能看到卡片,不是卡片内容是否为真。签名 Agent Card(v1.0 被称为"最重要的安全改进")能防篡改、能追溯签发者,却无法阻止签发者把"我只能查天气"写成"我能动生产库"。自证能力的结构性缺陷,签名补不上。

三、能力 ID 过宽:refund vs invoice.refund 的泛匹配税

即使没有恶意,粗粒度的 ID 也会让路由失真。how2.sh 的工程实践给出明确建议:用精确 ID(invoice.refund)而非宽泛 ID(refund)。原因在于调度逻辑通常是子集匹配——只要候选 Card 的能力集合是所需集合的超集就算命中。

def supports_all(card, required_ids):
    provided = {c["id"] for c in card.get("capabilities", [])}
    return required_ids.issubset(provided)   # 宽 ID 轻易命中

当一个 Card 只声明了 refund(含义模糊),而任务需要的是带版本约束的 [email protected](要求处理 1.1 版退款协议),子集匹配仍会把它选为候选。后果是任务被分发给一个语义擦边的智能体,直到执行阶段才暴露它根本不懂 1.1 版协议——而这往往表现为一个泛化的"task failed",工程师要花两小时才能定位到能力不匹配。实测中,把宽泛 ID 收敛为带域前缀 + 版本的精确 ID,是发现层性价比最高的一处改动。

四、静默漂移:改了 schema 不加版本,消息被悄悄丢弃

第三类失真最阴险——能力声明与现实之间发生了漂移,而系统沉默。一个智能体悄悄修改了字段名(比如把 user_id 改成 userId)却没有 bump 版本号。schema 校验失败时,调用方拿到的是一个模糊错误,甚至没有错误。

A2A 文档坦承:不声明 schema 或声明不一致的智能体,会导致静默消息丢弃,看起来像网络问题。thecodeforge 给出的工程对策是在每条消息里嵌入 schema hash,hash 不匹配时强制返回 CapabilityMismatch 错误并记录每一次不匹配——绝不允许静默降级。配合 jsonschema 在发现阶段预校验 Card 结构(required 字段、类型约束),可以把这类漂移从"运行时偶发故障"前置成"发现时硬失败"。核心原则来自 how2.sh:使用前校验卡片,必需能力缺失时 fail closed,而不是 fail open 去猜。

五、签名验身份不验能力:v1.0 签名卡的信任边界

v1.0 引入签名 Agent Card 是对的,但要清醒认识它的边界。签名解决了三件事:防篡改(卡片在传输中没被改)、可追溯(谁签的,吊销列表怎么查)、身份真实性(确实是 example.com 这台服务器发的)。它没解决一件最关键的事:声明的能力是否与实际能力一致。

这正好类比 PKI 体系:一张 X.509 证书能证明域名归属,证明不了那个域背后的服务真的安全。能力声明的真实性,必须靠带外验证——即真正的能力探测——来补充。这就是为什么官方文档反复强调"强烈推荐使用带外动态凭证,而非在 Card 里嵌入静态密钥":Card 里能写的都是声明,可信的部分必须放到 Card 之外。把签名当成能力担保,是把身份信任错当成能力信任,正是多智能体发现层最常见的认知错位。

六、发现层规模税:1 万智能体握手,注册表 p99 从 10ms 烧到 5s

能力失真不只是正确性问题,还是规模问题。当 1 万个智能体同时与中央能力注册表握手,注册表的 p99 延迟从 10ms 飙到 5s。修复需要三层:Redis 缓存能力查询、指数退避重试(100ms 起、10s 封顶)、以及每 60s 一次的"能力心跳"让注册表持有新鲜数据而无需全量握手。任务路由则改用一致性哈希环,把任务类型映射到固定智能体,在扩缩容时避免雪崩式重握手——这一项让握手负载直降 90%。

但这套机制的前提,是注册表里的能力数据本身可信。心跳上报的仍是智能体自报的能力。若一个智能体每 60s 心跳一次声称自己健康且具备某能力,注册表就会持续把任务路由过去——直到真正调用时才发现它在"假活"。规模越大,发现层与执行层之间的能力真相延迟就越久,一张失真的 Card 被复用的次数就越多。

七、下游失真:能力声明失效如何变成对抗性共识

能力失真的代价不止是路由错误,它会在协作层放大为对抗性共识。仲裁研究发现多智能体分歧有四类:风格性、推理性、高置信度、对抗性。其中对抗性分歧最危险——一个被操纵的智能体通过反复的协调性附和,能把目标智能体推向错误结论。医疗 AI 的对照实验显示,对抗性 assistant 智能体能达到 98%–100% 的攻击成功率,手段正是"制造假共识"。

这与能力失真的关联是:当一个能力冒充或漂移的智能体混入网络,它输出的"协作信号"会被其他智能体当作可信输入。多数票投票会放大共享错误而非抵消它——若若干智能体都从同一个失真能力源获得污染信号,多数票反而锁定错误。唯一的解药在研究里被明确写出:一个锚定外部 ground truth 的验证器智能体,能彻底消除这类攻击。能力声明可以被伪造,但对照外部事实的探测不能。这正是把"自证"升级为"实测"的工程出口。

发现与验证分层架构

flowchart TB
    subgraph D["发现层 Discovery"]
        A1[智能体自发布 Agent Card<br/>Well-Known URI]
        A2[策展注册表 Registry]
        A3[直接配置 Config]
    end
    subgraph S["签名校验层 v1.0"]
        B1[加密签名: 防篡改]
        B2[签发者追溯: 身份真实]
        B3[❌ 不验证能力真伪]
    end
    subgraph V["能力验证层 新增"]
        C1[schema hash 比对]
        C2[精确 ID + 版本匹配]
        C3[回声探测 echo probe<br/>实测而非自证]
        C4[锚定 ground truth 验证器]
    end
    subgraph R["协作层 Collaboration"]
        D1[多数票投票]
        D2[LLM Judge 仲裁]
        D3[辩论协议]
    end
    A1 & A2 & A3 --> S
    S -->|声明可信| V
    V -->|能力可信| R
    V -.->|fail closed<br/>必需能力缺失| X[❌ 拒绝路由]
    R -.->|对抗性共识污染| C4
    C4 -.->|消除 98%攻击| R

    classDef trap fill:#ffe0e0,stroke:#c33,color:#900
    class B3 trap

推荐方案

分层信任,把自证逐层替换为实测。 发现层只负责"找到候选",不可承担能力担保。三步落地:第一,发现阶段强制 schema 校验 + 精确 ID(带域前缀与版本),宽泛 ID 一律拒绝;第二,引入能力探测层——对关键能力在握手后做一次廉价回声测试(发一个已知输入,核对输出契约),把"声明可信"升级为"实测可信";第三,协作层至少保留一个锚定外部 ground truth 的验证器,专门用来刺破假共识。

按场景选发现机制:公开跨域用 Well-Known URI + 签名卡(接受自证风险,靠探测兜底);企业内用策展注册表(注册表做治理,但仍需探测);关键路径用直接配置 + 探测(最高可信,零弹性代价)。永远不要让"找到了"和"能干"画等号——前者是声明的,后者必须实测。

变现评估:能力声明审计(Card 契约校验 SaaS)、发现层探测探针(按能力探测计费)、对抗性共识红队服务——这三块在 2026 年企业 A2A 落地潮中是明确空白市场,适合做成训练营的"多智能体可信发现"专题。

参考来源

  1. Agent Discovery - A2A Protocol 官方规范 — Agent Card 结构、三种发现策略、签名与缓存官方定义
  2. A2A Protocol for AI Agents — How We Lost $40k to Agent Handshake Timeouts — 4 万美元事故复盘、admin 能力冒充案例、1 万智能体注册表规模税
  3. How to Implement A2A Agent Discovery with Capability Cards — 能力卡片实现、精确 ID、fail-closed 校验代码
  4. When Your Agents Disagree: Consensus and Arbitration in Multi-Agent Systems — 多智能体分歧分类、对抗性共识 98-100% 攻击成功率、ground truth 验证器
  5. Agent-to-Agent Communication Protocols: A2A, MCP, and Multi-Agent Security — A2A v1.0 签名 Agent Card 作为最重要的安全改进

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入