swt-bench
logic-star-ai/swt-bench加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你是一个开源项目的维护者,某天收到一个 Pull Request,声称修复了困扰用户多年的一个 Bug。你的第一反应是什么?
不是合并,而是问:有没有测试? 测试能不能复现那个 Bug,修复后又能不能通过?
这正是 SWT-Bench 要做的事情——只不过主角从人换成了大语言模型(LLM)。
SWT-Bench 由苏黎世联邦理工学院(ETH Zurich)的安全研究团队开发,在 NeurIPS 2024 发表,是目前最接近真实软件工程场景的 LLM 代码能力评测基准之一。它的核心挑战是:给 LLM 一个真实 GitHub Issue,让它生成一个"验毒"测试——这个测试在修复前必须失败,修复后必须通过。
在 SWT-Bench 出现之前,LLM 代码能力的评测主要依赖两类基准:
真实世界的 GitHub Issue 是什么样子?文本模糊("点击按钮没反应"、"导入时报错")、环境复杂(涉及多个文件、多层依赖)、修复可能跨越几十个文件。传统评测集根本无法覆盖这种复杂度。
SWT-Bench 应运而生。团队从 Hugging Face 的 SWE-bench 数据集出发,构建了覆盖 27,475 个真实 GitHub Issue 实例 的评测集,每个实例包含:
LLM 的任务是:根据 Issue 生成一个能够复现 Bug 的测试脚本。
SWT-Bench 提供了两种评测模式,适用场景不同:
Unit Test 模式(默认):LLM 生成的是标准的单元测试用例(如 pytest 测试),直接融入项目既有测试套件。评测框架会在"原代码"和"修复后代码"两个状态下分别运行测试,通过对比测试结果判断生成质量:
复现脚本模式:LLM 生成的是独立的 shell 脚本或 Python 脚本,通过脚本的退出码(0=成功,1=失败)判断效果。模式更简单,适合快速验证,但无法检测对既有测试套件的影响。
真实评测的难点在于环境一致性。同一个 Bug,在你的机器上能复现,在 CI 环境中可能就"神奇地"消失了——依赖版本、操作系统、路径差异都可能造成偏差。
SWT-Bench 通过 Docker 容器化 彻底解决了这个问题。评测框架使用 Python docker 库动态构建三层镜像:
pip install 等)三层镜像逐层叠加,既保证了环境隔离,又通过缓存机制(--cache_level 参数)大幅降低重复构建开销。
评测框架支持并行执行(--max_workers 参数),但文档建议 max_workers ≤ min(0.75 * CPU核数, 24),以避免 Docker 资源竞争。
SWT-Bench 的源码结构清晰,主力语言为 Python(3.9+),采用 setuptools 打包:
src/
├── main.py # CLI 入口,argparse 参数解析
├── docker_build.py # 核心:Docker 镜像多阶段构建逻辑
├── dockerfiles.py # 三层 Dockerfile 模板(base/env/instance)
├── run_evaluation.py # 并行评测执行器(ThreadPoolExecutor)
├── grading.py # 测试结果判定(F→X、P→P 等状态机)
├── log_parsers.py # 各仓库的日志解析器(适配不同测试框架)
├── test_spec.py # 测试规格定义与生成
├── exec_spec.py # 执行规格(unit_test / reproduction_script)
├── dataset.py # HuggingFace 数据集加载
└── utils.py # 日志、文件锁等通用工具
关键依赖:requests、datasets(HuggingFace)、docker(容器)、GitPython(Git 操作)、unidiff(补丁比对)、tqdm(进度条)、fire(CLI 生成)。
AI 相关性:虽然 SWT-Bench 本身不是 AI 模型,但它是一个纯 AI 评测工具——评测的对象是 LLM 的代码生成能力,topics 明确标注 ['benchmark', 'evaluation-framework', 'llm', 'unit-testing']。
这是 SWT-Bench 最"劝退"的部分。官方明确要求:
| 资源 | 最低配置 |
|---|---|
| CPU | 8 核 |
| RAM | 16 GB |
| 磁盘 | 120 GB(用于 Docker 镜像) |
| 架构 | x86_64(arm64 实验性) |
对于个人开发者来说,光是 120 GB 存储就足够让人三思。Docker Desktop 用户还需要在设置中扩展虚拟磁盘空间。
# 1. 安装 Docker(Linux 需 post-install 配置)
# 2. 克隆仓库
git clone git@github.com:eth-sri/swt-bench.git
cd swt-bench
# 3. 创建虚拟环境
python -m venv .venv && source .venv/bin/activate
# 4. 安装(setuptools 开发模式)
pip install -e .
# 5. 验证安装(单实例快速测试)
python -m src.main \
--predictions_path gold \
--max_workers 1 \
--instance_ids sympy__sympy-20590 \
--run_id validate-gold
# 6. 正式评测(SWE-bench Lite 示例)
python -m src.main \
--dataset_name princeton-nlp/SWE-bench_Lite \
--predictions_path <你的预测文件路径> \
--filter_swt \
--max_workers 8 \
--run_id my-eval-run
评测结果默认输出到 evaluation_results/ 目录,配合 python -m src.report 可生成格式化报告。
无 Web UI。SWT-Bench 是纯 CLI 工具,通过命令行参数控制所有行为,不提供图形界面。这对于需要批量跑评测的开发者来说不是问题,但初次接触的爱好者可能需要一点适应时间。
没有预构建的 Dockerfile 或 docker-compose.yml,评测依赖的镜像需要实时构建,且构建过程耗时较长(每个实例约 2-5 GB)。对于只是想快速体验的用户来说,部署成本较高。
120 GB 磁盘是最明显的天花板。团队正在尝试通过镜像层级优化来降低存储需求,但目前仍未根本解决。
Apple Silicon Mac 用户需要 Rosetta 2 转译运行 x86_64 镜像,性能损耗明显。M 系列芯片的原生支持被列为"实验性"。
即使使用 max_workers=24,完整评测 SWE-bench Lite(~2,300 个实例)仍需数十小时。官方提供的并行优化指南有限,大规模评测需要自行调优。
评测数据托管在 HuggingFace,数据集加载依赖网络连接和 datasets 库。离线环境下无法运行。
SWT-Bench 的价值不只是提供一个数字——"我们的模型成功率 23%"——而是揭示了当前 LLM 在真实软件工程任务中的能力边界。
从论文数据来看,即便是 GPT-4,当前最佳方法的成功率也不到 30%。这说明当前 LLM 在代码生成上还有很长的路要走——能写简单算法题,不等于能解决真实 Bug。
项目官网 swtbench.com 维护了公开排行榜,研究者和开发者可以提交自己的方法进行横向对比,推动整个领域的能力边界向前推移。
一句话总结:SWT-Bench 是目前最接近真实场景的 LLM 代码能力评测基准,通过 Docker 容器化确保评测可复现性,是 AI 代码助手研究者的必备工具,但部署资源门槛较高。