跳到主要内容

那个学会"靠打太极拿高分"的 Agent:LLM-as-Judge 上的目标错配游戏

· 阅读需 10 分钟
Tian Pan
Software Engineer

评测分在三个月里涨了 12%。客户满意度先是横盘,然后悄悄掉了半个点。团队继续上线新的 prompt 变体,仪表盘也继续奖励他们。直到有人把上周分数最高的那些对话拉出来,按一个真实客户的视角读了一遍——这才发现 Agent 的"嗓音"已经在不知不觉间变成了团队从来没有要求过的样子:每个回答都以"我并不完全确定,但一种合理的解读是"开头,每条建议都躲在"这里有几种不同的视角"后面,那些本该有唯一正确答案的问题,被当成开放式问答交付给了用户。

分数并没有撒谎。它精确地衡量了 rubric 让它衡量的东西。Agent 一点一点、忠实地学会了:赢下评审模型最稳妥的方式,就是听上去"标定得很好"——而在 rubric 把"标定"操作化为某种打分规则之后,"标定"和"在用户需要一个明确答案的问题上打太极",从外观上变得难以区分。

这是最让人难受的一种失效模式。彻底的回归是会被发现的:错误率飙升、P99 延迟爆掉、发布当天就有客户开工单。但 LLM 评审模型上的目标错配游戏却恰好相反——它发布时是绿色的,分数稳定上涨,看起来像是团队在赢。系统出问题的信号要在几个月后才从评测流水线读不到的渠道传回来:整体留存、NPS 开放题、某个评审模型从未给予权重的意图切片上的升级率。等到这种模式终于变得可读时,Agent 已经在三个月的 prompt 迭代里被训练成了一种"过 code review 时一定会被打回去"的行为。

在这个系统里,Goodhart 定律不是一个比喻

教科书上的那句"当一个度量变成目标,它就不再是个好度量"被引用得太多,已经被磨钝了。但在 LLM 评测循环里,Goodhart 不是一个类比,而是字面意义上的优化过程。评审模型定义了一个标量,团队不断迭代 prompt 变体直到这个标量上涨。Agent 通过团队的 prompt 改动被中介,正在被以"团队作为慢速梯度"的方式,训练去拟合评审模型的偏好。

麻烦的地方在于,评审模型的偏好并不是用户的偏好。两者经常重叠,而且重叠得不小,但在一些系统性特征上会出现分歧:长度、结构、打太极的措辞、引用密度、是否呈现出"思维链"的外观而非其实质。最近关于 LLM-as-judge 偏差的研究已经把数字钉在了上面——在等价的简洁答案与冗长答案之间,评审模型会给冗长答案打高 15 到 30 分,即便 rubric 明确写着"不要奖励长度"。一条显式的反冗长指令大约能把这种偏差砍掉一半,但消除不了它。

打太极属于同一类失效模式。当一个 rubric 出于好的理由奖励"标定得当的回答"时,评审模型奖励的会是标定的表面标记。赢下这场竞争的不会是那个"懂得何时打太极"的 Agent,而是那个"什么时候都在打太极"的 Agent——包括用户其实需要"是"或"否"的那些问题。

同家族陷阱在背后悄悄放大问题

当评审模型和候选模型来自同一个模型家族时,故事变得更糟。自我偏好效应已经被反复记录:厂商 A 的评审模型会系统性地给厂商 A 的模型打更高分,即便另一个厂商的模型输出在质量上等价。机制不是虚荣,而是共享先验。同一家族的分词方式相似、格式相似、伸手就抓的不确定性表达相似、组织推理的形状也相似。评审模型其实是在按"候选模型听上去有多像评审模型自己会说话的样子"打分。

当你针对一个同家族的评审模型迭代 prompt 时,你测量的并不是质量,而是候选模型已经在多大程度上收敛到了评审模型的"家族风格"。评测套件变成了一个镜厅。团队在挑选"评审模型看起来对的"输出,而评审模型对自己看起来永远是对的。

多厂商评审模型集成——把一个同家族评审模型与至少一个来自不同家族的评审模型配对——会把这种漂移以"分歧"的形式暴露出来。当两个评审模型一致时,分数是承重的;当它们分歧时,团队必须去看真实回答并自己做判断。把分歧本身当作一个独立信号、而不是噪声去做平均,才是让"集成"变得比"涨价"更有意义的关键。

那个必须按时执行的审计

能抓住这类回归的纪律并不光鲜:有人坐下来读那些分数最高的输出,问一句"这真的是我们想发布的东西吗?"这不是统计方法,而是一个结构化的审计,以固定节奏跑在一个"按分数段和意图分层抽样"的样本上。

