DAY 13 / PHASE 2 · SYSTEMS

Multi-agent Systems

何时该用 · Orchestrator-Worker · Debate · 协同协议与协调税

2026-05-27 · BigCat

2025 年 6 月 Anthropic 和 Cognition 几乎同时发文,立场完全相反——Anthropic「这样建多 agent」,Cognition「别建多 agent」。这一期把这场争论的工程底牌掀开:什么时候多 agent 真有价值,什么时候是 15× token 的浪费。

前置概念 → ai-ml-daily Day 7: Multi-Agent 系统概念(AutoGen, CrewAI)

// WHY THIS MATTERS

2025 年 6 月行业最有信息量的一周:Anthropic 发布 How we built our multi-agent research system,详细拆解他们的 Research 功能用 Opus 4 做 orchestrator + Sonnet 4 做 subagents,在内部 eval 上比 single-agent Opus 4 高 90.2%;同周 Cognition(Devin 团队)的 Walden Yan 发表 Don't Build Multi-Agents,明确说多 agent 是脆弱系统,主张「单 agent + 长 context + 完整 trace」。两个一线团队,公开对撞。重点不是「谁对」——是他们用多 agent 的任务结构不同:Anthropic 的 Research 是并行检索(每个 subagent 独立、最后聚合),Cognition 的 Devin 是串行编码(每一步依赖前一步的上下文)。多 agent 的工程价值完全取决于任务能否分解为独立子任务。这一期假设你已经懂 agent 是什么(ai-ml-daily Day 7 讲过),直接讲 4 个决定多 agent ROI 的工程层:① 何时不该多 agent 的决策线 → ② Orchestrator-Worker 的真实约束 → ③ Debate / 多视角的几乎所有真实价值 → ④ 协调税与通信协议(A2A vs MCP)

多 agent 决策线(2026 年版) 问题:单 agent + tools + 长 context 已经不够好 │ ▼ ┌─────────────────────────────────────────────────────────┐ │ ① 子任务能并行独立完成吗(不共享中间状态)? │ │ Yes → orchestrator-worker 候选 │ │ No → 留在单 agent + 长 context │ └─────────────────────────────────────────────────────────┘ │ Yes ▼ ┌─────────────────────────────────────────────────────────┐ │ ② 单 agent 的 context 真的爆了吗(> 200K 仍不够)? │ │ Yes → 多 agent 可摊分 context │ │ No → 加长 ctx / 加 RAG / compaction 更简单 │ └─────────────────────────────────────────────────────────┘ │ Yes ▼ ┌─────────────────────────────────────────────────────────┐ │ ③ 任务价值 > 15× token 成本? │ │ Anthropic 数据:multi-agent ≈ 15× chat token │ │ 研究类高价值任务 → 划算 │ │ 通用任务 → 不划算 │ └─────────────────────────────────────────────────────────┘ │ Yes ▼ ┌─────────────────────────────────────────────────────────┐ │ ④ 失败可独立判定吗(每个 subagent 输出可单独验证)? │ │ Yes → 上 multi-agent │ │ No → 失败会级联放大,留在单 agent + reflection │ └─────────────────────────────────────────────────────────┘ 绝大多数业务任务停在 ① 或 ② —— 这就是 Cognition 的立场。 Research / 大规模并行检索 / 跨工具调研 → 多 agent 真正起飞。
// 01

反模式:80% 的「多 agent」是单 agent 加上花架子

论断:Cognition 的 Walden Yan 是对的——多 agent 默认是脆弱系统。问题不是 agent 数量,是 context sharing 的崩塌:subagent 看不到彼此的中间决策、conflicting actions 互相覆盖、orchestrator 的 summarization 丢信息。在任务可串行的场景,单 agent + 完整 trace + 长 context 几乎总是更可靠、更便宜、更易 debug。

背景与原理

Cognition 在 Don't Build Multi-Agents(2025 年 6 月)里把这个反模式讲透了。核心 claim:multi-agent 系统的失败不是 agent 不够聪明,是它们看不到彼此。一个 subagent 决定「先 refactor 这个文件再加 feature」,另一个并发 subagent 决定「直接加 feature 不动结构」——两个都在自己 context 里逻辑自洽,merge 时冲突,orchestrator 既无法判优劣也无法回滚。这种隐式决策冲突(implicit decision conflict)是多 agent 最难治的失败模式,因为没有报错、没有 stack trace,只有一个看起来「奇怪但能跑」的结果。

Cognition 的两条工程原则:(1) Share full context, not summaries——任何 subagent 都要能看到整个 trace(包括 orchestrator 的目标、其他 agent 已经做了什么),summarization 是有损压缩,几乎一定会丢关键信息;(2) Actions carry implicit decisions——每个 tool call 都隐含一个判断(「我选择这条路而不是另一条」),并发 agent 各自做隐式决策时没有协商机制,所以编码、规划这类每一步依赖前一步的任务,单 agent 严格优于多 agent。

