阿里、中科大等提出ExecRepoBench:仓库级可执行代码补全新基准

代码补全已成为日常软件开发中的重要工具。现有的评估基准通常采用静态方法,这些方法无法完全捕捉现实世界编码环境的动态特性,并面临重大挑战,包括上下文长度有限、依赖表面评估指标以及可能对训练数据集过度拟合


为此,本文提出一个全新的仓库级可执行的代码补全任务的测试基准:ExecRepoBench该基准包含来自 50 个活跃 Python 仓库的约 1200 个样本用于代码补全评估。此外,本文提出了一种基于抽象语法树的多层次的代码片段遮掩方法,并基于此方法构造了代码补全的指令微调数据集 Repo-Instruct


本文基于该数据集构建了代码补全基线模型 Qwen2.5-Coder-Instruct-C该模型在 MultiPL-E 和 ExecRepo Bench 上取得了优异的性能表现。

论文链接:
https://arxiv.org/abs/2412.05210

数据集链接:

https://huggingface.co/datasets/CSJianYang/ExecRepoBench

榜单链接:

https://execrepobench.github.io/leaderboard.html



可执行的仓库级代码补全基准

代码补全中的静态测试基准存在参考答案唯一,可能过拟合等问题,无法准确反映代码的实际可执行性和功能正确性。为此,本文创建了可执行的仓库级基准  ExecRepoBench。

▲ 评测流程示意图


测试集构建的过程中,遵循以下原则:


(1)只收集持续更新的 Python 语言的代码仓库。


(2)标注者收集或创建测试用例来进行评估。


(3)所有单元测试可以在有限时间内完成。


最终,ExecRepoBench 选取了 50 个具有复杂相互依赖关系的多文件 Python 仓库,先经过严格筛选以及人工创建可执行的单元测试,然后构建了 6 类,共计约 1200 个补全任务。


具体任务数量和 token 长度分布如下表所示:

6 类任务中,不仅包含传统的对单行、多行、多逻辑代码块进行补全,还新增了基于 AST 构建的复杂逻辑代码补全任务,具体包含:


1. 表达式级补全任务涉及诸如填补二进制运算中的操作数或运算符,提供适当的函数参数等。


2. 语句级补全任务针对单个语句的补全,例如变量赋值、控制流结构(if 语句、for 循环)等。目标是维护逻辑流并确保语法正确。


3. 函数级补全任务旨在补全整个函数体或填充函数签名,主要包括编写参数列表、返回类型和函数的内部逻辑。

▲ ExecRepoBench包含的仓库以及相应类别

基于抽象语法树的补全数据构造方法

本文提出了一种基于抽象语法树的多层次的代码片段遮掩方法,用于补全任务数据的构造。


该方法首先根据代码片段构建抽象语法树,然后提取其中语句级、表达式级、函数级和类级的代码片段,用于构建多级补全指令微调数据 Repo-Instruct,覆盖 Python、C#、Cpp、Java、Javascript、Typescript、Php 等 8 种编程语言,从近 1.5M 仓库中采样了 3M 个样本。


代码补全基线模型 Qwen2.5-Coder-Instruct-C 

与使用 Fill-In-Middle(FIM)的上下文填空训练的模型不同,本工作基于 Repo-Instruct,在 Qwen2.5-Coder-Instruct 7B 上进行微调得到了新的模型 Qwen2.5-Coder-Instruct-C。与 30 多个大小从 0.5B 到 30B+ 参数不等的模型相比,Qwen2.5-Coder-Instruct-C 在 12 项测试中的 10 项取得第一。

此外,为了对比不同类型的训练数据对于模型性能的影响,作者在 CrossCodeEval 与 MultiPl-E 数据集上进行了消融实验。实验结果表明,在模型中同时使用代码生成和补全数据进行训练,可以在保持生成任务性能的同时,大大提升模型的代码补全能力

总结与启发

本文提出了 ExecRepoBench,一个面向仓库级代码补全的全新测试基准,并设计了基于抽象语法树的多层次代码遮掩方法,用于构建指令微调数据集 Repo-Instruct。基于该数据集训练的代码补全模型 Qwen2.5-Coder-Instruct-C 在多项基准测试中表现优异,为代码补全任务的评估和改进提供了新思路。



(文:PaperWeekly)

发表评论