第 04 章

Subagents

让不同专家处理不同任务——上下文隔离、角色专精、并行协作

一个助手又写代码又做审查,结果两头都不靠谱

角色混乱

你有没有发现,让 Claude 同时做实现和审查,两边质量都下降?

上下文膨胀

你让 Claude 先实现一个功能,再审查一遍。它既知道自己的实现意图,又要假装从外部视角审查。审查变成了走过场——它很难对自己的代码说"这里有问题"。

目标冲突

一个会话里既要"写新功能"又要"跑测试"又要"生成文档"。Claude 的注意力被分散,每个任务的输出质量都不如单独做。

安全风险

审查员不应该有写权限。但在同一个会话里,它既能读代码也能改代码——你没法约束它"只看不改"。

Subagent 就是为这个设计的:把不同任务交给不同角色,每个角色有独立的上下文、明确的职责、受限的工具权限。审查的归审查,实现的归实现。

什么是 Subagent

定义 → 白话 → 核心特性

Subagent是专门处理某类任务的独立 AI 助手,拥有隔离的上下文、自己的提示词和受限的工具权限。

说白了,它就是一个"被分配了特定角色的同事"——你让它做代码审查,它就只做审查,不带实现的想法进来,也改不了任何文件。

上下文隔离

主 Agent 上下文约 50K token,每个 Subagent 获得干净的独立上下文(约 20K token)。它看不到主会话的对话历史,只接收任务描述,完成后只返回结果——中间过程不污染主上下文。

单一职责

一个 agent 只做一件事。审查员不做实现,实现者不做审查。

最小权限

精确控制每个 agent 能用哪些工具。审查型 agent 只给 Read、Grep、Glob,不给 Edit 和 Write。

并行执行

多个 agent 可以同时处理不同任务。安全审查和质量审查可以并行跑,最后汇总。

配置字段

角色卡 frontmatter 中的每个字段都有明确用途

字段必填说明
name✅agent 名称,也是文件调用的标识符
description✅一句话说明"什么时候该调用它"——主 Agent 靠这个决定是否分派
tools✅允许使用的工具列表。控制权限的核心字段
model可选指定模型。默认 inherit(继承主 Agent),可设 sonnet/opus/haiku
prompt可选任务提示词。也可以直接写在 markdown 正文中
context可选上下文策略——控制 agent 能看到多少信息
# frontmatter 示例
---
name: data-scientist
description: 数据分析专家,擅长 SQL 和 BigQuery
tools: Bash, Read, Write
model: sonnet          # 用 Sonnet 更快更省钱
---

# markdown 正文 = agent 的 system prompt
# Data Scientist Agent
你是一名专注于 SQL 和 BigQuery 分析的数据科学家……
最关键的两个字段:description 决定"何时触发",tools 决定"能做什么"。写错了前者,agent 永远不会被调用;写错了后者,agent 要么干不了活,要么权限过大。

设计原则

设计一个角色卡,需要回答四个问题

1. 单一职责

每个 agent 只负责一个领域。不要让"审查员"同时负责测试。如果两个职责都需要,做两个 agent。

2. 可验证产物

每个 agent 的输出应该有明确的格式和验收标准。这样主 agent 才能汇总多个角色的结果。

3. 最小权限

审查型 agent 只需只读工具(Read、Grep、Glob),不要给写权限。实现型 agent 需要编辑权限,但要限制作用范围。

4. 清晰红线

明确列出"绝对不能做的事"。比如审查员不能改代码,实现者不能删测试。

配置位置:项目级 .claude/agents/(团队共享),用户级 ~/.claude/agents/(个人专用)。
Bash 权限可以进一步限定范围:不只是"Bash"或"不给 Bash"。你可以写 tools: Bash(npm *), Bash(mvn *),只允许特定前缀的命令——这样实现者能跑测试,但没法执行 rm -rf。
System Prompt 三条铁律: ① 任务说明要具体——"审查 src/auth 目录下的所有认证逻辑"比"帮我看看代码"好得多; ② 不要写太长——system prompt 越长,agent 越容易遗漏关键指令,控制在 200 行以内; ③ 只保留执行任务所需的信息——不要把项目背景、会议纪要都塞进去。

