我先承认:我自己也动过刷榜的歪脑筋,后来把这条路堵死了

33 阅读4分钟

2026 年了,看到一个模型或 Agent 晒 benchmark 分数,我第一反应早就不是"哇好高",是"这数是不是刷的"。这毛病现在是公开的信誉危机:同一份权重换个评测 harness 能差十几个百分点,榜单前几名的差距还常常落在统计噪声里。分数越来越不值钱。

我有资格这么说,是因为我自己就动过歪脑筋。

做 MASE(我的记忆系统)跑 LongMemEval 的时候,我真写过一套"按题号分桶路由"。LongMemEval 的题本来就分几类——普通题、gpt4 生成的题、该拒答的题——我一度让系统先看一眼这题是哪个桶,再换套策略去答。当时还觉得自己挺聪明。

然后我反应过来:这不就是冲着考题作弊吗?真实场景里,用户提问的时候哪有什么"题号"递给你看。靠题号挑策略,刷的是这一套考卷,不是真本事。

想明白之后,我没只在心里记一笔"以后别这么干"——那玩意儿靠不住。我做了件更狠的事:把作弊这条路从代码层面堵死,让我以后想偷偷加回来都加不进去。

先把那套题号路由的总闸焊成 MASE_LME_ROUTE_BY_QID=0、彻底关掉。然后写了个审计脚本 audit_anti_overfit.py 挂上 CI,--strict 一跑就扫一串黑名单:qid.startswithqid.endswith、按桶分配的那些环境变量、拿题号白名单去改写答案……运行时代码里只要冒出任何一个,CI 直接挂、合不进去。另外还有个 test_overfit_guards.py 专门盯着这事。

这里有个我琢磨了很久的分寸,我觉得是这套东西真正值钱的地方:不是所有"提前知道的信息"都算作弊。 真实部署里你本来就知道的东西——这是长文问答还是长程记忆、上下文是 64k 还是 256k、什么语言——这些能用,因为它们描述的是"要干什么活",不是"这道题的身份证"。能用任务画像,不能用题号。这条线我在策略文档里写死了。

光不作弊还不够,还得让别人能查。所以每个分数都挂一张"出生证":存在 docs/benchmark_claims/ 下的 JSON 里,带分数、答对数、样本总数、口径、配置、证据路径。新跑的还会带上数据集指纹 sample_ids_sha256。至于那些跑的时候还没这功能的老结果,我老老实实标成 summary_only_legacy,而不是假装它有指纹。报分也拆三把尺子:LongMemEval 我报 61.0%(严格字符串)和 80.2%(大模型判语义),同一批答案两把尺子量;那个 84.8% 是错题重跑拼出来的,死活只标"诊断参考",绝不混进 headline。

一句话:跑通 --strict,"我没刷榜"就升级成了"我想刷也刷不进去"。


同样的事,我在另一个项目 ReBuilder 上又干了一遍,只是这回防的是另一种作弊。

ReBuilder 是个"无尘室"程序重建 Agent:给它一个参考可执行文件加文档,让它只靠黑盒地跑、看行为,把这个程序重新写出来,不准看源码、不准反编译。这里的作弊不是刷分,是偷看答案——直接把那个参考二进制包层壳调用、git clone 原项目源码、拿 objdump/ghidra 把它拆开看。这些一旦干了,"我是干净重建的"这句话就破产了。

所以这里也有个扫描器 ComplianceScanner,逐行扫 Agent 生成的代码,逮到上面这些花招就判 ERROR。再配上"留一手不给它看的样本当关卡"(holdout gating)和"修复不准让已经过的用例倒退"的非回归约束。

最能说明问题的是一次真实提交:我把 zoxide 这个任务的基线从 67 提到 71,同一个 commit 的说明里写着 "+ de-overfit"——涨分的同时,把过拟合的部分一起拆了。我要的是涨上来的那几分是干净的,不是糊上去的。


写到这儿其实就一个信念:评分侧防"刷榜",求解侧防"偷答案",本质是同一件事——诚信别靠自觉,做成门禁。 出了事查得到,想作弊做不到,连我自己想偷懒都堵在门外。

说实话,我也喜欢上榜、喜欢被人看见,那种成就感谁不要。但比起冲个高名次,我更怕另一样东西:别人指着我的分数说一句"这不就是测试集过拟合刷出来的"。这话一旦贴上,分数再高也碎了,而且你还洗不清——因为你确实拿不出"我没干"的证据。所以我宁可花力气把"我没作弊"做成能验证的门禁,也不想要一个查无实据的高分。

这事尤其是冲着做模型的团队说的:他们见够了刷榜,最不缺的就是好看的数字,最稀缺的是"这个数我敢让你查"。所以现在让我评一个 Agent 靠不靠谱,我会先问一句:你敢不敢把"我没作弊"写成一条 CI?

代码开源在 github.com/zbl1998-sdjn/MASE-agent-memory(scripts/audit_anti_overfit.py)和 github.com/zbl1998-sdjn/rebuilder(core/compliance/),想看真东西的可以翻。