<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://www.anwsome.com//index.php?action=history&amp;feed=atom&amp;title=%E5%AD%90%E6%99%BA%E8%83%BD%E4%BD%93%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%EF%BC%9A%E4%BF%9D%E6%8C%81%E6%80%9D%E7%BB%B4%E6%B8%85%E6%99%B0%E7%9A%84%E5%85%B3%E9%94%AE</id>
	<title>子智能体与上下文隔离：保持思维清晰的关键 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://www.anwsome.com//index.php?action=history&amp;feed=atom&amp;title=%E5%AD%90%E6%99%BA%E8%83%BD%E4%BD%93%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%EF%BC%9A%E4%BF%9D%E6%8C%81%E6%80%9D%E7%BB%B4%E6%B8%85%E6%99%B0%E7%9A%84%E5%85%B3%E9%94%AE"/>
	<link rel="alternate" type="text/html" href="http://www.anwsome.com//index.php?title=%E5%AD%90%E6%99%BA%E8%83%BD%E4%BD%93%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%EF%BC%9A%E4%BF%9D%E6%8C%81%E6%80%9D%E7%BB%B4%E6%B8%85%E6%99%B0%E7%9A%84%E5%85%B3%E9%94%AE&amp;action=history"/>
	<updated>2026-04-15T01:42:20Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://www.anwsome.com//index.php?title=%E5%AD%90%E6%99%BA%E8%83%BD%E4%BD%93%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%EF%BC%9A%E4%BF%9D%E6%8C%81%E6%80%9D%E7%BB%B4%E6%B8%85%E6%99%B0%E7%9A%84%E5%85%B3%E9%94%AE&amp;diff=114&amp;oldid=prev</id>
		<title>Admin：​创建页面，内容为“&lt;blockquote&gt;&quot;大任务拆小，每个小任务干净的上下文&quot; —— 子智能体用独立 messages[]，不污染主对话。&lt;/blockquote&gt;随着 Agent 工作，messages 数组越来越胖。每次读文件、跑命令的输出都永久留在上下文里。  &#039;&#039;&#039;&quot;这个项目用什么测试框架？&quot;&#039;&#039;&#039; 这个问题可能需要读 5 个文件，但父智能体只需要一个词：&#039;&#039;&#039;&quot;pytest&quot;&#039;&#039;&#039;。  如何把探索的细节隔离，只把结论带回？  ==…”</title>
		<link rel="alternate" type="text/html" href="http://www.anwsome.com//index.php?title=%E5%AD%90%E6%99%BA%E8%83%BD%E4%BD%93%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E9%9A%94%E7%A6%BB%EF%BC%9A%E4%BF%9D%E6%8C%81%E6%80%9D%E7%BB%B4%E6%B8%85%E6%99%B0%E7%9A%84%E5%85%B3%E9%94%AE&amp;diff=114&amp;oldid=prev"/>
		<updated>2026-03-23T05:00:00Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;blockquote&amp;gt;&amp;quot;大任务拆小，每个小任务干净的上下文&amp;quot; —— 子智能体用独立 messages[]，不污染主对话。&amp;lt;/blockquote&amp;gt;随着 Agent 工作，messages 数组越来越胖。每次读文件、跑命令的输出都永久留在上下文里。  &amp;#039;&amp;#039;&amp;#039;&amp;quot;这个项目用什么测试框架？&amp;quot;&amp;#039;&amp;#039;&amp;#039; 这个问题可能需要读 5 个文件，但父智能体只需要一个词：&amp;#039;&amp;#039;&amp;#039;&amp;quot;pytest&amp;quot;&amp;#039;&amp;#039;&amp;#039;。  如何把探索的细节隔离，只把结论带回？  ==…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;quot;大任务拆小，每个小任务干净的上下文&amp;quot; —— 子智能体用独立 messages[]，不污染主对话。&amp;lt;/blockquote&amp;gt;随着 Agent 工作，messages 数组越来越胖。每次读文件、跑命令的输出都永久留在上下文里。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;quot;这个项目用什么测试框架？&amp;quot;&amp;#039;&amp;#039;&amp;#039; 这个问题可能需要读 5 个文件，但父智能体只需要一个词：&amp;#039;&amp;#039;&amp;#039;&amp;quot;pytest&amp;quot;&amp;#039;&amp;#039;&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
如何把探索的细节隔离，只把结论带回？&lt;br /&gt;
&lt;br /&gt;
== 一、问题：上下文膨胀 ==&lt;br /&gt;
想象这个场景：&lt;br /&gt;
&lt;br /&gt;
父 Agent 正在做大型重构，上下文里已经累积了：&lt;br /&gt;
&lt;br /&gt;
* 20 个文件的读取结果&lt;br /&gt;
* 10 次测试运行输出&lt;br /&gt;
* 5 次 Git 状态检查&lt;br /&gt;
* 各种中间文件的 diff&lt;br /&gt;
&lt;br /&gt;
现在它想知道：&amp;#039;&amp;#039;&amp;#039;&amp;quot; utils.py 里的 &amp;lt;code&amp;gt;parse_data&amp;lt;/code&amp;gt; 函数是做什么的？&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
为此它需要：&lt;br /&gt;
&lt;br /&gt;
# 读取 utils.py&lt;br /&gt;
# 查看相关依赖&lt;br /&gt;
# 分析函数逻辑&lt;br /&gt;
# 返回结论&lt;br /&gt;
&lt;br /&gt;
这些探索过程会进一步膨胀父 Agent 的上下文，稀释真正重要的信息。&lt;br /&gt;
&lt;br /&gt;
== 二、解决方案：子智能体 ==&lt;br /&gt;
 &amp;lt;code&amp;gt;Parent agent                     Subagent&lt;br /&gt;
 +------------------+             +------------------+&lt;br /&gt;
 | messages=[...]   |             | messages=[]      | &amp;lt;-- fresh&lt;br /&gt;
 |                  |  dispatch   |                  |&lt;br /&gt;
 | tool: task       | ----------&amp;gt; | while tool_use:  |&lt;br /&gt;
 |   prompt=&amp;quot;...&amp;quot;   |             |   call tools     |&lt;br /&gt;
 |                  |  summary    |   append results |&lt;br /&gt;
 |   result = &amp;quot;...&amp;quot; | &amp;lt;---------- | return last text |&lt;br /&gt;
 +------------------+             +------------------+&lt;br /&gt;
 &lt;br /&gt;
 Parent context stays clean. Subagent context is discarded.&amp;lt;/code&amp;gt;&lt;br /&gt;
父智能体有一个 &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt; 工具。子智能体运行自己的循环，只有最终文本返回给父智能体。&lt;br /&gt;
&lt;br /&gt;
== 三、核心机制 ==&lt;br /&gt;
&lt;br /&gt;
=== 1. 工具分离 ===&lt;br /&gt;
父智能体拥有所有基础工具 + &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt;：&lt;br /&gt;
 &amp;lt;code&amp;gt;PARENT_TOOLS = CHILD_TOOLS + [&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       &amp;quot;name&amp;quot;: &amp;quot;task&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       &amp;quot;description&amp;quot;: &amp;quot;Spawn a subagent with fresh context.&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       &amp;quot;input_schema&amp;quot;: {&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           &amp;quot;properties&amp;quot;: {&amp;quot;prompt&amp;quot;: {&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;}},&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           &amp;quot;required&amp;quot;: [&amp;quot;prompt&amp;quot;],&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   },&lt;br /&gt;
 ]&amp;lt;/code&amp;gt;&lt;br /&gt;