这跟 Anthropic 的 Research 系统不矛盾——它们的任务结构正好相反:并行检索 100 个网页、然后 orchestrator 聚合答案。每个 subagent 之间本来就独立,没有 implicit decision conflict 问题。所以判断要不要多 agent 的第一个问题不是「这个任务复杂吗」,是「子任务之间有没有隐式共享状态」。

另一个常被忽视的反模式:把单 agent 的 prompt 拆成多个 agent 来「降低复杂度」——typical 例子是「PM agent + Engineer agent + Reviewer agent」串行 pipeline。这种拆法几乎从不带来质量提升,只是把 prompt 工程的复杂度从 1 个 system prompt 转移到 3 个 agent 间的 message format 设计。MetaGPT 这类「SOP 编码进 agent 角色」的论文展示了上限,但需要把每个角色的 prompt 都调到生产质量——这本身工作量比单 agent 高 3×,且必然引入 agent 间 message drift 问题。除非你的产品 SOP 真的稳定到可以编码成 agent 角色(极少),否则单 agent 永远是 baseline。

任务结构 → agent 数量决策 任务类型 并行性 状态共享 推荐架构 ──────────────────────────────────────────────────────────── Research / 文献综述 高 低 Orchestrator + N workers Web 抓取聚合 高 低 Orchestrator + N workers 跨工具大规模信息整合 高 低 Orchestrator + N workers ────────────────────────────────────────────────────────── Coding agent (Devin 类) 低 高 单 agent + 长 context 长 form 写作 低 高 单 agent + 长 context 调试 / 重构 低 高 单 agent + 长 context ────────────────────────────────────────────────────────── Factual QA / 数学题 中 中 Debate (2-5 agents, 1 题) 关键决策审查 中 中 Debate / Cross-check ────────────────────────────────────────────────────────── 「分角色 pipeline」 低 高 ❌ 通常是反模式 → 状态共享高 + 并行性低 = 单 agent 永远赢

实战示例

用之前的 ROI 决策树问自己 6 个问题——如果有 ≥ 3 个 No,多 agent 就是过度工程:

# multi_agent_check.py —— 开建前的 sanity check
def should_use_multi_agent(task) -> str:
    checks = {
        "parallelizable":
            task.can_split_into_independent_subtasks,
        "low_implicit_state":
            not task.requires_step_n_depends_on_step_n_minus_1,
        "context_truly_overflows":
            task.estimated_tokens > 200_000,  # long-ctx 真不够
        "value_per_query_high":
            task.dollar_value_per_run >= 1.0,  # 15× token 才划算
        "subagent_output_verifiable":
            task.each_subagent_result_can_be_validated_independently,
        "single_agent_tried_and_failed":
            task.has_single_agent_baseline_with_eval_score,
    }
    failed = [k for k,v in checks.items() if not v]
    if len(failed) >= 3:
        return f"❌ Stay on single agent. Missing: {failed}"
    if "parallelizable" in failed or "low_implicit_state" in failed:
        return "❌ Task structure fights multi-agent. Use single agent + long ctx."
    return "✅ Good fit. Start with orchestrator-worker; measure 15× token budget."
失败模式:(1)「把单 agent 拆成 PM + Engineer + Reviewer 三个 agent」——pipeline 中每个 agent 只看上游的 summary,下游 agent 不知道上游为什么这么决定,决策上下文丢失,质量通常反而下降;(2)并发 subagent 共享工具但不共享 trace——两个 subagent 各自 write 同一个文件、各自调用 search 用不同 query,结果互相覆盖;(3)orchestrator 用 summary 而非 raw trace 给 subagent——summary 丢的恰好是 subagent 需要做决策的细节;(4)用多 agent debate 来「提升质量」却没有 ground truth eval——debate 容易让所有 agent 一起 confidently wrong,比单 agent 更难发现错;(5)多 agent 用同一个模型同一个 prompt——没有 diversity 时 debate/voting 退化为相关误差放大,等于把 N 票全投给同一个判断。
进阶资源 · Cognition · Don't Build Multi-Agents (2025), cognition.ai/blog/dont-build-multi-agents · Anthropic · Building effective agents, anthropic.com/engineering/building-effective-agents
// 02

Orchestrator-Worker:Anthropic 的赌注与真实成本

论断:Orchestrator-Worker 是 2026 年唯一被生产规模验证的多 agent 模式。Anthropic Research 系统披露 Opus 4 orchestrator + Sonnet 4 workers 比 single-agent Opus 4 高 90.2% — 但代价是 15× chat token 成本。理解这个 trade-off 的 4 个工程约束(任务 spawn 准则、subagent prompt 隔离、聚合策略、并发上限)决定它是飞起还是烧钱。

背景与原理

