AI 编程跑分暴涨到 80%,OpenAI 一查,三成题是坏的
八个月,通过率从 23.3% 干到 80.3%。
如果只看这条曲线,AI 写代码的能力正在起飞,一路仰角拉升,快得连坐标轴都要装不下了。
然后 OpenAI 在月底发了一篇审计报告,轻描淡写地补了一句,这张卷子本身,大概三成的题是坏的。
好家伙。更妙的是,这张卷子还是 OpenAI 自己推荐大家用的。

我跟你说,这事比它看起来有意思得多。它不只是一条「某基准有缺陷」的新闻,它几乎是把「AI 跑分到底该怎么看」这个问题,连皮带骨地摆到了台面上。今天想跟你把这事捋一遍,捋完你再看任何一张模型发布会上的跑分图,感觉都会不一样。
先交代一下背景。
给 AI 模型考编程,这几年最有名的卷子叫 SWE-bench,一个从 GitHub 真实仓库里抽题的评测基准。所谓评测基准(benchmark),你可以理解成一套标准化考卷,所有模型做同样的题,按通过率排名,媒体拿它写标题,厂商拿它做发布会 PPT,我们这些围观群众拿它决定下个月给谁付 20 美元。
去年 OpenAI 就公开处刑过一次这个系列里的 SWE-bench Verified,结论很不客气,设计有根本缺陷,数据被污染,也就是题目和答案早就混进了模型的训练数据,考的不是能力是背题。当时 OpenAI 说,这卷子我们不用了,大家去用 SWE-Bench Pro 吧,题更难、更接近真实工程,还能测长时程的智能体编码。
八个月后,OpenAI 拿着放大镜把 Pro 也过了一遍,然后在报告结尾写下一句话,我们撤回此前采用 SWE-Bench Pro 的建议。
换了张考卷,考卷又坏了。
三成的题是怎么个坏法,这部分是全文最有程序员共鸣的地方,你听我慢慢说。
SWE-Bench Pro 的出题方式和它的前辈一样,从一批公开和私有仓库的功能变更历史里程序化抽任务。给模型看一段需求描述,模型写代码,跑一组隐藏测试,全过就算对,还不能把仓库里原有的功能改挂。听着挺合理对吧,真实需求、真实代码、真实测试,比让模型做算法题高级多了。
问题恰恰出在「真实」上。
OpenAI 审计出的头号问题,叫过严测试,占了整个数据集的 14% 到 18%。意思是隐藏测试强制要求了一些题面里根本没写的实现细节,你功能写对了,细节跟出题人不一样,判错。
报告里给了个例子,我看到的时候真的绷不住。有道题要求把目录条目渲染回 Markdown,题面把格式规定到了字符级,还贴心地给了示例,示例里是一个前导空格。而隐藏测试里的断言,要的是两个空格。
一个空格。
模型老老实实按题面写,挂。这道题从此在榜单上记为该模型「不会做」。
如果你打过 OJ,或者参加过任何在线判题的比赛,此刻应该已经开始生理性不适了。答案对的,输出格式差一个换行符,Wrong Answer。二十年过去了,我们用世界上最先进的 AI 系统互相评测,翻车姿势和大学机房里一模一样。
为什么会这样,OpenAI 的解释很到位。这些题的测试用例,原本是开源仓库里某个 PR 自带的,而 PR 里的测试是为了验证那一次特定变更写的,不是为了定义一个跟实现无关的判题标准写的。人类协作的产物,issue 描述、合入代码、单元测试,本来就经过维护者和贡献者的多轮拉扯,硬掰成一道道独立、干净的考题,缝就露出来了。
除了过严测试,还有三类坏法。低覆盖测试,测试查得太松,不完整的修复也能混过去。误导性提示,题面把模型往错误方向带,或者干脆和测试要求打架。以及提示不完整,隐藏测试要求的东西题面里没写、也推断不出来。

