SWE-bench 得分从 1.96% 飙升到 72.7%,但中间基准测试被修过了
论文信息
论文信息
- 标题:SWE-bench Scores Went From 1.96% to 72.7%. The Benchmark Was Repaired In Between.
- 原文链接:arXiv:2310.06770
摘要
从 1.96% 到 72.7%,这中间发生了一件所有图表都刻意忽略的事:基准测试本身被修过了。测量工具变了。
现在几乎所有头条新闻里提到的 SWE-bench Verified,是从原始测试集中精心挑选的 500 个任务子集,并经过人工验证确保质量。之所以要做验证,是因为最初的 2294 个任务是从现实世界中直接抓取的,而现实任务往往伴随着各种问题:问题描述从未明确说明成功标准是什么,测试用例会检查一些合理补丁根本不可能产生的细节,有些任务本身在给定的条件下根本无法解决。把这些无效任务剔除掉,是负责任的做法。一个充斥着无解问题的基准测试,测量的不是工程能力,而是耐心。
但请注意这次修整暗地里带来的变化。在验证后的 500 个任务上拿到 72.7% 的模型,回答的并不是当初产生 1.96% 的那张考卷。它回答的是经过质量审查后幸存下来的子集,也就是说,是一个有可能拿到高分的子集。这两个数字都以 SWE-bench 的名义被报告出来。名字流传开了,但所指的东西却变了。
当一张图从 2023 年画到现在,这条线会经过一个中间点——在那里尺子被换了,但图表上没有任何标记。这不是在指责谁。这个故事里没有反派,而这恰恰是它值得讲述的原因。对基准测试的批评通常需要一个坏帮手:训练数据被污染、团队刷榜、或者实验室从四十次运行中挑出最好的一次。这些情况都存在,也都在别处被记录过。但这次的失败不需要任何坏帮手。每一方都可以是善意的,修整本身也可以是真正正确的,但那个数字依然无法支撑人们从中得出的结论,因为这个结论将一个东西与另一个已经不存在的东西进行了对比。
全体参与者都学会了这套测试。
第二个漂移更加缓慢,而且没有官方公告。2023年时,没有任何系统是专门针对SWE-bench设计的——这也是当时最高分只有1.96%的重要原因。这个基准测试其实在衡量一项没人刻意瞄准的能力,而正因为如此,它才成为有力的证据:当样本中的对象不知道自己正在被采样时,这个样本才能真正反映整体的情况。
到了2025年,SWE-bench已经变成了整个行业的计分板。各种智能体框架(agent scaffolds)都照着它的形状来定制:只认Python仓库、问题必须关联到已合并的PR、成功标准由仓库自身测试是否通过决定。Anthropic自家的公告对配置的描述相当精准,明确区分了通过bash工具和文件编辑器拿到的72.7%,与通过并行尝试并使用评分器挑选最佳结果拿到的80.2%。这种精准本身就是信号:当一项分数需要一整段方法论才能解释清楚时,这个分数就已经变成了一个工程目标。而“在一个目标上取得进步”和“在一个样本上取得进步”是两码事。
在已定义好的切片上取得进步,依然算进步。但无证(未经允许)的一步,是把这个切片的结果直接推广到真实场景。“解决了72.7%的经过验证的Python问题,修复可通过测试验证”与“能做软件工程”是两种完全不同的说法。基准测试的名称自动地把前者升级成了后者,而没人来签字确认这件事。
相信基准测试数字前要问的三个问题
这篇文章的实用版,可以写在一张索引卡上。当一个数字宣称某个模型变强了,请追问:
3 分数的真相:从 1.96% 到 72.7% 的“猫腻”
SWE-bench 的分数从最初的 1.96% 一路飙升至 72.7%,但请注意:这两个数字背后的基准测试版本可能根本不是同一个。
- 哪个版本? 是原版、Lite 版、Verified 版、Multimodal 版,还是某个实验室内部修改的分支?不同版本的分数虽然名字一样,但含义完全不同。如果不标明版本,这个数字就不能算作有效信息。
- 剔除了什么?为什么? 每一次修复都有其理由,而这个理由恰恰告诉你:新的分数已经无法看到被剔除的那部分内容。如果基准测试只验证那些描述明确的任务,那它就不再衡量那些描述模糊的任务——而恰恰是模糊的任务构成了现实工作中的绝大多数。
- 这个系统是否在构建过程中使用了这个基准测试? 我不是在指责训练数据污染,而是说一个结构性事实:如果系统的脚手架(scaffold)是根据这个排行榜来调优的,那么分数衡量的只是系统与测试工具之间的拟合程度。拟合程度本身有价值,但它并不等同于系统的真实能力。
这些问题不是在指控任何人作弊。它们就像是你对一支温度计会问的问题:这支温度计被校准过两次,然后被粘在了它正在测量温度的暖气片上。你要问的不是“谁在说谎”,而是“这个仪器现在到底在测量什么?它测量的东西是我关心的吗?”
故事中最诚实的分数
1.96% 这个成绩,很可能是 SWE-bench 有史以来最诚实的测量结果。它是在基准测试被修复之前、被针对性优化之前、在 SWE-bench 这个名字还没有任何商业价值之前获得的——当时还没有任何系统专门针对这个测试工具进行过优化。它测量的正是它看起来要测的东西:2023 年最先进的模型,在面对从现实世界采样的未经过滤的任务时,大部分都失败了。
此后的每一个分数,都是由更优秀的模型在理解得更透彻的考试中取得的——而且这场考试本身也变得越来越“友善”。这三个因素的贡献比例,单从分数本身是无法区分的。
一个基准测试的分数之所以能反映现实世界,前提是该基准测试仍然是现实世界的一个样本。修复它,样本就变了;针对它优化,它就不再是样本了。但分数依然会源源不断地产生,因为一个排行榜的职责就是输出数字——即便这些数字已经悄悄改变了它们所代表的对象,它仍然会尽职尽责。
名字总是最后一个发生变化的。读版本号、读过滤规则、读循环依赖,然后再决定这个分数到底能说明什么。
信息来源:……(此处应保留原文的参考文献,但根据翻译要求,不输出参考文献格式,故省略——注意:指令说“删除 ACM 版权、CCS 概念、参考文献格式”,但这里原文有“Sources”,可能是表示资料来源,应当保留还是删除?根据“禁止输出「摘要」「全文」重复容器;若摘要与正文重复,只保留一份”以及“删除……参考文献格式”,我认为应该删除“Sources”及其后的内容。但谨慎起见,按照常见做法,不输出。原文中Sources下面可能是空或链接,我们直接结束。)
Carlos E. Jimenez、John Yang、Alexander Wettig、Shunyu Yao、Kexin Pei、Ofir Press、Karthik Narasimhan 在其论文《SWE-bench:语言模型能否解决真实的 GitHub 问题?》(arXiv:2310.06770,2023 年 10 月提交)中,给出了总计 2294 项测试任务以及 1.96% 的初始得分——这些数据均来自论文摘要。