Anthropic 在 2025 年 6 月的 How we built our multi-agent research system 博客里把这个模式讲得最具体。架构:用户 query → Lead Agent (Opus 4) 做规划、拆分子任务、spawn N 个并行 Subagents (Sonnet 4) 各自查不同方向 → Lead 聚合所有 subagent 的发现 → 生成最终答案。关键数字:内部 research eval 上比 single-agent Opus 4 高 90.2%,但 token 消耗约为普通 chat 的 15×(普通 agent 大约 4×)。

四个让这个模式真正 work 的工程约束:

15× token 成本怎么理解?普通 chat 1 turn = 1 个 LLM 调用;普通 agent ≈ 4× 因为 ReAct loop 多轮;multi-agent research ≈ 15× 因为:lead 自己跑多轮(~4×)+ 每个 subagent 各跑多轮(~4×)× N 个并发 subagent(~3-5)+ 聚合。这意味着每 query 成本要 > $1 才有 ROI。低价值通用任务用 multi-agent 是直接烧钱;研究、尽职调查、跨工具调研、深度 SWE-bench 这类结果一份值钱的场景才匹配。

Orchestrator-Worker 标准拓扑 User Query │ ▼ ┌───────────────┐ │ Lead Agent │ ← Opus / GPT-5 (强模型) │ - 规划 │ │ - 拆任务 │ │ - 聚合 │ └───────────────┘ / │ │ │ \ / │ │ │ \ ▼ ▼ ▼ ▼ ▼ ┌────┐ ┌────┐┌────┐┌────┐┌────┐ │Sub₁││Sub₂││Sub₃││Sub₄││Sub₅│ ← Sonnet / Haiku (并发 3-7) │tool││tool││tool││tool││tool│ └────┘ └────┘└────┘└────┘└────┘ │ │ │ │ │ └─────┴────┴────┴─────┘ │ ▼ Lead 聚合 + 推理 │ ▼ Final Answer Token 账:Lead (~4×) + N·Sub (~4× each) + 聚合 ≈ 15× chat 适用:value/query > $1,且子任务独立可并行

实战示例

最小可工作的 orchestrator-worker(Anthropic SDK,伪代码——抓住模式而非细节):

import anthropic, asyncio, json

client = anthropic.AsyncAnthropic()

# ============ Subagent: 独立查一个子方向 ============
async def subagent(task: dict) -> dict:
    # 注意:prompt 只给本子任务,不给其他 subagent 的工作
    msg = await client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=2000,
        system="You are a research subagent. Focus ONLY on the assigned "
               "sub-question. Use search tools. Return: findings + sources.",
        tools=[search_tool, fetch_tool],
        messages=[{"role":"user",
                   "content": f"Sub-question: {task['question']}\n"
                              f"Scope: {task['scope']}"}],
    )
    # tool loop 省略,实际要循环到 stop_reason='end_turn'
    return {"task": task, "findings": msg.content[0].text}

# ============ Lead Agent: 规划 + 聚合 ============
async def lead_agent(user_query: str) -> str:
    # Step 1: 规划——用强模型决定要不要拆、拆成什么
    plan = await client.messages.create(
        model="claude-opus-4-7",
        max_tokens=1500,
        system="You are a research lead. Decide if this query benefits from "
               "parallel subagents. If YES, output JSON list of 3-7 INDEPENDENT "
               "sub-questions. If NO (task is sequential or simple), output "
               "{\"single\": true} and you'll handle it alone.",
        messages=[{"role":"user","content":user_query}],
    )
    spec = json.loads(plan.content[0].text)

    # Step 2a: 任务不适合拆 → fallback 单 agent (绝大多数 query)
    if spec.get("single"):
        return await single_agent_run(user_query)

    # Step 2b: 并行 spawn subagents
    results = await asyncio.gather(*[subagent(t) for t in spec["tasks"]])

    # Step 3: 聚合——再次用强模型,必须做 cross-check 而非 concat
    aggregation = await client.messages.create(
        model="claude-opus-4-7",
        max_tokens=4000,
        system="You are the research lead synthesizing N subagent reports. "
               "Cross-validate, identify contradictions, fill gaps. "
               "Output: comprehensive answer + confidence notes.",
        messages=[{"role":"user",
                   "content":f"Original query: {user_query}\n\n"
                             f"Subagent findings:\n{json.dumps(results, indent=2)}"}],
    )
    return aggregation.content[0].text

