多智能体与协议
第 26 课:多智能体与协议
紧接上一课(第 25 课《规划与反思》)——那一课把"想清楚再动手"讲透了,这一课只追一个问题:把任务交给多个 Agent,究竟是变强了,还是只是变贵了?我们从"多智能体不一定更强"的实测讲起,把收益/成本账、A2A 的能力发现、通信拓扑与消息设计、上下文工程,一路算到最底层的三笔账——token、延迟与失败率。
② 用 N(N−1)/2 算通信规模:5 个 Agent 网状要 10 条通道、中心辐射只要 4 条;协议把集成复杂度从 O(N²) 压到 O(N)
③ 用连乘算多 Agent 串联的失败率:单点 0.9 的 4 个 Agent 只剩 0.9⁴ ≈ 0.656;再用摘要 + 检索把上下文从 20,000 压到 5,000(降 75%)
上一部分我们讲过"想一步、做一步"的循环能靠外部观察纠错。这一课换一个问题:把任务交给多个 Agent 一起做,是不是就一定更强?
因为多智能体的收益(并行、互相纠错)要用 token 去买,而 token 账单会成倍放大——所以"更强"必须放到账上比,不能凭感觉。就像点外卖凑满减:多凑几单看似更划算,多付的配送费却可能把折扣吃回去。
| 指标 | 单智能体 | 多智能体(主 + 子) |
|---|---|---|
| 内部研究评测 | 基线 | 相对提升约 90.2% |
| 相对普通对话的 token | 约 4× | 约 15× |
| 数据来源 | Anthropic《How we built our multi-agent research system》(2025) | |
| 项 | 数值 |
|---|---|
| 一次任务的普通对话量(示意) | 20,000 token |
| 单 Agent ≈ 4× 普通对话 | 4 × 20,000 = 80,000 token |
| 多智能体 ≈ 15× 普通对话 | 15 × 20,000 = 300,000 token |
| 项 | 数值 |
|---|---|
| 多智能体比单 Agent 多花 | 300,000 − 80,000 = 220,000 token |
| 内部评测相对提升 | 约 90.2%(relative lift,非"90.2 个百分点") |
| 能否折算成"每 1% 花多少 token" | 不能:相对提升与百分点不是同一口径 |
多智能体不是"更聪明的模型",而是"允许花更多 token"的架构:Anthropic 自己分析发现,仅 token 用量一项就解释了 80% 的性能差异。先算账,再决定要不要上。
上一张卡片算清了多智能体的收益与账单。那么,什么任务该上、什么任务别上?
因为多智能体只在"任务能切成互不依赖的并行子任务"时才划算;一旦子任务要共享同一份上下文、互相依赖,协调成本(多出来的 token 与等待时间)就会盖过并行收益。就像装修:砌墙和铺砖互不干扰,可以两队并进;水电和墙面必须分先后,硬拆成两队只会互相等。所以先看任务结构,再决定拆不拆。
| 任务形状 | 适合多智能体 | 为什么 |
|---|---|---|
| 广度研究(多来源、互不依赖) | 是 | 线程独立,信息超一个窗口 |
| 同标准对比多个对象 | 是 | 每个对比独立跑、结果可合流 |
| 多个 Agent 改同一份代码 | 否 | 要共享上下文,改动互相冲突 |
| 串行流水线 | 否 | 没有可并行的部分 |
| 强延迟敏感 | 否 | 编排每波都要等最慢的 worker |
| 项 | 数值 |
|---|---|
| 4 个独立子任务,每个 10 秒 | 串行 4 × 10 = 40 秒 |
| 并行后关键路径 | 最慢子任务 10 秒 + 合并 2 秒 = 12 秒 |
| 加速比 | 40 ÷ 12 ≈ 3.33 倍 |
| 情形 | 观察 |
|---|---|
| 两个 Agent 改同一份共享代码 | 成功率约 50% → 25%(CooperBench,2026;最强模型档) |
| 必须共享同一份上下文 | Anthropic:这类任务不适合今天的多智能体 |
| 只是"多采样几次" | 与直接多采无本质区别,白付协调费 |
判据是任务结构:能切成独立、读多写少的线程,才上多智能体;子任务要共享同一份状态时,一个带规划的 Agent 往往更省更稳——并行省下的时间,要拿多出来的 token 去换。
上一张卡片说明要挑能拆开的任务。那拆完之后,两个 Agent 凭什么才能相互派活?
因为派活的前提是"可发现"与"可验证":不知道对方能做什么就会派错活,不知道对方是谁就无法验证结果、也可能被冒名者接走。就像进公司找人办事:先看工牌(身份)和岗位(能力),再谈具体做什么,否则会把报销单交给实习生。所以协议要先解决"我是谁、我能做什么"。
| 对象 | 作用 |
|---|---|
| AgentCard(智能体名片) | 身份 + 能力清单,放在 /.well-known/agent-card.json(旧版曾用 agent.json) |
| Task(任务) | 一次可跟踪、可回访的委派 |
| Message / Part(消息 / 片段) | 对话消息与其中的内容片段 |
| Artifact(工件) | 任务产物 |
| Agent 数 N | 两两直连 N(N−1)/2 | 有统一协议后 |
|---|---|---|
| 3 | 3 × 2 ÷ 2 = 3 | 3 |
| 5 | 5 × 4 ÷ 2 = 10 | 5 |
| 10 | 10 × 9 ÷ 2 = 45 | 10 |
| 字段 | 内容 |
|---|---|
| 身份与描述 | 我是谁、做什么 |
| 服务端点 | 到哪里找我 |
| 鉴权要求 | 怎么安全连接 |
| 能力(capabilities) | 是否支持流式、推送 |
| 技能(skills) | 我能接哪些活 |
协议解决两件事:"能否互通"(发现与格式)与"敢不敢互通"(身份与权限)。AgentCard 是两件事的交汇点——它既是接线图,也是准入门槛。
上一张卡片用 AgentCard 解决了"我是谁、我能做什么"。可角色分好之后,消息怎么走才不会互相打架?
因为通信拓扑(谁和谁连、消息怎么走)决定了"谁在等谁、谁和谁冲突":中心辐射只有一个编排者收口,谁来合流很清楚;网状人人对话则容易两两改同一件事而打架。就像开会:主持人一个人收口,比分头两两私聊更容易达成一致。所以先定拓扑,再定消息里放什么。
| 拓扑 | 通道数(N 个 Agent) | 优点 | 风险 |
|---|---|---|---|
| 中心辐射(orchestrator-worker) | N − 1 | 好合流、易追踪 | 中心是单点 |
| 网状(peer-to-peer) | N(N−1)/2 | 无单点 | 易冲突、难追踪 |
| 黑板(shared state) | 各写同一存储 | 解耦 | 要并发控制 |
| 做法 | 每次传递 | 5 个子产物合计(示意) |
|---|---|---|
| 传全文 | 5,000 token | 5 × 5,000 = 25,000 token |
| 传引用(指针 + 摘要) | 100 token | 5 × 100 = 500 token |
| 省下 | 1 − 500 ÷ 25,000 = 98% | |
| 字段 | 作用 |
|---|---|
| 任务 id | 同一件事的多次消息可归并 |
| 发送方 / 接收方 | 谁问谁、防串台 |
| 意图 | 派单 / 汇报 / 追问 / 收尾 |
| 产物引用 | 指向外部存储,不塞全文 |
| 状态 | 进行中 / 需要输入 / 完成 |
拓扑的判据是"写操作是否单线程":多个 Agent 只读、只有一个编排者合流就稳;多个 Agent 同时写共享状态就容易打架。消息则要"传引用不传全文"。
上一张卡片把通信拓扑和消息格式定了下来。可长任务跑到一半,上下文窗口塞满了怎么办?
因为轨迹会随步数线性增长,每多一步就多一段要带上,20 步就要占掉 128K 窗口的约 31%,很快逼近需要压缩的区间;硬塞只会让模型对中段信息的利用更差。就像出差装箱:不是把所有家当都带上,而是按行程挑必需品、其余寄存,要用再取。所以先算清轨迹怎么长,再看三种压缩各管什么。
最省事的做法是「窗口还能装就继续装」;但轨迹按步数线性长,每步 2,000 token,20 步就是 40,000,占 128K 窗口约 31%(与第 22 课同一窗口口径),继续下去很快逼近上限,而且模型对上下文中间部分的利用最差。所以长任务必须主动做上下文工程,而不是等它自己塞满。
| 项 | 数值 |
|---|---|
| 每步轨迹(示意) | 2,000 token |
| 10 步 | 10 × 2,000 = 20,000 token |
| 20 步 | 20 × 2,000 = 40,000 token(占 128K 窗口约 31%) |
| 手段 | 做法 | 代价 / 风险 |
|---|---|---|
| 摘要(compaction) | 把历史压成要点 | 信息有损 |
| 检索 | 按需取回相关片段 | 可能漏召 |
| 外置状态 | 文件 / 数据库存全量 | 多一层读写 |
| 方案 | 进上下文窗口的量 |
|---|---|
| 不压缩 | 20,000 token |
| 摘要 2,000 + 按需检索 3,000 | 2,000 + 3,000 = 5,000 token |
| 降幅 | 1 − 5,000 ÷ 20,000 = 75% |
上下文工程不是"写更好的提示",而是决定每一步把哪些 token 放进窗口:摘要给方向、检索给细节、外置状态兜住全量。这是多智能体能不能跑长大的最后一道工程约束。
上一张卡片把长轨迹压进了窗口。最后把三笔账合起来看,并回答一个绕不开的问题:为什么本课不教任何具体框架?
因为多智能体的代价分布在三处——token、延迟与失败率;而框架替你做的,正是前面五张卡片讲的事。就像学开车:先懂油门、刹车和路况判断,再挑哪款车,否则换个车型就不会开。所以先把三笔账算清,再谈工具。
| 口径 | 倍数(相对普通对话) | 一次任务(示意) |
|---|---|---|
| 普通对话 | 1× | 20,000 token |
| 单 Agent | 约 4× | 80,000 token |
| 多智能体 | 约 15× | 300,000 token |
| 做法 | 总时长(示意) |
|---|---|
| 串行 4 步,每步 5 秒 | 4 × 5 = 20 秒 |
| 编排 + 4 个 worker 并行 + 合并 2 秒 | 5 + 2 = 7 秒 |
| 多波次任务 | 每波都要等最慢的 worker |
| Agent 串联数 | 单点成功率 0.9 | 单点成功率 0.99 |
|---|---|---|
| 4 | 0.9⁴ ≈ 0.656 | 0.99⁴ ≈ 0.961 |
| 10 | 0.9¹⁰ ≈ 0.349 | 0.99¹⁰ ≈ 0.904 |
那为什么本课不教 LangGraph / AutoGen / CrewAI 这些框架?因为课程立场是先懂原理:框架替你做的,正是这 6 张卡讲的 6 件事——能力发现(AgentCard)、任务委派、通信拓扑、消息设计、上下文压缩、成本与失败率的账。等你清楚它们内部在干什么,用任何框架都只是 API 问题;反过来,只会调框架的人,一旦出问题就不知道该改拓扑还是改消息格式。
收口:多智能体的完整链条是——先算收益账(不一定更强)→ 挑能拆开的任务 → 用 AgentCard 解决"我是谁" → 定通信拓扑与消息格式 → 做上下文工程把轨迹压进窗口 → 三笔账(token / 延迟 / 失败率)都算清。框架只是把这些固化下来的壳——先懂原理,再挑工具。