Skip to content

所在组:Agent 系统 | 上一组出口(行动组):能安全执行单次工具调用 | 本页出口:能判断何时值得上多 agent,写出四要素委派契约,用 supervisor 拓扑委派专家并在路由失败时降级而不是崩溃 前置:Agent 运行时、工作流模式 | 下一步:A2A(跨边界才需要协议)、可观测性、成本与性能

1. 概述 ​

结论先讲:多 agent 不是更强的单 agent,而是用协调换容量的架构。它用独立上下文窗口做并行探索与压缩(subagent 把海量原始材料蒸馏成结论回传),换来单 agent 无法企及的覆盖面;代价是约 15 倍于聊天的 token 消耗、协调复杂度与错误传播。判断式只有三条,全部命中才考虑:任务价值高到付得起、子方向天然可并行、信息量超出单一上下文。缺任何一条,先回到工作流或单 agent。

范围先划清:本页只讲同一信任域内(同 host / 同进程)spawn subagent 的编排;要把任务委派给跨进程、跨组织、跨信任域的 agent,不在本页展开——先过 A2A,按协议地图选连接方向(判据见下文「关键边界」)。

心智模型:supervisor + 专家 + 产物 ​

三个构件:supervisor(拆解任务、写委派契约、汇总结果)、specialist(各自拥有独立上下文窗口、工具集与提示词的 subagent)、artifacts(大产物落盘,只回传引用——避免多级转述造成信息损耗)。

何时使用 / 何时不用 ​

  • 用(Anthropic 生产口径):高价值任务 + 重度并行 + 信息超出单上下文 + 需要对接大量复杂工具;典型是开放式研究(breadth-first 查询)。
  • 不用:所有 agent 必须共享同一上下文、或 agent 间依赖密集的任务——多数编码任务并行度不足,不适合;实时互相协调委派仍是非擅长项。步骤可枚举的,回工作流;单上下文够用的,回单 agent。

决策表:梯级定位 ​

方案方向控制权状态信任域最低复杂度
单 agent(Agent 运行时)读写循环模型 + 停止条件一个上下文host 内默认起点
同域多 agent(本章)读写循环 × Nsupervisor 委派与路由各自上下文 + 汇总点同一 host/进程内并行与专业化收益 > 协调成本
跨边界协作(协议地图)读写跨界协议协商(A2A 等)任务/消息/artifact跨进程/组织/信任域出现第二个信任域才需要

关键边界:同一进程内 spawn 的 subagent 不需要协议——函数调用与结构化任务就够;只有协作要跨进程、跨组织、跨信任域时,才进入 A2A 等协议分支。

收益与代价 ​

维度收益代价
上下文各自窗口并行探索,压缩后回传汇总点信息瓶颈;转述损耗(game of telephone)
专业化独立工具集/提示词/轨迹,降低路径依赖工具与提示的维护面 ×N
并行3–5 个 subagent 同时跑,耗时最高降 90%token 总量约 15×聊天;需要预算护栏
可靠性单个 subagent 失败可由 supervisor 补救错误跨 agent 传播;行为涌现难预测
调试委派 trace 天然分片全局因果链要跨片拼装

编排拓扑 ​

拓扑结构适用失败模式
supervisor(编排器-工人)中心 agent 拆解并委派,结果汇总子任务无法预定义的开放任务supervisor 成为信息瓶颈;顺序等待
router(路由)分类后转给专用 agent,无汇总输入类别清晰的分流误分类静默失败
pipeline(流水线)固定顺序传递中间产物阶段明确的加工链中间产物损耗逐级放大
辩论/验证(generator-verifier)生成与评估成对循环有明确评估标准的质量关键输出振荡不收敛,需最大迭代数

Anthropic 的五模式(generator-verifier / orchestrator-subagent / agent teams / message bus / shared state)是这四类的展开版,演进判据见资源库。

