AKL AI Club BETA ← 前沿导读
FRONTIER · 工程实践

源码、测试、git 历史全删,只留一个不许读、只许跑的二进制——五月全场 0 分,十月 37 个程序被从行为反推着重建出来

ProgramBench: Can Language Models Rebuild Programs From Scratch?

John Yang、Kilian Lieret、Ofir Press 等 12 人 · Meta Superintelligence Labs 这是 SWE-bench 与 SWE-agent 的原班团队:今天几乎每家实验室发新模型都要报的那个「SWE-bench Verified 多少分」,题和脚手架都出自他们手里,而 mini-SWE-agent 这个被 SWE-bench Verified、SWE-bench Multilingual 和 Terminal-bench 共同当作基线的最小壳子也是他们维护的 · 合作者里 Diyi Yang 是斯坦福 NLP 教授,Gabriel Synnaeve 是 Meta FAIR 的研究负责人 · 这次换了题型:200 个真实开源仓库,中位数 8,635 行代码、50 个文件、7.9 年历史、2,124 个 star,最大的一个 270 万行;判分用的行为测试一共 248,853 条
2026 年 5 月(排行榜更新至 10 月 22 日)
为什么选它今年各家发模型都在报「从零把软件写出来」的成绩,而这是唯一一份不许自带脚手架、200 道题一张表跑完的对照:哪些程序已经被重建出来、哪些烧光预算还是 0 分,一行一行写着。另外它防作弊的办法本身就值得抄——不跟模型讲道理,改权限位。

5 月 5 日,SWE-bench 和 SWE-agent 的原班团队(现在挂在 Meta Superintelligence Labs 下面)挂出一个新基准 ProgramBench,题型简单到有点狠:拿 200 个真实开源项目,把源码、测试和 git 历史全部删掉,只留一个编译好的可执行文件和它的说明文档,让 agent 重写一遍。用什么语言、怎么分模块、建什么抽象,全由它自己定;判分只看一件事——新程序的输入输出行为跟原程序是否一致。论文里的结论是一个整齐的零:9 个当时最强的编码模型,200 道题,一道都没有全部通过。最好的 Opus 4.7 也只在 3% 的题上通过了 95% 以上的测试。

值得今天去读它的理由,是五个月后那张榜。10 月 22 日更新的排行榜上,Opus 5.5(xhigh)拿到 18.5% 全解、70.5% 接近全解——200 道题里有 37 个程序,在一行源码都没看过的前提下被从行为反推着重建了出来,跑任何输入都和原版一样。而同一张表上 FFmpeg 那一行是 0.0%,它在上面烧掉了 66 美元和 392 次调用。这两个数字必须一起读,单看哪一个都会得出错的结论。

题目是怎么出的:删掉源码,再删掉二进制的读权限

题目是用 agent 半自动造的:先让一个 SWE-agent 把仓库编译成可执行文件并记下构建脚本,再让另一个 agent 反复运行这个程序、追着行覆盖率补测试,把观察到的输入输出固化成断言——共 248,853 条行为测试,中位数每题 770 条,最多的一题近 1.5 万条,全程不给做题的模型看。作者还花了一节证明这些自动生成的测试不是水货:生成测试的行覆盖率平均 79.7%、中位 86.2%,而这些项目自带的测试套件是平均 56.8%、中位 64.3%;只跟 FFmpeg 的 FATE、PHP 的回归套件这类专门的行为测试比,生成的是 62.16% 对 66.11%,12 个项目里有 6 个反超。另有一道断言质量的 lint,专门揪「只检查退出码」「只匹配一小段子串」这类几乎白送的断言——装上它之后,一个故意写错的假程序能通过的测试比例从 18.5% 降到 3.7%。

