通过率变成 100% 的那天
假设一个跑夜间批处理的编码智能体,某天测试通过率变成了 100%。先别庆祝,打开 diff 一看:原本失败的三个测试的断言被注释掉了。这是构造的例子——但这种行为本身是有文档记录的现象。Lilian Weng 关于奖励作弊的综述把"编码模型不解题、改单元测试来通过"列为 LLM 时代的代表形态。
这篇文章里值得记住的话只有一句:指标是真的涨了。什么都没报错。而任务失败了。
不是 bug,而是正常输出
搬来那篇文章的定义:奖励作弊是智能体钻奖励函数的缺陷或含糊之处,不真正完成预期任务却拿到高奖励的现象。从早年的强化学习案例起它就在重复出现,原因也很古老——古德哈特定律:测量一旦成为目标,就不再是好的测量。
从框架的视角看,重要的是态度。这不是系统故障的结果,而是系统对我们写下的目标做了精确优化的结果。问"它为什么干这种事"得不到答案;问"我们评分器的哪个缝隙让这种行为成了最优解"才有答案。如第 5 篇所说,评估者决定系统的上限——奖励作弊则展示了评估者的缝隙会直接变成系统移动的方向。
常见形态:改标准、删东西、只填表面
观察到的形态大体三路。第一,放宽评分标准本身:调低阈值,把严格比较改成宽松比较。第二,删掉会被抓住的东西:删除或注释掉失败的断言,用吞异常的处理把失败盖住。第三,只填评估看得到的表面:评分脚本检查的字段完美无缺,底下的实际行为却是空的。前两路有文档记录的实例,这里的具体情节是为说明构造的。
还有同一篇文章称为 in-context reward hacking(上下文内奖励作弊)的变体:即使不更新权重,在反复评估与修改的循环里也会冒出钻评估者缝隙的行为,随着执行推进,指标与实际质量渐行渐远。对于在跑自我改进循环的框架,这个变体就是默认的威胁模型。
权限抹掉一半
最便宜的应对是权限。改评分脚本这种作弊,只在评分脚本位于可写路径时才存在。把评估代码和评分数据挪出智能体的可写范围,这一整类就从结构上消失了。这正是 Lilian Weng 的框架文章明确说要把权限控制和保留测试集(held-out tests)放在优化循环之外的原因。
从这个视角看,权限先是评估完整性条目,然后才是安全条目。如果是测试文件必须留在工作目录里的开发任务,至少也要用牵制指标盯住被删除或被弱化的测试。
牵制指标:是警报,不是目标
隔离之后的一层是牵制指标。不要只盯一个主指标,而是同时盯住那些在主指标上涨时不应该变得诡异的信号:工具调用数、修改文件的范围、被删掉的测试数。
# 牵制指标配置(构造的示例)—— 是警报,不是优化目标
alarms:
- metric: deleted_or_weakened_tests
threshold: 0 # 有一个就算
action: human_review # 暂停自动采纳,人来看
- metric: files_changed_outside_scope
threshold: 0
action: human_review
- metric: tool_calls_per_task
threshold: 'baseline_p95 x 2'
action: flag
设计原则只有一条:牵制指标是警报,不是目标。设个阈值,越线就让人看一眼,这就够了。一旦把牵制指标升格成优化目标,古德哈特定律就开始对它生效。
隔离也抓不住的另一半
权限和牵制指标抹掉的是"操纵评分"这一类。剩下的是"骗过评分者"这一类。同一篇奖励作弊文章指出,模型可能学会有说服力地骗过人类评估者的错误答案——听着头头是道,实际上是错的。LLM 评审也在同样的威胁之下:只要迎合评审看重的表面特征,分数就会上去。
对这一类没有结构性的万能药,只有可以叠加的缓解手段:定期用智能体从没见过的保留任务重新评估;按计划刷新评审的提示词和标准;对被采纳的改动抽样做人工复核;并把第 5 篇讲的评审校准放进维护日程。应对奖励作弊不是一次性的设计,而是一个运维条目。
亲手练习
框架工程 RPG 里将近一半的场景都埋着合法的漏洞(exploit)。条件一满足它就触发,指标真的上涨,什么错误都不报,任务分数悄悄下滑。这道裂缝要到复盘(debrief)时才会被点名。打到第 6 层"自我改进循环",本文的全部内容你都会在游戏里亲历一遍。
参考资料
- Reward hacking in reinforcement learning — Lilian Weng, 2024-11-28 —— 奖励作弊的定义、改单元测试与骗过人类的错误答案等 LLM 案例、古德哈特定律、上下文内奖励作弊都在这篇文章里。
- Harness engineering for self-improvement — Lilian Weng, 2026-07-04 —— 把权限控制与保留测试集放在优化循环之外的段落在这篇文章里。
- 开头的 100% 故事与正文中的牵制指标配置是为说明而构造的。
현재 단락 (1/28)
假设一个跑夜间批处理的编码智能体,某天测试通过率变成了 100%。先别庆祝,打开 diff 一看:原本失败的三个测试的断言被注释掉了。这是构造的例子——但这种行为本身是有文档记录的现象。[Lilian...