跳到主要内容

Claude Code多Agent机制怎么选

“这个问题能不能多开几个 Agent 一起查?”

很多小伙伴第一次接触多 Agent,最先想到的是把数量拉上去。实际项目里,Agent 数量只是一个参数。任务能否拆开、多个分支会不会改同一批文件、谁负责汇总证据、权限请求由谁处理,这些问题更影响结果。

单个 Claude 主线能完成的任务可以保持单线程。出现相互独立、验收标准明确的调查分支后,再考虑并行。并行可以缩短等待时间,也会增加上下文、Token、协调和代码冲突。

先看一个库存对账案例

凌晨库存对账任务报警,同一个入库单在账面库存里增加了两次。仓库原始流水只有一条,inventory_ledger 却出现两条金额和数量完全相同的记录。

现在有四条调查线:

  1. 查消费端是否重复消费了消息;
  2. 查数据库有没有业务唯一约束;
  3. 查补偿任务会不会与实时消费同时写账;
  4. 补一组并发回归测试,稳定复现重复入账。

四条线看起来适合并行,但它们的写入风险不一样。前三条可以先只读调查,第四条要改测试代码。主 Agent 如果一上来让四个角色都自由修改仓库,大家很可能同时碰 InventoryLedgerService、Mapper 和同一个测试类。

一个更稳的分工是:

角色输入允许动作输出
主 Agent报警、仓库、日志入口统一计划,最后整合根因链路、修改方案、验证结果
消息调查 Agent消费者和消息字段只读搜索Ack、重试、幂等键证据
数据调查 Agent表结构和写入语句只读搜索索引、事务、并发窗口证据
测试 Agent已确认的可疑路径独立 Worktree 写测试可复现用例和运行结果

库存重复入账的多Agent调查拓扑

这张任务图先解决了“哪些工作可以同时做”。接下来才轮到 Claude Code 里的具体机制。

四种机制解决的问题不一样

Claude Code 当前常见的并行或分支能力可以放进一张表里看:

机制所在位置上下文关系协作特点我会用在什么地方
Subagent主会话内部有自己的上下文窗口,接收主 Agent 交代的任务完成后把结果交回主 Agent搜索、审查、测试、专项调查
/subtask当前会话中的支线任务从当前任务派生,在会话里跟踪适合把一个明确支线交给后台处理不想打断主线的短调查或验证
/fork独立后台 Session从当前会话复制出新的独立 Session分叉后各走各的,可单独继续同一上下文下探索另一套方案
Agent Teams多个独立 Claude Code 实例每个 Teammate 有独立上下文共享任务列表,可互相通信规模较大的研究、评审和多模块并行

这四种能力没有固定的强弱顺序。面试中如果只回答“Agent Teams 最强”,面试官很容易继续追问:一个十分钟的只读检索为什么要启一个团队?多个成员如何避免改到同一个类?花掉的 Token 怎么控制?

Subagent适合边界清楚的专项工作

Subagent 是主 Agent 派出的专门角色。它有自己的上下文,主对话里大量聊天记录不会全部塞进这个窗口;主 Agent 会把任务说明交给它,它完成后再返回结果。

这种隔离有两个直接价值:

  • 大范围搜索产生的中间噪声留在 Subagent 里;
  • 可以给角色配置更窄的工具和更具体的系统提示。

例如我们可以定义一个只读的数据库审查角色:

---
name: ledger-schema-reviewer
description: 调查库存台账的表结构、唯一约束、事务边界和写入入口,只返回带文件位置的证据。
tools: Read, Grep, Glob
model: sonnet
---

检查库存台账重复写入风险。输出必须包含:
1. 表结构和索引位置;
2. 所有INSERT入口;
3. 事务注解或事务模板位置;
4. 仍无法确认的事实。
不要修改文件,也不要根据类名猜测运行行为。

项目级自定义 Subagent 通常放在 .claude/agents/,用户级角色可以放在 ~/.claude/agents/。通过 /agents 可以查看和管理当前可用角色。团队想共享审查规范时,项目级配置更方便进入版本管理。

Subagent的任务说明要能单独验收

下面这种委派太宽:

帮我看看库存为什么错了,顺便修一下。

Subagent 不知道报警时间、订单标识、允许修改的范围,也不知道最终要交证据还是交代码。它很容易把猜测写成结论。

我会改成:

只读调查库存台账重复入账。样本入库单为 IN-20260806-1042,
两条ledger记录相差420ms。请搜索消息消费者、补偿任务和所有
inventory_ledger写入口,输出文件路径、方法名、调用关系以及三个
最可能的竞争窗口。不要修改文件,不要启动外部服务。

任务说明里至少要有样本、范围、动作边界和输出格式。能否并行,往往在这一步就能看出来。

Explore角色用于搜索,不要记死它的模型

Claude Code 内置的 Explore Subagent 擅长快速搜索和读取代码。当前官方说明中,从 v2.1.198 开始,Explore 会继承主会话使用的模型。面试时把它固定说成某个轻量模型,很容易被版本更新打脸。

更稳的回答方式是说清角色:Explore 面向只读代码探索,具体模型以当前配置和版本为准。