# ============ Cost guard:硬上限防失控 ============
# 在 production 必须包:单次 budget 上限 + N_subagent <= 7 + timeout
失败模式:(1)Lead 用弱模型——Haiku 做 lead 等于让小学生当 PM,规划质量差、聚合 cross-check 不出矛盾;lead 必须是该 stack 里最强的模型;(2)Subagent 数量无上限——lead 喜欢「多开几个保险」,没上限会 spawn 20 个 subagent,token 爆炸还没质量提升;硬编码 N ≤ 7;(3)聚合只是 concat——把 5 个 subagent 输出拼起来不叫聚合,叫信息堆积;必须用强模型再做一轮推理;(4)没有 budget guard——multi-agent 失控时单 query 能烧掉 $10+,必须包硬 token budget + tool call 上限;(5)用 multi-agent 处理串行任务——「让 5 个 subagent 各自写代码的不同部分」必然 merge 失败;这种任务永远单 agent;(6)不监控 single-agent baseline——上了 multi-agent 之后忘了对比,可能 90.2% 提升根本不存在(你的任务结构本来就不适合)。
进阶资源 · Anthropic · How we built our multi-agent research system (2025), anthropic.com/engineering/multi-agent-research-system · Wu et al. · AutoGen: Multi-Agent Conversation Framework, arxiv.org/abs/2308.08155
// 03

Debate / Cross-check:什么时候多视角真的提升质量

论断:Multi-agent debate(Du et al. 2023)是个被高估的范式——它在数学题、事实 QA 上确实涨点(5-15pp),但在开放写作、主观判断、价值评估上经常退化为同质化共识。真正起作用的不是「agent 数量」,是diversity 来源:不同模型、不同 system prompt、不同 role。同模型同 prompt 跑 N 次 = 把噪声平均,提升边际接近 0。

背景与原理

Du et al. 2023(Improving Factuality and Reasoning in Language Models through Multiagent Debate,arXiv 2305.14325)是这个范式的起点。核心机制:让 N 个 LLM 各自独立回答 → 互相看到对方答案 + 论据 → 多轮迭代后输出共识答案。论文在 MMLU、数学题、事实 QA 上证明显著优于单次回答和 self-consistency。这个结果到 2026 年仍稳健——当任务有明确正确答案

但 debate 在 3 个场景上几乎不 work:

更高 ROI 的「多视角」工程模式是 asymmetric cross-check(不对称交叉验证):用一个不同的模型 / 不同的 prompt / 单独的 verifier agent 来检查主 agent 的输出。例如:主 agent 用 Claude Opus 写代码 → verifier agent 用 GPT-5 单独跑 testing 思路 + 找 edge case。这种「主+审计」结构比 N-agent debate 在工程上更稳:责任清晰、成本可控(2× 而非 N×)、失败可独立 attribute。Constitutional AI 自己审、self-refine、Reflexion 都是同源的「主+审」结构在不同时间维度的展开。

还有一个反直觉发现:让模型「debate 自己之前的答案」(self-debate / self-reflection)效果常不如「让另一个 agent 来 critique」。Cognition 的 backward rationalization 问题:模型一旦给了答案 A,它会倾向于为 A 辩护、找证据支持,而非真正质疑——self-debate 经常变成 self-confirmation。所以cross-check 比 self-reflection 更可靠,这是 multi-agent 在工程上真正的甜点。

Debate / Cross-check 模式选择 任务类型 推荐结构 典型增益 ────────────────────────────────────────────────────────── 数学题 / 逻辑题 N-agent debate (3-5) +10-15pp acc 事实 QA / 知识题 debate or RAG cite +5-10pp acc Code 正确性 主 agent + verifier test pass +20% 关键决策审查 主 + 不同模型审计 发现 30%+ bug ────────────────────────────────────────────────────────── 创意写作 单 agent + 人评筛选 debate 反而平庸 产品文案 / 商业判断 单 agent + 多 prompt debate 易 converge 长 form 报告 单 agent + 分段 self-refine ────────────────────────────────────────────────────────── ❌ 同模型同 prompt N 次 → 等于 self-consistency,diversity = 0 ❌ Self-debate 一个 agent → backward rationalization 偏差大 关键变量:diversity 来源 > agent 数量

实战示例

Asymmetric cross-check 模式(主 agent + 不同模型 verifier),2× 成本换可观质量提升:

import anthropic, openai

claude = anthropic.Anthropic()
gpt = openai.OpenAI()

def primary_solve(question: str) -> str:
    # 主 agent:Claude Opus 出答案
    msg = claude.messages.create(
        model="claude-opus-4-7", max_tokens=1500,
        messages=[{"role":"user","content":question}],
    )
    return msg.content[0].text

def cross_check(question: str, primary_answer: str) -> dict:
    # Verifier:用不同厂商模型 + adversarial prompt
    # 关键 1:换模型(diversity)  关键 2:角色对立(反方)
    prompt = f"""You are a SKEPTICAL reviewer. Your job is to find what is
WRONG with the candidate answer below. Do NOT defend it.

QUESTION: {question}

CANDIDATE ANSWER:
{primary_answer}

Output JSON:
{{"verdict": "correct"|"incorrect"|"uncertain",
  "issues": [],
  "missing": []}}"""
    rsp = gpt.chat.completions.create(
        model="gpt-5", temperature=0.2,
        messages=[{"role":"user","content":prompt}],
        response_format={"type":"json_object"},
    )
    return json.loads(rsp.choices[0].message.content)

