给 agent 的工具(prompt、规则、JSON Schema、SKILL 文档)打补丁,让它"吃一堑长一智",是当下 LLM 工程里最诱人的想法之一:失败了看日志,看完日志写规则,写完规则再跑——一个"自我进化"的闭环。
但真正做过这件事的人,大多经历过同一个困惑:补丁越打越多,系统却越改越差。修好的那个 case 确实不再失败了,但某个八竿子打不着的流程悄悄坏掉了;总通过率不降反升,但你隐约觉得系统在"拆东墙补西墙";在 12 个任务的小集上明明验证通过,一合并进正式管线就开始出事。
这篇文章试图回答一个问题:为什么"给 LLM 工具打补丁"这件看似简单的工程动作,会系统性地失败? 文章按五层闭环组织:现象、机制、处方、诊断、决策。前两层回答"发生了什么"和"为什么会发生",后三层回答"怎么办、怎么量、怎么停"。
一、现象层:你看到的是退化,不是修复失败
自进化失败的典型形态,不是"补丁没生效",而是更诡异的两种现象。
1.1 任务交换:能力的重新分配,不是增长
任务交换(Task Exchange) 指:候选修改攻克了新的持外任务(Held-out),却丢失了原本 100% 稳定通过的持内任务(Held-in)。表现为能力的"重新分配"而非纯增强。
一个具体的例子:修改后持内丢 3 个任务、持外得 5 个任务,总分 +2。从报表看这是进步,从实质看这是零和——新任务是通过"抢"旧任务的注意力和容量来实现的。判别"交换"与"真增强"的关键,不在"总分涨没涨",而在"有没有人受损":若持外增益以持内损失为代价,无论总分如何,都不是帕累托改进。
1.2 非局部副作用:修改的局部性不等于影响的局部性
更隐蔽的现象是非局部副作用(Non-local Side Effects):对工具某一局部(如 JSON Schema)的严格性修饰,可能破坏模型在全局复杂流程控制(如并发、取消操作)上的稳定性。
直觉认为"只改了 Schema 的一处,影响也只在这一处"。但模型的注意力与推理是全局耦合的,一处收紧会改变模型对整个任务的处理倾向。而且副作用倾向于沿复杂度梯度传播——从简单处传向复杂处:Schema 收紧这种"简单结构修改",往往破坏的恰恰是"并发/取消"这种"复杂流程控制"。原因是复杂流程依赖模型的隐式灵活调度,而局部硬约束会排挤这种隐式能力。
麻烦在于:复杂流程控制任务通常在长尾,小测试集覆盖不到。这就是任务分布敏感性(Distribution Sensitivity)——在 12 个任务的小集上通过门控的修改,在 36 个任务的扩展集上才暴露副作用。小集通过 ≠ 大集通过,不是"验证不严谨",而是统计功效不足导致的假阴性结论:小集恰好没碰到受影响的任务。
还有一层容易被忽略的:模型特异性(Model-Specificity)。同一项编辑,在 GLM、MiniMax、DeepSeek 上效果不同——为模型 A 优化出的规则,搬到模型 B 可能无效甚至有害。"一份提示通吃所有模型"是直觉,不是事实。
现象层的三张面孔——任务交换、非局部副作用、分布/模型敏感性——指向同一个问题:这些退化在修改发生的地方是不可见的。 要理解为什么,必须进入机制层。
二、机制层:加规则 ≠ 加能力
为什么局部补丁会引发全局退化?四张机制卡片构成了一条完整的因果链。
2.1 注意力重分配:注意力是零和资源
Transformer 的 Softmax 归一化决定了每一层的注意力权重总和为 1。新增规则增加的注意力,必然是从别处"借"来的。 这与认知负荷理论的工作记忆容量限制高度同构——模型内部也存在一个有限的"注意力预算",多一条规则就少一份给原任务。
而且干涉是非对称的:新规则往往针对难点(少数 hard case),却稀释了对大量 easy case 的隐式关注。结果是"难题没真解、易题反退化"。
2.2 上下文竞争:信噪比稀释是双输
注意力重分配的宏观表现,是上下文竞争与信噪比稀释(SNR Dilution)。模型对一条指令的遵循程度,不仅取决于指令本身,还取决于它在上下文中的相对显眼度。一条核心规则被 50 条次要规则包围,其有效剂量被稀释到接近忽略。
核心命题只有一句:加规则 ≠ 加能力。 在零和的上下文里,每加一条规则都在稀释其余所有规则。当规则数超过某个阈值,整体能力不升反降。更糟的是,冗余上下文既降能力又增 Token 开销——信噪比稀释是"双输"。
2.3 显式规则排挤隐式启发式:规则是排他性的,不是叠加性的
这是四张机制卡片里最关键的一张。直觉认为"显式规则 + 隐式启发式 = 双保险",实际往往是"显式规则覆盖隐式启发式 = 单一僵化"。模型原本靠隐式启发式处理的场景(常见格式的 JSON 生成、常规代码风格),一旦被显式规则"接管",启发式就被覆盖而非补充。
僵化在边界 case 最明显:显式规则通常为 hard case 设计,但它的执行是全局的。对规则覆盖范围内的 easy case,原本隐式启发式能优雅处理,现在却被僵化规则绑架——卡片里的原话是:"杀鸡用牛刀,且牛刀砍坏了鸡。"
这与人类双系统高度同构:隐式启发式像系统 1 的灵活直觉,显式规则像系统 2 的刻意控制。区别在于,人类能路由,模型一旦被显式规则激活,就难以"退回"隐式。
2.4 过拟合局部 Trace:用偏差样本拟合偏差模型
以上三个机制解释了"为什么规则有害",而这一张解释"为什么我们会不断写出有害的规则"。
过拟合局部 Trace 是自进化流程中最常见的反模式:根据少数失败日志盲目生成规则来"修补"模型。问题在于,能被你看到的失败 Trace,本身就是"被注意到的"失败,不代表失败的全貌。 据其写规则,等于用偏差样本拟合偏差模型——"盲人摸象"。
更危险的是反例盲区:为失败 Trace A 写的规则,可能在 Trace B、C、D 上引入新失败。因为你写规则时没见过 B/C/D,规则对它们的行为是未观测、未验证的。一个失败 Trace 还往往是长链条误差累积的末端表现,在末端写规则治标不治本,真正的病因在链条上游。
四张卡片串起来的因果链是:
少数失败 Trace(有偏样本)
→ 写出带偏见的显式规则(过拟合)
→ 规则抢占注意力预算(注意力重分配)
→ 隐式启发式被排挤(规则覆盖而非补充)
→ 全局信噪比下降(信噪比稀释)
→ 远处任务退化(任务交换 / 非局部副作用)
链条的末端是现象,链条的入口是我们自己的工作流:看到失败就写规则。机制层给出的第一个对策不是加法而是减法——新增规则前先评估注意力代价,优先精简冗余 Checklist 腾预算,再决定是否加新规则。
2.5 一个附带的噪声源:解码路径漂移
在进入处方层之前,还要登记一个"假退化"的来源:解码路径漂移(Decoding Path Drift)。GPU 计算的非确定性、Prompt 长度变化引起的 RoPE 位置编码平移,都会让模型在决策临界点(top-1 与 top-2 token 的 Logit 差距极小时)走上完全不同的推理路径。一次翻转会通过自回归放大成截然不同的输出。
它不是能力改变,而是运行时方差。单次运行的通过/失败在临界任务上几乎没有诊断价值——这个结论会在诊断层反复用到。
三、处方层:先判类型,再选路径;先结构,后认知
如果"看失败写规则"是错的,正确的改进姿势是什么?答案是分类施治。
3.1 四大拟合路径
不同类型的工具,失效模式与最优改进路径不同,一把锤子敲所有钉子是自进化最大的浪费:
| 路径 | 适用工具类型 | 核心手段 | 方向 | 主要风险 |
|---|---|---|---|---|
| Path A Schema & Structural Hardening | 原子变换/校验型工具 | additionalProperties: false 等硬性契约 |
结构·加约束 | 最易引发非局部副作用 |
| Path B State-Transition & Workflow Protocol | 多步骤 CLI 工作流 | 强制 Pipeline、容错/回滚 | 结构·加约束 | 流程僵化 |
| Path C Constraint Density & Anti-Hallucination Pruning | 知识/策略型工具 | 抗幻觉剪枝、精简 Checklist、分层规则提 SNR | 认知·减噪声 | 误用成"加规则"会排挤隐式能力 |
| Path D Progressive Ergonomics & Context Trimming | 复杂 MCP/资源交互 | 渐进式加载、降 Token 占用与注意力干涉 | 认知·减噪声 | 加载触发条件设计不当 |
三条使用原则:
- 分类是改进的前提。 Path A 的硬契约对 Path C 的知识型工具不仅无效,还可能排挤隐式能力。先判类型、再选路径,是 Cynefin 框架"先判域再选策略"在工具改进层的翻版。
- A/B 偏结构,C/D 偏认知。 A、B 处理可形式化的结构与流程问题,靠"加约束";C、D 处理难以形式化的知识与上下文问题,靠"减噪声"——方向相反,不能混用。
- 组合需排序:先结构后认知。 先 Path A/B 把硬骨架搭稳,再 Path C/D 优化知识与上下文。颠倒顺序会在不稳定结构上调认知,事倍功半。
模型特异性在这里有实际意义:结构/契约类修改(A/B)通常模型无关、可迁移;知识/SNR 类修改(C/D)高度模型相关,不可盲目迁移。
3.2 渐进式暴露结构:治信噪比稀释的架构级解药
Path D 的核心实现机制是渐进式暴露结构(Progressive Disclosure)——工具/SKILL 文档按需逐层暴露信息,而非一次性全量灌入:
- Level 0(Frontmatter Description):触发词与初始系统提示,决定模型最初的 Plan 策略;
- Level 1(SKILL.md Body):核心工作流、规则指引与状态转移逻辑;
- Level 2(Deep References / Sub-tools):深度契约与 Schema 规范,仅在需要时加载。
分层让核心信息始终高 SNR,细节只在被需要时进入上下文。其中 Level 0 是入口契约——模型是否调用、如何调用一个工具主要由它决定,Level 0 写差了,后面两层再正确也无济于事。
与自进化直接相关的是受限标题边界 Patch(Heading-Boundary Patch):修改工具文档时,把改动约束在单一 Markdown Surface 或标题层级内,保证修改的局部性与可审计性。这与非局部副作用的防范同构——边界越窄,副作用越可控,diff 越易审。
四、诊断层:度量衡错了,全错
处方再好,没有可靠的测量也无从验证。诊断层要回答:一次修改到底好不好?
4.1 聚合指标陷阱:总分是均值,退化是分布
先看头号敌人。聚合指标陷阱指仅依赖总体通过率或平均分判断系统好坏所产生的"虚假繁荣"。
通过率从 70% 升到 75%,可能是"5 个新任务全过、0 个丢失",也可能是"10 个新任务过、5 个旧任务丢"。前者是纯增强,后者是任务交换——总分相同,性质完全不同。
掩盖机制有三种:类别掩盖(难任务涨、易任务跌,均值不变)、维度掩盖(能力涨但可靠性跌)、样本掩盖(测试集偏向新能力)。三者都源于"把异质信息压成一个数"。古德哈特定律在这里同样成立:当聚合指标成为优化目标,它就不再是好指标。
4.2 4D 诊断向量:维度间不可补偿
解药是把总分拆成四个互不替代、不可互相补偿的维度:
| 维度 | 含义 | 角色 |
|---|---|---|
| Q₁ Correctness | 能否解决更多、更难的任务 | 增长项 |
| Q₂ Reliability | 是否无回归、不破坏已有稳定能力 | 绝对底线 |
| Q₃ Efficiency | Context/Token 占用、交互步数、成本性价比 | 拦截"用更贵换更好" |
| Q₄ Human Utility | 人类工效学、可读性、改动局部性与安全性 | 拦截"技术正确但不可用" |
不可补偿是核心设计:Q₁ 涨 10 分不能抵消 Q₂ 丢失一个稳定任务。可补偿的总分制正是聚合指标陷阱的根源——把不同性质的得失压成一个数,等于放弃诊断。4D 的价值在于让退化无处藏身。
Q₂ 是底线,Q₁ 是增长项:先守底线、再看增量。Q₃/Q₄ 则防止"为了过任务把 Context 翻倍、把交互拖到 30 步"这类隐性退化。注意 4D 是诊断向量而非评分公式——它的目的不是算出一个加权分,而是给出四元诊断,定位退化的维度与方向。
4.3 验证器人为噪音:裁判必须先校准
4D 再精致,若底层数据由有噪音的验证器产出,诊断向量就是"精确地错"。验证器是评估的度量衡,度量衡错了全错。 治评估必先治验证器,这是方法学的第一性优先级——一句话说,裁判必须独立于选手,且裁判自己得先校准。
验证器人为噪音(Verifier Artifact) 指验证器自身实现缺陷把"模型实质正确"的输出误判为失败:断言过窄(硬匹配表面字符串别名)、缺少归一化、对等价表达不敏感。典型场景:模型说 idor、人说 broken-object-level-authorization、标准是 CWE-639——三者指同一漏洞,硬匹配就冤枉了模型。
两个关键性质:
- 噪音是非对称的:主要产生假阴性(对的判错),系统性低估模型能力,还会把"优化通过率"引导去迎合验证器的偏见——一种隐性的古德哈特。
- 核心解药是别名映射:建立 Canonical ID & Alias Mapping(标准 ID + 别名表),把表面表达差异归一化到标准实体。
4.4 安全伪目标:没有反例就分不清能力与幻觉
验证器噪音管"冤枉好人"(假阴性),安全伪目标评估(Safe-Decoy Evaluation) 管"放过坏人"(假阳性)。在安全/漏洞检测类评估中,引入无漏洞的干净代码作为伪目标,硬性检验 Agent 是否存在"盲目汇报、宁可错杀"的幻觉倾向。
若测试集只有含漏洞的代码,"逢码报漏洞"的策略能刷高召回率。伪目标提供了反例基线——真正有能力的 Agent 应当对干净代码说"无漏洞"。召回率容易被"多报"刷高,精确率难刷;在 0 个真漏洞的样本上报了多少,就是假阳性率的直接测量。这与红队思维主动构造失效场景的逻辑同构。
两层防线缺一不可:验证器噪音是测量仪器问题,伪目标是被测对象问题。
五、决策层:快而硬的门控,全而慢的诊断
有了机制理解、处方分类和诊断工具,最后的问题是工程决策:什么修改能合并?什么时候止损?
5.1 单任务可靠性门控:底线不可协商
单任务可靠性门控(Per-Task Reliable Gate) 把 Q₂ 从"一个维度分数"升级为"一票否决的硬门槛":候选版本必须在多次 Fresh Repeats(独立重跑)下,对所有已知 100% 稳定通过的任务绝对不丢失,方可合并。
三个设计要点:
- Q₁ 可谈判,Q₂ 不可谈判。 能力增量多解决几个算几个;任何一个原本 100% 稳定的任务掉到非 100%,即判不通过。
- Fresh Repeats 抵抗采样方差。 单次通过/失败可能是解码路径漂移造成的运气,多次独立重跑把"真退化"与"随机抖动"分开。
- 100% 任务是高信息量探针。 一个原本 100% 通过的任务,任何一次失败都是强信号;一个 50% 通过的任务,失败可能只是常态波动。门控优先盯 100% 任务,是用信息量最高的样本做哨兵。
门控与诊断有明确分工:门控只回答"能不能合并"(二元判定),不回答"为什么退化"(诊断)。门控要快、要硬;诊断要全、要慢。
5.2 分级评估与止损:先排雷,再下注
Formal 评估要跑大量 Fresh Repeats、全任务集,成本高昂。若验证器有噪音、任务无区分度(全过或全不过)、或天花板效应让分数扁平,Formal 跑完也得不到信息。因此把评估分成两阶段:
- Diagnostic Pilot(诊断试评):少 repeat、小任务规模,快速验证难度区分度、排查天花板效应(Outcome-flat)与验证器人为噪音;
- Formal Qualification(正式评估):通过试评后才消耗配额,做大 repeat、全任务集的完整 4D 评估与门控。
核心目的是在花掉昂贵配额前先止损。止损阈值要前置:Diagnostic 阶段就定义"什么情况直接放弃候选"——候选在试评任务上已出现任务交换迹象,或非局部副作用明显,则止损淘汰,不浪费 Formal 配额。
两阶段不是重复,而是分辨率递增的同一诊断:Diagnostic 主要看 Q₁ 的难度区分度与验证器健康,Formal 才完整跑 Q₁–Q₄ 与门控。但要注意任务分布敏感性的提醒——Diagnostic 小集通过不代表 Formal 大集通过,两阶段之外还需合并后在新任务上持续监控。
5.3 帕累托改进:底线不是目标
整个决策层的伦理基础是帕累托改进:一次自进化必须在不使任何已有能力变差的前提下,实现能力扩张或成本下降。任务交换之所以要被门控一票否决,正是因为它违反了"无人受损"这条底线。
但要记住:帕累托改进是底线,不是目标。 满足帕累托只说明"没变坏",不说明"值得做"。是否值得还要看改进的幅度与成本——守住底线之后,真正的追求是在多个维度上同时改进。而在 LLM 评估中,帕累托改进比经典经济学中更难达成,因为能力是多维耦合的、非局部副作用无处不在——正因如此,才需要 4D 解耦来精确验证"有没有人受损"。
结语:这套方法学本身也可能过拟合局部 Trace
把五层闭环压缩成一张图:
现象层 任务交换 / 非局部副作用 / 分布与模型敏感性
机制层 过拟合 Trace → 显式规则排挤隐式启发式 → 注意力重分配 → 信噪比稀释
处方层 四大拟合路径(A/B 结构加约束,C/D 认知减噪声)+ 渐进式暴露结构
诊断层 4D 诊断向量(不可补偿)+ 验证器归一化 + 安全伪目标
决策层 Diagnostic Pilot 先排雷 → Formal 跑 4D → 单任务门控一票否决 → 帕累托底线
贯穿全文的其实只有一个反复出现的命题:在零和的上下文里,每加一条规则都在稀释其余所有规则;而你能看到的失败,永远只是失败分布的有偏样本。 自进化的失败不是努力的失败,而是把"个案修补"误认为"分布修复"的方法学失败。
最后必须诚实地自我指涉:这篇文章提出的整套体系——四大路径、4D 向量、分级止损——目前只有单一项目的实证证据。按它自己的标准衡量,它本身也可能是一次过拟合局部 Trace:这些卡片来自一个项目的失败日志,分布外是否成立,需要在更多项目、更多模型、更多任务分布上重跑它自己的 Diagnostic → Formal 流程。
这不是自我否定,而是这套方法学唯一能自洽的姿态:任何方法学都应接受它自己主张的检验——裁判必须独立于选手,包括这篇文章。
本页是这篇文章的静态镜像。在互动版中打开,可使用附件下载、作者署名与目录导航。