历史版本里程碑:本章整合自旧页《Multi-Agent Coordination Patterns》(Claude 博客的仓库存档,2026-04-10);五模式原文保留在资源库,正文按四拓扑重组并补充委派契约与降级语义。更早时间线未验证,不编造。

2. 使用 ​

最小实战:supervisor 模式 mock——两个 specialist agent 接收结构化任务(TaskBrief 四要素)并返回结果,演示正常路由、路由失败降级、契约拒绝三种输出。专家是确定性 mock 而非 LLM:验证的是编排层的契约与降级,不是模型能力。零 API key、零依赖。

环境:Node ≥ 22.18。保存为 multi-agent.ts,运行 node multi-agent.ts。

ts
// multi-agent.ts — a supervisor-pattern mock: delegation contract + specialist routing + degraded fallback.
// Zero dependencies, zero API keys (specialists are deterministic mocks, not LLM calls).
// Runs natively on Node >= 22.18: node multi-agent.ts
import { setTimeout as sleep } from "node:timers/promises";

// ---------- Delegation contract: four required fields (objective / outputFormat / boundaries / taskType) ----------
interface TaskBrief {
  taskType: "search" | "summarize";
  objective: string;     // what question to answer
  outputFormat: string;  // what structure to return
  boundaries: string;    // what to do and what NOT to do
}

interface SpecialistResult {
  specialist: string;
  payload: unknown;
}

// ---------- Specialist agents: each with its own isolated context (mocked via closures) ----------
const specialists: Record<TaskBrief["taskType"], {
  name: string;
  handle: (brief: TaskBrief) => Promise<SpecialistResult>;
}> = {
  search: {
    name: "search-specialist",
    handle: async (brief) => {
      await sleep(10);
      // real system: this is a subagent loop with its own context window
      return { specialist: "search-specialist", payload: { query: brief.objective, hits: ["doc-a", "doc-b"] } };
    },
  },
  summarize: {
    name: "summarize-specialist",
    handle: async (brief) => {
      await sleep(10);
      return { specialist: "summarize-specialist", payload: { summary: "2 findings: cost is dominated by tool calls; retries need idempotency keys." } };
    },
  },
};

// ---------- Supervisor: validate the delegation contract -> route -> degrade on routing failure ----------
class Supervisor {
  private trace: string[] = [];

  async delegate(brief: TaskBrief): Promise<{ mode: "delegated" | "degraded" | "rejected"; result?: unknown; reason?: string }> {
    // 1) Delegation-contract check: a brief without an objective is rejected outright
    //    (prevents subagent spin-up with no steering, or duplicated work)
    if (!brief.objective || brief.objective.trim().length === 0) {
      this.trace.push("rejected: brief missing objective");
      return { mode: "rejected", reason: "brief missing objective — subagent cannot be steered" };
    }
    const specialist = specialists[brief.taskType];
    // 2) Degraded fallback on routing failure: the supervisor answers itself instead of crashing
    if (!specialist) {
      this.trace.push(`degraded: no specialist for taskType=${brief.taskType}`);
      return {
        mode: "degraded",
        result: { answer: `supervisor fallback for "${brief.objective}" (no specialist: ${brief.taskType})` },
      };
    }
    // 3) Normal delegation: structured task in, structured result out
    const result = await specialist.handle(brief);
    this.trace.push(`delegated: ${brief.taskType} -> ${result.specialist}`);
    return { mode: "delegated", result: result.payload };
  }

  getTrace() { return this.trace; }
}