/subtask适合当前会话里的支线

主线正在分析重复入账调用链时,我还想让 Claude 在后台跑一组现有库存测试。这项工作与当前分析有关,结果也要回到当前会话,但没有必要让主线停在那里等命令结束。

这类支线可以考虑 /subtask。它仍属于当前会话的任务管理范围,用户能够查看状态和结果。适合的任务通常有三个特点:

  • 开始条件已经满足;
  • 执行过程不需要频繁向用户追问;
  • 结果可以用一段清楚的摘要或测试日志交付。

如果后台任务很可能弹出权限请求,主线仍然要留意。把任务放进后台不等于它自动获得更多权限。

ClaudeCode的Context命令

/fork适合保留现场后另开一条路

有时主会话已经积累了完整上下文,我想保留这条调查线,同时试另一套思路。例如:

  • 当前 Session 继续沿“消息重复投递”排查;
  • Fork 出来的 Session 改查“补偿任务并发写入”;
  • 两边各自保留推理和工具记录,互不挤占后续对话。

/fork 会把当前会话复制成独立的后台 Session。分叉发生以后,两条 Session 独立推进,后续消息不会自动双向同步。

因此,Fork 之前最好在上下文里留下一个短状态块:

当前已确认:
- IN-20260806-1042存在两条ledger;
- 两条记录来自不同trace_id;
- 消费者与补偿任务都调用appendLedger。

未确认:
- 两个入口是否使用同一幂等键;
- 唯一索引是否覆盖warehouse_id和receipt_no。

本分支目标:只调查补偿任务与实时消费的并发窗口。

这样两个 Session 都从可核对的事实出发。Fork 只是复制起点,分支之间的结论整合仍要由人或某个明确的主线完成。

subtask与fork的会话关系图

Agent Teams用于需要成员直接协作的任务

Agent Teams 会启动一个 Team Lead 和多个 Teammate。每个成员拥有独立上下文,团队共享任务列表,成员之间还能发送消息。它比“主 Agent 派几个只返回最终结果的 Subagent”多了一层协作能力。

库存案例扩大后,Agent Teams 才开始有价值。假设问题牵涉三个仓储服务、一个消息平台和一套数据修复工具:

  • Teammate A 调查入库服务;
  • Teammate B 调查库存台账服务;
  • Teammate C 审查数据修复方案;
  • Team Lead 维护依赖关系、汇总证据并控制最终修改。

如果 B 发现幂等键来自 A 负责的消息字段,它可以直接把字段证据发给 A。共享任务列表也能标出哪些调查已经完成、哪些工作被依赖阻塞。

Agent Teams当前仍要显式开启

Agent Teams 目前属于实验能力,默认关闭。启用方式和配置项可能随着版本变化,使用前要查当前官方文档。把实验功能引入团队流程时,还要先约定失败后的回退方式,例如退回主 Agent 加 Subagent 的协作模式。

什么时候团队显得太重

下面几种任务,我通常不会启动 Agent Teams:

  • 只需要查三个类和一张表;
  • 所有分支最终都要修改同一个 Service;
  • 任务没有明确的完成条件;
  • 项目很小,启动成员和同步上下文的成本已经接近实际工作量;
  • 用户需要频繁确认每一步,成员会反复等待同一个决策。

团队机制会增加通信、任务认领、状态同步和结果整合。任务本身缺少边界时,多开成员会把模糊放大。

权限不会因为多Agent自动放宽

主 Agent 能使用某个工具,不代表所有子任务都应该拿到同样范围。自定义 Subagent 可以限制工具,也可以配置权限模式。权限设计我一般按最小动作来做:

角色建议权限
代码搜索Read、Grep、Glob
测试执行Read、Bash,限制可执行命令
文档整理Read、Edit,只允许目标目录
安全审查只读,不允许网络和写文件
修复实现按任务开放Edit、Write、Bash,保留高风险确认

Subagent 执行中遇到未授权动作时,权限请求会回到主流程处理。后台任务如果正在等待批准,看起来就像“卡住了”。排查时应该先看任务状态和权限提示,别盲目重启一份相同任务。

高风险操作仍由权限系统、Sandbox、基础设施账号和人工审批兜住。提示词中的“不要操作生产”只能表达意图,无法替代真正的访问控制。

共享工作区最容易制造假并行

多个 Agent 在同一目录里写代码,会共享文件系统状态。A 修改了 InventoryLedgerService.java,B 下一次读取时就可能看到这份尚未验证的修改。它们还可能同时格式化、重命名或覆盖同一文件。

这种协作有几个典型风险:

  1. 修改归属不清:很难确认哪段代码来自哪个任务;
  2. 前提悄悄变化:后启动的 Agent 基于别人未完成的代码继续推理;
  3. 测试互相污染:一个分支改了配置,另一个分支的测试结果随之变化;
  4. 覆盖用户改动:工作区原本就有未提交内容时,风险更大。

开始并行写入前,先记录 git status --short。发现已有修改后,要把它当作用户的工作保留下来,不能默认可以清理。