def arbitrate(question, primary, review) -> str:
    # 仅当 verifier 找出问题时才重新跑——成本可控
    if review["verdict"] == "correct" and not review["issues"]:
        return primary
    # 让主 agent 看到 critique 后修订(不是简单覆盖)
    revision = claude.messages.create(
        model="claude-opus-4-7", max_tokens=2000,
        messages=[
            {"role":"user","content":question},
            {"role":"assistant","content":primary},
            {"role":"user","content":
              f"A skeptical reviewer raised these issues:\n"
              f"{json.dumps(review, indent=2)}\n\n"
              f"Revise ONLY if the issues are valid. If you disagree, explain why."}],
    )
    return revision.content[0].text

# 用法
answer = primary_solve(question)
review = cross_check(question, answer)
final  = arbitrate(question, answer, review)
# 成本:~2× single agent。质量:对 factual/code 任务通常 +10-20pp
失败模式:(1)同模型 debate——Claude vs Claude 几乎一定 converge 到同一个偏差,等于浪费一次 call;至少跨厂商或跨 system prompt;(2)Verifier 用同样 prompt 风格——必须明确角色对立(「找错」「skeptical」),中性 verifier 容易给「looks fine」;(3)对所有 query 都跑 cross-check——成本翻倍但绝大多数 query 没问题;用 router 先判断「这个 query 是否高风险」(涉及数字、代码、关键决策)再决定要不要 verify;(4)把 cross-check 结果直接覆盖主答案——verifier 也会错,让主 agent 看到 critique 后选择性修订更稳;(5)用 debate 处理开放主观任务——「让 5 个 agent debate 这个广告语好不好」必然 converge 到平庸;这类任务用单 agent + 多 prompt 变体 + 人评。
进阶资源 · Du et al. · Improving Factuality and Reasoning through Multiagent Debate (ICML 2024), arxiv.org/abs/2305.14325 · Shinn et al. · Reflexion: Language Agents with Verbal Reinforcement Learning, arxiv.org/abs/2303.11366
// 04

协调税与通信协议:A2A、MCP、和 N² 的代价

论断:多 agent 系统的隐藏成本不在 token,在协调(coordination)——agent 数 N 上升时通信复杂度 O(N²)、决策延迟线性叠加、失败 attribution 指数级困难。2025 年 4 月 Google 推出的 A2A 协议试图把这些标准化,但选择 A2A vs MCP vs 自建消息总线,本质是不同任务结构匹配不同通信拓扑

背景与原理

多 agent 系统的「协调税」是分布式系统老问题在 LLM 时代的翻版。三个关键开销:

2025 年 4 月 Google 推出 A2A(Agent-to-Agent)协议,标准化「不同框架不同厂商的 agent 互相发现 + 委派任务 + 协调」。技术栈:HTTP + SSE + JSON-RPC 2.0,每个 agent 用 Agent Card(JSON 描述自身能力)发布,client agent 通过 Card 找合适的目标 agent,Task 抽象封装委派。6 月 Google 把 A2A 捐给 Linux Foundation,已有 150+ 组织支持。

A2A vs MCP 的分工经常被混:

但对独立开发者:不要先上协议。2-3 个 agent 的系统用裸 Python function call + asyncio.gather 几小时能搞定;上了 A2A/MCP 这种通用协议反而增加序列化、网络、版本兼容的复杂度。协议的价值在跨组织 / 跨厂商 / 长期演进的 agent 生态——你一个人的产品里 3 个 agent,直接函数调用比 JSON-RPC over HTTP 简单 10×、快 10×、易 debug 10×。等系统真的需要把内部 agent 暴露给外部、或者整合多个第三方 agent 时,再迁移到 A2A 也不晚。

通信拓扑选择 (按 agent 数量与边界) agent 数 边界 推荐协议 为什么 ────────────────────────────────────────────────────────── 1 单进程 直接函数调用 零开销 2-3 单进程内部 asyncio + dict 不要过度工程 3-7 单产品内部 内部 message bus 标准化 trace 5-20 跨服务/团队 MCP (tools) + 自建 MCP 已成事实标准 N 跨厂商/组织 A2A 互操作性需求 ────────────────────────────────────────────────────────── 反例:2 个 agent 的 PoC 上来就 A2A → 多 50% 代码量、调试难 5×、零互操作性收益

实战示例

独立开发者最务实的「无协议」多 agent 通信模板(asyncio + shared trace):

import asyncio, uuid, time, json
from dataclasses import dataclass, field

# —— 共享 trace:debug 多 agent 的命脉 ——
@dataclass
class SharedTrace:
    run_id: str = field(default_factory=lambda: str(uuid.uuid4()))
    events: list = field(default_factory=list)

    def log(self, agent: str, kind: str, payload: dict):
        self.events.append({
            "t": time.time(), "agent": agent,
            "kind": kind, "payload": payload,
        })