注意这几类坏法的方向不一样,这是这份报告里我觉得最值得咀嚼的一层。
过严测试是把对的判成错的,压低分数。低覆盖测试是把错的判成对的,抬高分数。一张卷子同时朝两个方向漏水,你就没法简单地说 80.3% 这个数「虚高」或者「低估」了,它是既有水分又有冤枉分的一锅粥。八个月从 23.3% 涨到 80.3% 的那条漂亮曲线里,有多少是模型真的变强,有多少是模型慢慢摸清了这批坏题的脾气,学会了往出题人的隐藏偏好上凑,从数字本身你根本分不出来。
怎么说呢,跑分不是假的,但它测的东西和你以为它测的东西,可能不是一回事。
再说说 OpenAI 这次是怎么查的,这部分对做工程的朋友有额外的看点。
他们先用一条自动化流水线扫了全部 731 道公开题,流水线会去读模型的解题记录、任务元数据和失败轨迹,标出 286 道疑似有问题的。然后兵分两路复核。一路是基于 Codex 的调查员智能体,能进到任务仓库里跑测试、翻文件、分析模型在这道题上的常见死法,跑完多轮由研究员做终审。另一路是五位资深工程师背靠背人工标注,每道题五个人独立看,先自己下判断,再看流水线的分析,分歧升级复审。

两路的结论重合率 74%。有意思的是人类下手更狠,智能体那路标了 27.4% 的题是坏的,人类标了 34.1%,而且在所有被标记的题里,没有任何一道题的人类多数意见是「这题没坏」。差距最大的是低覆盖测试这一类,人类认为占 9.4%,智能体只查出 4.1%,看来「测试写得太松」这种事,还是人类工程师闻得更准,谁让我们写了太多松测试呢。
说实话这个审计架构本身就值得抄。我的日常工作里就有一块是给模型搭评测,就是让模型真正能干活的那层工程里,负责「它到底行不行」的部分,我们内部踩过的坑和这份报告能对上一半以上。以前想核查一个几百道题的基准,纯靠人力,成本高到没人真的去做,大家默认「有名的基准应该没问题」。现在模型本身够强了,可以用智能体先做地毯式初筛,人只处理被标记的那一小撮,这套「机器扫雷、人拆弹」的打法有点子牛逼,第一次让大规模质检一个基准变成了一件成本上可行的事。
评测的缺陷一直都在,只是我们刚刚才配拥有看见它们的工具。
好,铺垫完了,回到你我最关心的问题。以后再看到模型跑分,到底该怎么读。
我自己的几条土办法,不一定对,但都是能今天就用起来的。
第一,先问这张卷子几岁了。一个基准发布得越久、被引用得越多,题目泄进训练数据的概率就越大,分数的含金量就越低。SWE-bench Verified 就是这么死的。看到一个新模型在老基准上刷出新高,先默念一遍,这可能是背题背出来的。反过来,越新、越没来得及被污染的基准,信号越干净,SWE-bench 社区这些年不停出新变体,某种程度上就是在跟污染赛跑。
第二,永远不要用单一数字做决定。一个模型如果只在某一张榜单上遥遥领先,在别的独立基准上表现平平,那大概率是这张榜单出了问题,而不是模型开了窍。跨基准的排名一致性,比任何单点分数都有信息量。
第三,看厂商敢不敢自曝。这次 OpenAI 审计的直接动机写在报告第一段,评测结果会喂进他们的部署与安全决策框架,卷子是坏的,安全结论就是错的,所以他们有真金白银的动力去查。一家愿意公开说「这个对我们有利的基准其实有问题」的厂商,报出来的其他数字也更可信。只报一个大数、不给失败案例、不给误差范围的跑分图,看看就好。
第四,也是我反正最信的一条,自己的活儿自己出题。从你自己的仓库里挑十几二十个真实任务,修过的 bug、加过的功能,做一套只有你自己知道答案的小评测,候选模型逐个过一遍。样本小、不严谨、没法发论文,但它考的是你真实的工作负载,没有污染,没有出题人的隐藏偏好,比任何公开榜单都更接近「这模型对我到底有没有用」的真相。土办法有土办法的准。
写到这想起经济学里那条老定律,古德哈特定律,一个指标一旦成为目标,它就不再是一个好指标。整个行业盯着 SWE-bench 系列优化了两三年,模型在榜单上一路狂奔,然后出卷人回头一看,卷子本身已经被这场狂奔碾得变了形。
这不是说跑分无用,是说跑分从来都只是航海图,不是海。图上标着水深八十米,你信它,直到龙骨擦到暗礁的那一声闷响。这次不过是画图的人自己潜下去看了一眼,上来说了句实话。
图还得看,但下水前,最好自己拿根竹竿探一探。
你手里那根竹竿,就是自己的代码库和那二十道只有你知道答案的题。