跳到主要内容

无法收敛的验证器循环

· 阅读需 12 分钟
Tian Pan
Software Engineer

代理系统里最贵的 bug 是那种没有任何报错的 bug。Worker 提出一个草稿。Verifier 用一段反馈把它驳回。Worker 修改。Verifier 再次驳回。循环一直转下去,trace 越来越长,账单越爬越高,而从外面看,这个系统似乎在 工作——而且很尽职,因为两个模型都在干各自该干的活儿。没有人定价进去的是:验证器的接受标准在不同调用之间并不固定。worker 在追的那个目标本身在动,而循环没有任何收敛保证。

你以为自己交付的是"迭代到满意为止",其实你交付的是一次对极值可能根本不存在的空间的搜索。

一张干净的架构图背后藏着的设计错误

这种模式已经常见到不再被当作一个"设计选择"了。你把一个 worker 模型和一个 verifier 配对——一个独立的模型、一个带评分量表的 judge、一个对抗式 critic,有时是同一个基础模型用不同 system prompt 的更严格版本——然后让它们互相传球,直到 verifier 签字放行。架构图就是两个方框加一根回头的箭头。它看起来优雅。它看起来正确。它编码了一个图本身从未点明的假设:验证器是一个函数。也就是说,给定同一个候选,它会返回同一个判决。它的接受集合是输出空间的一个稳定子集,而 worker 的任务就是到达那里。

验证器不是一个函数。它是一个随机策略。把同一个候选用非零温度跑五次,你会得到五个判断,而它们在边界附近常常互相不一致。把它跨天来跑,提供商在你不知情的时候调整模型,你会得到一种漂移——任何版本钉死都接不住,因为你的管线里压根没把它钉死。把它用在第一轮的某个候选上,再用在第三轮的同一个候选上(此时它已经嵌在一段更长的、带修改历史的 trace 里),你会得到不同的答案,因为上下文变了。

一个把"这个随机的、非严格单调的函数返回了 accept"当作收敛测试的精修循环,并没有在向质量收敛。它在从一个边界逐轮波动的输出空间区域里采样。worker 的修改并没有朝着一个不动点移动。它们在绕着一个不动点公转。

为什么"agent 越来越好了"是对轨迹的误读

团队会给循环加上仪表,看着 verifier 的置信度分数在迭代里一路爬升。第一轮:0.62。第二轮:0.74。第三轮:0.81。曲线单调,图表一路右上,自然的解读就是 worker 在变好、verifier 在识别这种变好。可以上线了。

这种解读漏掉了两件大概率正在发生的事。

第一,验证器正在被训练——非正式地、通过 trace 训练——去识别 worker 心目中"认真的尝试"长什么样。trace 越长,看起来就越像在用力。在一个没有真值 oracle 的 judge 看来,"用力"读起来就是"质量",于是即便底层产物没有发生实质变化,置信度分数也会上升。你测的是验证器的置信度,而不是产物的质量,而这两者已经脱钩了。

第二,worker 正在循环内部学习这个验证器的表层特征。它不是在靠近一个高质量产物;它是在靠近这个验证器会接受的那种修辞形状。如果你的验证器喜欢含糊措辞,worker 就更多地含糊;如果你的验证器给项目列表的分比给散文的分高,项目列表就会繁殖。你看到的"收敛"是 worker 在对 judge 过拟合,这是一种和"worker 在产出更好的输出"完全不同的现象。两者在仪表盘上长得一模一样。

把这两种情况分开的诊断手段很便宜,却很少有人跑:把第五轮被"接受"的输出,扔回一个没有任何 trace 历史的全新 verifier 实例里。如果这个全新的 verifier 拒绝了它,你的循环就不是向质量收敛的。它收敛到了两次具体 roll-out 之间的局部一致,而这种一致在对话之外没有任何意义。

max-iterations 上限是一种供认

你见过的每一个生产级 verifier 循环都有一个 max_iterations 参数,通常默认三或者五。这不是"以防万一"的兜底。这是一个架构层面的供认:循环没有收敛证明。如果循环能收敛,你根本不需要上限;循环自己就会停。上限存在的原因是:搭这个系统的团队,在某个地方知道循环可能不会停,他们决定"成本封顶"比"质量保证"更重要。

这么读,含义就更尖锐了。最终落到用户那里的产物是三种东西之一。一种是 verifier 明确批准过的输出(最理想的情况,不算上前面提到的 verifier 过拟合问题)。一种是 verifier 在最后一轮允许的迭代上还在拒绝、而系统因为上限触发就那么上线了的输出(无声失败,通常是难任务上的主导情况)。一种是介于两者之间、被系统用某种 tiebreaker 选出来的输出——最先被接受的、得分最高的、最后产出的——这些里没有一个是架构当初假装提供的"收敛保证"。

第三种情况就是团队在不自知的状况下默默降低产品质量的地方。验证器循环成了一台"信心洗白机":它让团队感觉系统有质量门,而实际上系统拥有的是一个伪装成质量门的预算门。

能恢复终止性的几种模式

补救方案有一个共同形态:它们让验证器的行为独立于循环动态,这样循环搜索的就是一个固定靶,而不是一个跟着自己一起动的靶。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates