【教程】AI 编程助手的 SubAgent 机制详解:让 AI 学会“分工协作“
本文详细解析了AI编程助手中的SubAgent(子代理)机制。SubAgent通过专业化分工让AI学会"协作":主Agent负责统筹,子代理专注特定任务(如代码探索、审查等),各自拥有独立上下文空间,仅返回精简结果。相比传统单代理模式,SubAgent能显著降低Token消耗(60%-80%)、提升处理效率,避免长上下文导致的注意力分散问题。文章通过场景对比、架构图解和工作流程
【教程】AI 编程助手的 SubAgent 机制详解:让 AI 学会"分工协作"
本文深入解析 AI 编程助手中的 SubAgent(子代理)机制,包括什么是 SubAgent、为什么需要它、核心工作原理、主流工具的实现对比,以及如何自定义 SubAgent 提升开发效率。适合已使用过 Claude Code、Cursor 等 AI 编程助手的进阶开发者阅读。
文章目录

1. 什么是 SubAgent
1.1 从一个场景说起
你有没有遇到过这样的情况:
- 让 AI 分析一个大型项目的代码结构,它读了半天文件,最后告诉你"上下文太长了,我可能遗漏了一些信息"
- 让 AI 找一个功能的实现位置,它一个个文件搜索,效率低得让人抓狂
- 让 AI 做代码审查,它把整个项目的代码都塞进上下文,结果重点信息反而被淹没了
说白了,这些问题的根源在于:传统的 AI 编程助手是"单打独斗"的模式。
打个比方,这就像让一个人既当侦察兵又当指挥官——他需要亲自跑遍整个战场收集情报,然后再回来制定作战计划。效率能高吗?
而 SubAgent 的出现,就是为了解决这个问题。它让 AI 学会了"分工协作":派出专门的"侦察兵"去探索代码库,收集信息后汇总成精简的报告,再交给"指挥官"做决策。
1.2 SubAgent 的定义
SubAgent(子代理)是主 Agent 可以调用的专门化子代理。
还是用公司的类比来解释:
- 主 Agent 就像公司老板,负责理解用户需求、规划任务、整合结果
- SubAgent 就像专业团队,每个团队专注于特定领域的工作
SubAgent 的核心特点:
| 特点 | 说明 |
|---|---|
| 专注特定任务 | 每个 SubAgent 只做一件事,比如代码探索、代码审查 |
| 独立上下文空间 | SubAgent 的工作过程不会污染主 Agent 的上下文 |
| 返回精简结果 | 只把最终结论返回给主 Agent,而不是原始数据 |
1.3 SubAgent vs 普通工具调用
你可能会问:这和普通的工具调用有什么区别?不都是 AI 调用一个功能吗?
区别大了。
| 特性 | 普通工具调用 | SubAgent |
|---|---|---|
| 复杂度 | 单一操作(读一个文件、搜索一个关键词) | 多步骤复杂任务(探索整个代码库) |
| 上下文 | 结果直接进入主 Agent 上下文 | 独立上下文,只返回精简摘要 |
| 返回结果 | 原始数据(文件内容、搜索结果) | 经过分析的精简报告 |
| 适用场景 | 读取已知路径的文件、简单搜索 | 代码探索、复杂分析、多文件关联 |
| Token 消耗 | 结果越多,消耗越大 | 无论探索多少文件,只返回摘要 |
举个例子:
普通工具调用:
SubAgent 方式:
2. 为什么需要 SubAgent
2.1 上下文窗口的困境
现在的 LLM 上下文窗口已经很大了,Claude 有 200K,GPT-4 有 128K。但是,大型项目的代码量动辄几十万行,全部塞进上下文是不现实的。
而且,上下文越长,问题越多:
| 问题 | 影响 |
|---|---|
| 注意力分散 | 重要信息被淹没在大量无关内容中 |
| 成本增加 | Token 消耗直接影响 API 调用成本 |
| 响应变慢 | 处理长上下文需要更多时间 |
| 准确度下降 | 研究表明,LLM 在长上下文中容易"遗忘"中间内容 |
说实话,我自己在使用 AI 编程助手时就遇到过这个问题。让它分析一个稍微大点的项目,它读了一堆文件后,反而把之前讨论的重点给忘了。
2.2 专业化分工的优势
SubAgent 的核心思想是"专人专事":
- code-explorer:专门负责代码探索,熟悉各种搜索策略
- code-reviewer:专门负责代码审查,知道常见的代码问题
- test-generator:专门负责生成测试,了解测试最佳实践
每个 SubAgent 都有自己的"专业知识"(系统提示词),能更高效地完成特定任务。
打个比方:你不会让公司的前端工程师去做数据库优化,也不会让 DBA 去写 CSS。AI 也是一样,专业化分工能大幅提升效率。
2.3 减少 Token 消耗
这是 SubAgent 最直接的好处。
传统方式:
SubAgent 方式:
根据我的实际使用经验,使用 SubAgent 后,Token 消耗可以降低 60%-80%。这对于需要频繁使用 AI 编程助手的开发者来说,是实打实的成本节省。
3. SubAgent 的工作原理
3.1 核心架构
SubAgent 的架构其实不复杂,核心就是"主从分离":
3.2 调用流程详解
一次完整的 SubAgent 调用流程:
第一步:主 Agent 识别任务类型
主 Agent 收到用户请求后,会判断这个任务是否需要广泛搜索代码库。如果是,就决定调用 SubAgent。
用户:"帮我找一下项目中用户认证的实现"
主 Agent 思考:
- 这个任务需要搜索多个文件
- 我不知道认证代码在哪里
- 需要广泛探索 → 调用 code-explorer SubAgent
第二步:通过 Task 工具启动 SubAgent
主 Agent 调用 Task 工具,传入任务描述:
{
"subagent_name": "code-explorer",
"description": "查找认证实现",
"prompt": "请在项目中搜索用户认证相关的实现,包括登录、注册、Token 验证等功能。分析代码结构并返回摘要。"
}
第三步:SubAgent 在独立上下文中执行
SubAgent 启动后,拥有自己独立的上下文空间。它可以:
- 调用
search_content搜索 “auth”、“login”、“token” 等关键词 - 调用
read_file读取相关文件 - 调用
list_files探索目录结构
这些操作的结果都在 SubAgent 的上下文中,不会进入主 Agent。
第四步:SubAgent 返回结构化结果
SubAgent 完成探索后,会生成一份精简的报告:
## 认证模块分析结果
### 文件位置
- `src/auth/` 目录下包含所有认证相关代码
### 核心文件
1. `src/auth/login.ts` - 登录逻辑
2. `src/auth/register.ts` - 注册逻辑
3. `src/auth/middleware.ts` - Token 验证中间件
### 技术方案
- 使用 JWT 进行身份验证
- Token 有效期 7 天
- 支持 refresh token 刷新
### 调用关系
login.ts → generateToken() → middleware.ts 验证
第五步:主 Agent 基于结果继续工作
主 Agent 收到这份精简报告后,可以:
- 直接回复用户
- 基于报告中的文件路径,进一步读取具体代码
- 结合用户需求,给出更具体的建议
3.3 上下文隔离机制
为什么上下文隔离这么重要?
不隔离的问题:
隔离后的效果:
信息传递方式:
| 方向 | 传递内容 |
|---|---|
| 主 Agent → SubAgent | 任务描述(prompt) |
| SubAgent → 主 Agent | 精简的结果摘要 |
SubAgent 内部的搜索过程、读取的文件内容、中间思考过程,都不会传递给主 Agent。这就是"隔离"的含义。
4. 主流工具的 SubAgent 实现
4.1 Claude Code 的 SubAgent
Claude Code 内置了 code-explorer 子代理。
触发条件:
当任务需要广泛搜索代码库时,Claude Code 会自动调用 code-explorer。你也可以在对话中明确要求:
用户:使用 code-explorer 帮我分析项目结构
内置工具:
code-explorer 可以使用以下工具:
| 工具 | 功能 |
|---|---|
search_file |
按文件名模式搜索(支持通配符) |
search_content |
按内容搜索(支持正则表达式) |
read_file |
读取文件内容 |
list_files |
列出目录结构 |
使用示例:
用户:帮我找一下项目中所有的数据库操作
Claude Code 响应:
"我来启动 code-explorer 子代理帮你探索..."
[SubAgent 执行中]
- 搜索 "database"、"sql"、"query" 关键词
- 分析 ORM 配置文件
- 识别数据模型定义
[返回结果]
"根据探索结果,项目使用 Prisma ORM,数据库操作主要在以下位置:
1. prisma/schema.prisma - 数据模型定义
2. src/services/*.ts - 业务逻辑中的数据库调用
3. src/repositories/*.ts - 数据访问层封装"
自定义 SubAgent:
Claude Code 支持自定义 SubAgent。你可以在项目中定义自己的子代理,后面会详细介绍。
4.2 Cursor 的 Agent 模式
Cursor 的 Agent 模式和 Claude Code 的 SubAgent 有些不同。
工作方式:
Cursor 的 Agent 模式更像是一个"增强版"的 AI 助手,它可以自动调用多个工具完成任务,但不是严格意义上的"子代理"。
与 Claude Code SubAgent 的区别:
| 特性 | Claude Code SubAgent | Cursor Agent 模式 |
|---|---|---|
| 上下文隔离 | 完全隔离 | 部分隔离 |
| 触发方式 | 自动/手动 | 手动切换模式 |
| 自定义能力 | 支持自定义 SubAgent | 不支持 |
| 多 Agent 协作 | 支持 | 有限支持 |
使用建议:
如果你的任务比较简单,Cursor 的 Agent 模式足够用了。但如果需要复杂的代码探索或多 Agent 协作,Claude Code 的 SubAgent 更强大。
4.3 GitHub Copilot Workspace
GitHub Copilot Workspace 采用了多 Agent 协作的架构。
Agent 类型:
| Agent | 职责 |
|---|---|
| 规划 Agent | 分析需求,制定实现计划 |
| 编码 Agent | 根据计划编写代码 |
| 审查 Agent | 检查代码质量和安全性 |
| 测试 Agent | 生成测试用例 |
工作流程:
特点:
- 自动化程度高,用户只需描述需求
- 多 Agent 协作,各司其职
- 但自定义能力有限,不能添加自己的 Agent
4.4 对比总结
| 工具 | SubAgent 名称 | 触发方式 | 独立上下文 | 可自定义 | 多 Agent 协作 |
|---|---|---|---|---|---|
| Claude Code | code-explorer | 自动/手动 | ✅ | ✅ | ✅ |
| Cursor | Agent 模式 | 手动切换 | 部分 | ❌ | 有限 |
| Copilot Workspace | 内置多 Agent | 自动 | ✅ | ❌ | ✅ |
| Aider | 无内置 | - | - | ✅ | ❌ |
选择建议:
| 场景 | 推荐工具 |
|---|---|
| 需要自定义 SubAgent | Claude Code |
| 简单的代码辅助 | Cursor |
| 完整的需求到代码流程 | Copilot Workspace |
| 开源/本地部署 | Aider |
5. 自定义 SubAgent 实践
5.1 SubAgent 定义格式
在 Claude Code 中,SubAgent 的定义格式如下:
# 在 CLAUDE.md 或 AGENTS.md 中定义
name: code-reviewer
path: builtin # 或自定义路径
description: 代码审查子代理,用于检查代码质量、发现潜在问题
如果是自定义 SubAgent,需要创建一个 Markdown 文件来定义其行为:
# Code Reviewer SubAgent
## 职责
对代码进行审查,检查以下方面:
- 代码风格是否符合规范
- 是否存在潜在的 bug
- 性能是否有优化空间
- 安全性问题
## 可用工具
- read_file: 读取代码文件
- search_content: 搜索代码模式
## 输出格式
返回结构化的审查报告,包括:
1. 问题列表(严重程度、位置、描述)
2. 改进建议
3. 总体评价
5.2 创建自定义 SubAgent
以创建一个 “code-reviewer” SubAgent 为例,完整步骤如下:
第一步:定义 SubAgent 的职责
首先明确这个 SubAgent 要做什么:
## Code Reviewer 职责
1. 检查代码风格
- 命名规范
- 缩进和格式
- 注释完整性
2. 发现潜在问题
- 空指针/未定义检查
- 资源泄漏
- 异常处理
3. 性能分析
- N+1 查询
- 不必要的循环
- 内存使用
4. 安全检查
- SQL 注入
- XSS 漏洞
- 敏感信息泄露
第二步:配置可用工具
SubAgent 需要哪些工具来完成任务:
tools:
- read_file # 读取代码文件
- search_content # 搜索代码模式
- list_files # 列出目录结构
第三步:编写系统提示词
这是 SubAgent 的"大脑",决定了它的行为方式:
# Code Reviewer System Prompt
你是一个专业的代码审查员。你的任务是对代码进行全面审查,找出问题并提供改进建议。
## 审查流程
1. 首先了解代码的整体结构
2. 逐文件检查代码质量
3. 分析代码间的依赖关系
4. 汇总问题并分类
## 问题分类
- **Critical**: 必须修复,可能导致系统崩溃或安全漏洞
- **Major**: 应该修复,影响代码质量或性能
- **Minor**: 建议修复,代码风格或可读性问题
- **Info**: 仅供参考,最佳实践建议
## 输出格式
```markdown
## 代码审查报告
### 概述
[简要描述审查范围和总体评价]
### 问题列表
#### Critical
- [ ] 文件:行号 - 问题描述
#### Major
- [ ] 文件:行号 - 问题描述
#### Minor
- [ ] 文件:行号 - 问题描述
### 改进建议
[具体的改进建议]
### 总结
[总体评价和下一步建议]
\````
第四步:集成到主 Agent
在 CLAUDE.md 或 AGENTS.md 中注册这个 SubAgent:
## 可用 SubAgent
### code-reviewer
- **用途**:代码审查
- **触发**:当用户要求审查代码时使用
- **配置**:`.claude/subagents/code-reviewer.md`
5.3 SubAgent 提示词设计
好的提示词是 SubAgent 成功的关键。以下是设计原则:
1. 明确任务边界
# 好的写法
你只负责代码审查,不要修改代码,不要执行代码。
# 不好的写法
帮我检查一下代码。
2. 定义输出格式
# 好的写法
## 输出格式
返回 JSON 格式的审查结果:
{
"summary": "总体评价",
"issues": [
{"severity": "critical", "file": "xxx.ts", "line": 10, "message": "xxx"}
],
"suggestions": ["建议1", "建议2"]
}
# 不好的写法
返回审查结果。
3. 设置质量标准
# 好的写法
## 审查标准
- 必须检查所有公开方法的参数验证
- 必须检查异常处理是否完整
- 必须检查是否有硬编码的敏感信息
# 不好的写法
仔细检查代码。
5.4 实战案例:代码审查 SubAgent
下面是一个完整的代码审查 SubAgent 实现。
配置文件(.claude/subagents/code-reviewer.md):
# Code Reviewer SubAgent
## 角色定义
你是一个资深的代码审查员,拥有 10 年以上的软件开发经验。你擅长发现代码中的潜在问题,并能给出具体的改进建议。
## 审查维度
### 1. 代码正确性
- 逻辑错误
- 边界条件处理
- 空值检查
- 类型安全
### 2. 代码质量
- 命名规范(变量、函数、类)
- 代码重复
- 函数长度(建议不超过 50 行)
- 圈复杂度(建议不超过 10)
### 3. 性能问题
- 不必要的循环
- N+1 查询
- 内存泄漏风险
- 大对象拷贝
### 4. 安全问题
- SQL 注入
- XSS 漏洞
- 敏感信息泄露
- 不安全的依赖
### 5. 可维护性
- 注释完整性
- 代码结构清晰度
- 测试覆盖率
- 文档完整性
## 审查流程
1. **了解上下文**:先读取相关配置文件,了解项目规范
2. **逐文件审查**:对每个文件进行详细检查
3. **交叉验证**:检查文件间的依赖和调用关系
4. **汇总报告**:生成结构化的审查报告
## 输出格式
```markdown
# 代码审查报告
## 📊 概述
| 指标 | 值 |
|------|-----|
| 审查文件数 | X |
| 发现问题数 | X |
| Critical | X |
| Major | X |
| Minor | X |
## 🚨 Critical 问题
### [问题标题]
- **文件**:`path/to/file.ts`
- **行号**:10-15
- **描述**:问题描述
- **建议**:修复建议
```typescript
// 问题代码
\````
```typescript
// 建议修改
\````
## ⚠️ Major 问题
[同上格式]
## 💡 Minor 问题
[同上格式]
## ✅ 亮点
[代码中做得好的地方]
## 📝 总结
[总体评价和改进建议]
\````
## 注意事项
1. 不要修改任何代码,只做审查
2. 对于不确定的问题,标注为"待确认"
3. 给出的建议要具体可操作
4. 考虑项目的技术栈和规范
使用示例:
用户:请审查 src/services/user.ts 文件
Claude Code:
"我来启动 code-reviewer 子代理进行审查..."
[SubAgent 执行]
1. 读取 src/services/user.ts
2. 读取项目配置了解规范
3. 逐行分析代码
4. 生成审查报告
[返回结果]
# 代码审查报告
## 📊 概述
| 指标 | 值 |
|------|-----|
| 审查文件数 | 1 |
| 发现问题数 | 3 |
| Critical | 0 |
| Major | 1 |
| Minor | 2 |
## ⚠️ Major 问题
### 缺少参数验证
- **文件**:`src/services/user.ts`
- **行号**:25
- **描述**:`updateUser` 函数没有验证 `userId` 参数
- **建议**:添加参数验证
```typescript
// 当前代码
async function updateUser(userId: string, data: UserData) {
return db.user.update({ where: { id: userId }, data });
}
\````
```typescript
// 建议修改
async function updateUser(userId: string, data: UserData) {
if (!userId || typeof userId !== 'string') {
throw new Error('Invalid userId');
}
return db.user.update({ where: { id: userId }, data });
}
\````
## 💡 Minor 问题
...
## ✅ 亮点
- 使用了 TypeScript 类型定义
- 函数命名清晰
- 代码结构简洁
## 📝 总结
整体代码质量良好,建议补充参数验证逻辑,提高代码健壮性。
6. 最佳实践
6.1 何时使用 SubAgent
✅ 适合使用 SubAgent 的场景:
| 场景 | 说明 |
|---|---|
| 代码探索 | 不知道代码在哪里,需要广泛搜索 |
| 项目分析 | 分析整个项目的结构、依赖关系 |
| 代码审查 | 检查多个文件的代码质量 |
| 重构评估 | 评估重构的影响范围 |
| 文档生成 | 基于代码生成文档 |
❌ 不适合使用 SubAgent 的场景:
| 场景 | 原因 |
|---|---|
| 读取已知文件 | 直接用 read_file 更快 |
| 简单搜索 | 一次 search_content 就能搞定 |
| 修改代码 | SubAgent 应该只读不写 |
| 执行命令 | SubAgent 不应该有执行权限 |
判断标准:
6.2 SubAgent 设计原则
1. 单一职责
每个 SubAgent 只做一件事。
# 好的设计
code-explorer: 只负责代码探索
code-reviewer: 只负责代码审查
test-generator: 只负责生成测试
# 不好的设计
super-agent: 什么都能做
2. 明确边界
清晰定义输入输出。
## 输入
- 任务描述(字符串)
- 目标文件/目录(可选)
## 输出
- 结构化报告(Markdown 格式)
- 包含:概述、详情、建议
3. 精简输出
只返回必要信息,不要返回原始数据。
# 好的输出
"项目使用 React 18 + TypeScript,入口文件是 src/main.tsx,共有 15 个组件"
# 不好的输出
[返回所有文件的完整内容]
4. 可组合性
多个 SubAgent 可以协作完成复杂任务。
6.3 常见问题与解决方案
Q1: SubAgent 返回结果太长怎么办?
A: 在 SubAgent 的提示词中明确限制输出长度:
## 输出限制
- 总结部分不超过 200 字
- 问题列表最多 10 条
- 每条问题描述不超过 50 字
Q2: SubAgent 搜索不到想要的内容?
A: 检查以下几点:
- 搜索关键词是否准确
- 文件路径是否正确
- 是否需要使用正则表达式
- 是否被 .gitignore 排除
Q3: 如何调试 SubAgent?
A: 可以通过以下方式:
- 让 SubAgent 返回详细的执行日志
- 分步执行,检查每一步的结果
- 在提示词中添加 “请说明你的思考过程”
Q4: SubAgent 执行太慢怎么办?
A: 优化策略:
- 缩小搜索范围(指定具体目录)
- 使用更精确的搜索模式
- 限制读取的文件数量
- 并行执行多个搜索
7. 进阶话题
7.1 多 SubAgent 协作
复杂任务可能需要多个 SubAgent 协作完成。
串行调用:
A 的结果作为 B 的输入。
并行调用:
同时启动多个 SubAgent,加快执行速度。
实际案例:
7.2 SubAgent 与 MCP 的关系
MCP(Model Context Protocol)是 Anthropic 提出的模型上下文协议,用于扩展 AI 的能力。
关系说明:
扩展 SubAgent 能力:
通过 MCP,SubAgent 可以:
- 查询数据库,分析数据模式
- 调用外部 API,获取更多信息
- 与其他服务集成,完成复杂任务
示例:
# Database Analyzer SubAgent
## 可用工具
- MCP: database_query(查询数据库)
- MCP: schema_info(获取表结构)
- read_file(读取代码中的 SQL)
## 任务
分析数据库设计,检查:
1. 表结构是否合理
2. 索引是否完整
3. 外键关系是否正确
7.3 未来发展趋势
1. 更智能的 SubAgent 调度
未来的 AI 编程助手可能会自动判断何时需要调用 SubAgent,以及调用哪个 SubAgent。
2. 自学习的 SubAgent
SubAgent 可能会根据使用情况自动优化自己的行为:
- 记住常用的搜索模式
- 学习项目的代码风格
- 适应开发者的偏好
3. 跨工具的 SubAgent 标准化
目前各工具的 SubAgent 实现不统一,未来可能会出现标准化协议:
- 统一的定义格式
- 统一的调用接口
- 跨工具的 SubAgent 共享
8. 总结
8.1 核心要点回顾
写这篇文章的过程中,我对 SubAgent 的理解更加深刻了。说实话,一开始我也觉得这不就是让 AI 调用另一个 AI 嘛,有什么特别的?但深入研究后发现,这里面的设计思想还是很精妙的。
总结一下核心要点:
-
SubAgent 是什么:主 Agent 可以调用的专门化子代理,拥有独立的上下文空间,专注于特定任务。
-
为什么需要 SubAgent:解决上下文窗口限制、实现专业化分工、降低 Token 消耗。
-
如何使用 SubAgent:
- 代码探索用
code-explorer - 代码审查用
code-reviewer - 复杂任务可以多 SubAgent 协作
- 代码探索用
-
如何自定义 SubAgent:
- 明确职责边界
- 设计好提示词
- 定义输出格式
- 集成到主 Agent
8.2 选择建议
| 场景 | 建议 |
|---|---|
| 简单的代码辅助 | 不需要 SubAgent,直接用工具 |
| 代码探索和分析 | 使用内置的 code-explorer |
| 代码审查 | 自定义 code-reviewer SubAgent |
| 复杂的多步骤任务 | 多 SubAgent 协作 |
8.3 个人感悟
SubAgent 的出现,让我看到了 AI 编程助手的发展方向——不是一个"全能"的 AI,而是一个"会分工协作"的 AI 团队。
这和软件工程的发展历程很像:从单体应用到微服务,从单打独斗到团队协作。AI 也在走同样的路。
未来,我们可能会看到更多专业化的 SubAgent:
- 专门做代码审查的
- 专门做性能优化的
- 专门做安全扫描的
- 专门做文档生成的
每个 SubAgent 都是某个领域的专家,协作起来就能完成复杂的开发任务。
参考资料
更多推荐


所有评论(0)