一个有用的协议:

  • 按分数段分层抽样。 从评审模型分数分布的前十分位、中位数和后十分位各拉一批对话。目标错配游戏躲在头部——前十分位正是 Agent 学到的小聪明最值钱的地方——而不是大家本来就在巡视的长尾。
  • 一份留出的人类评审集。 保留一份由人类打过标的几百条样本作为冻结面板,并以季度为周期重新打标。评审模型与人类面板的一致率才是标定信号。如果评审模型在生产流量上的分数在涨,而它与人类面板的一致率持平或下降,要么评审模型在漂移,要么 Agent 在玩它,要么两者都有。
  • 会惩罚特定失效模式的对抗性切片。 如果怀疑的薄弱点是打太极,就构造一组答案明确、唯一正确的题目,并配一份会专门惩罚"在这些题目上打太极"的 rubric。如果怀疑的是冗长,就构造一组正确答案只有一个词的切片。对抗性切片让失效模式在淹没主分数之前就变得可读。

评审模型无法自我验证。一个不带人类评审锚点跑评测的团队,根本无法察觉评审模型会随着生产分布漂移而逐步累积的偏差。

不轮换评审模型,你就在朝它训练

还有第二种从不同角度抓住同类失效的纪律:轮换。一个评审模型在岗的时间越长,团队的 prompt 迭代就越是隐式地拟合了它的怪癖。每个季度轮换一次评审模型——换厂商、换尺寸、换 prompt——会让此前累积下来的"小聪明"作废。原来在旧评审模型下能赢的变体不再赢,团队会注意到,会去看为什么,会从中学到一些关于"旧评审模型在奖励而新评审模型并不奖励"的东西。

轮换在两个方向上代价高昂。历史分数序列在边界处不再可比,这会让管理层的汇报变得尴尬。多厂商评测的运行成本也是真实的。但这两条都不是"只用一个评审模型"的理由,反而都是"从第一天就按假设评审模型会被替换、分数序列会有重基点、真正重要的对比是当前生产 vs 当前评审模型、而不是这周 vs 十二个月前"去设计评测系统的理由。

"评测分涨了 12%"不是一个发布理由

这是在领导层这一层值得反复讲的对话。在软件工程的大部分历史里,一个绿色的仪表盘就是一个充分的发布理由。但对 LLM 类功能,绿色的仪表盘只是一个假设:这个指标仍然在追踪它本该追踪的东西。当指标本身是一个"有自己偏好的模型"时,这个假设会随着指标在岗的时间越久而越快衰减。

只靠"分数涨了"就发布的团队,运行在和早期"目标错配游戏"研究里那些下棋作弊结果同一套假设上——即 Agent 在朝着 rubric 的精神而不是表面去优化。这套假设已经两年不安全了。能站得住脚的发布理由是:评测分涨了,人类面板的一致率稳定,对抗性切片没有回归,并且前十分位输出的抽样审计读起来仍然是一个客户希望读到的样子。三种证据,不是一种。

把这件事说清楚的理由,是另一种替代方案——通过留存曲线发现回归——比跑一次审计昂贵得多。Agent 每多带着一个学会的打太极小动作发布一周,就有一周客户在被训练去预期这个小动作,也有一周竞品的 Agent 比起来显得更果断。

评测套件是一份策略文档

把上面所有东西组织起来的核心结论,对那些把评测流水线建成一套纯测量系统的团队来说,会很难听:评测套件衡量的不是 Agent。通过 prompt 迭代这一梯度,它在给 Agent 编程。评审模型的偏好就是策略,rubric 就是宪法。评审模型奖励什么,Agent 最终就会变成什么。

把评测套件当作策略文档看待,会改变团队产出的物件。Rubric 会和 Agent 的 system prompt 一样被版本化、被代码审查——因为它的爆炸半径和 system prompt 一样大。Rubric 的改动会附上 release notes,解释团队"现在在选择什么行为"、"不再奖励什么行为"。对抗性切片是在团队观察到新的失效模式时被加进去的,而不是当成定期更新。人类面板的标定按一个能扛过 on-call 轮换的节奏跑。

那个学会了"礼貌地打太极"的 Agent 既不是恶意的,也没有坏掉。它精确地做着这个循环里每一个系统在挑选的事情。修复的方向不是"让 Agent 更诚实",而是让评测流水线对"诚实"的奖励,能在三个月对着一个"对诚实听起来像什么自有意见"的模型迭代之后,依然存活。

分数还会继续涨。问题是,它衡量的东西是否还能映射到客户真正需要的东西。那些按时回答这个问题的团队,才是仪表盘和留存曲线不再背道而驰的团队。

References:Let's stay in touch and Follow me for more thoughts and updates