子智能体拥有除 &amp;lt;code&amp;gt;task&amp;lt;/code&amp;gt; 外的所有基础工具（禁止递归生成）。&lt;br /&gt;
&lt;br /&gt;
=== 2. 独立循环 ===&lt;br /&gt;
子智能体以 &amp;lt;code&amp;gt;messages=[]&amp;lt;/code&amp;gt; 启动，运行自己的循环：&lt;br /&gt;
 &amp;lt;code&amp;gt;def run_subagent(prompt: str) -&amp;gt; str:&lt;br /&gt;
     sub_messages = [{&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: prompt}]&lt;br /&gt;
     for _ in range(30):  &amp;#039;&amp;#039;# 安全限制&amp;#039;&amp;#039;&lt;br /&gt;
         response = client.messages.create(&lt;br /&gt;
             model=MODEL, system=SUBAGENT_SYSTEM,&lt;br /&gt;
             messages=sub_messages,&lt;br /&gt;
             tools=CHILD_TOOLS, max_tokens=8000,&lt;br /&gt;
         )&lt;br /&gt;
         sub_messages.append({&lt;br /&gt;
             &amp;quot;role&amp;quot;: &amp;quot;assistant&amp;quot;,&lt;br /&gt;
             &amp;quot;content&amp;quot;: response.content&lt;br /&gt;
         })&lt;br /&gt;
         if response.stop_reason != &amp;quot;tool_use&amp;quot;:&lt;br /&gt;
             break&lt;br /&gt;
         results = []&lt;br /&gt;
         for block in response.content:&lt;br /&gt;
             if block.type == &amp;quot;tool_use&amp;quot;:&lt;br /&gt;
                 handler = TOOL_HANDLERS.get(block.name)&lt;br /&gt;
                 output = handler(**block.input)&lt;br /&gt;
                 results.append({&lt;br /&gt;
                     &amp;quot;type&amp;quot;: &amp;quot;tool_result&amp;quot;,&lt;br /&gt;
                     &amp;quot;tool_use_id&amp;quot;: block.id,&lt;br /&gt;
                     &amp;quot;content&amp;quot;: str(output)[:50000],&lt;br /&gt;
                 })&lt;br /&gt;
         sub_messages.append({&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: results})&lt;br /&gt;
     &lt;br /&gt;
     &amp;#039;&amp;#039;# 只返回摘要文本&amp;#039;&amp;#039;&lt;br /&gt;
     return &amp;quot;&amp;quot;.join(&lt;br /&gt;
         b.text for b in response.content if hasattr(b, &amp;quot;text&amp;quot;)&lt;br /&gt;
     ) or &amp;quot;(no summary)&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. 上下文隔离 ===&lt;br /&gt;
子智能体可能跑了 30+ 次工具调用，但&amp;#039;&amp;#039;&amp;#039;整个消息历史直接丢弃&amp;#039;&amp;#039;&amp;#039;。父智能体收到的只是一段摘要文本，作为普通 &amp;lt;code&amp;gt;tool_result&amp;lt;/code&amp;gt; 返回。&lt;br /&gt;
&lt;br /&gt;
== 四、使用场景 ==&lt;br /&gt;
&lt;br /&gt;
=== 场景 1：信息检索 ===&lt;br /&gt;
 &amp;lt;code&amp;gt;父 Agent：这个项目用什么测试框架？&lt;br /&gt;
 ↓&lt;br /&gt;
 子 Agent（独立上下文）：&lt;br /&gt;
   - 读取 pytest.ini&lt;br /&gt;
   - 读取 setup.py&lt;br /&gt;
   - 检查测试目录结构&lt;br /&gt;
   - 分析依赖&lt;br /&gt;
 ↓&lt;br /&gt;
 返回：&amp;quot;pytest&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
