subagent vs multi-agent · 架构对照手册
0 / 7 章 ← 首页
01

一句话分清:这不是二选一,是一条控制权谱系

「Subagent 和多 Agent 有什么区别」这个问题本身就问偏了——它们不是竞争方案,而是同一根轴上的三个刻度。轴的两端是:控制权在谁手里,信息怎么流动。

剥掉营销词汇,所有多 agent 架构只回答两个问题:

  • 谁持有最终答案的所有权?——主管始终持有(subagent)、移交给专家(handoff)、还是分散给团队(agent teams)
  • 信息走什么拓扑?——星型(一切经主管中转)、链式(对话整体移交)、网状(成员点对点直连)

OpenAI 在 Agents SDK 文档里把前两种说得很直白:agents-as-tools 模式下「主管保留答复所有权」,handoff 模式下「控制权转移给专家 agent」。而 Claude Code 2026 年推出的实验特性 Agent Teams 则补上了第三格——teammate 是完全独立的实例,互相直接发消息,甚至可以绕过 lead 私下协商。

本手册以三家一手资料为底:Anthropic 工程博客《How we built our multi-agent research system》(2025-06)、《When and how to use multi-agent systems》(2026)、Claude Code 官方文档 Agent Teams 章节、OpenAI 官方 Orchestration 文档。所有数字都来自官方原文。

02

Subagent:主从星型,用完即毁的压缩器

Subagent 是 orchestrator-worker 模式的基本单元:主 Agent 把任务派出去,sub agents 在自己的独立上下文窗口里干活,跑完只有最终结论被传回——中间过程随销毁一起消失。

Orchestrator-worker(编排者-工人)是从分布式系统借来的经典架构:一个 orchestrator 拿着完整任务,负责拆解、派发、汇总;多个 worker 各领一块子任务,干完只交结果。MapReduce 的 master-slave、微服务里的任务队列,骨子里都是这个形状。LLM Agent 把它借了过来,只是「工人」从进程换成了上下文窗口:

  • Orchestrator = 主 Agent:唯一持有全局上下文的角色,对用户始终保有最终答案的所有权
  • Worker = sub agent:领到一段 prompt 和受限工具集,在自己的隔离上下文里自主执行,交付结论后即销毁
✦ 三家官方文档,同一个模式的不同叫法 OpenAI 的 Orchestration 文档称它为 manager pattern(管理者模式),与之相对的 decentralized pattern(去中心化模式)正是第 03 章 handoff 和 Agent Teams 的世界;Anthropic 在多 Agent 研究系统的工程博客里把主管叫 lead agent;Claude Code 的 Agent tool 则是这套模式最直接的落地——图 2-1 里那个标着 Orchestrator 的中心节点,就是它。

Anthropic 对它的价值有个精辟概括:搜索的本质是压缩。sub agents 并行探索海量信息,各自完成蒸馏,只把最重要的 token 送回主管。这就是 context isolation 的全部意义。

图 2-1点击任意节点查看该角色的上下文状态
主 Agent (Orchestrator) 全局上下文 · 最终答案 Subagent A 独立上下文 → 销毁 Subagent B 独立上下文 → 销毁 Subagent C 独立上下文 → 销毁 Subagent D 独立上下文 → 销毁
👆 注意:四个 Subagent 之间没有连线——它们互相不知道对方的存在。这是星型结构可预测、易调试的根本原因。

一次派发的完整生命周期

lifecycle.ts · 以 Claude Code Agent tool 为例
// ① 主 Agent 决定拆解:目标 + 输出格式 + 工具白名单 + 任务边界
const result = await Agent({
  subagent_type: "Explore",          // 预定义角色(受限工具集)
  prompt: "调查 auth 模块的登录流程,输出 ≤500 字结论",
});
// ② sub agents 启动:全新空上下文,只有这段 prompt + 角色的工具集
// ③ sub agents 自主循环调工具 N 轮 —— 中间结果全部留在它自己的上下文里
// ④ sub agents 结束:只有 final message 作为 tool result 返回主 Agent
// ⑤ sub agents 销毁,上下文释放;主 Agent 上下文只增加了一段结论

OpenAI Agents SDK 里的等价物叫 as_tool():把一个专家 agent 包装成主管手里的一个普通工具调用。发起调用、拿到返回值、继续掌控对话——sub agents 从头到尾只是主管的「有界能力」(bounded capability),而不是对话的接管者。

