用子代理把脏活隔离出去,保住主对话的上下文

读四十份材料会把主对话塞满,而那些原文你之后再也不会看第二眼。让子代理在自己的窗口里读完,只把结论带回来。

2026/08/06约 6 分钟HiBridge 原创
方法来源本文由 HiBridge 撰写,方法来自下面的出处。
出处
Create custom subagents
来自
Anthropic 官方文档
查证日期
2026/08/06

让它读四十份访谈稿,然后基于这些写一份发现总结。

问题是:四十份原文全都进了主对话的上下文。等它开始写总结时,上下文已经被原文塞满,而那些原文你之后一眼都不会再看。这正是上下文腐化最典型的触发方式。

子代理(subagent)就是为这个场景设计的。

它解决什么

官方的说法很准确:

当一项副任务会用你之后不会再引用的搜索结果、日志或文件内容淹没你的主对话时,就用一个子代理:它在自己的上下文里做那些工作,只返回摘要

每个子代理运行在自己独立的上下文窗口里,有自己的系统提示词、指定的工具权限和独立的许可设置。

官方列的几项收益:

  • 保住上下文——把探索和执行挡在主对话之外
  • 强制约束——限制某个子代理能用哪些工具
  • 复用配置——用户级的子代理可跨项目使用
  • 专门化行为——为特定领域配聚焦的系统提示词
  • 控制成本——把任务路由给更快更便宜的模型(比如 Haiku)

最后一条常被忽略。 「把四十份稿子读一遍并摘出要点」这种活儿,不需要最贵的模型。

怎么配

一个子代理就是一个 Markdown 文件:

Markdown
---
name: interview-reader
description: 读取指定的访谈转录稿,按项目框架摘出要点。需要批量阅读访谈材料时使用。
tools: Read, Grep, Glob
model: sonnet
---

你是访谈材料的阅读者。对每一份材料:

1. 按 @docs/编码框架.md 的类目摘出要点
2. 每条要点附一句逐字原话,并标注访谈编号
3. 材料里没有依据的写「未涉及」,不要推断

**只返回结构化的要点,不要返回原文。** 主对话不需要看到转录稿本身。

放在哪决定作用范围:

位置 范围
~/.claude/agents/<名字>.md 你机器上的所有项目
.claude/agents/<名字>.md 只在这个项目

配好之后,主对话里说「用 interview-reader 把 interviews/ 下的材料都读一遍」就行。

最关键的一行

上面那份配置里,真正起作用的是这句:

只返回结构化的要点,不要返回原文。

子代理的价值全在返回什么上。 如果它把读到的内容原样带回来,那和你自己读没有区别——上下文照样被填满,你只是多绕了一圈。

写子代理的提示词时,明确规定返回的形态和篇幅

返回一张表格,每份材料一行:编号 | 三条要点 | 最有代表性的一句原话。
不要返回完整转录稿,不要返回你的分析过程。

什么时候该用,什么时候不该

该用

  • 要读一批文件,但你只关心结论
  • 要在大量材料里做检索,中间过程你不关心
  • 同一类活儿反复做,值得固化一个专门的配置

不该用

  • 一次性的、简单的任务——配置成本高于收益
  • 你需要看到中间过程的任务——比如你想跟着它一起判断某段话该怎么归类
  • 需要来回讨论的任务——子代理是「派出去、拿回来」,不适合对话

官方还有一条重要提醒(见检查点那篇):子代理做的文件编辑,主会话的检查点回退不到。 要撤销只能靠 Git。所以让子代理只读是更稳的默认——需要它改文件时,先确认目录已纳入版本管理。

tools 字段限制权限是最直接的做法:只给 Read, Grep, Glob,它就改不了任何东西。

一个典型的两段式流程

主对话:规划 + 综合
   │
   ├─→ 子代理 A:读 interviews/ 全部材料 → 返回要点表
   │
   ├─→ 子代理 B:读客户历史报告 → 返回背景摘要
   │
   └─→ 主对话拿着两张表写发现章节

主对话从头到尾没有见过任何一份原文,但拿到了写作所需的全部信息。

这就是上下文工程里说的「关注点分离」:详细的检索上下文被隔离在子代理内部,主对话专注于综合与分析。

和 Skill 的区别

两个概念容易混:

Skill 子代理
是什么 一套流程说明 一个独立的执行者
上下文 加载进当前对话 有自己的上下文窗口
用来 规定「这件事怎么做」 把一件事派出去做完

可以组合:让子代理在执行时使用某个 Skill。

判断标准:你要的是「让它按某套方法做」→ Skill;你要的是「让它去把这堆东西读完但别把原文带回来」→ 子代理。