# 三行速读
- 子智能体的本质不是并发,而是上下文隔离。
- 父级负责主目标,子级负责支线探索,回流的是摘要不是全量噪音。
- 这章在给后续多智能体能力打 “信息边界” 地基。
# 先修知识
- 已掌握 s03 的主线推进思维。
- 理解 “消息历史越长,模型注意力越分散” 的现实。
# 读完后你应该能做到(可检验清单)
# 本篇要解决什么
多步骤任务里,经常有 “支线探索” 会污染主上下文:查资料、跑对比、试错过程全塞进主会话,最后主目标反而看不清。s04 用子智能体解决这个问题。
核心目标:把探索任务隔离到新上下文中,主线程只接收摘要结果。
# 用一个类比先理解
把主 Agent 当项目经理,子 Agent 当临时调研员:
- 经理下发调研问题;
- 调研员在独立会议室工作;
- 最后只带 “结论摘要” 回来。
这样经理的主会议记录不会被大量中间细节淹没。
# 为什么这一步必须现在做
因为从这章开始,系统会逐渐并行化。若没有上下文隔离,能力越强、噪音越多。s04 先把隔离边界立住,后续多 Agent 才不会失控。
# 关键代码怎么读
# 1) 子任务从 fresh messages 启动
1 | def run_subagent(prompt: str) -> str: |
关键点不是 “再调用一次模型”,而是 “上下文重新开始”。
# 2) 子工具池与父工具池分离
1 | CHILD_TOOLS = ["bash", "read_file", "write_file", "edit_file"] |
教学版故意不让子 Agent 再递归调用 task ,先控制复杂度,避免无穷委派。
# 3) 父级通过 task 路由委派
1 | if block.name == "task": |
父 loop 不关心子任务内部细节,只关心输入任务和输出结果。
# 4) 子结果以摘要返回
1 | return "".join(b.text for b in response.content if hasattr(b, "text")) or "(no summary)" |
只回摘要是为了控制主上下文体积与聚焦度。
# 你可以怎么复现
- 给主 Agent 一个 “编码 + 调研” 混合任务。
- 让它把调研部分通过
task下发子 Agent。 - 观察主上下文是否明显更干净。
# 常见误区
- 误区 1:把 subagent 当并发线程模型。这里重点是上下文隔离。
- 误区 2:子任务返回原始日志而非摘要,主上下文仍会膨胀。
- 误区 3:委派边界不清晰,父子职责混乱。
# 一句话总结
s04 的核心不是 “多开一个 Agent”,而是用上下文隔离保护主目标可见性。
# 补充解读:s04 的关键是 “边界管理”
很多文章讲 subagent 会过度强调并发,其实这章最核心的是:通过 fresh context 防止主线被支线信息淹没。
# A. AgentTemplate 提示了后续可配置方向
1 | class AgentTemplate: |
这部分在教学里像 “预告片”:后续可以把子代理定义做成外部模板,而不写死在代码里。
# B. 子代理工具池刻意受限
1 | # Child gets all base tools except task (no recursive spawning) |
这是非常务实的设计。先把递归委派关掉,可以避免新手阶段出现 “代理套娃” 问题。
# C. 子代理循环也遵循同一 tool_use 模式
1 | for _ in range(30): |
即使是子代理,执行协议仍和父代理一致。这种一致性会让系统更容易维护。
# D. 只把摘要回给父级
1 | # child context is discarded |
这句可以直接当设计原则:主上下文保存决策信息,不保存所有中间推理痕迹。
# 进阶练习
- 在
run_subagent增加max_turns入参,观察子任务稳定性。 - 给
task工具加description必填校验,提升委派可读性。 - 对同一任务分别用 “父级直做” 和 “子级委派” 对比上下文体积。
# 你会收获的工程习惯
- 把探索和决策分层。
- 保持父子协议一致。
- 用摘要而不是原始噪音回流主线。
# 统一术语口径(本章)
Subagent:带独立消息上下文的一次性委派执行单元。Fresh Context:子任务从空白消息历史启动的隔离环境。Summary Return:子任务仅返回摘要,不回流全部过程。
# 章节衔接(从易到难)
- 本章解决 “主线与支线的信息隔离”。
- 下一章
s05解决 “知识能力如何按需注入而不爆上下文”。