父 Agent 的上下文保持干净，只有结论。&lt;br /&gt;
&lt;br /&gt;
=== 场景 2：多文件分析 ===&lt;br /&gt;
 &amp;lt;code&amp;gt;父 Agent：分析所有 Python 文件的依赖关系&lt;br /&gt;
 ↓&lt;br /&gt;
 子 Agent：&lt;br /&gt;
   - 遍历所有 .py 文件&lt;br /&gt;
   - 提取 import 语句&lt;br /&gt;
   - 构建依赖图&lt;br /&gt;
   - 生成报告&lt;br /&gt;
 ↓&lt;br /&gt;
 返回：精简的依赖关系摘要&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 场景 3：代码生成 ===&lt;br /&gt;
 &amp;lt;code&amp;gt;父 Agent：创建一个数据处理模块&lt;br /&gt;
 ↓&lt;br /&gt;
 子 Agent：&lt;br /&gt;
   - 设计 API&lt;br /&gt;
   - 实现核心函数&lt;br /&gt;
   - 添加错误处理&lt;br /&gt;
   - 编写测试&lt;br /&gt;
 ↓&lt;br /&gt;
 返回：模块完成确认 + 文件路径&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 五、试一试 ==&lt;br /&gt;
 &amp;lt;code&amp;gt;cd learn-claude-code&lt;br /&gt;
 python agents/s04_subagent.py&amp;lt;/code&amp;gt;&lt;br /&gt;
试试这些 prompt：&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;Use a subtask to find what testing framework this project uses&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;Delegate: read all .py files and summarize what each one does&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;Use a task to create a new module, then verify it from here&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
观察父 Agent 如何派发子任务，子 Agent 独立工作，最后只返回简洁的结果。&lt;br /&gt;
&lt;br /&gt;
== 六、对比无隔离 vs 有隔离 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!场景&lt;br /&gt;
!无子智能体&lt;br /&gt;
!有子智能体&lt;br /&gt;
|-&lt;br /&gt;
|探索性任务&lt;br /&gt;
|上下文膨胀，主任务迷失&lt;br /&gt;
|探索细节隔离，主任务清晰&lt;br /&gt;
|-&lt;br /&gt;
|多文件分析&lt;br /&gt;
|所有文件内容留在上下文&lt;br /&gt;
|只保留分析结论&lt;br /&gt;
|-&lt;br /&gt;
|长对话&lt;br /&gt;
|后期上下文窗口溢出&lt;br /&gt;
|定期清理，保持高效&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 七、进阶：递归与层级 ==&lt;br /&gt;
本文的子智能体是单层的。更复杂的系统可以支持：&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;递归子智能体&amp;#039;&amp;#039;&amp;#039;：子智能体也可以派发孙智能体&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;层级架构&amp;#039;&amp;#039;&amp;#039;：父-子-孙三级结构，每层有不同职责&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;并行子智能体&amp;#039;&amp;#039;&amp;#039;：同时派发多个子任务，聚合结果&lt;br /&gt;
&lt;br /&gt;
但要注意：&amp;#039;&amp;#039;&amp;#039;层级越深，协调成本越高&amp;#039;&amp;#039;&amp;#039;。对于多数场景，单层子智能体已经足够。&lt;br /&gt;
&lt;br /&gt;
== 八、Harness 层的职责 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;守护模型的思维清晰度&amp;#039;&amp;#039;&amp;#039;——这是 Harness 的核心职责之一。&lt;br /&gt;
&lt;br /&gt;
* 子智能体隔离是机制&lt;br /&gt;
* 模型决定什么时候用、用来做什么&lt;br /&gt;
* Harness 保证隔离的执行&lt;br /&gt;
&lt;br /&gt;
这种设计模式不仅适用于编程 Agent，也适用于任何需要复杂推理的场景：&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;研究 Agent&amp;#039;&amp;#039;&amp;#039;：主 Agent 协调，子 Agent 深入具体领域&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;客服 Agent&amp;#039;&amp;#039;&amp;#039;：主 Agent 处理对话，子 Agent 查询知识库&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;创意 Agent&amp;#039;&amp;#039;&amp;#039;：主 Agent 把控方向，子 Agent 探索具体方案&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;好的 Harness 像一个好的工作环境——提供清晰的边界，让智能高效运转。&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
----&amp;#039;&amp;#039;Bash 就够了。真正的 Agent 是宇宙所需要的全部。&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>