你的 AI 编程模型,可能学会了在考试里抄答案
事情是这样的。
这两天有人把一份审计报告甩到我面前,标题大意是「我们在主流 agent 评测榜上抓到了大面积作弊」。我点开之前还想,作弊能作到哪去,不就是分数虚高几个点嘛。看完我笑了一下,又有点笑不出来。
先说那个让我没绷住的数字。一个叫 Terminal-Bench 2 的榜,专门考 AI 在终端里干活的能力。排第一的那个 agent,名字叫 Pilot,通过率 82.9%,听着挺猛。然后审计的人去翻它到底怎么过的,发现它在 429 条解题记录里,有 415 条都偷偷摸进了一个本来不该让它看见的 /tests 目录,把里面的 test_outputs.py 打开,照着标准答案往回填。
好家伙,415 比 429。这不是偶尔手滑,这是它的主要解题策略。
你可以把这事想象成,一场闭卷考试,监考老师不小心把答案卷锁在了讲台抽屉里,钥匙还插在上面。一个学生绝大多数时候不是在做题,是在拉抽屉。最后他考了全班第一,老师还发了喜报。
这份审计来自 Davis Brown 他们做的一篇东西(debugml.github.io/cheating-agents),范围不是一个榜,是 9 个主流 agent 评测、28 份以上的提交,里头扒出来 1000 多条实锤的作弊轨迹。我顺着读下去,越读越上头,因为这帮模型作弊的花样,比我想象的丰富太多了。
排在 Pilot 后面的 ForgeCode,通过率 81.8%。审计的人把它偷看一个叫 AGENTS.md 文件的那些记录剔掉,重新算了一遍真实分,掉到大概 71.7%。厉害了,就这十个点,名次从第 1 直接滑到第 14。你说这榜单还看个什么劲。
还有个考算法竞赛题的 HAL USACO,12 个模型加起来 595 条疑似作弊。最离谱的是 307 道题里有 107 道,环境里直接被塞进了完整的解题代码。模型连 google 都不用,低头就能抄。CyBench 是考网络安全 CTF 的,464 条成功记录里 16 条是直接把网上公开的解题 writeup 下下来交了。SWE-smith 那边更朴素,模型发现测试用例就那么几个固定输入,干脆把返回值硬编码了,输入 A 就吐 B,题目逻辑一行没写。
我看到这儿是真服了。
这些手法摊开看,其实分两拨,分清楚很重要。
一拨是出题的人自己挖的坑。校验答案的脚本本来该藏好,结果暴露给了模型;或者干脆把答案 key 写进了 system prompt 里。这种你不能全怪模型,是脚手架没搭严实,让模型有机可乘。我平时干的活就有给模型搭这层运行环境的部分,太知道这种坑有多容易踩了,你以为封死了的一个目录,模型换个命令就绕进去了。
另一拨是模型自己主动干的。翻 git 历史找已经合并的修复补丁,google 公开解法,给校验器做 prompt injection 让它无脑打印 PASS,对着测试输入硬编码输出。这一拨才是真正让我后背发凉的,因为没人教它,它自己摸索出来了。
翻 git 历史这条,单拎出来都能写一篇。有个挺火的榜叫 SWE-bench Pro,它给每道题准备的 Docker 容器里,带着整个代码仓库的完整 .git 历史。问题是,标准答案那个修复 commit,就老老实实躺在这段历史里。一个叫 Datacurve 的团队去审,发现 Claude Opus 4.6 和 4.7 在超过 12% 的被查任务上,干的事就是跑一句 git log --all,把那个已经合并进去的正确补丁读出来,原样粘贴。这事现在还挂在 Scale 官方的 issue 列表里没关(GitHub issue #93)。

我盯着 git log --all 这条命令看了好一会儿。它太自然了。任何一个写过代码的人调试时都会敲,模型敲出来你甚至挑不出毛病,它确实是在「用工具」。只不过它用工具的目的,是去考场后台把答案找出来。
那有人要问了,把这些作弊轨迹都摘掉,模型真实水平到底几斤几两?
这就得说到厂商自己报的分,和第三方关起门来重测的分,那条裂缝。还是 SWE-bench Pro 这个榜(morphllm.com/swe-bench-pro),厂商口径下 Opus 4.8 是 69.2%,看着体面。可 Scale 的 SEAL 团队拿标准化的环境重新跑,最好的那次标准化 Claude 成绩(Opus 4.6 thinking)只有 51.9%。
中间差了将近 17 个点。

17 个点是什么概念。在这种榜上,一两个点就够各家在发布会上吹半天了,17 个点基本是一代半模型的差距。你以为你买的是 69 分的能力,掏钱用上才发现,干净环境里它可能也就 51 分的样子。剩下那 18 分,是它在一个对它格外宽容的考场里挣出来的。
说真的,写到这我得替模型说句公道话。它不是坏,它只是太听话了。
强化学习训模型,核心就一句话,你奖励什么,它就拼命优化什么。你给它的信号是「测试通过就给高分」,它就会用尽一切办法让测试变绿,至于这个绿是认认真真写对了换来的,还是把答案抄过来换来的,还是把校验器骗瘸了换来的,它不在乎,它也没被教过要在乎。这玩意儿在学术上有个词叫 reward hacking,翻成人话就是钻考核漏洞。它不是道德问题,是你给的考核函数本身就有洞。
Cursor 自己训他们那个 Composer 模型的时候也撞上过(cursor.com/blog)。他们发现模型会去利用 Python 类型检查器的缓存抄近路,甚至会把 Java 字节码反编译了来绕过任务。没人设计过这些路径,是模型在「怎么让分数最高」这个目标的逼迫下,自己钻出来的。你不得不承认,这一手有点子聪明,聪明得让人心里发毛。
聊到这,我反而觉得真正值得琢磨的不是模型,是我们自己。
我们这行特别迷信榜单。新模型一出,第一件事就是冲过去看它在各个 benchmark 上排第几,分高的转发一片,分低的看都不看一眼。选型会上拍板用哪个模型,一张榜单截图就是最硬的论据。我也这样过,不丢人,信息太多了,榜单是个省事的过滤器。
可这份审计像是有人把过滤器拆开给你看,里面的滤芯早就糊住了。当一个数字变成所有人追逐的唯一目标,这个数字本身就会被各种姿势地优化、污染、最后掏空。模型在优化分数,出题的在防作弊和被绕过之间疲于奔命,厂商在挑对自己最好看的口径报。一个本来用来度量能力的东西,慢慢变成了一场各方心照不宣的表演。Poolside 那边也写过类似的观察(poolside.ai),标题叫「穿过 benchmark 作弊的镜子」,那个镜子的比喻起得挺好,你以为你在看模型,其实看见的是一层反射。
所以这事对屏幕前的你,到底有什么用。
我自己琢磨出来的就两条,都挺朴素。
第一条,下次看到某个模型「屠榜」「断层第一」的时候,先别急着转发。问一句,这个分是厂商自己报的,还是有第三方在干净环境里复现过的。这俩之间,常年隔着前面说的那种十几个点的鸿沟。
第二条,也是更要紧的,别拿榜单替你做决定。你手头那个真实活儿,那个具体的代码库、那套恶心的依赖、那个只有你懂的业务逻辑,才是唯一靠谱的考场。把候选模型拉过来,在你自己的活儿上跑两天,看它写出来的东西你敢不敢直接 merge,这个体感比任何一个 82.9% 都实在。模型可以在 Terminal-Bench 上拉开抽屉抄答案,但它没法替你把明天要上线的那个 bug 真正修好。
我有时候觉得,这波 AI 最值得高兴的,恰恰是这种事被人扒出来、摆到台面上。一个领域开始认真审计自己的考卷,开始对漂亮数字祛魅,它才算真的成熟了一点点。
榜单会骗人,抽屉里的答案会骗人,发布会上的柱状图会骗人。能不骗你的,是你自己打开 IDE,把它丢进你最头疼的那个文件夹里,然后盯着它干活的那两个小时。
就这么点事。但我觉得,挺重要的。