大数跨境

Agent架构:把 12 个子 Agent 折回 1 个:省下的延迟,和要重建的四道防线

Agent架构:把 12 个子 Agent 折回 1 个:省下的延迟,和要重建的四道防线 AI技术研习社
2026-11-06
5
导读:那句被写成注脚的话折叠不是把 12 个盒子塞进 1 个盒子。它是把 12 道隔离墙拆掉,然后在同一个房间里重新划区。

导读:折叠的隐性代价

折叠不是把 12 个盒子塞进 1 个盒子。它是把 12 道隔离墙拆掉,然后在同一个房间里重新划区。

这句话源自 Anthropic 应用 AI 团队的文章《Building agents: When to fold subagents into your main agent loop》。文章详细阐述了何时保留子智能体、如何折叠及团队协作方法,但其核心代价仅以注脚形式提及:

将子智能体折叠进主循环后,虽然延迟降低,但破坏了一条原本正常的流程——主 Agent 持有订单查询工具后,自行编造了交付日期,而未咨询物流专家。这种错误具有偶发性,仅在部分运行中出现。

错误的本质在于:没有报错,没有超时,没有异常栈。用户询问“订单何时到达”,Agent 查询订单后,依据“通常三天”的经验给出了格式、语气均正常的答案。唯一的问题是,交付日期是虚构的。这并非模型能力退化,而是流程约束消失:原本在调用图中明确的“需咨询物流专家”规则,折叠后需依靠提示词、工具和评测重新构建。

本文旨在探讨:折叠会移除哪些结构性保障,以及重建这些保障所需付出的工程成本。

一、收益核算:折叠省下的三样资源

折叠带来的真实收益主要体现在以下三个维度:

维度 多智能体架构 折叠后架构 收益分析
上下文保真 每次交接返回摘要,细节丢失 原始结果直接进入主窗口,由模型自行连接 跨步骤归纳类任务收益最大
延迟 N 层嵌套模型循环,每层需等待 单层循环,轮内工具并行执行 公开案例显示速度提升约 2 倍(受限于任务串行度)
维护面 N 份提示词、N 套评测、N 个归属团队 1 份系统提示 + 1 套端到端评测 最易被低估,但长期收益最持久

其中,“维护面”的优化值得重点关注。多智能体系统的隐性成本不仅是算力,更是一致性。各团队独立维护提示词会导致规则冲突(即“弗兰肯提示”现象),且分散的评测体系会使整体评分失真。折叠通过统一提示词和评测集,一次性解决了这些问题。

然而,收益与代价并存。下图展示了折叠交易的两面性:

折叠这笔交易的两栏账 左边是能立刻量到的收益,右边是要过一段时间才显形的代价 省下的 · 折完当天就能测 上下文保真 不再有「子智能体交回一段摘要」这一步, 模型看到的是原始结果,能自己连起来。 ↑ 质量,尤其是需要跨步骤归纳的任务 延迟 少掉 N 次嵌套的模型循环。公开案例里, 单循环比多智能体框架快约 2 倍。 ↑ 但成立前提是任务强串行,见第三节 维护面 N 份系统提示、N 套评测、N 个归属团队, 收敛成一份提示加一套端到端评测。 ↑ 这条最容易被低估,也最持久 vs 丢掉的 · 出事的时候才知道 上下文隔离 脏数据从「随子循环一起丢弃」变成 「永久留在主上下文,之后每轮都在读」。 并行 单循环是轮内并行、轮间串行。任务一旦 扇出成 8 条独立支路,就要串 8 轮。 权限边界 一个循环要服务所有权限级别,检查点 从 1 处变成 N 处,漏一处就是越权。 故障域 子智能体的崩溃封在子循环里;主循环里 一次崩,整个会话的上下文都被带脏。 左栏三条是「工程师能写进周报的」,右栏四条是「三个月后复盘才想起来的」

图 1 · 左栏三条能写进周报,右栏四条要等三个月后复盘才想起来

二、代价之一:上下文从“有边界”变为“无边界”

子智能体的核心价值常被误解为“隔离”,更准确的说法是它提供了一次性丢弃权。子智能体的窗口在任务完成后可整体丢弃,其中的试错过程和垃圾数据不会进入主循环,主循环仅接收有损但可控的摘要。