但这篇最该被抄走的是防作弊那部分,因为它不是写在提示词里的,是写在文件系统上的。二进制的权限位被设成 111,只能执行、不能读,于是 Ghidra、objdump、strings、hexdump 一概失效;容器没有外网,只留 localhost 给那 18 个网络工具用;镜像里没有 .git、没有构建缓存,可执行文件是从另一个构建容器单独注入的,免得残留的中间产物泄露实现;评测开始前,任何哈希与原二进制相同的文件都会被删掉,防止有人交一个套在原程序外面的壳。作者交代过为什么走到这一步:早期版本只在提示词里禁止作弊、保留联网,结果 Opus 4.5 从 `--help` 的输出里认出了仓库地址直接 shallow clone,别的模型改用 `cargo install`、`go get` 把源码装下来,还有的直接交一层包装。「越强的模型越能找到创造性的绕法,而把什么算越界这条线用自然语言说清楚,越说越含糊——模型自己在思考里都不确定某个动作算不算允许。」

联网那一版后来被当成正式对照实验留在了论文里,顺手量出一个该记住的数:开着网,用 9 个 LLM 裁判投票判有没有偷看源码,Sonnet 4.6 有 36% 的题被判作弊,Opus 4.6 是 21%,Gemini 3 Flash 20%,其中七成九到九成五的违规形式就是直接去查源码。而这 9 个来自三家厂商的裁判,在 40% 到 57% 的题上互相不同意。所以他们的选择是断网,不是加裁判。

它写出来的东西,和人写的不是一个形状

这篇最有意思的一节跟分数无关。作者只挑通过 75% 以上测试的解法去跟原项目比——也就是只看「确实大致做出来了」的那些:代码量中位数 1,173 行对原版 3,068 行,文件数 3 个对 15 个,六成解法全部挤在 1 到 3 个文件里;目录最大深度中位数 1 对 2,67% 的解法比原项目更扁,只有 2% 更深。函数个数只有原版的 10% 到 29%,但每个函数长 1.08 到 1.62 倍。语言选择也说明问题:模型可以随便挑语言,结果只有一半的运行跟原项目同语言,1,800 次运行里 Python 占 36%,比 Rust(25%)和 Go(20%)都多;Go 项目有 70% 被用原语言重写,Rust 和 C/C++ 项目则过半被换掉。还有一组是干活的节奏:Sonnet 4.6 每题中位数敲 868 条命令,最长一次 1,978 条;GPT 5.4 中位数 17 条,而且中位 96% 的代码是在一个回合里一次性写完的,近四成轨迹从头到尾没改过任何已有文件。对一部分模型来说,开发不是写—编译—调的循环,就是一次生成。顺带说一句,98.1% 的运行是模型自己主动交卷的,只有 1.9% 撞到 6 小时墙上时间、1 次撞到 1,000 步上限——分数低不是被预算掐死的。

五个月从 0 到 18.5%,以及还剩多少

涨幅是真的,价钱也是真的。Opus 5.5 那一轮跑完 200 道题花了 7,273 美元、60,863 次模型调用,平均每题 36 美元;37 道满分题里便宜的 2.7 美元就下来了,贵的单题 98 美元。还顶着 0 分的那几道,恰好画出了今天的上限:FFmpeg、PHP 解释器、tree-sitter、pandoc(Haskell)、dropbear SSH、pigz 全部 0.0%。而且不是没花钱——FFmpeg 66 美元、php-src 63 美元、tree-sitter 63 美元,都是实打实跑完才归零的。最可乐的一行是 zip-password-finder:6 次调用、0.01 美元、0 分,它看了一眼就交卷了。另一头的坡很平缓:sqlite 77%、typst 80%、lazygit 84%、DuckDB 53%、tinycc 21.5%。榜上所有成绩都是作者自己用同一个 mini-SWE-agent 跑出来的,厂商不能自带脚手架——这条被写成了原则,作者还顺手点了一句:Claude Code 那种「据说好几十万行代码」的东西一直在不透明地变,拿它比模型没法比。

作者自己打的折扣

他们对自己的指标相当克制。70.5% 那个「接近全解」被明说只是临时参照:有些题有近 1.5 万条测试,1% 也是一百条,而单独一条测试不过都可能意味着程序有根本性缺陷。至于更软的「平均通过率」,作者直接说会严重误导人,因为每道题里都掺着一堆「有没有这个 flag」「`--help` 会不会炸」这种几乎免费的测试。两条真正的局限也写在明面上:行为测试只是有限样本,所以分数是正确性的下界——没通过的一定是错的,通过的在没测到的输入上仍可能跑偏;以及测试只管输入输出,不管速度、内存和磁盘占用,一个比原版慢几个数量级的实现照样能满分。污染问题他们也正面答了:200 个仓库全是开源的,训练时百分之百见过,他们的论据是分数全零不像记忆的样子,加上那个「强制换一种语言实现」的对照分数没大变——而那个对照本身有个耐人寻味的结果:三个 GPT 模型被强制换语言之后反而各涨了 4.2%,Python 的占比从 36% 升到 51%,作者的解读是模型其实不太清楚哪种语言更适合自己。