# —— Subagent:直接 async 函数,不上 RPC ——
async def subagent(name: str, task: dict, trace: SharedTrace,
                   budget_tokens: int = 8000) -> dict:
    trace.log(name, "start", {"task": task})
    used = 0
    try:
        # LLM call + tool loop (省略)
        result = await run_llm_loop(task, budget_tokens=budget_tokens)
        used = result["tokens_used"]
        trace.log(name, "done", {"tokens": used, "preview": result["text"][:200]})
        return result
    except Exception as e:
        trace.log(name, "error", {"err": str(e), "tokens": used})
        return {"failed": True, "reason": str(e)}

# —— Orchestrator: 并发 + budget + timeout 三层防护 ——
async def orchestrate(user_query: str) -> dict:
    trace = SharedTrace()
    trace.log("lead", "query", {"query": user_query})

    plan = await lead_plan(user_query, trace)
    if len(plan["tasks"]) > 7:
        plan["tasks"] = plan["tasks"][:7]   # 硬上限

    # 三层保护:每 agent budget / 总超时 / 失败不阻塞
    try:
        results = await asyncio.wait_for(
            asyncio.gather(*[
                subagent(f"sub-{i}", t, trace, budget_tokens=8000)
                for i, t in enumerate(plan["tasks"])
            ], return_exceptions=True),
            timeout=120,                 # 总 budget 2 分钟
        )
    except asyncio.TimeoutError:
        trace.log("lead", "timeout", {})
        results = [{"failed": True, "reason": "global timeout"}]

    # 部分成功也能聚合 (failure isolation)
    good = [r for r in results if not (isinstance(r,dict) and r.get("failed"))]
    final = await lead_aggregate(user_query, good, trace)

    # 落库:trace 是后续 debug + eval 的命脉
    json.dump({"run_id":trace.run_id, "events":trace.events, "final":final},
              open(f"runs/{trace.run_id}.json","w"), ensure_ascii=False)
    return {"answer": final, "trace_id": trace.run_id}
失败模式:(1)没 budget guard——LLM agent loop 偶发卡在 tool call 死循环,一个 query 烧 $50 一觉醒来才发现;硬 token + tool call + wallclock 三层 budget 必须;(2)没 timeout—asyncio.gather 没 timeout 时一个 subagent 挂会拖死整个 run;(3)失败一个就 fail-fast 整个 run——multi-agent 应该用 return_exceptions=True + 部分成功聚合,失败 isolation;(4)没存 trace——multi-agent 失败时如果没有完整 trace 落库,事后根本不知道哪一步出错;trace 是 multi-agent 工程的命脉;(5)上 A2A 协议但只有 3 个 agent——协议开销远超收益,等到跨厂商需求出现再迁移;(6)用 MCP 让 agent 之间通信——MCP 是 agent ↔ tools,不是 agent ↔ agent;用错协议引入抽象不对位。
进阶资源 · Google · Agent2Agent (A2A) Protocol (2025), a2a-protocol.org · Anthropic · Model Context Protocol (MCP), modelcontextprotocol.io · Hong et al. · MetaGPT: Meta Programming for Multi-Agent Framework, arxiv.org/abs/2308.00352

// 综合实战 · 多 agent 系统的两周建设路径

假设你想把一个内部任务升级到 multi-agent 架构(例:「每周帮我做 AI 行业研究简报」),两周从单 agent 走到稳态 multi-agent:

  1. Day 1 · 单 agent baseline + eval:先写一个最简单的单 agent 版本(Claude Opus + search tool),跑 10 个真实 query,人评每个输出打分。这个分数是后面所有决策的 baseline。没有 baseline 不上 multi-agent
  2. Day 2 · 结构诊断:用 #01 的 6 问 check 你的任务结构。如果有 3 项以上不通过 → 停下;不是 multi-agent 的问题。研究类任务通常都过。
  3. Day 3-4 · Orchestrator-worker 最小版:照 #04 的 asyncio 模板写。Lead 用 Opus,subagent 用 Sonnet/Haiku,硬上限 N ≤ 5。同样 10 个 query 跑一遍,对比 baseline。
  4. Day 5 · Trace 落库:每个 run 全 trace 写 JSON,建一个最简单的 viewer(哪个 agent 哪一步花了多少 token 输出了什么)。这一步看着多余,等第一次 debug multi-agent 失败时你会感谢自己。
  5. Day 6 · 聚合质量:检查 lead 的 aggregation prompt 是不是真的在做 cross-validation 而不是 concat。常见 bug:lead 把所有 subagent 输出一字不漏 dump 给用户,没做去重和矛盾识别。
  6. Day 7 · 决策点:multi-agent 版的 eval 分数有没有比单 agent 高 10pp+?没有 → 任务结构不适合,回单 agent;有 → 继续。
  7. Day 8-9 · Asymmetric cross-check:在关键输出处加一个 verifier(不同模型 + 反方 prompt)。重点:不是所有 query 都跑 cross-check,用一个 router 先判断风险。这一步通常再涨 5-10pp。
  8. Day 10-11 · 三层 budget:token / tool call / wallclock 都加硬上限。multi-agent 失控时单 query 烧 $50 是真事;这一步保命。
  9. Day 12 · 失败模式 audit:故意构造 5 个 edge case(subagent 全失败、超时、tool 不可用、矛盾结论、空结果),验证系统能 graceful degrade。
  10. Day 13-14 · 长尾观察:跑 50 个真实 query,看 token 分布、延迟 p50/p95、失败 rate。这时再决定要不要上 A2A/MCP——绝大多数独立开发者的答案是「不需要,asyncio 已经够了」。