角色卡示例

一个 code-reviewer 角色卡长什么样

# 文件:.claude/agents/code-reviewer.md

---
name: code-reviewer
description: 审查代码质量、安全性和可维护性
tools: Read, Grep, Glob
---

# Code Reviewer

你是一名资深代码审查专家。

## 职责
审查代码变更,发现潜在问题并提供改进建议。

## 审查维度
1. **代码质量**:命名、结构、可读性、复杂度
2. **安全性**:输入验证、权限、敏感数据处理
3. **可维护性**:耦合度、扩展性、文档完整度

## 工具权限
- ✅ Read:读取源码
- ✅ Grep:搜索模式
- ✅ Glob:查找文件
- ❌ Edit/Write:只读,不能修改代码
- ❌ Bash:不执行命令

## 输出格式
按严重程度分类:🔴 高危 | 🟡 中等 | 🟢 建议
每条包含:文件路径、行号、问题描述、修复建议

## 红线
- 不修改任何文件
- 不执行任何命令
- 只报告发现,不做决策
注意 tools 字段:这里只列了 Read、Grep、Glob——全是只读工具。这就是"最小权限"在角色卡中的体现。审查员不应该有修改能力。
可选字段 model:默认 model: inherit(继承主 Agent 的模型)。你也可以指定 model: sonnet 为特定角色选模型——比如数据分析 agent 用 Sonnet 更快,审查 agent 用 Opus 更准。

本仓角色一览

看看不同类型的 agent 各自解决什么问题

Code Reviewer 只读

工具:Read, Grep, Glob

审查代码质量、命名规范、结构可读性、耦合度和可维护性。输出按严重程度分类(高/中/建议),每条包含文件路径、行号、问题描述和修复建议。

Secure Reviewer 只读

工具:Read, Grep(最小权限集)

专注安全漏洞:硬编码密钥、SQL 注入、命令注入、XSS、API key 泄露、PII 处理。按 OWASP 分类,每条包含 Severity、漏洞类型、影响和修复方案。

Debugger 读写

工具:Read, Edit, Bash, Grep, Glob

排错流程:分析错误 → 检查最近变更 → 提出假设 → 隔离故障 → 最小修复 → 验证。输出包含根因、证据、修复内容、回归检查。

Test Engineer 读写

工具:Read, Write, Bash, Grep

编写单元测试、集成测试、边界情况测试。遵循项目现有框架(Jest/pytest 等),目标 80%+ 覆盖率,关键路径 100%。

Documentation Writer 读写

工具:Read, Write, Grep

生成 API 文档、用户指南、架构文档和 Changelog。基于实际代码验证准确性,包含参数说明、返回值、错误码和可运行的示例。

Implementation Agent 全权限

工具:Read, Write, Edit, Bash, Grep, Glob

端到端功能实现:理解需求 → 分析代码库 → 制定方案 → 逐步实现 → 边做边测 → 清理重构。红线:不删测试、每次改动不超过 5 个文件、不改配置。

Data Scientist 读写

工具:Bash, Read, Write | 模型:sonnet

SQL 查询、BigQuery 操作、数据洞察。支持探索性分析、统计分析和报告生成。输出包含目标、查询、结果、洞察和建议。

Clean Code Reviewer 只读

工具:Read, Grep, Glob, Bash

按 Clean Code 原则(Robert C. Martin)审查:命名、函数长度、SOLID、DRY/KISS/YAGNI、坏味道。四级严重度:Critical(50 行+函数)→ Low(轻微可读性)。

观察规律:审查型角色都是只读,实现型角色才有写权限。权限越大,红线越要写清楚。Secure Reviewer 的权限最小——只有 Read 和 Grep,连 Glob 都不给。

安装方式

