子代理:什么时候拆子代理、怎么写子代理定义
子代理是什么,为什么它值一个章节
子代理(subagent)是 Claude 派出去的"专项工人":它有自己独立的上下文窗口、自己的系统提示词、受限的工具集,干完活只把结论汇报回主对话。主对话里那些读文件的中间过程,全都留在子代理自己的窗口里。
这就是子代理的全部价值所在:上下文隔离。回忆心智模型那一章:主会话的上下文是你唯一要经营的资源。让主对话直接读二十个文件做调研,就像让你自己复印一百页资料只为了给领导写一页摘要;派子代理去,它复印、它读、它还给你一页摘要。
用一个前置知识表理清"分身"家族:
| 机制 | 独立上下文 | 谁管理生命周期 | 典型场景 |
|---|---|---|---|
| 子代理(Agent 工具) | 有 | 主对话 | 调研、探索、批量检查 |
/subtask |
有(继承对话副本) | 主对话 | 当前任务派副活,结果回主线 |
后台会话(/fork、/background) |
有 | 你(可 attach) | 长任务挂机,多终端监控 |
| Agent 团队 | 每成员有 | Claude 协调 | 多实例协作(见下一章) |
内置的三个子代理
Claude Code 自带三个常用的子代理,认识它们能帮你理解自动调度:
- Explore:只读探索专家,Write/Edit 被禁。Claude 需要搜索、理解代码库但不改动时派它。调用时还会指定彻底程度:quick(定向查)、medium(平衡)、very thorough(地毯式);
- Plan:计划模式里做代码调研的那个,同样只读;
- General-purpose:全能型,探索加改动都行,多步骤复杂任务的主力。
另外还有 claude(兜底全能)、statusline-setup(配状态栏)、claude-code-guide(答 Claude Code 用法问题)等辅助型。不想让 Claude 派子代理?在 permissions.deny 里禁掉 Agent 工具即可。
什么时候值得拆
不是所有任务都要拆。我的判断表:
| 任务特征 | 拆不拆 | 理由 |
|---|---|---|
| "调研 X 怎么实现的" | 拆 | 大量文件阅读,结论一页 |
| "全库找含某反模式的代码" | 拆 | 搜索过程嘈杂,结论是清单 |
| 改一个文件的小修小补 | 不拆 | 派遣开销大于收益 |
| "改完顺手跑测试修失败" | 不拆 | 主对话的验证闭环本来就该干 |
| 独立于主任务的研究(查库选型等) | 拆 | 别让支线污染主线 |
| 需要特定工具限制的任务 | 拆 | 子代理可配独立工具集 |
派活话术很简单:"用子代理调研一下我们的鉴权系统怎么处理 token 刷新"。加了"用子代理"四个字,Claude 就会明确走派遣路径。
子代理启动时带什么
理解子代理"从什么状态开工"对设计很重要。默认情况下,自定义子代理启动时会加载:你的 CLAUDE.md 文件(用户/项目/本地)和 git 状态快照——所以团队约定它天然知道。但内置的 Explore 和 Plan 反而不带这些(为了探索更快更省)。想让某个子代理轻装上阵,frontmatter 里加 omitClaudeMd。
还能给子代理开持久记忆(memory 字段):它会维护自己的记忆目录,跨会话积累经验——比如一个长期服役的"部署专家"子代理会记住你环境的各种坑。注意主对话的自动记忆不会传给子代理(fork 型例外),各记各的。
派遣形态:前台、后台与分身
子代理有三种运行形态,覆盖不同的等待耐心:
- 前台(默认):你等它,主对话阻塞在派遣调用上;
- 后台:让 Claude"在后台跑一个子代理",主对话继续干活,完成后收到通知;
/tasks命令能看到当前会话所有后台任务的状态; - 分身(fork):
/subtask <任务>派出一个继承当前完整对话的后台子代理——它带着你们聊过的全部上下文去干副活,结果送回主对话。和/fork(复制成独立后台会话)的区别在于:分身的结果回到这条对话线,/fork则是开了一个新的独立会话。
这套形态选择的心法:等结果再继续的用前台;结果晚点要的用后台;需要"带着记忆去办另一件事"的用分身。
写一个自定义子代理
子代理就是一个 md 文件 + YAML frontmatter。最省事的创建方式是直接让 Claude 写:告诉它"在 ~/.claude/agents/ 创建一个代码审查子代理,只读,用 Sonnet",它就把文件写好。手写的话长这样——保存为 ~/.claude/agents/code-improver.md(用户级,全项目可用):
---
name: code-improver
description: 扫描文件并给出可读性、性能和最佳实践改进建议。
在写完或修改代码之后使用。
tools: Read, Grep, Glob
model: sonnet
---
你是代码改进专家。对每个发现的问题:
1. 解释问题是什么、为什么是问题
2. 展示当前代码
3. 给出改进版本
只读操作,不要修改任何文件。
字段解读:description 依然是自动调度的钥匙,Claude 拿任务和各子代理的 description 匹配决定派谁;tools 限定工具集(不写则继承全部可用工具);model 指定模型——让杂活跑便宜模型是显式省成本的手段。作用域两档:项目级放 .claude/agents/(进 git 团队共享),用户级放 ~/.claude/agents/。还有更灵活的 frontmatter 字段:permissionMode(子代理自己的权限档)、maxTurns(轮数上限)、memory(给子代理开持久记忆)、isolation、skills 等,见官方子代理文档。
测试:说"用 code-improver 检查这个项目",转录里会看到 code-improver(建议代码改进) 这样的派遣行。
定义设计的四条经验
经验一:description 短,system prompt 长。 所有子代理的 description 加起来超过 15,000 token 会触发启动警告——每个会话都要背着这些描述。细节放正文里,正文只在派遣时加载。
经验二:工具集宁紧勿松。 只读调研的就只给 Read/Grep/Glob。工具越少,跑偏概率越低,权限弹窗也越少。
经验三:一次性的活别建文件。 临时定义用 --agents 命令行 JSON 传进去,随用随弃:
claude --agents '{
"debugger": {
"description": "报错与测试失败的调试专家",
"prompt": "你是调试专家,分析错误、定位根因、给出修复。"
}
}'
经验四:给"专家"角色写清输出格式。 子代理的产出是回到主对话的摘要,让它按固定结构汇报(如"结论 / 证据文件列表 / 风险"),主对话消化起来最顺。
与并行会话的协同
子代理在单会话内的分工讲完了,补一层跨会话的协同视角。当你用 --worktree 或 claude --worktree 名字 开并行会话时,每个会话照样可以派自己的子代理——两层并行叠加:会话级并行处理互不相干的任务,会话内的子代理并行消化各自的调研。大改造场景(比如"迁移整个模块")的正规姿势是 /batch:它把工作拆成 5 到 30 个独立单元,每个单元在独立 worktree 里由后台子代理实现并跑测试——相当于把本章和并行会话那章的机制一次性编排起来。
显式调用与权限
自定义子代理除了自动调度,还能指名道姓地调用:启动时 claude --agent <名> 直接把会话跑在这个代理的身份上(工具限制、模型都按它的定义来),会话内也可以说"用 code-improver 处理这个文件"。权限方面,子代理继承主对话的权限规则——主对话里 deny 的命令它同样碰不了,你不用重复配置;它额外发出的工具请求如果主模式要弹窗,照样弹给你。
派子代理也是花钱的:它发出的每一次模型请求都计入你的用量。所以"一个任务拆五个子代理"不是免费的并行加速,每个都在消耗额度。成本敏感场景记得给杂活代理配 model: haiku,把钱花在主对话的推理上。
理解了这个层次结构,你就有了完整的调度坐标系:任务是横轴(拆给谁),上下文是纵轴(在哪算)。子代理解决"上下文在哪算",worktree 解决"文件在哪改",团队解决"谁协调谁"——三者正交,按需组合。
最后划一条与 Agent 团队的边界:子代理活在单个会话内、由主对话单向管理;多个 Claude 实例互相发消息、协同分工,那是 Agent 团队的事,下一章展开。想看"由谁来做"的选型对比在多代理实战部分还有总表。
本章由 WorkBuddy 原创整理,事实性内容参考 Claude Code 官方文档。
