RL 环境的判分器测试

找出判分器不该给分的回答。

falsepass 用环境自己的奖励代码,给一批事先已知对错的回答打分,然后报告每一处不一致:错的回答拿了分,对的回答没拿到分。不需要模型,不需要跑训练,也不需要 GPU。

uvx falsepass demo
探测结果得分 · 应得
回答得分应得
#### 421.01.0正常
The answer is definitely not 42.1.00假通过
\boxed{42 \text{ is wrong}}1.00假通过
A B C D E F G H I J1.00假通过
#### 42.0.01.0假失败
(空)0.00正常
示意数据。每一种情况都在公开环境里真实出现过。

工作原理

判分器就是一条断言。测试它的方法和测试任何一条别人写的断言一样:喂给它正确结论已知的输入。

01

指定一个环境

Hub 上的环境、本地文件夹、Inspect AI 任务或 HUD 环境都可以。每个环境装在自己的临时虚拟环境里,版本按它构建时的依赖锁定。

falsepass init owner/environment
02

探测判分器

标准答案及其无害变体;空回答、复述题目、列出所有选项、否定答案、格式完美的错答;格式损坏的输出;重复打分。另有变异搜索和对奖励代码的静态扫描。

falsepass audit environment --search 120
03

确认,再修复

每个失败的探测都能生成一个独立复现脚本,只依赖环境自己的包。改好判分器后重跑,可以看到具体哪些行变了。

falsepass repro environment --probe P5

反复出现的问题

在几十个公开的 RL 环境上跑下来,同样几类判分缺陷在不同作者的环境里一再出现。

数关键词打分

开放式任务按关键词给分。一段跟任何题都无关的通用文本,对所有题都提交,得分反而超过数据集自带的参考答案。

return df # dropna fillna astype …

为格式付钱

格式分和推理分从不检查答案,错误答案也能拿到满分的三分之一左右。

<think>…</think> \boxed{B} (错)

该严的不严,该松的不松

多一个句号就得零分;连答案标记都没有的否定句却拿满分。

The answer is definitely not 42.

答案框里的否定

本来为单位设计的规范化步骤会丢掉数字后面的文字,等式也只比较了一边。

\boxed{13 = 12}

没人看见的异常

某个奖励项每次调用都报错,被框架捕获、记日志、记 0 分,跑出来的数字看起来一切正常。

NameError: name 're' is not defined

不会结束的回合

游戏结束后环境还在回话,奖励又会重读每条消息,于是一直说话的人得分最高。

That was a great game!

阅读完整文章(英文):Your reward function is an assertion →

看它抓出一个埋好的漏洞

falsepass demo 审计一个玩具环境:只要答案出现在回复里任何位置就给分。静态扫描指出了那一行,三个探测从不同方向确认了它。

终端录屏:falsepass demo 找出一个埋好的判分漏洞

支持你用的框架

已发布的或还在本地文件夹里的都可以。每个框架都走它自己的代码路径,测到的就是判分器真实运行时的行为。

verifiers · Environments Hub

环境自己的 rubric 或 taskset,三代接口都支持,单轮、多轮,以及按脚本调用工具的策略。

Inspect AI

任务自己的 solver 链,用按脚本回答的替身代替 generate(),再用它自己的 scorer 打分。

HUD

按 HUD 服务器的方式调用任务模板的判分代码。没有参考答案时跑不需要答案的探测。

每次提交都检查

GitHub Action 会在错误答案拿到分时让构建失败,并把探测结果表放进任务摘要。

# .github/workflows/falsepass.yml
on: [push, pull_request]
jobs:
  falsepass:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: Super-Eric/falsepass@main
        with:
          path: .
          fail-on: "ceiling>0.1 errors>0"

为 AI 代理调用而设计

所有命令都不需要交互,都有机器可读的输出。编程代理可以独立跑完一次审计,交给你的是已经复现过的线索。

MCP 服务器

scan、init、audit、results、repro、discover 都作为工具提供,任何 MCP 客户端都能用。

代理技能(Skill)

完整的审计流程,包括怎么区分缺陷和有意的设计。

JSON 与退出码

大小适合放进上下文窗口的结果摘要、CI 门槛,以及文档的 llms.txt。

 

$ claude mcp add falsepass -- \
    uvx --from "falsepass[mcp]" falsepass mcp

› 审计 owner/environment 的判分器

  falsepass_init   owner/environment
  falsepass_audit  environment  n=25
  false_pass_ceiling 1.0  via P5 shotgun/all_in_one_slot
  falsepass_repro  environment  probe=["P5"]
  … 复现两次,读奖励代码,
    报告出问题的那一行和修改建议

示意会话。其他 MCP 客户端用法相同:其他客户端的配置(英文)→

给的是线索,不是结论。探测失败只说明值得去读奖励代码。一个发现要成立,需要两次输出完全一致的复现、找到出问题的那一行,并核实它影响了多少真实任务。题目要求的严格格式、为研究奖励作弊而故意留的漏洞,都不算缺陷。

已在几十个公开环境上使用过。修复先以小的 pull request 交给维护者。