Claude Code 三种 Agent 模式深度对比:普通 Subagent / Worktree Agent / Agent Team

Claude Code 三种 Agent 模式深度对比:普通 Subagent / Worktree Agent / Agent Team
用 Claude Code 写代码,你迟早会遇到一个问题:一个 agent 不够用了。
代码分析要跑,测试要跑,前后端要同时改 —— 你需要并行。Claude Code 提供了三种 Agent 并行模式,但文档里散落各处,很难一次看明白。
这篇文章把三种模式放在一起讲清楚:它们到底区别在哪,什么时候该用哪个。
先建立一个心智模型
想象你在一间办公室(主会话)里工作。你需要帮手。
- 普通 Subagent = 你叫了个同事过来,坐在你旁边,用你的电脑、你的文件。你们共享同一张桌子。
- Worktree Subagent = 你给同事配了一台独立电脑,复制了一份项目代码。他改他的,你改你的,互不干扰。
- Agent Team = 你组了一个项目组,每个人有自己的办公室,通过内部邮件系统沟通。
这三种模式的核心区别就是 文件隔离程度 和 通信方式。
模式一:普通 Subagent(默认)
工作方式
主会话通过 Agent 工具启动一个子任务。子 agent 与主会话 共享同一个工作目录,可以直接读写主仓库的所有文件。
主会话 (cwd: /my-project)
└── Subagent A (cwd: /my-project) ← 共享同一目录
└── Subagent B (cwd: /my-project) ← 共享同一目录
特点
- 无文件隔离:所有 agent 操作同一份文件
- 无 Git 隔离:改动直接落在当前分支的工作区
- 独立 context window:subagent 不继承主会话的对话历史,有自己的上下文空间
- 结果回传:subagent 完成后,结果摘要注入主会话的 context
风险
多个 subagent 并发修改同一文件时,后者会覆盖前者。这不是 merge conflict —— 是直接覆盖,没有任何警告。
适用场景
- 只读任务:代码分析、文件搜索、文档查询
- 串行的写任务:先让 agent A 改完,再让 agent B 接着改
- 修改不同文件的并行任务(前提是你能确保文件不重叠)
模式二:Worktree Subagent(isolation: "worktree")
工作方式
启动时,Claude Code 自动调用 git worktree add,在 .claude/worktrees/<name>/ 下创建一个 独立的仓库副本,并切换到一个新分支。
主会话 (cwd: /my-project, branch: main)
└── Worktree Agent A (cwd: /my-project/.claude/worktrees/frontend/, branch: worktree-frontend)
└── Worktree Agent B (cwd: /my-project/.claude/worktrees/backend/, branch: worktree-backend)
特点
- 完全的文件隔离:每个 agent 有自己的文件副本,互不影响
- 独立的 Git 分支:改动提交在各自的分支上,不影响主分支
- 自动清理:如果 agent 没产生任何改动,worktree 自动删除;有改动则保留,返回路径和分支名供后续合并
- 并发安全:多个 worktree agent 可以同时修改同一个文件的不同版本,不会冲突
使用方式
在 Agent 工具调用时加上 isolation: "worktree" 参数:
{
"description": "重构前端组件",
"prompt": "重构 UserProfile 组件...",
"subagent_type": "general-purpose",
"isolation": "worktree"
}
适用场景
- 并行修改多个模块:前端、后端、测试各用一个 worktree agent 同时推进
- 探索性实现:尝试两种不同方案,最后合并最好的那个
- 安全的大重构:在隔离环境里大改,确认没问题再合并回来
模式三:Agent Team(实验性)
工作方式
每个 teammate 是一个 完全独立的 Claude Code 实例(独立进程),通过 mailbox 消息系统和共享 task list 进行协调。
Team Lead(主会话)
├── Teammate: Security Reviewer ← 独立 Claude Code 实例
├── Teammate: Performance Analyst ← 独立 Claude Code 实例
└── Teammate: Test Writer ← 独立 Claude Code 实例
↕ mailbox 互相通信
↕ 共享 task list
特点
- 完全独立的 context:teammate 的对话历史不回传主会话,对主会话 context 零占用
- 横向通信:teammate 之间可以 直接互发消息,不需要通过主 agent 中转
- 自主协调:通过共享 task list 认领任务,不完全依赖主 agent 分配
- 无自动文件隔离:默认共享工作目录,需手动约定各 teammate 负责不同文件
启用方式
需要在 settings.json 中手动开启实验性功能:
{
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
}
}
适用场景
- 多角色并行 review:安全、性能、测试覆盖率各一个 teammate 同时审查 PR
- 竞争性假设验证:多个 teammate 各持不同 debug 假设,互相挑战
- 长时间运行的复杂任务:需要多个 AI 持续协作,而不是一次性返回结果
全维度对比
隔离与安全
| 维度 | 普通 Subagent | Worktree Subagent | Agent Team |
|---|---|---|---|
| 文件隔离 | ❌ 共享 | ✅ 独立 worktree | ❌ 共享 |
| Git 隔离 | ❌ | ✅ 独立 branch | ❌ |
| 并发写安全 | ⚠️ 冲突风险 | ✅ 安全 | ⚠️ 冲突风险 |
上下文(Context Window)
这是很多人忽略的关键差异:
| 维度 | 普通 Subagent | Worktree Subagent | Agent Team |
|---|---|---|---|
| 继承主会话上下文 | ❌ | ❌ | ❌ |
| 结果回传主会话 context | ✅ 摘要注入 | ✅ 摘要注入 | ❌ 完全独立 |
| 对主会话 context 的占用 | ⚠️ 返回结果占用 | ⚠️ 返回结果占用 | ✅ 零占用 |
为什么这很重要?
主会话的 context window 是有限资源。当你让 subagent 去扫描 20 个文件、跑 10 次搜索时,所有这些中间过程都在 subagent 自己的 context 里消化,只有最终的精简摘要才回到主会话。这是 subagent 的一个 隐藏价值 —— 它像一个过滤器,保护主会话的 context 不被中间噪音污染。
而 Agent Team 更进一步:teammate 的结果 完全不回传,只通过 mailbox 按需通信,对主会话 context 零压力。
通信与协调
| 维度 | 普通 Subagent | Worktree Subagent | Agent Team |
|---|---|---|---|
| 通信方向 | 单向:子→主 | 单向:子→主 | 双向:teammate ↔ teammate |
| 协调方式 | 主 agent 控制 | 主 agent 控制 | 共享 task list 自协调 |
| 可恢复(resume) | ✅ | ✅ | ✅ |
执行速度
三种模式的 LLM 推理速度完全相同。 它们调用的是同一个模型。
真正影响总体执行时间的不是模式本身,而是:
- 模型选择:这是最大的速度杠杆。
model: "haiku"推理速度比opus快 5-10 倍,适合简单搜索/分析任务。 - 并行度:在一条消息里同时发多个 Agent tool call,它们真正并发执行。
max_turns控制:限制 agent 的最大轮数,防止无意义的反复尝试。run_in_background: true:让 agent 在后台运行,主会话继续处理其他事情。- 冲突导致的返工:Worktree agent 在并发写场景下 总体可能更快,不是因为单次推理快,而是因为避免了文件冲突导致的重做。
| 因素 | 普通 Subagent | Worktree Subagent | Agent Team |
|---|---|---|---|
| 单次推理速度 | 相同 | 相同 | 相同 |
| 启动开销 | 低 | 中(创建 worktree) | 高(启动独立实例) |
| 并行时互相阻塞 | ⚠️ 可能 | ✅ 不会 | ✅ 不会 |
| 可指定更快模型 | ✅ model: "haiku" |
✅ model: "haiku" |
❌ 用会话配置 |
| Token 成本 | 低 | 低 | 显著更高 |
选择决策树
你需要并行执行多个任务吗?
├── 不需要 → 普通 Subagent
└── 需要
├── 任务之间会修改同一个文件吗?
│ ├── 不会 → 普通 Subagent(并行启动多个)
│ └── 会 → Worktree Subagent
└── 任务之间需要互相讨论/挑战吗?
├── 不需要 → Worktree Subagent
└── 需要 → Agent Team(实验性)
简单记忆:
- 读多写少 → 普通 Subagent
- 并发写代码 → Worktree Subagent
- 多角色协作 → Agent Team
实战建议
1. 用 model 参数做"分层调度"
不是所有任务都需要最强的模型。搜索和分析用 haiku(快且便宜),代码编写用 sonnet(平衡),复杂架构决策用 opus(最强推理)。
2. 善用 run_in_background
当 agent 任务不阻塞你的下一步时,让它后台跑。主会话可以继续做别的事,完成后会自动通知。
3. Worktree Agent 的合并策略
Worktree agent 完成后会返回分支名。你可以:
git merge合并回主分支git cherry-pick挑选部分改动- 直接丢弃(不满意的探索性尝试)
4. 保护主会话 Context
把"脏活"(大量文件扫描、日志分析、依赖树遍历)交给 subagent 做。它们在自己的 context 里消化噪音,只把结论给你。这能显著延长主会话的有效寿命。
总结
| 选择 | 原因 |
|---|---|
| 普通 Subagent | 默认选择,简单轻量,适合大多数场景 |
| Worktree Subagent | 需要并发写代码且不想处理冲突时的最佳选择 |
| Agent Team | 需要多 AI 自主协调、互相通信的复杂场景(实验性) |
核心思路:根据任务的冲突风险和协作需求选模式,根据任务的复杂度选模型。 模式决定隔离程度,模型决定执行速度。两者正交,组合使用效果最好。