外观
子代理与多智能体编排
子代理(subagent)回答的问题是:当一个任务超出了单个上下文窗口的承载能力,或者包含多个可以同时推进的独立方向时,harness 如何把工作分出去,又不让自己被分出去的工作淹死?
先给出本文的核心命题:子代理的本质是上下文隔离与并行化,是上下文工程的一种空间换时间的手段——而不是"多个 AI 开会"。市面上大量多智能体框架把卖点包装成"模拟一个团队":产品经理 agent、程序员 agent、测试 agent 围坐讨论。这是用人类组织的隐喻遮蔽了真正的工程变量。真正决定多智能体系统成败的只有三件事:每个 agent 的上下文里有什么、它们之间交换什么、以及谁来为冲突的结论负责。
为什么需要子代理:三个真实动机
剥掉"AI 团队"的叙事,子代理存在的理由可以归约为三条,全部指向同一个稀缺资源——主上下文窗口。
动机一:保护主上下文
这是最朴素也最普遍的理由。一个调研型任务——"搞清楚这个仓库的鉴权模块怎么工作"——可能需要读几十个文件、跑十几条搜索,产生数万 token 的原始材料。如果全部塞进主对话,主 agent 还没到真正干活的阶段,上下文就已经被中间产物占满了,随后触发压缩、丢失早期细节(上下文管理的困境详见上下文工程)。
子代理把这堆中间产物隔离在自己的上下文窗口里:它读完所有文件,只把几百字的结论返回给主 agent。主上下文看到的不是勘探过程,而是勘探报告。这和记忆系统里的压缩是同一个思想——用摘要换空间——只不过压缩发生在代理边界上,而不是会话内部。
动机二:任务分治与关注点分离
一个子代理可以被赋予自己的系统提示、自己的工具子集、甚至自己的(更便宜或更专精的)模型。这让"代码审查"、"测试编写"、"日志分析"这类角色固定、边界清晰的任务可以被封装成可复用的专家单元。注意:这里的价值不在"角色扮演",而在每个单元携带不同的上下文配置和权限面——审查 agent 可以只给只读工具,这同时是一个权限决策。
动机三:并行探索
单线程 agent 的探索是串行的:查完 A 方向才能查 B 方向。对于宽度优先的任务("找出 S&P 500 所有科技公司的董事会成员"),串行意味着总耗时等于各方向耗时之和,而且早期方向的选择会路径依赖地污染后续判断。多个子代理并行铺开,每个带着独立上下文独立探索,总耗时约等于最慢的那个方向。Anthropic 的实测(下文详述)表明,这类任务上多智能体架构的收益是压倒性的。
text
┌─────────────────────────── 主 Agent 上下文 ───────────────────────────┐
│ 用户任务 │
│ 子任务 A 的描述 ──────────────┐ │
│ 子任务 B 的描述 ──────────┐ │ ← 只进:任务描述(几百 token) │
│ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ │
│ │ 子代理 A │ │ 子代理 B │ ← 各自独立的上下文 │
│ │ 独立窗口 │ │ 独立窗口 │ 窗口,可并行执行 │
│ │ 读 20 个 │ │ 跑 15 条 │ │
│ │ 文件…… │ │ 搜索…… │ │
│ └─────┬──────┘ └─────┬──────┘ │
│ 结论摘要 A ◄─────────────┘ │ │
│ 结论摘要 B ◄────────────────────────────┘ ← 只回:摘要(几百 token) │
│ │
│ 数万 token 的中间产物留在子代理上下文里,随其结束而丢弃 │
└────────────────────────────────────────────────────────────────────────┘看清这张图,就能理解子代理的全部经济学:主上下文是稀缺资产,子代理是消耗品。委托出去的是意图,收回来的是结论,过程就地焚毁。
Claude Code 的子代理机制:委托-返回摘要
Claude Code 的子代理是这一思想最干净的工程实现,值得逐层拆解(机制依据其官方文档,产品层面的完整剖析见 Claude Code 案例)。
独立上下文窗口
每个子代理在一个与主对话完全隔离的上下文窗口中运行。它不继承主对话的历史——没有用户的闲聊、没有之前的工具输出、没有 todo list。它看到的只有:自己的系统提示 + 主 agent 写给它的任务描述。这是隔离的彻底之处,也是隔离的代价所在(后面 Cognition 的批评正中这一点)。
配置即 Markdown
子代理不是代码,而是带 YAML frontmatter 的 Markdown 文件,放在项目的 .claude/agents/ 目录下:
yaml
---
name: code-reviewer
description: 资深代码审查专家。在完成一段代码修改后主动使用。
tools: Read, Grep, Glob, Bash
---
你是一位资深代码审查者。收到代码变更后:
1. 检查正确性、安全漏洞与项目规范符合度;
2. 按严重程度组织反馈;
3. 不修改代码,只输出审查意见。三个设计细节值得注意:
description是路由依据。 主 agent 是否把任务委托给某个子代理,靠的就是匹配任务与这个字段。description 写得含糊,委托就会错乱——这和工具系统里"工具描述决定工具使用率"是同一条规律。tools字段是权限边界。 子代理可以被限制为只读工具集,harness 层面就堵死了它改文件的可能。隔离的上下文 + 收窄的工具面,让子代理成为天然的权限沙箱。- 正文是完整系统提示。 子代理的行为完全由这段提示塑造,它不知道、也不需要知道主对话里发生过什么。
委托-返回摘要的协议
主 agent 通过一个 Task 工具发起委托:传入子代理类型和一段自足的任务描述("自足"是关键——子代理看不到主对话,任务描述里没写的信息对它不存在)。子代理跑完自己的完整 agent loop 后,只有最终一条消息回到主上下文,中间几十轮工具调用全部留在子代理的窗口里。
这个协议的含义是双面的:
- 收益:主上下文为一次可能消耗数万 token 的勘探,只支付了"任务描述 + 结论摘要"的成本。
- 代价:主 agent 对子代理的执行过程完全不可见。摘要错了、漏了、过度乐观了,主 agent 没有原材料去复核——它必须信任一份二手报告。这是所有委托式架构的共同软肋。
Anthropic 的多智能体研究系统:orchestrator-worker 的正面证据
Claude Code 的子代理解决的是"上下文保护",Anthropic 2025 年 6 月发表的工程博客《How we built our multi-agent research system》则展示了子代理在"并行探索"上的规模化形态——Claude 的 Research 功能背后的架构。
架构:lead agent + 并行 subagents
这是一个教科书式的 orchestrator-worker 结构(谱系上对应 Anthropic 在《Building effective agents》中定义的 orchestrator-workers 模式):
text
用户查询:"找出 X 领域的所有重要公司"
│
▼
┌───────────────────┐
│ LeadResearcher │ ← 制定研究策略,把计划写入
│ (orchestrator) │ Memory 防止上下文截断丢失
└─────────┬─────────┘
┌───────────────┼───────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Subagent 1 │ │ Subagent 2 │ │ Subagent 3 │ ← 并行执行,各自
│ 方向 A 搜索 │ │ 方向 B 搜索 │ │ 方向 C 搜索 │ 独立上下文窗口
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└───────────────┼───────────────┘
▼
LeadResearcher 汇总发现,
决定是否需要追加研究(可再开子代理)
│
▼
CitationAgent 核对引用来源 → 最终报告文章解释了这个架构为什么适合研究任务:搜索的本质是压缩——从海量语料中蒸馏出洞见。子代理各自在大语料的不同切片上并行压缩,把最重要的 token 浓缩后返回给 lead agent。独立上下文还带来关注点分离(不同的工具、提示、探索轨迹),降低了路径依赖。
实测数据:提升巨大,烧钱也巨大
这篇文章的可贵之处在于给出了罕见的量化数据:
- 性能:以 Claude Opus 4 为 lead agent、Claude Sonnet 4 为 subagents 的多智能体系统,在内部研究评测上比单 agent 的 Opus 4 高出 90.2%。宽度优先型查询(需要同时追踪多个独立方向)收益最大——例如"找出 S&P 500 信息技术板块所有公司的董事会成员",单 agent 串行搜索慢且漏,多智能体分解后找到了正确答案。
- 性能来源:在 BrowseComp 评测(考察浏览型 agent 定位难找信息的能力)的分析中,三个因素解释了 95% 的表现方差,其中 token 用量单独解释 80%。多智能体架构的本质作用由此揭晓:它是一台 token 扩展机器——把推理预算分摊到多个并行上下文里,突破单 agent 的窗口与串行限制。
- 成本:普通 agent 的 token 用量约为聊天交互的 4 倍,多智能体系统约为 15 倍。结论很直白:只有任务价值高到值得为性能付出这个溢价时,多智能体才在经济上成立。
踩过的坑:协调复杂度的爆发
文章同样诚实记录了从原型到生产的教训,每一条都对 harness 设计者有直接价值:
- 委托必须具体。 早期 lead agent 只会下"研究半导体短缺"这种模糊指令,结果一个子代理去研究 2021 年汽车芯片危机,另外两个重复调查 2025 年供应链——既重叠又留缺口。修法是要求每个子任务带目标、输出格式、工具指引和明确的边界。
- 努力程度要定标。 早期 agent 会为一个简单查询开出 50 个子代理。修法是在提示里写入显式的努力标定规则:简单事实查询 1 个 agent、3–10 次工具调用;直接对比 2–4 个子代理;复杂研究才上 10 个以上。
- 并行是免费的性能。 引入两级并行(lead 同时开 3–5 个子代理 + 每个子代理同时调 3 个以上工具)后,复杂查询的研究时间最多缩短 90%。
- 同步执行是瓶颈。 当时的实现里 lead agent 同步等待每批子代理完成,期间无法纠偏、子代理之间无法协调,整个系统会被最慢的一个阻塞。异步执行是明确的方向,但会引入结果协调、状态一致性和错误传播的新难题。
- 生产工程的老问题被放大。 长时运行的有状态 agent 需要断点恢复而不是从头重启;非确定性行为必须靠全链路 tracing 才能调试(呼应可观测性);部署更新不能打断正在运行的 agent,要用彩虹部署(rainbow deployment)逐步切流。
反方观点:Cognition《Don't Build Multi-Agents》
就在 Anthropic 文章发表的同一周(2025 年 6 月),Devin 的开发商 Cognition 发表了立场鲜明的反方文章《Don't Build Multi-Agents》(作者 Walden Yan)。考虑到 Cognition 做的是编程 agent——恰好多智能体最难啃的领域——这篇文章值得认真对待。
两条原则
文章从"长时运行 agent 的可靠性理论"出发,提出 context engineering 的两条原则,并主张默认排除一切违反这两条原则的架构:
原则一:共享上下文,而且要共享完整的 agent 轨迹(trace),不只是消息。 经典反例:"造一个 Flappy Bird 克隆"被拆成两个子任务——子代理 1 造"会动的游戏背景",子代理 2 造"可以上下移动的鸟"。子代理 1 把背景做成了超级马里奥风格,子代理 2 的鸟根本不像游戏素材。最后负责合并的 agent 面对两份各自误解的产物无从下手。你以为把原始任务抄给子代理就能解决,但真实系统里,任务含义是在多轮对话和工具调用中逐步明确的——子代理拿到的静态任务描述,承载不了主对话里沉淀的全部语义。
原则二:行动承载隐式决策,冲突的决策导致坏结果。 即使两个子代理都正确理解了任务,它们各自动手时会做出大量没被规定的隐式选择——这次可能是鸟和背景的视觉风格完全不搭。两个局部正确的 agent,产出一个全局错误的系统。
结论:单线程优先
Cognition 给出的默认架构是单线程线性 agent:上下文连续,任何决策都能被后续步骤看到。上下文溢出是真实约束,但解法应该是压缩与记忆技术(在长任务中维护连续的上下文),而不是把工作切碎分发给互不可见的执行者。
两条原则与子代理机制并不天然冲突
仔细看会发现,Cognition 批评的靶子是"并行分头干活、事后合并产物"的架构,而不是一切形式的委托。一个只读探索、返回摘要的子代理(比如 Claude Code 里"去看看这个模块怎么工作")不产出需要合并的工件,隐式决策冲突无从谈起。真正危险的是多个子代理并行写入同一系统——代码、设计、配置。判断一个多智能体设计是否踩雷,就检查一件事:子代理的产物需不需要彼此一致?
适用边界:这场争论其实不矛盾
把两篇文章放在一起读,会发现它们各自悄悄限定了论域,而且论域几乎不重叠:
| 维度 | Anthropic(多智能体研究系统) | Cognition(Don't Build Multi-Agents) |
|---|---|---|
| 任务类型 | 开放式研究、宽度优先信息搜集 | 编程、构建一个连贯的工件 |
| 子代理产物 | 各自独立的信息摘要,汇总即完成 | 需要拼装成同一系统的部件 |
| 并行性 | 天然高:方向之间几乎无依赖 | 天然低:部件之间接口耦合 |
| 上下文共享需求 | 低:各方向不需要知道彼此发现了什么 | 高:每个决策影响其他部分的解释 |
| 结论 | 多智能体性能提升 90.2%,值得 15 倍 token | 违反两条原则,默认别做 |
Anthropic 自己也承认这个边界,原文写得很清楚:"需要所有 agent 共享相同上下文、或 agent 之间存在大量依赖关系的领域,目前不适合多智能体系统。比如大多数编程任务中真正可并行的部分比研究少得多,而且 LLM agent 还不擅长实时地与其他 agent 协调和委托。"
所以正确的读法不是"Anthropic 说多智能体好,Cognition 说多智能体坏",而是一条统一的原则:
子代理的收益 = 并行探索的收益 + 上下文隔离的收益 − 协调与上下文断裂的成本。
研究类任务前两项大、第三项小;编程类任务恰好反过来。这也解释了为什么 Anthropic 在 Research 产品里重度使用多智能体,而 Claude Code 的子代理被刻意设计成"隔离探索 + 摘要返回"的保守形态——同一个公司,在不同的任务结构上做了不同的选择。
决策框架:单线程强 agent 还是多智能体
如果你在设计 harness,面对一个具体任务时按下面的顺序问四个问题:
1. 任务能否分解为低耦合的子任务? 子任务的产物是否需要彼此一致?需要(同一份代码、同一个设计)→ 偏向单线程;不需要(各自独立的事实搜集、独立的代码库区域)→ 可以继续问。
2. 子任务之间需要多少上下文共享? 完成子任务 B 是否需要知道子任务 A 的执行细节(而不只是结论)?需要 → 单线程,上下文断裂的代价会吃掉并行收益。
3. 单上下文窗口装得下吗? 装得下且任务不宽 → 单线程,别引入不必要的复杂度(这条与 Anthropic《Building effective agents》"先找能用的最简单方案"的原则一致)。装不下 → 优先考虑压缩与记忆,仍装不下再考虑委托。
4. 任务价值付得起 token 溢价吗? 多智能体 ~15 倍于聊天的 token 成本是 Anthropic 的实测数字,不是理论估计。日常任务用多智能体编排,大概率是在为组织结构图付电费。
text
┌─────────────────────────┐
│ 接到一个复杂任务 │
└───────────┬─────────────┘
▼
子任务产物需要互相一致?
(写同一套代码?)
│ │
是│ │否
▼ ▼
┌───────────┐ 单窗口装得下?
│ 单线程 │ │ │
│ 强 agent │ 是│ │否
│ + todo/ │ ▼ ▼
│ 记忆/压缩 │ 单线程 子任务只读探索、
└───────────┘ 返回摘要?
│ │
是│ │否(需写同一系统)
▼ ▼
委托式子代理 高风险区:
(Claude Code Cognition 警告的
式,低并行) 并行写入架构
│
宽度优先 + 高价值?
▼
orchestrator-worker
(Research 式,大规模并行)一条经验法则
只读委托安全,并行写入危险。 子代理去"看"、"查"、"试"、"评",然后带着摘要回来——这类用途几乎总是净收益。子代理各自"写"同一份产物的一部分——这类用途必须先回答 Cognition 的两条原则,答不上来就退回单线程。这与规划里的经验法则同源:分解深度超过 todo list 承载能力时,才轮到子代理出场。
与 harness 其他组件的接缝
子代理不是独立组件,它和 harness 的其他部分有几处关键接缝,设计时需要一起考虑:
- 与 Agent Loop:每个子代理内部跑的是一个完整但通常更受限的 loop(更少的工具、更明确的停止条件)。编排层的 loop 则多了一种新动作:委托与等待。
- 与上下文工程:子代理是上下文管理的"总量换质量"手段——烧更多总 token,保住主上下文的注意力预算。任务描述怎么写,决定了隔离是保护还是断裂。
- 与权限:收窄子代理的工具面是成本最低的权限控制。一个只有只读工具的探索子代理,搞砸事情的上限天然低于主 agent。
- 与记忆系统:Anthropic 的 Research 系统里,lead agent 把研究计划写入 Memory 防止上下文截断丢失——长任务中,跨子代理轮次的连续性仍然要靠外化记忆,子代理解决不了这个问题。
- 与可观测性:多智能体系统的调试难度随 agent 数量爆炸,"用户报告 agent 没找到明显信息,但我们看不到为什么"是 Anthropic 的亲身经历。没有全链路 tracing,多智能体系统不可维护。
延伸阅读
- 上下文工程——子代理的隔离与摘要本质上是上下文管理的另一种形态
- 规划与任务分解——todo list 与子代理的分工边界:分解深度超过两层时该选谁
- Agent Loop——子代理内部运行的循环结构
- 工具系统——description 路由与工具描述遵循同一条"描述决定行为"的规律
- 权限与人机协作——子代理的工具面收窄作为权限沙箱
- 记忆系统——跨子代理轮次的状态连续性靠什么维持
- 可观测性——多智能体系统为什么离不开全链路 tracing
- Claude Code 案例——委托-返回摘要机制的完整产品设计剖析
- Devin 案例——反方观点提出者的产品实践对照
参考资料
- Anthropic 工程博客:How we built our multi-agent research system(2025-06)——orchestrator-worker 架构、90.2% 提升、15 倍 token 成本与全部生产教训的原始出处
- Cognition 博客:Don't Build Multi-Agents(Walden Yan,2025-06)——context engineering 两条原则与 Flappy Bird 反例的原始出处
- Claude Code 官方文档:Subagents——独立上下文窗口、
.claude/agents配置格式与委托机制 - Anthropic:Building effective agents(2024-12)——orchestrator-workers 模式的定义与"先找最简单方案"原则