折叠后,主循环窗口累积且每轮完整读取,导致三类数据性质发生改变:

  • 工具返回的失败载荷:如 502 页面或长篇堆栈信息。在子循环中随循环结束消失;在主循环中永久占用位置。
  • 检索回来的无关文档:RAG 召回的多篇文档中,主循环需全文读取所有文档,包括无用部分,并在后续轮次重复读取。
  • 试错过程:多次参数尝试的错误记录会成为“历史”,影响模型对后续步骤的判断,导致过度谨慎或误判。

同一条脏数据,在两种结构里的寿命完全不同 A · 有子智能体:污染被关在子循环里 主循环 context 干净 调用 子智能体 · 独立 context 3,000 token 的 HTML 报错页 工具返回了一坨没法用的东西 子循环继续,但主循环不知道 交回 200 字摘要 「获取物流失败」 子循环一结束,3,000 token 一起消失 B · 折叠之后:污染进入主上下文,永久居住 主 context window 任务说明 第 1 轮 订单查询结果 第 2 轮 3,000 token HTML 报错页 甩不掉 第 3 轮 还在读它 第 12 轮 仍在读它 每一轮都要重新读一遍 在 A 里,污染的成本是「一次任务失败」; 在 B 里,污染的成本是「之后所有轮次的判断都被这三行 HTML 影响」——而且你不会在日志里看到任何错误。

图 2 · 同一条脏数据,在两种结构里的寿命差了一个数量级

这是一种交换:用“摘要的有损损耗”换取“污染的完全暴露”。摘要损耗是可预测的,而污染损耗是不可预测的。若任务失败代价低(如检索筛选),折叠划算;若失败会写入下游(如审批结论),则应保留摘要机制以避免脏数据干扰。

三、代价之二:并行能力的局限取决于扇出宽度

单循环并非完全无法并行,其瓶颈在于扇出宽度(同时处理的独立支路数)。由于模型缺乏全局任务清单,面对多源数据查询时,往往采取“查几个看结果再决定下一步”的策略,将本可并行的任务压制成串行。

「快 2 倍」是有条件的:任务扇出度决定谁赢 纵轴 = 端到端耗时(相对值,扇出为 1 时单循环记为 1.0) 0 2 4 6 8 12 1 2 4 8 16 任务扇出宽度 W(需要并行处理的独立支路数) 临界带 W≈2.6 单循环(折叠后) 多智能体(按上下文拆分) 「快约 2 倍」测的 是这一段 这里折叠会亏 W=8 时差 2 倍以上 单循环为什么随 W 变差:模型看不到全貌,只能查一个、看结果、再决定查下一个, 扇出被压成了串行 。 多智能体起点高(协调开销固定),但每个子任务独占窗口,所以斜率平。

图 3 · 扇出越宽,单循环越吃亏;“快 2 倍”测的是左边那一段

粗略估算表明,交叉点位于扇出宽度 W≈3 附近。对于客服、代码修改等串行任务(W=1),折叠优势明显;而对于尽调、多源比价等宽扇出任务(W≥8),折叠后反而变慢。建议通过统计会话中的工具调用依赖关系来判断:若 80% 会话为串行依赖,可放心折叠;若存在高扇出尾部,需保留子智能体或改为批量工具调用。

四、代价之三和四:权限边界与故障域扩大

权限:从“配置错误”变为“逻辑遗漏”

在多智能体结构中,权限由编排层集中控制(1 个检查点)。折叠后,权限检查下沉至每个工具内部(N 个检查点)。风险性质随之改变:

  • 旧结构风险为“配错”,通常导致功能大面积不可用,易被发现。
  • 新结构风险为“漏写”,即某工具未进行权限检查,导致敏感数据泄露。此类错误不报错、不告警,难以察觉。

因此,代码规范应强制要求工具权限检查默认拒绝。可见的故障(无法访问)远比不可见的越权(成功返回非法数据)更具工程安全性。

故障域:局部错误扩散至全局

子智能体崩溃仅为局部事件,主循环可重试或降级。而在主循环中,工具返回的“看似成功实则错误”的结果会进入上下文,污染后续所有推理步骤。此外,折叠降低了可测试性:端到端测试难以捕捉“跳过步骤”等局部逻辑错误,需通过增加运行次数来弥补统计上的不足。

五、折叠后必须重建的四道防线

针对上述代价,需主动构建以下四道防线:

折叠之后,这四样东西要自己重新建出来 主 agent 循环 一个模型 · 一个 context window · 开放式工具循环 · 轮次与成本预算 · 写入门控 折叠后 只剩这一层 原本由架构保证的事,现在要靠流程保证 ① 工具级权限 补什么 每个工具自己检查 调用者的权限,拒绝时 返回一句模型能读懂 的话,而不是抛异常。 不补会怎样 权限检查点从 1 处 变成 N 处。新增一个 工具忘了检查,就是 一次越权。 改一处 → 只需改 这一处工具 ② 上下文卫生 补什么 工具返回进主上下文 之前过一道:长度上限、 失败单独标记、异常体 不入正文。 不补会怎样 一次 3,000 token 的 报错页会跟完整个 会话,而且日志里 看不出异常。 这是折叠后最 容易漏的一条 ③ 链路覆盖评测 补什么 每条生产环境的调用 链一个用例;每条不能 违反的规则一个用例; 每个用例跑 3 次以上。 不补会怎样 端到端只能测到「结果 对不对」,测不到「它 跳过了哪一步」。而 跳过往往只在某一次。 单次运行通过 ≠ 这个流程没坏 ④ 决策日志 补什么 每一轮记:加载了哪个 skill、调了哪些工具、 顺序如何、token 花在 哪一步。 不补会怎样 折叠后只剩一条链路, 出了问题没有「哪个 agent 的错」可以指向, 只能靠回放猜。 归因能力是折叠 必须预付的成本 共同点: 这四件事在旧架构里是「结构自动给的」,折叠之后变成了「你要主动写的代码和流程」。 少写任何一样,都不会立刻报错——只会在某次事故里发现它本来在保护你。

图 4 · 这四件事在旧架构里是结构自动给的,折叠后要主动写

防线一:工具级权限,默认拒绝

from functools import wraps


def guarded(tool_name: str):
    """工具级权限闸门。注意:没有显式授权就是不许,不是「先放行再看」。"""
    def deco(fn):
        @wraps(fn)
        def wrapper(ctx, *args, **kwargs):
            # 默认拒绝:allowed_tools 里没有,就是无权
            if tool_name not in ctx.allowed_tools:
                return {
                    "ok": False,
                    "reason": f"当前用户无权调用 {tool_name}。",
                    # 关键:返回模型能读懂的拒绝,而不是抛异常
                    "hint": "请告知用户联系管理员开通,或改用其他方式回答。",
                }
            if not ctx.rate_limiter.allow(tool_name):
                return {"ok": False, "reason": "调用过于频繁,请稍后再试。"}
            return fn(ctx, *args, **kwargs)
        return wrapper
    return deco

关键点:默认拒绝、返回模型可理解的提示信息、在同一层处理限流以避免模型误判工具故障。

防线二:上下文卫生

MAX_TOOL_CHARS = 4000


def sanitize(raw: str, ok: bool) -> str:
    """工具结果进主上下文之前,先过这一道。"""
    if not ok:
        # 失败载荷不进正文,只留一行定位信息
        return "[工具失败] 已记录,不要基于此结果回答。请换一种方式获取。"

    if len(raw) <= MAX_TOOL_CHARS:
        return raw

    # 超长结果保留头尾:头给结构,尾给结论,中间通常是重复数据
    head, tail = raw[:2500], raw[-1000:]
    return f"{head}\n…[已省略 {len(raw) - 3500} 字符]…\n{tail}"

补充规则:

  • 去重:合并同一轮次中重复的工具返回结果。
  • 定期摘要:长会话中将已确认事实结构化归档,由 Agent 主动管理上下文。

防线三:链路覆盖评测

建议建立中央端到端评测集,并遵循以下折叠特有规则:

  • 按调用链建用例:覆盖真实生产环境中的每一条调用链,检测顺序约束是否被破坏。
  • 红线规则用例:针对“绝对不可违反”的规则(如未查物流不得回答日期)设立专用用例。
  • 多次运行验证:每个用例至少运行 3 次,以捕捉偶发性逻辑跳过错误。

防线四:决策日志

折叠后需通过日志还原内部结构,重点记录:

记录内容 目的 典型定位问题
本轮加载的 Skill 替代原有的“路由准确率”指标 流程错乱(如退款走成换货)
工具调用列表及顺序 监控顺序约束的执行情况 未查物流即回答日期
Token 消耗分布 识别上下文膨胀的渐进过程 后期判断能力下降

