M12.1 · 执法契约重构——从阶段禁令到预算制#
简历 Bullet Point: 一次线上「换品类被误判成复用」的 27 轮死循环事故,暴露效率闸/安全闸执法权错配;四段重构——热修逃生门→liveness 看门狗→逃生规则通用化→检索预算制替代阶段白名单禁令,阶段状态机从执法者降级为遥测+提示,死锁场景评测 76.7→100
开场钩子#
用户上轮搜冲锋衣,这轮说「换个方向,要衬衫式上衣」。planner 把换品类误判成 retrieval=reuse(在旧候选上收紧条件),阶段机直跳 COMPARING、把 item_search 锁死。旧候选全是冲锋衣被 exclude 全排除,两条回退腿都以「精挑过」为前置而模型拒绝精挑空池——27 轮、76 秒,每个组件都在按自己的规则正确运行,组合起来是死锁。
一、模块运作流程#
1.1 闸的两种执法权#
复盘时最关键的一步是给闸分类——两类闸的判定依据和误判后果完全不同:
| 判定依据 | 判错后果 | 应有执法方式 | |
|---|---|---|---|
| 安全闸(fork 深度/检索总量/token 预算/终结硬停) | 精确事实(计数器、标志位) | 不会判错——耗尽就是耗尽 | 永远硬拒 |
| 效率闸(阶段表/postfork 直搜/websearch 动机) | 上游推定(planner 意图) | 把模型唯一正确的路堵死 | 必须 fail open |
阶段状态机守的是效率,依据的是 planner 的意图判定——而上游判定是假设不是承诺。它却拿着「无限次硬拒」的安全闸执法权。
1.2 四段弧线#
第一段·热修:给错墙开门。 按 (阶段, 工具) 计拒绝次数,同一堵墙连拒 2 次后第 3 次放行。检索类放行时同步做配套回退(退 SEARCHING、reuse→augment、解锁 postfork 闸)。核心洞察:模型对同一堵墙的反复坚持,本身就是「墙立错了」的强信号。
第二段·看门狗:兜住一切停滞。 liveness 看门狗以「工具真实执行成功」为唯一进展口径(被拦、回放都不算),停滞 45s 注入收敛指令、再宽限 30s 硬停交部分结果。从此任何死锁都有天花板。
第三段·逃生通用化:效率闸统一带门。 逃生门上提到 Hook Pipeline 统一实现:效率闸声明 escape_key 即接入。闩锁语义——赢过一次后同 key 直接放行,不再每次攒 2 轮拒绝烧延迟。
第四段·预算制:把墙拆了。 逃生门本质还是「给错墙打补丁」——模型要白挨 2 次拒绝才走上正路。正确形态是不设禁令、设小预算:复用轮检索预算收紧到 1(max(1, ...) 钉死永不为 0),预算内第一次补搜当场放行执行。阶段白名单禁令整个删除。
1.3 阶段机降级后的三个角色#
阶段状态机不再执法,保留三个角色:
- 遥测:trace 里看走到哪一步
- 提示的依据:「检索收线」等指路文案
- 少数安全底线的判据:候选池空或本轮没规划/精挑过不许交卷——这是事实判定,不是白名单
二、踩坑与设计决策#
放行一道闸 ≠ 放行一条路#
热修最早只让阶段闸放行,同一次调用又撞死在下一道 postfork 闸。链路上的闸是串联的,逃生必须连带做配套回退——开门要开一整条走廊。
通告文案要跟机制同步改#
拆墙后「会被机制拒绝」的旧话术变成假话。对模型撒谎会反噬(它会拿真实行为校准你说的话),所有哨兵/通告按新语义重写。
回退腿不能以「模型配合」为前置#
refine_backfill 曾要求 picker_attempted 才点火,而模型拒绝精挑空池。机制的逃生路径必须是确定性的,不依赖模型愿不愿意先走一步冤枉路。
为什么是预算而不是更聪明的门#
三个候选都考虑过:① 让 planner 判得更准——准确率到不了 100%,禁令制下 1% 误判 = 100% 死锁;② 逃生门——能解死锁但白挨 2 轮拒绝,是急救包不是终态;③ 小预算——判对时备而不用,判错时第一次补搜直接执行零轮浪费。预算制让误判代价从「死锁」降到「多花一次检索」。
三、面试问答#
Q1: 为什么不直接删掉状态机?#
遥测和提示仍需要「走到哪一步」的概念。删掉的是执法权,不是观测价值。收尾资格底线也还要用它判「本轮规划过没有」。
Q2: 小预算被恶意烧完怎么办?#
复用轮硬挡后模型只剩精挑/收尾两条路。若精挑证明池子真不够,refine_backfill 主动授权补搜——「要更多预算」的裁量权在确定性代码手里,不在模型手里。
Q3: 这套分类怎么推广到新闸?#
立一道新闸先问:判定依据是事实还是推定?推定→要么带逃生门、要么改成预算;事实→可以硬,但必须有看门狗这类全局兜底,因为组合死锁不挑单个组件的对错。
Q4: 四段为什么不直接跳到预算制?#
事故 on-call 时先用最小风险的方案止血(热修),再加全局兜底(看门狗),再推广逃生能力(通用化),最后才有足够信心把墙彻底拆掉。每一段都是下一段的信心基础。
四、诚实边界#
| 维度 | 做了 | 没做 |
|---|---|---|
| 效率闸/安全闸分类 | 全量闸重新归类 + 效率闸统一带门 | 形式化的闸分类 DSL |
| 预算制 | 复用轮小预算 + 永不为 0 不变量 | 动态预算(按 query 复杂度调) |
| 看门狗 | 停滞检测 + 强制收敛 + 硬停交部分结果 | 基于 token 速率的进展检测 |
| 验收 | 死锁回归 q19 76.7→100 | 大规模 A/B 测试 |