把角色卡放到正确的位置,Claude 就能自动发现

# 方法 1:安装单个角色到项目
$ cp 04-subagents/code-reviewer.md .claude/agents/

# 方法 2:安装全部角色到项目
$ mkdir -p .claude/agents
$ cp 04-subagents/*.md .claude/agents/

# 方法 3:安装到个人目录(跨项目通用)
$ mkdir -p ~/.claude/agents
$ cp 04-subagents/debugger.md ~/.claude/agents/
位置作用域共享方式适合放什么
.claude/agents/当前项目Git 同步团队审查流程、项目专属角色
~/.claude/agents/所有项目不共享个人调试、跨项目通用角色
方法 4:使用 /agents 命令(推荐)
# 在 REPL 中直接管理
$ /agents

# 通过 CLI 查看所有可用 agent
$ claude agents

验证安装

  1. 运行 /agents,检查对应 agent 是否出现在列表中
  2. 试着让 Claude 委派一个简单任务,观察是否自动分派
  3. 直接说"用 code-reviewer 审查这段代码"来手动指定

文件结构 (点击文件名查看角色定义)

.claude/agents/
├── clean-code-reviewer.md
├── code-reviewer.md
├── data-scientist.md
├── debugger.md
├── documentation-writer.md
├── implementation-agent.md
├── secure-reviewer.md
└── test-engineer.md

何时该用

不是所有任务都需要 Subagent——有时直接在主会话做更高效

场景该用吗原因
多步骤复杂功能 用 分离关注点,防止上下文污染
并行任务执行 用 每个 subagent 有独立上下文,互不干扰
需要权限隔离 用 审查员只读、实现者可写,角色分离更安全
长时间分析任务 用 防止主上下文耗尽
快速代码审查 不必 开销不值得,直接在主会话做更快
单一步骤任务 不必 只增加延迟,没有收益
判断标准:如果任务需要隔离上下文、权限控制、或并行执行——用 Subagent。如果只是简单的一问一答——直接做,别增加复杂度。

调用方式

四种方式让 Subagent 开始工作

自动委派

主 Agent 根据 description 字段自动判断。你只需正常描述任务,它会自己找到合适的 agent。

用户: "审查这段代码的安全性"
# 主 Agent 自动选择 secure-reviewer

显式指定

直接说出 agent 名称,跳过自动匹配。

用户: "用 code-reviewer 审查 src/auth.ts"
# 直接调用指定角色

@ 提及调用

在对话中通过 @agent-name 方式引用。

用户: "@debugger 这个空指针异常怎么修?"
# 直接唤起 debugger 角色

会话级固定

在整个会话中固定使用某个 agent。适合长时间专注某一领域。

$ claude --agent code-reviewer
# 整个会话都用 code-reviewer

串联协作

多个 agent 依次接力,前一个的输出是后一个的输入

并行不是唯一的协作方式。有些任务天然是串行的——代码写完才该审查,审查完才该补测试,测试通过才该写文档。

# 串联工作流:实现 → 审查 → 测试 → 文档

用户: "给登录模块加上 OAuth2 支持"

主 Agent 编排:
1. implementation-agent → 实现 OAuth2 登录流程
   输出: 修改了 4 个文件,新增 auth/oauth2.ts

2. code-reviewer → 审查实现质量
   输出: 🟡 2 个中等问题(错误处理不完整、缺少 token 刷新)

3. test-engineer → 为 OAuth2 模块生成测试
   输出: 新增 12 个测试用例,覆盖率 92%

4. documentation-writer → 更新 API 文档
   输出: 更新了 auth.md,新增 OAuth2 配置指南

设计要点

  • 每个 agent 的输出格式要标准化,方便下一个 agent 解析
  • 前一步发现问题可以中断链路,让主 Agent 决定是修还是继续
  • 串联链路不宜超过 4-5 个环节,否则延迟和 token 消耗会失控

何时用串联 vs 并行

  • 有依赖关系 → 串联(实现完了才能审查)
  • 互相独立 → 并行(安全审查和质量审查同时跑)
  • 混合场景 → 先并行收集,再串联处理(并行审查后,串联通往文档更新)

Agent Teams

实验功能——多个 agent 围绕一个共同目标协作

普通 Subagent 是"主 Agent 逐个分派"。Agent Teams 更进一步:多个 agent 并行推进大任务,共享中间结果。

普通 Subagent

主 Agent 逐个分派任务,每个 agent 独立完成后返回。

主 Agent
├── 分派 → code-reviewer → 返回
├── 分派 → test-engineer → 返回
└── 汇总

Agent Teams

多个 agent 并行协作,可以共享中间发现。

主 Agent 编排
├── 前端 Agent ──┐
├── 后端 Agent ──┤ 共享中间结果
└── 测试 Agent ──┘
         ↓
    统一交付

团队配置要点

  • 角色定义要清楚——每个角色的职责边界和输出格式都要明确
  • 任务边界要明确——不要让多个 agent 做重复工作
  • 计划审批流程——如果是 plan 驱动,团队会先审计划再执行

交互能力

  • 显示模式:终端或图形界面,选择适合你的显示方式
  • 导航:可以在 team 中切换角色、查看状态和读取消息
  • Hook 事件:一些 hook 可以在 team 生命周期中触发(启动/完成/失败)
实验功能:Agent Teams 目前仍处于实验阶段,行为可能变化。启用方式:export CLAUDE_AGENT_TEAMS=1 或在 settings.json 中设置 {"agentTeams": {"enabled": true}}。复杂团队需要更多配置,建议从简单场景开始尝试。

分派与汇总

触发 → 分派 → 并行执行 → 汇总结果

图:多角色并行审查的分派与汇总流程
# 场景:审查一个 PR

用户: "审查当前 PR"

主 Agent 分派:
├── secure-reviewer  → 扫描安全漏洞
├── code-reviewer    → 检查代码质量
└── test-engineer    → 验证测试覆盖

并行执行中...

汇总:
✅ 安全: 未发现关键漏洞
⚠️ 质量: 3 个中等问题(命名不规范 ×2,方法过长 ×1)
❌ 测试: 覆盖率不足 (45%),关键路径缺少测试
关键设计:每个 agent 的输出格式必须统一(严重程度 + 文件路径 + 问题描述 + 修复建议),这样主 agent 才能把多个角色的结果合并去重,按严重程度排列。

Subagent 生命周期

从创建到结束,一个 subagent 经历五个阶段:

1. 创建  → 加载角色卡,初始化隔离上下文
2. 分配  → 主 Agent 传入任务描述和必要信息
3. 执行  → 在隔离上下文中独立运行,调用工具
4. 返回  → 输出结构化结果,汇总到主会话
5. 结束  → 上下文销毁,或挂起等待恢复

可恢复的 Agent

某些 subagent 可以先启动、之后再恢复——适合长任务接力。比如一个耗时的大规模重构,你可以今天做到一半,明天恢复继续。

结合后台执行,你可以:启动 agent → 去做别的事 → 回来检查进度 → 继续或结束。

后台与隔离

让 agent 在后台跑,用 worktree 隔离文件变更

后台执行

Subagent 可以作为后台任务运行,不阻塞主会话。你继续做别的事,它跑完了会通知你。

# 场景:后台跑安全扫描
用户: "后台扫描一下整个代码库的安全问题"

主 Agent: 已启动 secure-reviewer 后台任务
         你可以继续其他工作...

[通知] secure-reviewer 完成:
       发现 3 个中等安全问题
       已生成报告 → .claude/reports/security.md

在支持快捷键的界面中,可以用快捷键查看或切换后台 agent。

# 关闭后台任务(settings.json)
{
  "agents": {
    "background": false
  }
}
# 设为 false 后,所有 agent 都在前台阻塞执行

Worktree 隔离

为 agent 分配独立的 Git worktree,文件变更互不污染。

# 没有隔离时
implementation-agent 修改了 src/auth.ts
→ 主会话的文件也被改了
→ 其他 agent 看到的是被修改后的版本

# 使用 worktree 隔离
implementation-agent → worktree A
code-reviewer       → 主分支(只读)
→ 互不干扰,安全审查看到的是原始版本
Worktree 的代价:每个 worktree 会占用额外的磁盘空间。对于只读型 agent(如审查员),不需要分配 worktree——它们本来就不改文件。

上下文管理

子上下文越小越快——别把所有信息都塞进去

每个 Subagent 获得独立的上下文窗口(约 20K token),但这个空间不是无限大的。上下文越大,推理越慢、准确性越低。

保持子上下文精简

  • 只传递任务所需的最少信息——不要把整个对话历史都丢进去
  • 用 context 字段控制 agent 能看到多少信息
  • 让每个 agent 只负责自己的事,不要"什么都想知道"

性能考虑

  • 过多的上下文会拖慢推理速度并降低准确性
  • 如果发现 agent 输出质量下降,先检查是不是塞了太多无关信息
  • 子上下文尽量控制在 5K token 以内,把空间留给结果
关键行为:Subagent 在隔离上下文里工作,但仍能把结果汇总回主会话。主 Agent 负责把多个子结果合并——所以每个 agent 的输出要结构化、可合并。

Subagent 的持久记忆

Subagent 可以拥有自己的 memory 范围,让它在各自职责内跨会话保持一致。记忆不会和主会话完全混在一起——subagent 在自己的上下文中读取对应的记忆文件。

记忆范围位置适合场景
项目级.claude/memory/团队共享的项目约定、架构决策
用户级~/.claude/memory/个人偏好、跨项目通用经验
子目录级子目录下的 .claude/模块级别的专属知识

内置角色

Claude Code 自带的 Subagent,不需要配置直接可用

角色触发场景特点
Planning需要先做架构设计再动手生成实现计划,不写代码。适合复杂任务的拆分
Explore需要搜索和理解代码库快速只读搜索,适合定位文件和符号。不做代码审查或分析
Claude Code Guide用户问"怎么用 Claude Code"回答 CLI、API、SDK 相关问题,能查阅官方文档
Statusline配置状态栏显示管理 IDE 底部状态栏的配置
内置角色无需安装:它们已经在系统中注册好了。你只需正常描述任务,主 Agent 会自动判断是否需要调用内置角色。你也可以显式指定,比如"用 Planning agent 帮我设计一下方案"。

限制与安全

控制谁能被启动,以及在插件分发场景下的安全边界

限制可启动的 Agent

你可以限制 Claude 只能 spawn 某些 subagent,降低风险。

# settings.json 示例
{
  "agents": {
    "allowList": ["code-reviewer", "secure-reviewer"],
    "denyList": ["implementation-agent"]
  }
}

# 只允许审查类 agent,禁止高风险自动化

适用场景:CI/CD 管道中只允许只读审查,生产环境禁止自动修改代码。

插件分发安全

插件分发的 subagent 要特别注意:

  • 权限范围:检查 tools 字段,确保没有超出预期的权限
  • 边界条件:第三方 agent 的 prompt 可能包含你不知道的指令
  • 最小信任:对插件提供的 agent 采用与自定义 agent 相同的审查标准
原则:永远不要盲目信任第三方 agent 的 tools 配置。安装前先读它的 markdown 源文件,确认权限合理。

与 Skill 配合

Skill 定义"怎么做",Subagent 定义"谁来做"

对比SkillsSubagents
角色提供方法与模板执行任务的角色
上下文在主会话中加载在隔离上下文中运行
触发方式自动匹配或手动调用由主 Agent 分派
适合场景标准化输出结构需要隔离的专门任务

典型搭配:你做了一个 code-review Skill(审查步骤 + 审查模板),然后创建一个 code-reviewer Subagent(只读权限、审查专精)。Agent 执行时引用 Skill 的模板来格式化输出。

一句话记住:Skill 是"手册",Subagent 是"执行手册的人"。手册可以有多份,人可以有不同的专长。两者配合才完整。

排错指南

角色重叠

症状:两个 agent 做了同样的分析,结果冲突,token 白白浪费。

修复:检查每个 agent 的职责边界。code-reviewer 看代码质量,secure-reviewer 看安全漏洞——维度不重叠。

权限过大

症状:审查型 agent 拿到了 Edit 权限,审查过程中顺手"修"了代码。

修复:审查型角色的 tools 字段只保留 Read、Grep、Glob。需要修改时让主 agent 另派实现型 agent。

输出格式不统一

症状:不同 agent 的输出格式各异,主 agent 无法汇总。

修复:在 Skill 的模板中定义统一的输出格式,所有 agent 执行时都引用同一个模板。

重复劳动

症状:多个 agent 各自读同一份文件做类似分析。

修复:让主 agent 先做一次预分析(提取关键信息),再分派给不同角色,避免重复读取。

动手练习

为你的团队设计 2 个角色:一个负责实现,一个负责审查

任务:设计 2 个 subagent 角色卡,覆盖"实现"和"审查"两个方向。
  • 每个角色卡包含:职责、工具权限、输出格式、红线
  • 两个角色的职责不重叠
  • 审查型角色必须是只读权限
  • 输出格式可以被主 agent 汇总
提示:先想清楚这两个角色在真实项目中各自做什么。不要设计"万能角色"——单一职责是关键。

参考答案

实现者

---
name: implementer
description: 实现功能和修复代码
tools: Read, Edit, Write, Bash
---

# Implementer

## 职责
根据需求实现功能、修复 bug。

## 工具权限
- ✅ Read/Edit/Write: 读写代码
- ✅ Bash(npm *, mvn *): 构建测试

## 输出格式
1. 修改文件清单
2. 每个修改的原因
3. 运行测试的结果

## 红线
- 不删除现有测试
- 每次修改不超过 5 个文件
- 不修改配置文件

审查者

---
name: quality-reviewer
description: 审查代码质量和测试覆盖
tools: Read, Grep, Glob
---

# Quality Reviewer

## 职责
审查代码质量,检查测试覆盖。

## 工具权限
- ✅ Read/Grep/Glob: 只读
- ❌ Edit/Write/Bash: 无

## 输出格式
按严重程度分类:
🔴 高 | 🟡 中 | 🟢 低
每条:文件、行号、问题、建议

## 红线
- 不修改任何文件
- 只报告,不做决策
- 不评价设计方向
对比检查:实现者有 Edit/Write 权限但受文件数限制;审查者只有 Read 权限,红线明确写了"不修改任何文件"。权限与职责严格匹配。

本章回顾

到这里,你已经能

  • 说清 Subagent 解决什么问题(上下文隔离、角色专精)
  • 设计角色边界和权限(单一职责 + 最小权限)
  • 用串联或并行方式组织多角色协作
  • 利用后台执行和 Worktree 隔离管理复杂任务
  • 控制上下文大小、限制可启动的 agent 范围
  • 理解内置角色、Agent Teams 与 Skill 的配合

它和前后章节的关系

  • Skills — 为 Subagent 提供执行手册
  • Subagents — 定义"谁来做"
  • MCP — 让 agent 访问外部工具和数据
  • Hooks — 自动化角色间的质量门禁
核心结论:分工提升质量。好的角色设计 = 清晰的职责 + 最小的权限 + 可汇总的输出。审查的归审查,实现的归实现——别让一个角色干两份活。

延伸阅读

继续本课程

  • 下一章:MCP — 让 agent 访问外部工具和数据
  • Hooks — 自动化角色间的质量门禁

本章源文件

  • 04-subagents/ 目录 — 所有角色定义文件
  • 推荐先看 code-reviewer.md,再看 secure-reviewer.md

加载中…