六、将保留条件转化为可测判据

Anthropic 提出的三条保留条件需量化执行:

判据 1:上下文长度扫描,关注切片而非均值

def probe_context_ceiling(tasks, lengths=(8_000, 16_000, 32_000, 64_000, 128_000)):
    rows = []
    for L in lengths:
        for task in tasks:
            ctx = fill_history(task.prompt, target_tokens=L)  # 人为灌到指定长度
            out = run_agent(ctx)
            rows.append({
                "len": L,
                "task_type": task.type,      # 关键:按任务类型切片
                "score": judge(out, task.rubric),
            })
    # 每个任务类型单独找拐点,不要只看总体均值
    return pivot_by_type(rows)

「上下文膨胀导致性能下降」怎么才算可测量 横轴 = 灌进主 context 的历史长度,纵轴 = 任务成功率(示意曲线,请用自己的评测集复现) 0 30 60 90 成功率 % 8k 16k 32k 64k 128k 256k 32k:跨步骤任务先塌 全部任务的平均成功率 需要跨步骤归纳的那一类 平均分还好看, 细分已经塌了 这就是为什么很多团队「觉得自己没有上下文膨胀」——他们只看总平均分。 正确的做法是按任务类型切片 ,并且先记录「每类任务在多少历史长度下开始掉」这条基线, 否则你既没有资格折叠,也没有证据反驳「该折叠」的提议。

图 5 · 平均分还好看的时候,跨步骤归纳类任务可能早就塌了

许多团队误以为无上下文膨胀,是因为简单任务拉高了平均分。正确做法是按任务类型切片,确定各类任务的性能拐点基线。

判据 2:统计扇出分布

通过分析日志,统计会话中工具调用的数量及依赖关系。若 80% 会话扇出 ≤2,可折叠;若尾部 10% 会话扇出 ≥8,需单独处理。

判据 3:工具选择能力扫描

逐步增加工具集规模(10/20/30...),观察工具选择准确率。若在较少工具时准确率即下降,说明工具描述存在歧义,应先优化描述或进行工具分组,而非直接折叠。

七、折叠时机本质上是评测问题

模型能力的提升由供应商推动,而评测能力的建设则由团队自主掌控。折叠时机取决于两者斜率的差异:

该不该折叠,取决于你在哪个象限——不是取决于模型有多强 评测能力 → (有没有按链路切片、能不能复现、跑几次) 模型能力 → 危险区 你会折,因为「模型够强了」 你看不见折坏了什么, 因为没有东西能看见 先花两周建基线,再谈折叠 该折 每次折叠都有数据支撑, 折错了当天下班前就知道 一次折一个,逐个比对 可以试点 模型偏弱但你看得清, 正好用评测去决定折哪个 从使用率最高的那个开始 别动架构 这时候折叠是纯赌博: 赢了不知道为什么赢 10 个黄金用例就够了 大多数团队 起步点 默认漂移方向 模型被供应商推着涨, 评测得自己建 纵轴那条线你控制不了,横轴那条线只有你能推—— 所以折叠的时机,本质上是个评测问题

图 6 · 纵轴你控制不了,横轴只有你能推;于是大多数团队在往左上漂

危险区的特征是:模型足够强,但评测体系仍沿用旧架构,无法覆盖折叠后的新失败模式(如步骤跳过、字段编造)。此时折叠可能导致隐性质量下降。

折叠将“可局部验证的结构”转换为“只能整体验证的结构”。评测能力是进行此交易的保证金。保证金不足,即便模型再强也不应折叠。

反之,若评测能力强大,可更早尝试折叠,因为能快速发现并回滚错误。

结语:墙拆掉之后,线由谁来划

折叠确实简化了架构图,但也将被结构隐含保护的约束转变为需显式维护的规则。复杂度并未消失,只是从“结构复杂度”转移为“规则复杂度”。

决策顺序应为:先建立黄金用例基线,再统计扇出分布,最后逐个折叠子智能体并验证。那些为了拆墙而建立的检查、用例和日志,既是折叠的成本,也是真正的技术门槛。

【声明】内容源于网络
0
0
AI技术研习社
1234
内容 259
粉丝 0
AI技术研习社 1234
总阅读25.4k
粉丝0
内容259