子智能体。
子智能体只给你一样东西——第二个会被填满、然后消失的上下文窗口——而多数团队为它掏钱时,指望买到的是一位同事。人设是免费的,也什么都不顶用;隔离才是那件商品。孩子读过的一切,在它返回的那一刻就没了,于是你真正交付出去的,是它临走前写下的那一段话。要设计的是返回通道,不是角色。
子智能体是一道上下文边界,一侧挂着一根任务字符串。
把词汇剥掉,机制其实很小。父方发出一段任务描述;一个全新的模型实例从空的(或近乎空的)上下文起步,带着父方为它挑好的工具集与步数预算;它干活;它返回文本。父方的上下文只多出这段文本,此外一无所获。没有共享内存,没有来回,没有能活下来的状态。
这个形状有三样值得掏钱的性质,也只有这三样:
人设不是机制;起一个名字不花你什么,也不给你买来什么。
常见的设计是一套班底:一个「研究员」、一个「批评者」、一个「规划者」、一个「安全评审」。它读起来像组织设计,所以很有说服力。但「批评者子智能体」和同一个提示词里的「批评者段落」,差别恰恰只有一处——子智能体看不到那段产出了它要批评之物的对话。有时这份独立正是要点,那你该把话说明白。多数时候它是个意外,于是批评者评的是工作的摘要,而不是工作。
真正能预测一个子智能体划不划算的,是一个比值:它吃掉多少上下文,又返回多少?
- 比值高——委派出去。「找出这个函数的所有调用点,告诉我其中哪些传了可空实参」要读上千行,返回的是一份六条的清单。搜索、日志分诊、扫一个目录、读一份长文档只为回答一个问题:全都是大进小出。
- 比值低——就地内联。如果孩子把见到的几乎原样送回,你就为「把 token 从一个窗口搬到另一个窗口」付了一整段提示词、一次往返,外加一步摘要。改写一个段落、对父方已经握着的材料做个判断、给输出排个版——都不是子智能体该干的活。
- 比值等于一——你做出来的是个路由器。一个接过问题、不做任何中间工作就返回答案的子智能体,是一次多了延迟的模型调用。作为一步路由它或许没问题;它不是委派。
先用比值,再谈组织架构图。多数班底名单能活下来两个角色,其余全数出局。
那段摘要就是全部交付物,而父方核不了它。
这是最后才被设计、却惹出最多麻烦的一环。孩子返回时,它的证据已无从追回:工具结果不在父方的上下文里,权衡它们的推理没了,父方也没有一条便宜的路径可以再看一眼。抵达的是散文,带着孩子恰好用上的那份笃定;而父方会把它当作事实——因为在它的上下文里,那就是一条事实,与一条工具结果毫无分别。
由此直接生出两种失效,而且都是静悄悄的:
- 「我什么都没找到」和「我根本没找成」写出来是同一句话。一个搜索工具报错了的、预算用尽了的、或是搜错了目录的孩子,报出的空结果,与一个搜对了的孩子用词一模一样。父方于是带着一个它没有理由怀疑的否定结论往下走。
- 细节是在压缩里被凭空造出来的。孩子把十二个文件压成四句话,而第四句里那个行号,大致是对的。这是寻常的接地失效,但在这里更糟,因为那些本可以反驳它的证据,已经被丢掉了。
补救之道是别再把返回值当成一份汇报,而把它当成一条记录:
- 返回句柄,而不是复述。文件路径、行号区间、记录 ID、URL——那些父方在需要时花几百 token 就能重新打开的东西。一段以句柄标注了出处的摘要,把一个无法验证的断言换成了一次廉价的查阅。这与塑形工具结果是同一套纪律。
- 把形状结构化,并让「没有」显式存在。一个带
searched、found与incomplete_because字段的 schema,逼着孩子去区分散文会揉成一团的那三种结果。一个撞上步数上限的孩子,必须没有办法报出一个干净的否定。 - 把出处一路带进父方。父方的上下文应当记下某条说法来自子智能体、而非来自它自己的观察,这样日后出现矛盾时是可判的,而不是令人困惑的——指令层级关于信任等级的那套论证,对你自己的孩子同样成立。
委派不是免费的,而代价落在你没在看的地方。
经济账值得摊开来讲,因为「子智能体省上下文」这个直觉,会悄悄让人以为它也省钱,而它并不省。
- 每个孩子都是一整段提示词。系统提示词、工具 schema、任务描述——按孩子重付一遍。扇出五个就是五份,随后父方还要付钱去读五段摘要。你是在拿总 token 去换父方上下文里的 token,这通常是笔对的买卖;但它仍然是笔买卖,该被明确写进你的成本模型。
- 只有工作彼此独立时,并行才帮得上忙。必须看到彼此发现的孩子并不是在并行,而是一条你把调试搞得更难了的序列。若第二个孩子的任务依赖第一个孩子的答案,墙上时间的收益是零、上下文开销却翻了倍——这和并行工具调用受的是同一条约束。
- 目标只能经由那根任务字符串抵达孩子。父方理解了却没写下来的部分,传不过去。每多一层委派,就是对目标又一次有损的复述,于是目标漂移会随深度复利,而不是保持不变。
- 嵌套会把轨迹变成一棵没人看的树。会再生孩子的孩子,把一份线性的对话记录变成你的可观测性栈多半会渲染成几次互不相干运行的东西。等结果错了,你手上就不是一份可读的记录,而是一个功劳分配问题。在你能看清两层之前,把深度封在一层。
加一个子智能体之前,先把两个问题写下来答清楚:它要读的、父方绝不能读的那个大东西是什么;它要返回的、那个小而结构化的东西又是什么。第一个答不上来,就把提示词内联进去。第二个答不上来,你就还没把它设计完——而默认的自由文本返回,正是将来会在生产里悄无声息失效的那一种。然后去把你的子智能体最近产出的二十段摘要读一遍,数数其中有多少条说法,你不重跑一次孩子也能核实;那个比例,就是你这层委派的真实质量。
相关:子智能体模式对比看各大框架如何实现这件事,单智能体 vs 多智能体看何时该停在一个,以及上下文压缩——那是用完一个窗口之后的另一条路。