MirrorCode 探讨 AI 在无人接手的情况下,最多能够独立完成多大规模的软件项目。该问题直接指向编码 Agent 的任务边界与自主开发能力评估。
AI 在过去几年里,在软件工程基准测试上取得了快速进展。然而,大多数此类基准测试往往聚焦于较短的任务,例如修复 bug 或实现单个功能。MirrorCode 是我们与 METR 共同开发的基准测试,用于评估 AI 模型完成长周期编码任务的能力。在 MirrorCode 任务中,AI 模型需要在无法访问原始源代码的情况下,从头到尾重新实现一个完整程序。AI 生成的解决方案必须在端到端测试中与原程序的输出完全一致,其中也包括预留的隐藏测试。MirrorCode 的 25 个目标程序覆盖了计算机领域的多个方向:Unix 工具、数据序列化与查询工具、生物信息学、解释器、静态分析、密码学和压缩。
至关重要的是,我们提供了足够大的推理预算,让模型能够真正尝试解决 MirrorCode 任务。许多现有的软件工程基准测试将推理开销限制在约 1~10 美元,即使相应任务需要人类花费数周才能完成也是如此。例如,MirrorCode 中规模最大的任务之一,单次运行成本为 2,600 美元,AI 在无人干预的情况下连续工作了 19 天。
对人类软件工程师而言,重新实现整个程序是一项极具挑战性的工作。我们认为,如果没有 AI,一名人类工程师可能需要数月才能解决 MirrorCode 中最复杂的任务。不过,MirrorCode 任务本身也是可完成的;我们知道任务提供的信息足够充分,因此这种评估是公平的。
我们将 AI 模型置于沙箱中,要求它们在无法访问互联网、无法访问原始代码库,并且没有任何方式可以在任务中作弊的条件下完成工作。还有一些模型在开发代码期间永远无法看到的端到端测试,因此,它们不能简单地创建一张查找表来模仿原程序的输出。
尽管 MirrorCode 任务难度很高,AI 已经能够解决其中一些长周期任务。例如,Claude Opus 4.7 重新实现了 gotree:这是一个拥有约 16,000 行 Go 代码、包含 40 多条命令的生物信息学工具包。¹ 我们认为,如果没有 AI 辅助,同样的任务需要一名人类工程师花费 2~17 周。Opus 4.7 用 14 小时解决了这个任务,成本为 251 美元。
这些结果有一个重要的注意事项:数据污染。由于 MirrorCode 任务要求重新实现开源程序,AI 模型很可能在预训练过程中见过原始代码库。这可能会导致模型在该基准测试中的表现虚高。不过,AI 成功重新实现了多个通过记忆检测的目标程序,却未能重新实现一些在检测中发现存在记忆证据的程序。这表明,实验结果并非主要由记忆驱动,但我们仍无法排除记忆对 AI 表现有所贡献的可能性。总体而言,我们预计 MirrorCode 所衡量的能力可以泛化到模型从未见过的代码库。在论文中,我们对此进行了进一步讨论,同时还提供了更多结果以及基准测试构建方面的详细信息。
MirrorCode 尚未被完全解决。在我们定期更新的排行榜中,报告的是 MirrorCode (ML, +Private, 2L)。这意味着我们运行 Medium 和 Large 分组中的 15 个目标程序,并去掉 Small 分组。每个目标程序会使用两种实现语言进行评估(通常是 Go 和 Ada),因此共有 30 项任务。每项任务运行三次,每次尝试的预算为 100 亿个 token,最长运行 7 天。²
我们将 scaffold 和 MirrorCode 的 25 个目标程序中的 22 个以开源形式发布(在六种受支持的编程语言中,共计 132 个任务实例),另外三个目标则作为私有测试集保留。
这项工作由我们与 METR 共同开发,并得到了 METR 的资助。MirrorCode 的作者是 Tom Adamczewski、David Owen 和 David Rein。Florian Brand、Giles Edkins、Allen Hart 和 Daniel O’Connell 贡献了额外的目标程序。Rasmus Faber-Espensen 对基础设施进行了关键改进,并提供了工程方面的建议
得分最高的 AI gotree 实现通过了 2001 项测试中的 2000 项,但在一项边缘情况测试中失败了。这项测试针对的是一条用于操作日期注释的小众命令。因此,严格来说,它们并没有以 100% 的完成度解决这项任务,但我们认为这个重新实现已经接近完美,基本覆盖了范围内的全部功能。
得分最高的 AI gotree 实现通过了 2001 项测试中的 2000 项,但在一项边缘情况测试中失败了。这项测试针对的是一条用于操作日期注释的小众命令。因此,严格来说,它们并没有以 100% 的完成度解决这项任务,但我们认为这个重新实现已经接近完美,基本覆盖了范围内的全部功能。
相关定义请参阅论文中的“建议命名约定”。“+Private”表示包含私有测试集:在这里,指的是 private_M 和 private_L,也就是 Medium 和 Large 分组中的私有目标程序。在 2L 映射下,目标程序通常使用 Go 和 Ada(一种主流语言和一种低资源语言),但有两个例外。这些分数不能与论文中的结果直接比较:论文评估了全部 25 个目标程序,在 Small 和 Medium 分组中使用了全部六种 Agent 实现语言,并且除 Large 目标程序外,每次尝试的预算均为 10 亿个 token,同时不设时间限制。
相关定义请参阅论文中的“建议命名约定”。“+Private”表示包含私有测试集:在这里,指的是 private_M 和 private_L,也就是 Medium 和 Large 分组中的私有目标程序。在 2L 映射下,目标程序通常使用 Go 和 Ada(一种主流语言和一种低资源语言),但有两个例外。这些分数不能与论文中的结果直接比较:论文评估了全部 25 个目标程序,在 Small 和 Medium 分组中使用了全部六种 Agent 实现语言,并且除 Large 目标程序外,每次尝试的预算均为 10 亿个 token,同时不设时间限制。