async function main() {
  const supervisor = new Supervisor();

  console.log("== case 1: search task -> routed to search-specialist ==");
  const r1 = await supervisor.delegate({
    taskType: "search", objective: "find docs about agent cost",
    outputFormat: "list of doc ids", boundaries: "only internal wiki, max 5 queries",
  });
  console.log(JSON.stringify(r1));

  console.log("== case 2: summarize task -> routed to summarize-specialist ==");
  const r2 = await supervisor.delegate({
    taskType: "summarize", objective: "summarize search findings for the cost report",
    outputFormat: "3 sentences", boundaries: "no new searches",
  });
  console.log(JSON.stringify(r2));

  console.log("== case 3: unknown taskType=translate -> routing failure degrades gracefully ==");
  const r3 = await supervisor.delegate({
    taskType: "translate" as any, objective: "translate the report to English",
    outputFormat: "translated text", boundaries: "keep terminology",
  });
  console.log(JSON.stringify(r3));

  console.log("== case 4: negative — a brief missing its objective is rejected by the contract ==");
  const r4 = await supervisor.delegate({
    taskType: "search", objective: "", outputFormat: "list", boundaries: "wiki only",
  });
  console.log(JSON.stringify(r4));

  console.log("== supervisor trace (failure localization: who handled what) ==");
  for (const line of supervisor.getTrace()) console.log(`  ${line}`);
}

main();

正常输出(确定性):

text
== case 1: search task -> routed to search-specialist ==
{"mode":"delegated","result":{"query":"find docs about agent cost","hits":["doc-a","doc-b"]}}
== case 2: summarize task -> routed to summarize-specialist ==
{"mode":"delegated","result":{"summary":"2 findings: cost is dominated by tool calls; retries need idempotency keys."}}
== case 3: unknown taskType=translate -> routing failure degrades gracefully ==
{"mode":"degraded","result":{"answer":"supervisor fallback for \"translate the report to English\" (no specialist: translate)"}}
== case 4: negative — a brief missing its objective is rejected by the contract ==
{"mode":"rejected","reason":"brief missing objective — subagent cannot be steered"}
== supervisor trace (failure localization: who handled what) ==
  delegated: search -> search-specialist
  delegated: summarize -> summarize-specialist
  degraded: no specialist for taskType=translate
  rejected: brief missing objective

看点:case 3 的 mode:"degraded"——路由失败没有抛异常崩溃,supervisor 降级自答并留下 trace;case 4 的 mode:"rejected"——委派契约在 spawn 之前就把不可驾驭的任务挡回去。

验收命令:

bash
node multi-agent.ts | grep -c '"mode"'   # 期望输出: 4(delegated ×2 / degraded / rejected)

清理:纯内存运行,无副作用。

场景推演 ​

场景输入动作输出适用不适用
开放研究一个宽问题supervisor 拆 3–5 个子方向并行委派汇总 + 引用breadth-first、超单上下文有固定答案链的查询(单 agent 便宜)
多维度评审一份文档每维度一个 specialist(安全/性能/风格)分维度结论维度独立、可并行维度间强依赖(会互相推翻)
分流客服用户请求router 分类转专用 agent专用路径处理类别清晰可分类类别模糊(误分类静默失败)

3. 原理 ​

为什么多 agent 有效:容量与压缩 ​

Anthropic 的生产数据分析:在 BrowseComp 评测上,token 使用量本身解释了 80% 的性能方差(加上工具调用次数与模型选择共解释 95%)。多 agent 架构的本质是为超出单 agent 限制的任务扩展 token 使用:每个 subagent 在自己的上下文窗口里并行探索,再把最重要的 token 压缩后回传。内部评测中,Opus 4 主控 + Sonnet 4 subagent 的组合比单 Opus 4 高 90.2%(breadth-first 研究类查询)。

委派契约:教 supervisor 委派 ​

subagent 的产出质量上限由委派描述决定。Anthropic 的最小契约四要素(缺项即 case 4 的 rejected):

要素回答的问题缺失的后果
objective要回答什么subagent 无法被驾驭,空转或重复别人的工作
outputFormat返回什么结构汇总端解析失败,转述损耗放大
工具与来源指引用什么、不用什么拿搜索工具找只存在于 Slack 的事实
boundaries做什么、不做什么多个 subagent 撞车做同一件事