03

多 Agent:网状协作,会互相聊天的持久团队

真正的多 Agent 系统里,每个成员都是独立的长生命周期实例。关键差异不在「有几个 agent」,而在成员之间能不能点对点直接通信。

Claude Code 的 Agent Teams 是最好的官方标本。它由四个组件构成:

组件职责实现
Team lead创建队友、分配初始工作主 Claude Code 会话
Teammates认领任务、独立干活各自独立的 Claude 实例
Task list共享任务列表,自行 claim~/.claude/tasks/{team}/
Mailbox任意两点间发消息~/.claude/teams/{team}/inboxes/*.json

实现上非常「工程师味儿」:发送消息 = 成功写入对方的 JSON inbox 文件。任务依赖自动管理——某队友完成任务后,依赖它的任务自动解锁。没有消息总线,没有中间件,就是文件读写。

图 3-1橙线 = 队友点对点直达 · 灰点线 = 共享文件系统读写
Team Lead 创建队友 · 协调 不再垄断通信 Teammate 前端持久实例 Teammate 后端持久实例 Teammate 测试持久实例 共享 Task List 自行 claim · 依赖自动解锁 Mailbox 收件箱 点对点消息 · JSON 文件
橙色线 = 点对点直达通道。前端 teammate 可以直接@后端:「我改了 API 契约,你跟一下」——不需要经过 lead 转述。底部两块是跑在共享文件系统上的基础设施:共享 Task List 让队友自行 claim 任务,Mailbox(~/.claude/teams/{team}/inboxes/)承载任意两点间的私信——发消息 = 写入对方的 JSON 文件。

官方对照表(Claude Code Docs 原文翻译)

维度SubagentsAgent Teams
上下文独立窗口;结果回传给调用者独立窗口;完全独立
通信只向调用者回传结果队友之间直接互发消息
协调主 Agent 管理全部工作自行协调 + 共享任务列表
最适合只要结果的聚焦型任务需要讨论、质疑、协作的工作
Token 成本较低(摘要回传)显著更高(每人都是完整实例)

官方立场一句话:要快速专注的打工仔,用 subagent;要能互相讨论、互相挑战的真团队,用 agent teams。

框架落地:LangGraph 的 Supervisor 与 Swarm

除了 Claude 的 Agent Teams,LangChain 生态把同一条谱系做成了两个官方库:langgraph-supervisor(星型:主管全控,worker 输出一律流回主管)和 langgraph-swarm(网状:没有中心,agent 之间用 Command(goto=...) 直接转交控制权)。对应关系一目了然——supervisor 是第 01 章谱系左端的 LangGraph 版,swarm 是去中心化的落地。

机制:create_supervisor 把每个 worker 注册成一个 handoff 工具(默认名 transfer_to_<agent>)挂到主管自己的工具列表里;worker 跑完把输出交回主管,由主管决定下一步或汇总答复。output_mode 控制回传多少上下文——默认 last_message(只回传最后一条,即 subagent 式压缩),full_history 回传全部。主管还可以套主管,组成多级层级。
supervisor.py · 星型:所有路都经过中心
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langgraph_supervisor import create_supervisor

model = ChatOpenAI(model="gpt-4o")

# ① 先造各领域专家:普通 agent,各带各的工具
research_agent = create_agent(
    model, tools=[web_search],
    name="research_expert",
    prompt="You are a researcher. Do not do any math.",
)
math_agent = create_agent(
    model, tools=[add, multiply],
    name="math_expert",
    prompt="You are a math expert.",
)

# ② supervisor 把每个 worker 注册成一个 handoff 工具,挂到主管自己手里
workflow = create_supervisor(
    [research_agent, math_agent],
    model=model,
    prompt="You are a team supervisor routing work to the right expert.",
    output_mode="last_message",   # worker 只回传最后一条消息(默认值)
    parallel_tool_calls=False,    # True = 主管可一轮并行派多个 worker
)
app = workflow.compile()

# ③ 控制权永远在 supervisor:worker 结果全部流回中心,由它答复用户
app.invoke({"messages": [
    {"role": "user", "content": "FAANG 2024 的总人数是多少?"},
]})
机制:没有主管节点。每个 agent 手里握着通往同伴的 transfer_to_<agent> 工具,调用时返回 Command(goto=目标) 在图上直接跳转;active_agent 状态记住「现在谁活跃」,下一轮请求从 TA 继续——必须配 checkpointer,否则每次都失忆。
swarm.py · 网状:点对点转交,无中心
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents import create_agent
from langgraph_swarm import create_handoff_tool, create_swarm

# ① 转交工具的目标是彼此——没有中心节点
research = create_agent(
    model,
    tools=[web_search,
           create_handoff_tool(agent_name="math_expert")],
    name="research_expert",
)
math = create_agent(
    model,
    tools=[add,
           create_handoff_tool(agent_name="research_expert")],
    name="math_expert",
)

# ② active_agent 状态记住「现在谁活跃」,下一轮从 TA 继续
workflow = create_swarm(
    [research, math],
    default_active_agent="research_expert",
)
app = workflow.compile(checkpointer=InMemorySaver())  # 不带 checkpointer 会失忆

# ③ 第二轮请求直接命中上次的活跃 agent——省掉一次路由调用
app.invoke(
    {"messages": [{"role": "user", "content": "what's 5 + 7?"}]},
    {"configurable": {"thread_id": "1"}},
)
handoff.py · swarm 的全部魔法(简化自源码)
# langgraph_swarm/handoff.py —— 整个 swarm 的核心就是这一个返回值
@tool(f"transfer_to_{agent_name}")
def handoff_to_agent(state, tool_call_id):
    return Command(
        goto=agent_name,          # 图上直接跳到目标 agent 节点
        graph=Command.PARENT,     # 作用于父图(swarm 图),而非当前 agent 内部
        update={
            "messages": [state["messages"],
                         ToolMessage(f"Successfully transferred to {agent_name}")],
            "active_agent": agent_name,  # 记下「现在谁活跃」
        },
    )
# 下一轮请求进来时,add_active_agent_router 读 active_agent 直接路由——
# 这就是 swarm 重复请求比星型少跳的原因。
演示 3-2 · 同一请求,两种拓扑的消息路径场景:『查 FAANG 2024 总人数并算总数』——跨研究和计算两个领域
用户发起请求
⇄
Supervisor中央调度
⇄
Research搜索专家
⇄
Math计算专家
控制权跳转—
LLM 调用 · 示意—
谁答复用户—
▸ 用上方标签切换拓扑(swarm 下 Supervisor 节点会整个消失),再点右上角运行。

官方性能对比(LangChain docs 实测口径):一次性任务里 subagents 比 handoffs 多一次调用(结果要流回主 agent 再汇总);重复请求时 swarm 反超(active_agent 省掉路由);多领域并行时星型反超(subagent 可并行、上下文隔离,handoff 链只能串行)。

场景Subagents(星型 / supervisor)Handoffs(链式 / swarm)
一次性任务(「买杯咖啡」)4 次模型调用3 次 ✓
重复请求(第二轮同请求)4 次(两轮共 8)2 次(共 5)✓
多领域并行(对比 3 个领域)5 次 · ~9K tokens ✓7+ 次 · ~14K+ tokens
⚠ 三个别读漏的细节 ① 官方基准里 swarm 全线略优于 supervisor、token 更省,主因是 supervisor 的「传话游戏」——worker 不能直接答复用户,主管转述会引入误差(改进后的 langgraph-supervisor 加了 forward_message 原样转发等手段,基准性能提升近 50%);② 但多领域并行反转:需要 fan-out 的任务请回到星型;③ LangChain 现在建议新项目直接用工具实现 supervisor 模式(官方 multi-agent 指南),langgraph-supervisor 库主要服务向 LangChain 1.0 迁移的存量代码。
04

Handoff:常被认错亲戚的第三种模式

聊多 Agent 绕不开 OpenAI 的 handoff(交接)。它经常被误归进上面两类,但其实都不算:控制权交出去了(不是主从),但同一时刻只有一个活跃 agent(也不是团队)。

典型形态是客服分流:triage agent 判断意图后把整个对话移交给 billing 或 refund 专家,此后由专家直接面对用户,triage 不再参与。

模拟 4-1点一条客户消息,看 triage 如何路由控制权
Triage Agent待命 · 持有对话
→
Specialist等待交接…
选择上方一条消息开始演示。注意:交接后 triage 就退场了——这正是 handoff 与 subagent 的本质区别。

Handoff 的限制也很明显:社区实践中 handoff 无法并行发生,一次只能交接一个专家,不适合需要并行跑工具的场景。OpenAI 文档给出的选型口诀:

  • 专家应该接管对话分支 → handoff(控制权转移)
  • 主管要合成最终答案、专家只做有界任务 → agents-as-tools(即 subagent)
  • 成员需要互相讨论协商 → agent teams
05

数据说话:为什么值,代价是什么

Anthropic 公开了他们生产级多 agent 研究系统(Claude Research 功能背后)的核心指标——这是目前最有分量的一手证据。

+90.2%
Opus 4 lead + Sonnet 4 subagents 的多 agent 系统,在内部研究评测上领先单 agent Opus 4 的幅度
80%
token 用量单独解释 BrowseComp 评测中性能方差的比例(三因素合计解释 95%)
15×
多 agent 系统相对普通聊天对话的 token 消耗倍数(普通 agent 约 4×)
−90%
并行拉起 3–5 个 subagent + 并行调工具后,复杂查询的研究时间最大缩短幅度

结论很冷静:多 agent 不是银弹,是用 token 换覆盖面的架构。Anthropic 明确指出,编码任务比研究任务更少真正可并行的部分,LLM 实时协调委托又还不强,所以多 agent 目前最适合的是:高价值、重并行、信息量超单上下文窗口、需对接大量复杂工具的任务。

什么时候该拆,什么时候千万别拆

Anthropic 后续文章给出多 agent 一致优于 单 agent 的仅有的三种情况:

  1. Context protection——子任务产生大量中间信息(>1000 token)但对主任务大部分无用。让 subagent 吃掉脏活,只回传几十 token 摘要。
  2. Parallelization——广度优先的多方向探索。例:「列出标普 500 IT 板块所有公司董事会成员」,串行搜不完,必须分头并行。
  3. Specialization——工具超过 15–20 个模型就选不准;不同任务需要互相冲突的系统提示词(共情客服 vs 严苛审查);领域知识太深装不进通用 agent。
反面教训(Anthropic 原话):「我们见过团队花几个月搭建精巧的多 agent 架构,最后发现单 agent 把 prompt 写好就能达到同样效果。」按「问题类型」拆分 agent(一个写功能、一个写测试、一个做审查)会导致每次交接丢失上下文,变成传话游戏——实测中 agent 们协调花的 token 比干活还多。正确的拆分原则是按上下文边界:写功能的人顺带写测试,因为它已有上下文。

LangChain 的 Harrison Chase 给过一个好记的判断维度:Read 操作天然可并行适合多 agent;Write 操作耦合度高适合单 agent 收口。Anthropic 的研究系统就是典型——一堆 subagent 并行搜索阅读,报告由 lead 统一写。

06

选型指南:先看任务形状,再挑架构

不要先问「哪个框架最强」,先问控制权、信息流和上下文应该长什么样。先从下方最接近的场景反查,再用四道题确认边界。

六个高频场景,直接反查

把你的任务代入决策器

顺序有意设计成「用户控制权 → 并行与上下文 → 团队通信 → 可确定性」。只要前面的信号足够强,就不必为后面的能力付额外 token 账单。

问题 1 / 4
07

终极测验:五题出师

全部出自上文与官方文档原文。答完看你是「架构明白人」还是「该回去复习」。

FINAL QUIZ · SUBAGENT VS MULTI-AGENT0 / 5
QUESTION 1 / 5
参考资料 · 全部一手来源
  • Anthropic Engineering — How we built our multi-agent research system(2025-06)anthropic.com/engineering/multi-agent-research-system
  • Anthropic — Building multi-agent systems: When and how to use them(2026)claude.com/blog
  • Claude Code Docs — Orchestrate teams of Claude Code sessions code.claude.com/docs/en/agent-teams
  • OpenAI API Docs — Orchestration and handoffs developers.openai.com/api/docs/guides/agents/orchestration
  • OpenAI Agents SDK — Multi-agent orchestration openai.github.io/openai-agents-python/multi_agent
  • LangChain Docs — Multi-agent patterns(subagents / handoffs 性能对比) docs.langchain.com/oss/python/langchain/multi-agent
  • LangChain Blog — Benchmarking multi-agent architectures blog.langchain.com/benchmarking-multi-agent-architectures
  • GitHub — langchain-ai/langgraph-supervisor-py · langchain-ai/langgraph-swarm-py