§08 子代理:把脏活分给干净上下文
先给结论:子代理是"上下文隔离的任务委派"。主 Agent 不被子任务的细节淹没。
我做长研究时吃过亏。所有中间步骤塞进一个上下文,读到后面,前面的重点全被挤掉。 子代理的解法很妙:主 Agent 把活派给一个全新、干净上下文的 Agent。 子代理干完,只回一个总结给主 Agent。
最简单的字典定义
research_subagent = {
"name": "researcher", # 必需:唯一标识
"description": "深度搜索网络信息", # 必需:触发条件
"system_prompt": "你是搜索大师", # 必需:不继承主代理
"tools": [internet_search], # 可选:写了就全覆盖
"model": "openai:gpt-5.4", # 可选:换模型
}
三个字段是必需的:name、description、system_prompt。 description 要写触发条件,不是功能介绍。这很关键。
标叔的经验:我见过一个真实 bug:
description写得太模糊,主 Agent 不知道何时委派,子代理从没被调用。把描述改成"用户要生成任何图片时调用",委派准确率立刻上来了。
多专家协作
subagents = [
{"name": "data-collector", "description": "收集原始数据",
"system_prompt": "全面收集数据", "tools": [web_search]},
{"name": "data-analyzer", "description": "分析数据",
"system_prompt": "提取洞察", "tools": [statistical_analysis]},
{"name": "report-writer", "description": "撰写报告",
"system_prompt": "写专业报告", "tools": [format_document]},
]
agent = create_deep_agent(system_prompt="你协调多专家", subagents=subagents)
其他两种形态
CompiledSubAgent:传预编译的 LangGraph 图,要完全控制拓扑时用。AsyncSubAgent:后台长任务,start/check/update/cancel管理。
默认会有一个 general-purpose 子代理。你不定义也会自动加。 想关掉:GeneralPurposeSubagentProfile(enabled=False)。
标叔的结论:子代理的核心价值是"上下文隔离"。复杂任务不拆,上下文迟早爆。拆,就干净。
注意:子代理不继承父代理的工具(除非不写
tools)。不继承 middleware、skills。要用的,显式传。详见 §19 配置规范。
下一章,讲随用随取的技能包:Skills。