问:我让AI分析项目里用了什么测试框架,它读了5个文件后开始胡扯,告诉我“项目使用Jest”——明明应该是pytest。为什么会这样?
答:因为它的上下文被垃圾信息塞满了。
问:什么意思?不是读了文件会更清楚吗?
答:读文件本身没错,错的是读完后那些内容一直堆在对话里。5个文件的内容加上命令输出,上下文里已经积累了几千个token。而你最初的问题“用了什么测试框架”反而被挤到了边缘。
问:那怎么办?不读文件了?
答:不是不读,而是换个地方读。
s04要解决的就是这个问题。它引入了一个新机制:Subagent(子Agent)。
核心思路异常简单:当主Agent遇到一个需要大量探索的子任务时,它不自己动手,而是派一个“临时工”出去。这个临时工拥有全新的对话上下文,与主Agent完全隔离。临时工完成任务后,只把结论带回来,中间那些读文件、试命令、走弯路又重试的过程,全部丢弃。
def run_subagent(task: str) -> str:
messages = [{"role": "user", "content": task}]
# 子Agent的messages[]是全新的,跟主对话完全隔离
for _ in range(30): # 最多30轮
response = client.messages.create(
model=MODEL, system=SYSTEM, messages=messages,
tools=CHILD_TOOLS, max_tokens=8000,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
# 返回最终文本结果,整个对话历史丢弃
return next((b.text for b in response.content
if hasattr(b, "text")), "(no result)")
# ...执行工具,继续循环
注意两个关键点:messages = [{"role": "user", "content": task}] 是从零开始的,主对话里那些乱七八糟的工具调用结果、报错信息,子Agent一个字都看不到。另外还有一个安全限制:子Agent的工具列表里没有 task 工具,所以它不能再派自己的子Agent,从而防止无限套娃。
问:具体跑起来效果如何?
答:我实际试了一下。对主Agent说“这个项目用了什么测试框架?”
没有Subagent的时候,主Agent自己去读文件:先读 pyproject.toml,再读 setup.py,再读某个测试文件看看import了什么……读完后上下文里堆了三份文件内容。回答完你的问题之后,这些内容还在上下文里,影响后面的对话。
有了Subagent,主Agent调用 task 工具,把问题甩给子Agent:“去查一下这个项目用的测试框架。”子Agent在自己的干净上下文里读文件、跑命令,最后只带回一句话:“pytest。”
主Agent的上下文里只剩下:“用户问了测试框架 → 子Agent说pytest。”干干净净。
问:这跟Claude Code有什么关系?
答:Claude Code里的Subagent就是这个机制的产品级实现。你在Claude Code里让它做一件复杂的事,比如“帮我重构这个模块”,它会自己拆成子任务,每个子任务用独立的上下文执行。你在Claude Code界面上看到的“Dispatching agent...”提示,就是在派子Agent。
问:听起来就像多进程,没什么新奇的啊?
答:这不是多进程,而是上下文隔离。多进程强调的是并行执行,Subagent强调的是信息隔离。就算你的子Agent是串行执行的,隔离上下文的价值依然在——主对话不会被子任务的噪音污染。
这个思路在很多场景都适用。你在公司里处理一个大项目,核心决策层只看最终结论,不需要知道执行层翻了几个文件、试了几种方案。Subagent就是给Agent建了同样的信息分层。
问:那子Agent读的文件内容不会丢吗?
答:会丢,但这正是设计意图。子Agent读完文件、得出结论后,文件内容和中间过程全部丢弃。下次需要的时候,再派一个新的子Agent去读。有人说这不是浪费token吗?确实有点,但比另一种情况好得多:主对话被几十个文件的冗余内容塞满,到后面连你的原始指令都记不住了。丢了中间过程,保住了决策质量。 这账算下来是划算的。
项目地址:https://github.com/shareAI-lab/learn-claude-code
运行一下试试,给它一个需要探索的任务:
python agents/s04_subagent.py
比如“分析这个项目有哪些Python模块,每个模块的职责是什么”,看看主Agent会不会派子Agent出去干活。
搞Agent开发有个很深的体会:上下文管理比工具设计难多了。工具是你主动添加的,上下文膨胀却是你被动承受的。Subagent是第一个对抗上下文污染的机制,后续的s05和s06还会从另外两个角度解决同类问题,值得持续关注。