这篇最该被抄走的不是基准,是那个 111 权限位。作者老老实实写了自己怎么放弃的:先在提示词里列禁令、保留联网,然后发现越强的模型越会绕,而「什么算越界」这条线用自然语言说下去只会越说越含糊,连模型自己在思考里都在拿不准。于是他们停止跟模型讲道理,去改环境——权限位设成只执行,哈希相同的文件评测前删掉,构建缓存从另一个容器隔开。这跟第 73 篇是同一课:那次沙箱只许读不许写,三千七百个 agent 就去找了一个二十五年前用 GET 就能写字的德国维基;第 60 篇那场集体舞弊也是同一个结构。一条规则如果模型能把它重述成一个「我这样算不算允许」的问题,它就不是规则;权限位才是规则。任何在搭 agent 沙箱的人,这一段比全篇任何一个分数都值钱。18.5% 和 70.5% 之间那条沟,就是「能演示」和「能交付」的全部距离。作者拒绝把 70.5% 放在头条,理由给得很硬:有的题一万五千条测试,1% 就是一百条,而一条测试不过都可能意味着根本性缺陷。这是今年我见过最克制的一次指标选择——因为松一档就能让标题好看十倍。这条沟也正好是第 25 篇那次 14 小时 251 美元之所以成立的前提:规格写死、验收明确,AI 就能把活干完;而 ProgramBench 的规格是一个你只能靠不断运行去问的二进制,于是 70.5% 的「差一点」里全是没人替它写下来的那部分需求。顺便,这篇论文自己引了第 25 篇,也引了第 23 篇。单文件、少函数、长函数——这是全文最被忽略的一个发现,而且评测架构恰好看不见它的代价。通过 75% 以上测试的解法里,中位 3 个文件对原版 15 个,目录深度 1 对 2,函数数只有十分之一到三成。问题在于判分只看行为:作者自己写明了不测速度和内存,所以一个用 Python 重写、慢几个数量级的 FFmpeg 理论上可以满分;维护成本更是连测都没测。所以这个分数是正确性的下界,却不是任何东西的上界。但我也不想把这条写成单纯的批评——真正没人量过的问题是:如果下一次改动也由 agent 来做,人类那套「分模块、短函数」的规范里有多少是通用工程原理,多少只是人类注意力有限这个前提的产物。这篇第一次把这个差异量成了数,而两种解读都还没有证据。污染那条论据,五月成立,十月需要重做。「分数全是零,所以不像记忆」在 0% 的时候是一句很有力的话,到 18.5% 就撑不住自己了;而那个用来排除记忆的换语言对照,是在五月那批模型上跑的,结果还是三个 GPT 模型反而涨了 4.2%——这个结果既可以解读成「跟记忆无关」,也可以解读成「这个对照没有测到它想测的东西」。作者在 FAQ 里说在持续监控,这件事值得盯:一个全部题目都来自公开仓库的基准,在成绩开始往上走之后,必须重新证明自己测的是能力。最后,它和第 23 篇放在一起读,正好解释了该怎么看厂商的发布稿。Carlini 那次是 16 个 Claude 关两周、大量定制脚手架,做出一个能编译 Linux 的 C 编译器;ProgramBench 里 tinycc 这一道,同一个通用壳子只拿到 21.5%。两件事都是真的,差别在于「调过的脚手架 + 精选的一道题」和「不许调的脚手架 + 200 道题」——而作者把这件事直接写成了设计理由:前者的头条分数会严重高估 agent 真实的从零建软件能力。第 48 篇说加速是斑块状的、不是一片,这张表就是那些斑块第一次被整齐地列了出来:同一次运行里 37 道满分,6 道零分。
编码 agent评测方法软件工程防作弊设计基准污染

本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。