子智能体
子智能体是可被主智能体调用的另一套智能体循环。本例的 harness 把 Task 注册为工具,处理器在一个新的 messages[] 上执行调用模型、检查、分发工具、追加结果的循环。新上下文只以委派提示词开始,探索记录留在子上下文,最后只返回一行文本。这就是上下文隔离。
本课的普通循环只追加消息,不压缩或删除。四次档案搜索会让结果留在后续请求里;委派后,主会话只增加 Task 调用卡片和结果卡片。本例相同搜索工作留下的主上下文约为 90 token 与 2.1k token。真实运行时可以压缩、截断或缓存,不能把这里的保留量当成永远累计的实际账单。
隔离也有代价:本例子智能体只收到提示词,不继承主会话、用户之前的澄清或已确认的约束。没有写进委派提示词的信息,对它不可见。
本课沿用智能体循环与工具调用。Task 和 search 位于同一分发表,画面两条泳道对应两个 messages[] 数组。
子智能体如何隔离上下文
主循环收到 Task(prompt="…"),harness 调用 run_subagent(prompt),再把返回文本追加为普通 tool_result。从通用分发接口看,它与其他工具调用相同。
隔离发生在 sub = [{"role": "user", "content": prompt}]:创建新数组。子循环仍然调用模型、运行工具、追加结果,但全部写进 sub。模型给出文本后,return r.text 只返回该字符串;本例不保留 sub 供主循环检查。
上下文记录。 一次委派向主会话加入一个结果卡片(外加 Task 调用卡片),而非 k 个工具步骤的记录。卡片数为 O(1) 而非 O(k),前提是返回内容有长度约束;一张卡片的 token 数并不天然固定。内联的 572-token 结果会进入后续请求,委派可减少这些后续输入,但仍要承担子调用和编排开销,实际费用还取决于缓存等规则。
信息缺口。 主会话里“指 2011 原版,不是 2024 重拍版”的说明,不会自动进入子会话。子智能体可能正确回答收到的提示词,却答错用户真正的问题。
子智能体逐步演示
默认委派一个自包含问题:“原版 Aurora Run 的制作公司是哪年成立的?”观察两条上下文的计数。电影与档案用于本课示例。
- 初始化。 主会话只有一条用户消息,约 18 token,
main = 18 tok。 - 委派。 预设模型请求
Task(prompt="Find the founding year of the studio that produced the original 2011 film Aurora Run.")。提示词自己携带 2011 原版约束,主上下文增为main = 52 tok。 - 建立子上下文。
sub = [prompt]新开泳道,提示词约 26 token。主会话等待,内容不变。 - 搜索 1。
search["Aurora Run"]得到主条目为 2024 重拍版、另有 2011 版链接的索引。请求与结果约 432 token,只加入子泳道。 - 搜索 2。 依据提示词中的 2011,查询
search["Aurora Run (2011)"],约 572 token,得到导演 Mara Voss、制片方 Northlight。 - 搜索 3。
search["Northlight"]约 392 token,出现 Northlight Pictures 与 Northlight Films 两家公司。 - 搜索 4。
search["Northlight Pictures"]约 692 token,确认其成立于 1987 年,并制作 2011 版 Aurora Run。子上下文约 2.1k token,主会话仍为 52。 - 子结论。 原文回答
Northlight Pictures — founded in 1987.,16 token。只返回这一行。 - 合并。 结果作为
tool_result回到主会话,main = 68 tok。子泳道变灰,显示sub = discarded,约 2.1k token 不再保留在本例活动上下文;这不表示已经消耗的计算费用退还。 - 主回答。 原文
The studio was Northlight Pictures, founded in 1987.,主会话为 90 token。四次搜索结果都未进入主会话。
切换 mode = inline,同样四次搜索直接追加到唯一的 messages[]。探索计数依次为 432、1,004、1,396、2,088,最后 main = 2,128 tok。答案相同,本例保留的主上下文约为委派的 24 倍;比较改变的是结果追加位置。
再选 Context-dependent。用户问导演出生年,并补充“2011 原版,不是 2024 重拍版”。预设委派却只写 Task(prompt="Find the birth year of the director of the film Aurora Run."),漏掉澄清。子智能体按档案主条目查重拍版,返回出生于 1989 年,符合模糊提示词却不符合用户意图。
内联版本保留澄清,面对两部电影时选对原版,返回 Mara Voss,1974 年出生。任务与档案相同,模型选择是脚本;本比较展示约束放在哪个上下文,不是测量模型成功率。
边界情况
- 只有一次搜索的委派。 Task 请求、返回卡片、额外循环都有成本,探索内容不比结论大多少时收益有限。
- 返回为空或错误。 本例父级只收到一行,不保留可回看的子记录。需要重新委派并明确问题,或在主循环重新取证。生产系统可另存日志,不受本例限制。
- 遗漏必要约束。 信息缺口场景不会报错或警告。子级可能按收到的问题给出格式正确的答案,因此委派方要把必要条件写进提示词;其他运行时也可提供显式上下文传递机制。
- 子级需要追问。 本接口没有直接向用户发问的通道,只能在结果中报告歧义。主级可据此继续处理;这不是所有子智能体产品的限制。
常见错误
- 把子智能体当成主循环的特殊分支。 这里是
TOOLS["Task"] = run_subagent,与 search 同样经分发表执行并追加结果。 - 假定子级已见主会话。 本例只给提示词,约束、修正、偏好都要明确传入。答案偏离时先检查委派内容。
- 返回整段探索记录。 全量导入会失去缩小主上下文的效果。本例返回结论;实际应用可保留必要引用或独立审计记录,避免只剩不可核查的断言。
- 只看合并时的 token 数。 后续模型调用也会携带所保留的历史;同时不能漏算子循环成本,或把输入量直接等同实际计费。
- 期望父级自动识别错误。 只有结论而没有证据,父级无法充分核查。ReAct 解释观察结果与结论之间的证据链。
模型的简化
新建数组、分发、单行返回与卡片 token 累加由确定性代码执行。委派提示词、搜索选择、结论是预设,并非实时模型记录。工具调用与 ReAct 展示循环的录制实例,2011 版电影示例与 ReAct 记录一致。
token 数只累计本课卡片,省略系统提示词、工具 schema、推理 token 等输入或输出,不是完整账单。生产子智能体可以继承指定上下文和工具、使用不同模型与轮次预算、并行运行、保留审计轨迹或返回结构化结果。本例的单提示词与单行返回,是为了展示上下文边界而选的接口。