独立写入可以用Git Worktree隔开

如果两个实现分支真的互不依赖,可以给它们不同 Worktree:

git worktree add ../inventory-ledger-review -b review/inventory-ledger
git worktree add ../inventory-replay-test -b review/inventory-replay-test

每个 Worktree 有独立工作目录和分支,文件修改不会互相覆盖。它们仍共享同一个 Git 对象库,所以占用通常比复制两份仓库小。

Worktree 解决文件隔离,还没有解决逻辑冲突。两个分支如果都改了幂等组件,最终合并仍然可能冲突。分配任务时要标清目录所有权、公共接口变更和合并顺序。

共享目录与Git Worktree并行对比图

多Agent的成本怎么算

每个独立上下文都要读取任务说明、相关代码和返回材料。并行节省的是墙上时间,也就是人实际等待的时间;总 Token 和总计算量通常会上升。

可以把成本粗略拆成:

总成本 = 各Agent读取与推理 + Agent之间通信 + 主线整合 + 冲突返工

任务拆得太细时,每个 Agent 都要重复理解仓库背景。任务拆得太粗时,它们又会在内部做大量无关搜索。一个实用判断是:单个分支能否用三到五句话写清输入、边界、交付物和验收。 写不清时,先继续拆任务模型,别急着启动。

控制成本的六个动作

  1. 让调查角色先只读,确认根因后再开放写入;
  2. 给每个角色限定目录、样本编号和输出格式;
  3. 返回结论时带文件位置,少贴大段原始日志;
  4. 主 Agent 只把必要背景发给分支;
  5. 同一个问题已有分支在查时,不重复启动第二份;
  6. 设定停止条件,证据不足就明确标成未知。

调度失败时会出现什么症状

多 Agent 出问题时,表面症状经常是进度慢或结论乱。沿着证据、权限、任务状态和工作区隔离检查,通常能找到具体原因。

大家都很忙,没人能给根因

任务被拆成“看看消息”“看看数据库”“看看测试”,输出只有概括,没有文件、方法、日志或数据。主 Agent 收到三份泛泛的总结后仍要重查一遍。

修正方法是把证据格式写进任务:文件路径、关键字段、调用入口、确认事实、未确认事实。

两个Agent给出相反结论

先比较它们使用的输入版本和样本范围。一个查的是实时消费者,另一个查的是旧版补偿任务,结论当然可能不同。主 Agent 应该回到原始证据,不能用“少数服从多数”替代验证。

后台任务一直没有结果

依次检查:

  1. 是否在等待工具权限;
  2. 是否缺少用户选择;
  3. 命令是否持续运行;
  4. 任务范围是否没有结束条件;
  5. 所在 Session 是否已经与主线分叉。

合并后测试全坏了

分别在各 Worktree 验证,再检查公共接口和配置变更。单分支通过只能证明局部状态可用,最终组合仍要跑集成测试。

给库存案例安排一套可执行方案

我会把整个过程分为四轮。

第一轮:主Agent固定现场

  • 记录 git status --short
  • 保存异常入库单、两条台账ID、时间差和trace_id;
  • 找到消费者、补偿任务和台账写入的入口;
  • 明确当前阶段只读,不做数据修复。

第二轮:并行调查

  • Subagent A 查消息Ack、重试和幂等字段;
  • Subagent B 查索引、事务和所有INSERT;
  • Subagent C 查补偿任务的扫描条件与锁;
  • 主 Agent 继续还原生产时间线。

三个分支只返回证据,不改代码。这样它们可以安全共享工作区。

第三轮:单点确定根因

假设证据最终显示:实时消费按 message_id 去重,补偿任务按 receipt_no 查询完成状态;两个入口在检查后都调用 appendLedger,台账表也没有 (warehouse_id, receipt_no, line_no) 唯一索引。

这里存在典型的先查后写竞争窗口。主 Agent 应先确认业务唯一键,再决定数据库约束、写入语句和异常处理。根因没有确认前,让多个 Agent 各自实现一版幂等会产生更多分歧。

第四轮:隔离实现和验证

  • 一个 Worktree 实现唯一约束与原子写入;
  • 另一个 Worktree 先写并发复现测试;
  • 主线审查迁移脚本对历史重复数据的影响;
  • 合并后运行单元测试、并发测试和迁移演练。

这套安排里,并行主要用于调查和独立测试。最终业务键与数据修复方案仍由一条主线决策,责任比较清楚。

面试回答可以这样组织

回答示例

Claude Code里的多Agent能力要按协作关系来选。Subagent有独立上下文,适合主Agent派出搜索、测试和专项审查,结果再回到主线;/subtask适合当前会话中的后台支线;/fork复制当前上下文并形成独立Session,适合保留现场后探索另一条路线;Agent Teams提供独立成员、共享任务列表和成员通信,适合多模块协作,目前仍是实验能力。并行前我会检查任务是否可以独立验收、是否会写同一批文件、权限怎样回流以及总Token成本。只读调查可以共享工作区,独立写入优先使用Git Worktree。最终结论由主线根据代码、日志、数据和测试统一验证。

参考资料

🎁优惠