SWE-bench: Can Language Models Resolve Real-World GitHub Issues?


TL;DR

本文提出了一个名为 SWE-bench 的大规模、真实世界的软件工程基准,通过要求语言模型(Language Models, LMs)解决来自12个流行Python仓库的真实GitHub问题,发现即使是最先进的模型也难以完成这些复杂的代码编辑任务,揭示了当前模型能力的巨大局限性。

关键定义

本文提出了一个核心基准,并在此基础上构建了评估体系:

相关工作

本文方法

SWE-bench 基准构建

本文的核心方法论是其基准的构建流程,该流程旨在从海量的开源项目中自动化地筛选出高质量、可评估的任务实例。整个流程分为三个阶段:

SWE-bench 构建流程图 图1: SWE-bench任务实例的构建流程,从合并的拉取请求中筛选,要求其解决一个问题、贡献了测试并且能成功安装。

  1. 阶段一:仓库选择与数据抓取 (Repo selection and data scraping): 从 12 个流行的 Python 开源 GitHub 仓库中抓取了约 90000 个拉取请求(Pull Requests, PRs)。选择流行仓库是因为它们通常有更好的维护、清晰的贡献指南和更高的测试覆盖率。

  2. 阶段二:基于属性的过滤 (Attribute-based filtering): 对 PRs进行初步筛选,保留同时满足以下两个条件的候选任务:(1) PR 明确地解决了一个 GitHub 问题;(2) PR 修改了仓库的测试文件,这表明开发者很可能为验证修复或新功能编写了新的测试。

  3. 阶段三:基于执行的过滤 (Execution-based filtering): 对每个候选任务进行验证。首先,仅应用 PR 中对测试文件的修改,运行测试并记录失败的测试用例。然后,应用 PR 中对代码文件的修改,再次运行测试。只有当至少存在一个“fail-to-pass”测试时(即从失败变为通过),该任务实例才被保留。此步骤确保了每个任务都有一个可靠的、可自动验证的评估标准。

经过这三层过滤,最终得到了包含 2294 个任务实例的 SWE-bench。

SWE-bench 任务形式与特点

SWE-bench 任务分布 图2: SWE-bench 任务在12个开源GitHub仓库中的分布。

属性 类别 平均值 最大值
问题文本 长度 (词) 195.1 4477
代码库 文件数 (非测试) 3,010 5,890
  代码行数 (非测试) 438K 886K
黄金补丁 编辑行数 32.8 5888
  编辑文件数 1.7 31
  编辑函数数 3.0 36
测试 Fail to Pass 数 9.1 1633
  总计测试数 120.8 9459

表1: SWE-bench 任务实例的各项属性统计。

SWE-bench Lite

为了方便研究者快速上手和迭代,本文还提供了一个轻量级子集 SWE-bench Lite,包含 300 个从原数据集中采样的、相对更独立的任务实例,主要关注功能性 bug 的修复。

SWE-Llama 模型

为了评估开源模型在该任务上的能力,本文对 CodeLlama 模型进行了微调,推出了 SWE-Llama。

实验结论

实验设置

由于代码库远超模型的上下文窗口,本文采用了一种基于检索的方法来构建模型输入。

评估的模型包括 Claude 2、ChatGPT-3.5、GPT-4 以及本文微调的 SWE-Llama 7b 和 13b。

核心实验结果

1. 现有模型性能极低,任务极具挑战性。

模型 SWE-bench (% Resolved) SWE-bench (% Apply) SWE-bench Lite (% Resolved) SWE-bench Lite (% Apply)
Claude 3 Opus 3.79 46.56 4.33 51.67
Claude 2 1.97 43.07 3.00 33.00
ChatGPT-3.5 0.17 26.33 0.33 10.00
GPT-4-turbo 1.31 26.90 2.67 29.67
SWE-Llama 7b 0.70 51.74 1.33 38.00
SWE-Llama 13b 0.70 53.62 1.00 38.00

表2: 各模型在使用BM25检索器时的性能对比。% Resolved 指成功解决问题的比例,% Apply 指生成的补丁能成功应用的比例。

2. 检索质量和上下文长度是关键瓶颈。

性能与上下文长度关系图 图3: Claude 2 的性能随着输入总长度的增加而下降,但与问题描述本身的长度关系不大。

3. 模型生成的解决方案更简单。

模型 总行数 添加行数 删除行数 函数数 文件数
Claude 2 19.6 4.2 1.9 1.1 1.0
黄金补丁 (对应) 44.1 12.0 5.8 2.1 1.2
所有黄金补丁 74.5 22.3 10.5 3.0 1.7

表3: 模型生成的成功补丁与黄金补丁的平均编辑统计对比(在“神谕”检索设置下)。

4. 质性分析揭示了模型的“贪心”和“原始”行为。

最终结论

真实世界的软件开发远比简单的代码补全复杂。SWE-bench 通过模拟真实的开源协作流程,为评估和发展语言模型提供了一个忠实且极具挑战性的环境。实验结果表明,当前最先进的语言模型在解决实际软件工程问题方面仍处于起步阶段,在代码定位、长上下文理解和复杂推理方面存在巨大提升空间。本文希望该基准能够推动未来语言模型向着更实用、更智能、更自主的方向发展。