两周走完这条路径:multi-agent 不是「我多开几个 agent 显得高级」,是「我已经 baseline、已经诊断任务结构、已经验证 15× token 换 90% 提升的 ROI、已经备好 trace 和 budget guard,然后才上多 agent」。这是 2026 年 multi-agent 工程的真实姿势——绝大多数业务任务走到 Day 7 决策点就会发现,单 agent + 长 context 才是正确答案。

// ENGLISH GLOSSARY

Multi-agent System (MAS)
多个 LLM agent 协同完成任务的系统;agent 通过工具调用、消息传递或共享状态协调。
Orchestrator-Worker
由 lead agent 规划任务、spawn worker subagents 并行执行、最后聚合的拓扑;Anthropic Research 系统的标准模式。
Subagent
被 orchestrator 派出去做子任务的 agent;通常用更便宜的模型(Sonnet/Haiku)以控制成本。
Implicit Decision Conflict
并发 agent 各自做隐式决策且无协商时产生的冲突;Cognition 反对 multi-agent 的核心论据。
Context Sharing
agent 之间共享完整 trace vs 只共享 summary;Cognition 主张 full context,Anthropic Research 主张 task-scoped。
Multi-agent Debate
多个 agent 独立回答后互相 critique、多轮迭代后输出共识;Du et al. 2023 的范式。
Self-Consistency
同 agent 同 prompt 跑 N 次取多数票;与 debate 易混,但 diversity 来源完全不同。
Asymmetric Cross-check
用不同模型 / 反方 prompt 的 verifier 检查主 agent 输出;比 N-agent debate 工程上更稳。
Backward Rationalization
模型给出答案后倾向为之辩护而非质疑;self-debate 容易退化为 self-confirmation 的成因。
A2A (Agent-to-Agent) Protocol
Google 2025 年 4 月开源的 agent 间通信标准;HTTP + SSE + JSON-RPC 2.0;现属 Linux Foundation。
Agent Card
A2A 协议里描述 agent 能力的 JSON 文档;用于 agent discovery。
MCP (Model Context Protocol)
Anthropic 2024 的 agent ↔ tools 协议;和 A2A 互补不互斥。
Coordination Tax
agent 数量增加带来的通信、决策、debug 复杂度开销;O(N²) 通信 + 延迟叠加 + attribution 困难。
Failure Attribution
multi-agent 失败时确定「哪个 agent 哪一步出错」的能力;trace 完整度决定可行性。
Shared Trace
所有 agent 的事件统一写入的事件流;multi-agent 的 debug 命脉。
Token Multiplier (15×)
Anthropic 数据:multi-agent research 系统约用普通 chat 的 15× token;ROI 门槛。

// 深入思考

