S04|子代理:给 Agent 开 “独立小房间”,上下文不乱、主线不飘
上一章 S03,我们给 Agent 加了待办计划,让它能按步骤执行复杂任务,不再跑偏。
但新问题又来了:Agent 查资料、读文件、试命令时,会产生一大堆中间过程消息,把主对话塞得又乱又长,越往后推理越慢、越容易出错。
这一章 S04,我们用子代理(子智能体)解决这个问题:把杂事丢进独立上下文,干完只带回结果,主对话永远干净清爽。
本章核心信息
- 核心闭环:子任务使用全新、独立的上下文执行
- 工具数量:5 个(新增
task子任务工具) - 核心思想:大任务不必挤在一个上下文里,探索性工作交给子代理
先看懂本章所有名词
1. 父代理(Parent Agent)
就是和你直接聊天、负责主线任务的那个主 Agent。它持有完整对话历史,盯着最终目标。
2. 子代理(Subagent)
父代理临时 “派出去” 干活的小助手。它有自己独立的对话记录,干完就交总结,然后退出。
3. 上下文隔离
父代理一套消息记录,子代理另一套消息记录,互不干扰。子代理的乱七八糟中间步骤不会污染主对话。
4. 上下文噪声
那些为了得出答案产生的中间过程:反复读文件、试错命令、查询日志、临时思考……这些对最终结果没用,但会占满上下文。
5. Fork(继承上下文)
子代理不完全从零开始,而是复制一份父代理的历史,再接着做子任务。适合需要基于之前讨论内容继续干活的场景。
6. 摘要返回
子代理干完活,不把全部过程丢回来,只返回一句精炼结果。这是上下文减负的关键。
这一章到底要解决什么问题?
举个真实场景:你问:“这个项目用什么测试框架?”
为了回答这句话,Agent 可能要:
- 读
pyproject.toml - 读
requirements.txt - 查项目目录
- 试跑测试命令
- 看配置文件
这一大堆操作都会塞进主对话历史。结果就是:主上下文越来越臃肿,模型推理变慢、注意力分散、容易跑偏。
根源:所有任务都堆在同一个上下文里,噪声太多。
解决方案:把局部探索、查询、试错类工作,交给子代理在独立上下文里做。
最小心智模型:一张图看懂子代理
父代理(主对话) | | 接到一个需要查资料的小任务 v 派生子代理 → 开一个全新干净上下文 | | 子代理疯狂读文件、执行命令、试错 | (这些过程全留在子代理内部) v 子代理完成 → 只把精炼结果返回 | v 父代理拿到结果,继续主线任务核心真相:子代理的价值,不是多一个 AI,而是多一个干净、独立、可丢弃的上下文。
最小实现:子代理怎么做?
1. 给父代理加一个 task 工具
让模型可以主动发起子任务:
{ "name": "task", "description": "在独立上下文执行子任务,返回总结", "input_schema": { "type": "object", "properties": { "prompt": {"type": "string"} }, "required": ["prompt"] } }2. 子代理用全新的消息列表
这是隔离灵魂:
def run_subagent(prompt: str): # 全新上下文,不继承父消息 sub_messages = [{"role": "user", "content": prompt}] # 子代理自己循环执行 summary = agent_loop(sub_messages, ...) return summary3. 子代理工具集更小、更安全
不给它无限递归能力:
- 可以读文件
- 可以执行安全命令
- 可以搜索查询
- 不允许再创建子代理
4. 只返回摘要,不返回全过程
子代理干完活,只丢回一句结果:
该项目使用 pytest 作为测试框架。而不是把几十轮工具调用全粘回来。
最关键的数据结构
记住这个最小骨架:
class SubagentContext: messages: list # 独立上下文 tools: list # 可用工具 handlers: dict # 工具路由 max_turns: int # 最大轮数,防止死循环就这 4 样,足够实现一个稳定可用的子代理。
子代理到底有什么用?
1. 给父上下文 “减负降噪”
子代理的中间垃圾信息不会进主对话,父代理始终专注主线。
2. 让子任务更专注
给子代理的指令可以极度明确:
- “只告诉我用了什么测试库”
- “只检查这个函数有没有 bug”
- “只总结这段代码功能”
3. 为后续多智能体团队打基础
今天是临时子代理,明天就是:规划师、程序员、测试员、评审员……S04 是多智能体系统的第一块基石。
进阶概念:什么是 Fork(继承上下文)?
默认子代理是空白启动,完全独立。
但有些任务需要基于之前的对话继续:
“根据我们刚才定的方案,去写个测试。”
这时可以 fork:
注意:fork 不是入门第一步,先学会隔离,再学继承。
初学者最容易踩的 5 个坑
1. 觉得子代理是为了 “炫技多 AI”
错!它首先是上下文隔离工具,不是用来秀数量的。
2. 把子代理全量历史塞回父代理
那就完全失去隔离意义,上下文照样爆炸。
3. 一上来就搞一堆角色
什么 planner、coder、reviewer、explorer……先把最简单的子执行器做对,再加角色。
4. 不给子代理设最大轮数
没限制 → 直接无限循环卡死。
5. 让子代理权限过大
允许它无限嵌套子代理 → 直接递归崩溃。
S03 → S04 升级了什么?
| 模块 | S03 | S04 |
|---|---|---|
| 结构 | 单个 Agent + 计划 | 父 Agent + 子代理隔离 |
| 上下文 | 单一,越来越大 | 主上下文干净,子任务独立 |
| 任务处理 | 线性一步步做 | 杂事外包,主线专注 |
| 效率 | 步骤多了变慢变乱 | 长期运行更稳定 |
| 扩展性 | 适合单流程任务 | 适合复杂、多阶段任务 |
本章教学边界
这一章不讲:
- 多智能体团队协作
- 持久化子代理
- 后台运行
- 复杂权限体系
- 文件系统隔离
只牢牢守住一个核心:子代理 = 独立上下文 + 子任务执行 + 摘要返回
一句话总结本章
子代理的核心,不是多一个 AI 角色,而是多一个干净、独立、可丢弃的上下文,让父代理专心盯主线,杂事外包不扰民。