配套的规模规则(写进 supervisor 提示词):简单事实查证 1 个 agent、3–10 次工具调用;直接对比 2–4 个 subagent、各 10–15 次;复杂研究 10 个以上、分工明确。没有规模规则的早期系统曾为简单查询 spawn 50 个 subagent。

状态:共享还是隔离 ​

模式机制适用风险
隔离 + 消息回传subagent 只通过结构化结果与 supervisor 通信默认:探索型、可压缩的任务汇总端瓶颈
共享存储各 agent 读写同一文件/DB/knowledge base协作构建型(发现互相影响)重复劳动、反应性循环(A 写→B 应→A 再应,token 无限燃烧),需显式终止条件
artifact 旁路大产物直写文件系统,只回传引用长报告、代码、数据集引用失效需治理

失败定位 ​

多 agent 的调试单位是委派:每次 delegate 记录 brief 摘要、路由结果、subagent 终态。行为是涌现的——supervisor 提示词的小改动会不可预测地改变 subagent 行为——所以评估以终态(end-state)为准而不是逐步骤路径:断言最终状态正确,而非路径符合预设。跨片因果链靠 trace 拼装(进生产与运营组的可观测性)。

规范要求 vs 本地实测 ​

官方口径(Anthropic 多 agent 研究系统复盘)本地 fixture 对应
orchestrator-worker 模式:lead agent 规划并 spawn 并行 subagent(retrievedAt 2026-09-01)Supervisor.delegate 路由到 specialists
委派描述需要 objective、输出格式、工具与来源指引、任务边界TaskBrief 四字段;缺 objective 即 rejected
简单查询曾 spawn 50 个 subagent → 嵌入规模规则本章把规模规则列进原理(fixture 未实现,属提示词层)
token 用量:agent ≈ 4× 聊天,多 agent ≈ 15× 聊天fixture 用 mock 专家,token 成本为零——正文决策表保留该约束
大产物写文件系统、回传引用,减少转述损耗心智模型图的 artifacts 旁路

4. 开发 ​

集成 ​

  1. supervisor 即工具执行工程意义上的一个 approval 以下档工具:spawn subagent 的动作本身过 allowlist 与预算门。
  2. 每个 specialist 是独立的 agent 循环(见 Agent 运行时):自己的上下文、工具集、提示词;互不共享内存。
  3. 委派产物超阈值(如 2K token)时切 artifact 旁路:写文件、回传路径引用。
  4. 预算护栏:per-run subagent 数上限、per-subagent 工具调用上限、总 token 上限——三者任一触顶即停止 spawn 并汇总现有结果。

测试 ​

  • 路由三分支:delegated / degraded / rejected 各有确定性断言(fixture 即模板)。
  • 契约负例:缺每个要素的 brief 都要被拒。
  • 终态评估:端到端断言最终产物,而非中间路径(多 agent 路径非确定)。

回滚 ​

编排层回滚 = 回退 supervisor 提示词与路由表。注意涌现性:小改动可能大改变 subagent 行为,回滚后必须重跑终态评估集,不能只看单例。

症状 → 证据 → 处理 → 完成标准 ​

症状:两个 subagent 交回几乎相同的内容,第三个方向没人做。 证据:两条 brief 的 objective 高度重叠且都无 boundaries;trace 显示重复的搜索词。 处理:补齐委派契约——objective 互斥拆分、boundaries 显式写「不做 X」;在 supervisor 提示词里加「拆分后自查覆盖率」。 完成标准:同一任务的 brief 集两两 objective 不重叠;重复检索在 trace 中消失。

症状 → 证据 → 处理 → 完成标准 ​

症状:简单问题也 spawn 十几个 subagent,账单爆炸。 证据:无规模规则;trace 里 subagent 数与问题复杂度无相关。 处理:把「1/3–10、2–4/10–15、10+」三级规模规则写进 supervisor 提示词;加 per-run spawn 上限硬门。 完成标准:简单查询的 subagent 数稳定为 1;上限门有测试覆盖。

