无限上下文的问题
想象一下,你让 Claude 研究项目的身份验证是如何工作的。它开始读取文件。很多文件。突然你的上下文就被 50,000 个令牌的代码填满了,而这些代码你只需要查阅,而不是记住。
现在每个响应都变得更慢。也更贵。当你想做其他事情时,所有这些上下文仍然在那里,占用着思维空间。
解决方案:子代理。你启动一个专门的代理,它在自己的独立上下文中完成繁重的工作,给你返回一个摘要,然后消失。你的主对话保持清洁。
什么是子代理
子代理是 Claude 的一个独立实例,它:
- 拥有自己的上下文(不会污染你的对话)
- 可以拥有受限的工具(只读、只有 bash 等)
- 可以使用不同的模型(haiku 用于简单任务,opus 用于复杂任务)
- 可以在前台(阻塞)或后台(并行)执行
把它们想象成专门的实习生。你给他们分配任务,他们独立工作,完成后向你汇报。
你已经拥有的子代理
Claude Code 自带几个集成的子代理:
| 代理 | 模型 | 用途 | 工具 |
|---|---|---|---|
| Explore | Haiku | 搜索和分析代码 | 只读 |
| Plan | 继承 | 规划期间的研究 | 只读 |
| general-purpose | 继承 | 复杂的多步骤任务 | 全部 |
| Bash | 继承 | 在独立上下文中执行命令 | 只有 Bash |
| Claude Code Guide | Haiku | 关于 Claude Code 的问题 | 文档 |
最有用的是 Explore。当 Claude 需要在你的代码库中搜索内容时,它会启动一个 Explore,疯狂地读取文件,处理一切,然后只返回相关内容。
如何启动子代理
从 REPL(正常对话)
只需用自然语言请求:
使用子代理研究缓存系统是如何工作的
启动 Explore 代理找到所有 API 端点
在我继续工作的同时并行研究身份验证
Claude 理解这些请求,并在内部使用 Task 工具启动适当的子代理。
从技能(Skill)
在技能中,你可以通过 context: fork 强制在独立的子代理中执行:
| |
使用 context: fork,技能在子代理中执行。使用 agent: Explore,你指定使用哪种类型的代理。
按类型显式启动
如果你想要具体指定:
使用 Explore 代理映射项目结构
使用 general-purpose 代理重构支付模块
使用 Bash 代理执行完整的测试套件
前台 vs 后台
前台(阻塞)
默认情况下,子代理在前台执行。你的会话等待它们完成。
研究速率限制是如何工作的
[Claude 启动子代理,你等待,接收结果]
当你需要立即得到结果时很有用。
后台(并行)
你可以通过两种方式将子代理发送到后台:
1. 明确请求:
在后台研究缓存系统,同时我检查其他东西
2. 在执行时使用 Ctrl+B:
如果子代理已经在运行,你想继续工作,按 Ctrl+B。代理转入后台,你可以继续。
> 分析项目中的所有测试
[开始执行...]
[按 Ctrl+B]
> 好的,同时请解释这个文件的作用
[继续工作,分析在并行进行]
查看后台任务
使用 /tasks 命令查看正在运行的任务:
/tasks
这显示所有后台任务及其 ID、状态和进度。
与子代理的通信
了解它在做什么
当子代理在前台时,你可以实时看到其进度(它读取哪些文件,执行哪些命令)。
如果它在后台,使用 /tasks 查看状态。完成时,Claude 会自动通知你结果。
给出额外指令
如果子代理正在运行,你想添加上下文:
顺便说一下,忽略测试文件,我只对生产代码感兴趣
如果可能的话,Claude 会尝试将这些信息传递给子代理。
停止子代理
要停止后台任务:
停止分析任务
取消正在运行的子代理
或者从 /tasks,你可以通过 ID 取消特定任务。
恢复子代理
子代理在会话内保持其历史记录。你可以从中断的地方继续:
继续之前的身份验证分析
现在也检查授权
Claude 使用其完整的先前上下文恢复子代理。
创建你自己的子代理
使用 /agents 命令(推荐)
/agents
选择 Create new agent,选择范围(用户或项目),描述你想要的,Claude 会为你生成文件。
手动创建
在 .claude/agents/(项目)或 ~/.claude/agents/(全局)中创建 Markdown 文件:
| |
前言配置
| 字段 | 必需 | 描述 |
|---|---|---|
name | 是 | 唯一标识符(小写和连字符) |
description | 是 | 何时使用代理(Claude 读取此信息) |
tools | 否 | 允许的工具(默认:全部) |
disallowedTools | 否 | 禁止的工具 |
model | 否 | haiku、sonnet、opus 或 inherit |
permissionMode | 否 | 如何处理权限 |
skills | 否 | 要注入到上下文中的技能 |
hooks | 否 | 生命周期钩子 |
权限模式
| 模式 | 行为 |
|---|---|
default | 像往常一样请求权限 |
acceptEdits | 自动接受文件编辑 |
dontAsk | 自动拒绝未请求的操作 |
bypassPermissions | 跳过所有权限(危险) |
plan | 只读模式 |
示例:只读代理
| |
示例:测试代理
| |
常见用例
1. 代码库研究
使用 Explore 了解通知系统是如何工作的
Explore 读取所有必要的内容,你收到摘要而不会污染你的上下文。
2. 并行分析
并行研究:
- 身份验证如何工作
- 支付系统如何工作
- 邮件发送如何工作
Claude 启动三个并发的子代理。每个研究其区域。
3. 后台测试
在我实现这个功能的同时在后台执行测试
你不必等待。当它们失败(或通过)时,它会通知你。
4. 隔离的代码审查
使用子代理审查我刚才所做更改的安全性
审查在独立的上下文中进行。你收到反馈而没有噪音。
5. 安全重构
| |
每次编辑都会自动触发测试。
子代理 vs 技能:何时使用每一个
| 需求 | 使用 |
|---|---|
| 在主上下文中的可重用指令 | 技能 |
| 生成大量输出的任务 | 子代理 |
| 为操作限制工具 | 子代理 |
| 独立的并行工作 | 子代理 |
| 有我想看到的定义步骤的过程 | 技能 |
| 我不需要记住的研究 | 子代理 |
你也可以组合使用:带有 context: fork 的技能启动子代理。
限制
- 不能嵌套:子代理不能启动另一个子代理
- 后台权限:后台的子代理自动拒绝未预批准的权限
- 单一会话:子代理的上下文只在会话期间存在
高级技巧
禁用特定子代理
在 settings.json 中:
| |
自动压缩
子代理在上下文的 95% 时有自动压缩。要更早触发:
| |
查看转录
子代理日志保存在:
~/.claude/projects/{project}/{session}/subagents/agent-{id}.jsonl
对调试或审计很有用。
禁用后台任务
如果你希望一切都是阻塞的:
| |
结论
子代理是在不让上下文爆炸的情况下扩展 Claude Code 使用的方法。它们委派繁重的工作,保持你的对话清洁,并可以并行工作。
将它们用于研究、分析、测试和任何生成大量你不需要记住的输出的任务。为具有特定限制的重复任务创建你自己的代理。
技能(做什么)+ 子代理(在哪里做)+ 钩子(何时验证)的组合给你对 Claude 如何工作的相当细致的控制。
总结:子代理是用于特定任务的 Claude 的隔离实例。它们保持你的上下文清洁,可以并行运行(Ctrl+B),你可以在 .claude/agents/ 中创建自己的代理。使用 /tasks 监控它们,使用 /agents 管理它们。