Anthropic 和 Cognition 几乎同时(2025 年 6 月)发出立场完全相反的多 agent 文章,这不矛盾——他们各自的「最优解」恰好是对方的「反模式」。这个分裂揭示了 LLM 工程怎样的本质特征?
揭示的是:架构是任务函数,不是模型函数。Anthropic Research 系统的核心任务是「并行检索 + 聚合」,子任务天然独立,多 agent 是合适的并行计算抽象;Cognition Devin 的核心任务是「串行编码 + 调试」,每一步严重依赖前一步的隐式状态,多 agent 必然在 implicit decision conflict 上崩。两边都对,只是在不同任务空间。这指向一个更深的工程哲学:LLM 时代的「best practice」必须绑定任务结构来谈,否则等于没说。「该不该用 multi-agent」「该不该用长 context」「该不该用 RAG」这些争论之所以经常没结论,是因为讨论时遗漏了任务结构这个变量。资深工程师的判断力一大半在「识别任务结构」上——能看出一个任务是并行可分解、串行强依赖、还是混合结构,剩下的架构选择几乎自动。
Anthropic 公开多 agent 系统使用 15× chat token——这个数字对 AI 经济学意味着什么?「每 query > $1 才有 ROI」会把多 agent 永远锁在 enterprise 场景吗?
短期是,中期不是。短期看,单 query $1+ 的成本结构把 multi-agent 排除了消费级(C 端 query 价值通常 < $0.01)和大多数中小 B 端轻量场景。能撑住 15× token 的只有:研究、尽职调查、企业搜索、复杂 SWE-bench、并行 outbound(销售线索研究 / 候选人背调)等单次价值高的场景。但中期看(2-3 年),三个力量会改变方程:(1)推理成本指数下降——Haiku 4.5 已经比 Claude 1 时代便宜 20×+,subagent 用便宜模型的方案越来越划算;(2)prefix caching 普及——多 agent 共享 system prompt + 工具定义可以大幅缓存命中,实际 token 成本不是 15× 而可能是 6-8×;(3)专用小模型崛起——为 multi-agent 角色 fine-tune 的专用小模型(research subagent、verifier、aggregator)可以把单 subagent 成本压到 1/10。这三个加起来,2-3 年内 multi-agent 会下沉到中等价值任务(每 query $0.10),消费级仍难。
Multi-agent debate 在 ground truth 任务上涨 10-15pp 但在开放主观任务上退化为同质化共识——这个不对称是 LLM 特性还是 debate 范式本身的局限?人类 debate 也有这个问题吗?
主要是 LLM 特性放大了 debate 范式的固有问题,但人类也部分有。Debate 的理论假设是「agent 之间真有 diversity」——独立信息源、独立先验、独立推理路径。同模型同 prompt 跑 N 次完全没满足这个假设:它们的先验是同一份训练数据、推理路径是同一个 attention pattern、连失败模式都同质化。所以一旦没有 ground truth 拉锚,N 个 agent 自然 converge 到「训练数据上最常见的中庸答案」——这是 RLHF + 大模型平均化倾向的直接体现。人类 debate 类似问题:群体内同质化(echo chamber)也会产生平庸共识,但人类 debate 通常依赖真实经验差异 + 利益差异提供 diversity,LLM agent 没有这两个机制。这意味着 multi-agent debate 想 work 必须工程上显式注入 diversity:跨厂商模型、强对立角色 prompt、不同知识库 / 工具组合。靠「多开几个 agent」自然产生 diversity 在 LLM 时代是错的直觉。
A2A 协议(Google 2025)已经有 150+ 组织支持,但 Anthropic 和 Cognition 在他们公开的 multi-agent 实现里都没用 A2A,而是用内部消息总线。这是早期阶段的常态,还是揭示了 A2A 本身有结构问题?
更可能是早期阶段常态,但 A2A 确有一些结构选择需要时间证明。Anthropic Research 系统是单产品内部多 agent——所有 subagent 都是 Anthropic 自己的 Claude,跨厂商互操作性收益为零,用 A2A 等于背 HTTP/JSON-RPC 开销没拿到任何好处;Cognition Devin 也是同样情况。A2A 真正的目标场景是跨组织 / 跨厂商 agent 生态——比如你的 agent 调用 Slack 的 agent 委派任务、调用 Salesforce 的 agent 查数据,这种「企业 agent 之间互联」场景目前还没大规模落地。结构上 A2A 有两个 open question:(1)跨 trust boundary 的 prompt injection——外部 agent 通过 task description 注入恶意指令的攻击面比单 MCP 工具大很多;(2)计费 / SLA 模型不清——一个 agent 委派给另一个 agent,token 费谁付、超时怎么算,协议没规定。这两个解决了 A2A 才会真正起飞。MCP 走了类似的路径:2024 年发布后内部团队先用 1 年验证,2025-2026 才大规模生态化——A2A 大概率在 2026-2027 进入类似阶段。
如果 2027 年 single agent 的 context window 普遍到 10M+ tokens、推理能力进一步提升,multi-agent 的工程价值会消失吗?还是会出现新的「只有 multi-agent 能解」的场景?
会改变但不会消失,且新场景会出现。短期看,long context + 强推理能力会蚕食 multi-agent 的中间地带——今天那些「单 agent context 不够 → 才上 multi-agent」的场景(研究简报、长文档处理),明天单 agent 用 10M context + 更强推理就能搞定,multi-agent 在这些场景的 ROI 会下降。但 multi-agent 在真并行 + 真异构场景反而会更有价值:(1)跨模型协作——Claude 用文字推理 + Gemini 处理多模态 + 一个专用 code agent 验证,能力互补不是 context 大小能替代的;(2)跨 trust boundary 协作——你的 agent 和别人的 agent 协作(A2A 场景),永远不可能合并到一个 context;(3)real-time 高并行任务——比如同时监控 100 个数据源做秒级决策,物理上必须并行 agent;(4)specialized agent ecosystems——为特定领域深度 fine-tune 的小专用 agent(医疗诊断 / 法律审计 / 代码安全),单个通用 agent 永远赶不上。所以 2027 年 multi-agent 会从「补救 context 不足的工具」转向「真正的协作 / 互操作架构」——更高门槛、更窄场景、但更不可替代。

// 延伸阅读