症状 → 证据 → 处理 → 完成标准 ​

症状:supervisor 汇总的结果丢细节、甚至曲解 subagent 的发现。 证据:subagent 原始输出很长,全部经 supervisor 上下文中转后失真(转述损耗)。 处理:大产物切 artifact 旁路——subagent 直写文件/存储,只回传引用与一段摘要;supervisor 按需读取。 完成标准:终产物中的关键事实可回溯到 artifact 原文;supervisor 上下文占用显著下降。

症状 → 证据 → 处理 → 完成标准 ​

症状:多 agent 系统出错后无人能定位是哪个环节引入的。 证据:只有最终答案日志;无 per-delegation trace。 处理:每次 delegate 记录(brief 摘要、路由决策、subagent 终态、产物引用);评估改终态断言 + trace 抽查。 完成标准:任一次失败可在 trace 中指认到具体委派;终态评估集全绿。

反模式清单 ​

  • 为规模而上多 agent:并行度不足的任务(多数编码)只会得到协调开销。
  • 委派一句话:「研究一下半导体短缺」式的 brief 是重复劳动的温床——契约四要素缺一不可。
  • 无预算护栏的 spawn:任何「按需再开一个」的路径都必须有硬上限。
  • 共享状态无终止条件:反应性循环会把 token 烧到预算清零。
  • 拿多 agent 修单 agent 的提示词问题:先修单 agent 的工具描述与提示,再谈拆分——拆分会复制问题而不是解决问题。

5. 资料库 ​

四级阅读路线:

  • Beginner:读完本页 → 能复述「三条判断式 + 委派四要素」;跑通 fixture 的三分支输出。
  • Builder:Agent 运行时(specialist 的本体)+ 本页契约代码集成进 supervisor。
  • Operator:多 agent 研究系统复盘的生产段落(checkpoint、rainbow deployment、终态评估);成本与性能的 token 预算。
  • Researcher:五协调模式的演进判据;共享状态与反应性循环的形式化分析。

资源表 ​

名称证据层级canonical URL用途支持的断言下一步
How we built our multi-agent research system(Anthropic)L1(维护者)https://www.anthropic.com/engineering/built-multi-agent-research-system架构、委派契约、规模规则、生产可靠性「token 用量解释 80% 方差;agent ≈4×、多 agent ≈15× 聊天;并行化最高省 90% 时间」(retrievedAt 2026-09-01)精读生产可靠性一节
Multi-agent coordination patterns(Claude 博客)L1(维护者)https://claude.com/blog/multi-agent-coordination-patterns五模式与两两演进判据五种协调模式(本仓旧页存档核验 2026-04-10,本次未重验)对照本章四拓扑
Building multi-agent systems: when and howL1(维护者)https://claude.com/blog/building-multi-agent-systems-when-and-how-to-use-them投入前判断「何时值得上多 agent」(旧页转引,未在本次重验)作为判断式交叉验证
Building Effective Agents(Anthropic)L1(维护者)https://www.anthropic.com/engineering/building-effective-agentsorchestrator-workers 模式定位编排器动态分解子任务的边界(retrievedAt 2026-09-01)工作流模式
Learn LLM(兄弟站)siblinghttps://llm.zenheart.site/多 agent 行为的模型侧根源模型机制归 Learn LLM(retrievedAt 2026-09-01)停止点见上文

主动证伪与未决问题 ​

  • 证伪入口:如果你有一条依赖密集的任务用多 agent 跑得又好又便宜——给出任务形态与账单对比,本章「三条判断式」需要修订。
  • 未决:异步多 agent(subagent 并行中互相通信)的协调语义,Anthropic 自述仍在演进,本章只覆盖同步 supervisor 模式。
  • 未决:跨组织多 agent 的身份、授权与结算如何映射到 A2A 任务模型,待协议地图分支展开。

learn-ai 到此为止 / 继续去哪 ​

为前端工程师打造 · 基于 VitePress 构建