Automated Program Repair: Emerging Trends Pose and Expose Problems for Benchmarks
【综述解析·I】Automated Program Repair: Emerging Trends Pose and Expose Problems for Benchmarks
领域:计算机科学→软件工程→程序分析与程序维护、APR、Benchmarking、Evaluating
摘要:
机器学习(ML)已经渗透到自动程序修复(APR)领域。各类算法使用神经机器翻译和大型语言模型(LLM)来生成软件补丁等。但这些 ML 应用与早期工作存在重要差异,使得确保其结果有效且具备泛化能力变得更加复杂。一个挑战在于,现行最流行的 APR 评测基准并非为 ML 技术设计,尤其是对于 LLM,其庞大且往往未公开披露的训练数据集可能包含了评测中使用的问题实例。
本文回顾了自 2018 年以来在该领域五大顶级会议上发表的 APR 相关工作,重点关注包括 LLM 在内的 ML 模型的显著崛起等新兴趋势。我们从结构和功能两个维度对基于 ML 的文章进行了分类,并指出了这些新方法引发的多种问题。值得注意的是,由于现有评测基准在 ML 技术兴起之前设计,使用它们来验证基于 ML 的 APR 方案时,可能会出现数据泄露和数据污染的问题。我们讨论了评测设计与性能报告中的不一致之处,并在可行时提出了改进建议。最后,文章还展望了该领域已经开始探索的一些有前景的新方向。
发表单位:亚利桑那州立大学;通讯作者:Stephanie Forrest,总引用数 43839。
首先来了解一下 APR 的定义:一个软件工程的子领域,目的是在解决修复程序缺陷和 Bug 的过程中减少人类的参与度。达到自动化。
在 APR领域内,先后诞生了如下几类工具。
- 演化计算(遗传算法)大类
- 模板化的变异算子技术
- 面对单一成因缺陷的语义推理技术
- 处理多编辑错误的方法
- (最近又开始流行)基于机器学习技术的方法
但是,APR 领域也存在几个常见的不一致性问题:
- 正确性:不同的 ML 驱动的工具有不同的补丁方式,因为他们都是合理的做法,所以没办法直接比较;
- 故障定位:有些论文使用的是明确的代码行;有的是人工的缺陷报告;还有的直接把故障定位作为工具的一部分;
- 终止条件:各种工具的停止时间不一样,从几百到几千个例子不等,有的还是以时间为界限。
背景
Transformer Models and Attension(纯介绍,可跳过)
神经机器翻译(Neural Machine Translation, NMT)模型最初为自然语言处理(NLP)任务而开发,利用神经网络执行诸如句子预测及跨语言翻译等任务。当前主流的 NMT 模型通常采用带有注意力机制的编码器-解码器 Transformer 架构,相较于早期基于长短期记忆网络(LSTM)的编码器-解码器结构,该架构在性能上实现了显著提升。Transformer 架构的形式多样,涵盖编码器、解码器以及编码器-解码器组合,在不同任务中各有应用。编码器模块用于提取输入信息并将其嵌入至潜在空间中,而解码器则依据该潜在表示生成相应输出。由于编码器架构在零样本学习中的生成能力有限,在生成式任务中通常采用解码器单元或完整的编码器-解码器结构。尽管注意力机制并非 Transformer 所独有,但它作为关键结构组件显著提升了模型对不同长度输入序列的适应能力。注意力机制使模型能够识别输入与输出之间的位置无关的关系,对于自动程序修复(APR)等任务尤为关键,因其输入(通常为标记化源代码)在结构和长度上具有高度可变性。
Language Models(纯介绍,可跳过)
语言模型广泛应用于自然语言处理(NLP)任务,用于学习文本的上下文表示,通常以深度神经网络形式实现。预训练语言模型(Pre-trained Language Model, PLM)通过在大规模语料库上进行训练来初始化模型参数,以获得通用的文本表示能力。这类模型有效地摊销了在大数据集上训练所需的大量计算成本,后续可通过微调以适应特定下游任务。大型语言模型(Large Language Models, LLMs)顾名思义,是参数规模通常达到十亿级及以上的语言模型。LLMs 继承了 PLMs 的预训练-微调范式及其架构设计,并在多个领域迅速获得应用。在自动程序修复(Automated Program Repair, APR)等领域,LLMs 在复杂生成任务中的优越性能构成了其重要的竞争优势。
Data Bias(纯介绍,可跳过)
数据偏差是一类常见的机器学习错误,指当特征在训练数据中未被公平代表时,可能导致结果失真、性能下降和准确率降低。随着训练数据规模的扩大,识别数据偏差及其潜在来源变得愈加困难。在使用真实世界数据处理自然语言任务时,非预期的数据偏差是一种普遍存在的问题。然而,偏差在自动程序修复(APR)任务中可能如何表现,目前尚缺乏系统研究。例如,使用 Codex 的神经程序修复(Neural Program Repair, NPR)模型可能会对人类可读的输入-输出对产生偏向,而在处理算法生成代码时表现不佳,这是因为 Codex 的训练语料中过滤掉了疑似自动生成的源代码。尽管这一现象以及其他与代码相关的潜在数据偏差值得在未来研究中深入探讨,当前研究中往往采用合成数据扩充训练集,以缓解已知的数据偏差。合成数据的生成过程旨在保留与任务相关的统计特性,同时控制其他干扰因素。然而,我们所回顾的文献并未明确讨论数据偏差或其应对策略。
Data Leakage(纯介绍,可跳过)
在机器学习中,数据泄漏(data leakage) 是指训练数据中包含与预测目标直接相关的信息或特征,这通常会导致模型在未见数据上的性能被高估。当预测结果或其代理变量出现在训练数据中时,常见的数据泄漏就会发生。此外,其他类型的泄漏与污染还可能源于个体样本之间存在相似内容(如近重复样本,或代码中的二型与三型克隆),甚至是完全相同的内容(如重复样本,或代码中的一型克隆)。为避免训练集与测试集之间存在重复,机器学习研究者通常会在数据划分阶段尽力最小化这类问题,采用去重(deduplication)和去污染(decontamination)等策略。然而,这些方法在自动程序修复(APR)任务中常常不够充分。
- 在语言模型中,重复现象可能发生在不同的粒度或抽象层级上,例如句子、文档或整个数据集;
- 而在源代码中,重复则可能出现在语句、函数、类甚至整个文件的层级上。
APR 中的 ML 策略一览
该图反应了 APR 论文的趋势,18 年以前 论文使用 ML 手段,但 23 以后 的论文已经开始使用 ML 了。
LLM 模型的发展
随着大型语言模型(Large Language Models, LLMs)在模型规模与训练数据规模上的不断增长,其表现出一系列表观的涌现能力,包括逐步推理(step-by-step reasoning)与上下文学习(in-context learning)等特性。这些能力引起了研究者以及公众对 LLMs 作为通用人工智能(Artificial General Intelligence, AGI)组成部分潜力的广泛关注。然而,这些能力为何会在大型模型中出现、其涌现的具体机制,以及为何在小型模型中缺失,目前仍缺乏充分理解。
尽管如此,LLMs 正在自动程序修复(Automated Program Repair, APR)研究中逐渐获得关注,通常被用于补丁生成任务。
在作者收录的 118 篇文献中,有 61 篇提出了新的 APR 技术方案。其中,有 22 篇采用了机器学习模型,而这 22 篇中有 7 篇使用了 LLMs。进一步来看,这 7 篇使用 LLM 的 APR 技术中,有 6 篇发表于过去两年内,显示出 LLMs 在该领域的迅速发展趋势。
特定于代码的语言模型
部分预训练语言模型(PLMs)与大型语言模型(LLMs)在其训练语料中包含源代码数据,这些源代码通常来自诸如 GitHub 等公共代码仓库或 StackOverflow 等代码相关问答平台。
研究表明,当推理任务被格式化为类似代码的结构时,这类模型在相关任务中的表现更为准确。针对源代码进行微调的专用代码生成模型(code LLMs)在代码补全和程序合成等生成式任务中展现出良好前景。已有初步研究开始将 LLMs 应用于自动程序修复(APR)问题。
架构概述(重点)
其他专用的机器学习架构也已被应用于与代码相关的任务。当神经网络技术用于自动程序修复(Automated Program Repair, APR)时,通常被称为神经程序修复(Neural Program Repair, NPR)。尽管在其他代码相关任务中,诸如图神经网络(GNN)等结构化模型已被用于代码摘要生成等应用,但大多数 NPR 架构仍采用神经机器翻译(Neural Machine Translation, NMT)模型。NMT 架构的 NPR 模型可通过定制方式实现。
但近年来,代码领域的大型语言模型(code LLMs) 在多个工具中日益流行,例如
- AlphaRepair 使用 CodeBERT
- CoditT5 与 RewardRepair 使用 CodeT5
- 以及 SelfAPR 使用 PLBART
在作者的文献回顾中发现,Transformer 架构是最常被采用的机器学习结构。
在 29 篇使用机器学习技术的文章中,有 20 篇采用了 Transformer 模型,其中包括以下 18 个工具:RewardRepair、CURE、DLFix 、VRepair、SeqTrans、SynShine、SequenceR、AlphaRepair、VulRepair、Recoder、Quatrain、SelfAPR、TransRepair、Reptory 、TENURE、Tare、Knod 和 Rete。
除此之外,其他类型的神经网络架构也被用于分类器任务,例如 TRANSFER中采用的基于 BiLSTM 的多分类器;用于生成任务的架构,如 SynFix所采用的 RNN 构造,及 AccPR 中基于 ASTNN 的代码表示模型;还有用于学习修复模式特征的模型,如使用卷积神经网络(CNN)的研究。首批采用机器学习进行 APR 的模型大多基于 NMT,其基本范式是将含缺陷代码“翻译”为修复后的代码。而当前的发展趋势则转向采用大型语言模型(LLMs),其范式通常为:删除包含缺陷的代码行,并利用生成式文本模型预测填补该空缺的修复代码。
注意力机制
在我们考察的基于 Transformer 的工具中,注意力机制的处理方式并不一致:其中有一项工作未提及具体的注意力模型,有五项工作对其进行了详细描述,其余则采用不同方式处理,如引用注意力相关研究(例如 Vaswani 和 Luong )、提供简要说明,或仅引用其所继承的 NMT 模型。例如,CURE虽然继承了其预训练语言模型 GPT 中的多头注意力架构,但其在文中仍引用了 Vaswani 的经典工作以说明注意力机制。相比之下,SeqTrans 则对注意力机制进行了详尽的说明,其实现基于 OpenNMT,后者采用了 Luong 的注意力机制。这种描述层级的差异可能源于当前缺乏统一、被广泛接受的注意力机制分类体系。
这一部分疑似偏到 AI 去了。
数据泄漏污染模型和基准
数据泄露
数据泄漏通常发生在训练数据中包含与任务相关而模型本不应访问的信息时。在所回顾的文献中,提及数据泄漏问题时,通常采用的是训练-测试集分离策略,即明确区分训练语料与测试集,以最大程度减少内容重合。
- SelfAPR 通过 自监督学习 挖掘项目特定知识,其训练与测试数据集按照时间边界划分,即基于项目中修复缺陷提交的时间戳进行分割。
- CURE 同样采用了类似方法,其训练数据限定在 2006 年之前,以避免与 2007 年以后构建的评估基准产生污染。
- Overfitting Detection System 是用于评估自动程序修复补丁正确性的工具,其采用项目级别的基准划分方式,即通过排除出现在多个数据集中的项目(如 Apache Math 库),来避免因重复数据而使标准的随机划分策略失效,从而实现训练集(例如 Bugs.jar、Bears 和 Defects4J)与测试集的有效区分。
- RewardRepair 在其句法训练中直接使用由缺陷-修复对构成的现有训练语料,未对该部分数据进行训练-测试划分或去污染处理。
- Synshine 使用预训练的 RoBERTa Transformer 模型,在其由 170 万对错误与修复程序组成的数据集中采用了标准划分策略,并随机选取 10 万对作为测试集进行评估。
作者建议在基于机器学习的自动程序修复方法的评估中,应对数据泄漏问题给予更高关注,尤其是在使用并非为机器学习模型评估而设计的评估基准时。这一点对采用预训练模型的技术尤为重要,因为许多自动程序修复数据集中的缺陷数据具有多年历史,且广泛存在于公共互联网上,表明这些预训练语言模型很可能在训练过程中已接触过这些数据。
数据污染
污染问题对基于机器学习的自动程序修复(APR)结果的有效性构成显著威胁,因为它可能导致报告的性能水平在实际应用中无法重现。重复数据会使训练模型对特定样本产生偏倚,从而提高生成内容被模型记忆而非学习的可能性。
我们的回顾中未发现已有 APR 研究系统探讨近重复样本的问题,尽管有一项研究讨论了预训练语言模型(PLM)可能存在的污染情况。尽管数据去污染可提升大型语言模型(LLMs)的性能,但其实施仍具有挑战性。首先,由于预训练权重是直接继承的,最终用户无法对原始训练数据集进行去重。其次,用户通常无法获取训练过程的详细信息,包括训练语料本身,从而导致测试数据的去污染在实践中不可行。在使用 LLMs 进行 APR 的研究中,有五项工作未考虑数据泄漏与污染的影响。一项研究报告了具有开源训练语料的 PLM 的污染信息,并列举了修复补丁与训练数据中代码完全一致的样本,即模型复现了开发者的修复操作。SelfAPR 选择自行训练 LLM,并在训练语料中剔除了所有重复的缺陷样本。CURE 同样采用自定义训练策略,其语料由 GitHub 上 2006 年之前的开源 Java 项目构成,并通过手动方式移除重复缺陷,采用的粗粒度去重方法与 CoCoNut 一致。CURE 的去污染策略基于两个较强假设:GitHub 项目之间相互独立,以及代码提交与缺陷修复之间相互独立;相较之下,SelfAPR 对每个样本进行评估,仅保留唯一数据。已有三项基于 LLM 的 APR 方法通过去重语料来应对数据泄漏问题,其中一项基于句法信息进行去重,另一项基于语义,第三项虽进行了去重但未明确方法。关于数据集去污染的若干方法将在后续部分进一步讨论。
基准测试数据集的去污染
即便明确设定了去污染作为目标,实际执行去污染处理,甚至仅仅是量化污染程度,往往都难以实现。
在语言任务中,尚未形成针对预训练模型的标准化去污染方法,更遑论面向代码任务的通用方案。例如,GPT-3 使用 N-gram 匹配进行污染检测,其中一个 gram 被定义为小写、以空格分隔、不含标点的单词;相比之下,GPT-4 则采用多样本子串匹配作为过滤策略。
由于其训练语料不公开,第三方用户难以将 OpenAI 所采用的 GPT 去污染策略直接应用于新的基准数据集。此外,一些常用于训练后期污染检测的标准方法,如计算已见与未见数据之间的熵差,也无法适用于无法直接访问模型参数的情形(例如,仅能通过 API 调用模型)。
机器遗忘(machine unlearning)是一种更新预训练模型已有权重的策略,其目标是通过重新训练或近似模拟,消除特定污染数据对模型的影响。
该领域的研究主要聚焦于安全性与隐私保护问题,并因 2023 年 NeurIPS 挑战赛的发布而受到越来越多的关注。
模型的记忆性与泛化
记忆性作为数据泄漏的一种表现形式,是指语言模型倾向于逐字输出其训练数据中的片段,而未能真正理解其语义。
在某些需要重现已学知识的语言任务中,记忆性可能是有益的,但在代码任务中的效果则不尽一致。在模型遇到与训练数据重复的缺陷时,记忆性可能有助于生成正确补丁;
然而,当任务要求模型具备泛化能力时,记忆性则可能成为障碍。尽管完全防止模型对特定训练样本的记忆较为困难,已有研究表明,从训练语料中移除重复样本(如一型代码克隆)或近重复样本(如二型和三型代码克隆),有助于降低逐字记忆的发生概率。
目前仅有少数语言模型明确说明其去污染策略,更少有模型附带完整的去污染工具包,用于检测受污染的测试样本并生成清洁版本的评估基准,例如某些开源模型项目所做的尝试。相关研究提出了两种可能的解决思路。第一,可借鉴语言模型安全性与隐私保护研究中的测试方法,用以评估测试样本在训练集中出现的可能性。其中一种方法是引入“金丝雀字符串”(canary strings):这是一类合成的、容易识别的数据,一旦被模型复现,即可证明其曾出现在训练语料中。第二,受对抗性文本生成研究及某些代码模型的启发,在验证模型泛化能力时,可以对变量名和用户自定义类型名进行扰动,从而评估模型对语义变异的鲁棒性。
粒度
尽管在处理非代码任务的语言模型中,文档级、语句级及句子级的重复问题已有较多研究,但在代码模型中,大多数去重工作仍集中于文件级别。这种处理粒度可能导致在其他抽象层级(如函数级)存在的重复代码片段未被识别并保留下来。
一个简单的例子是:多个项目可能参考同一 StackOverflow 上的问题解答,进而采用并修改相似的函数实现。
这类函数级别的重复在文件级去重过程中往往难以消除。 尽管在某些代码任务(如代码摘要生成)中,过细的分割可能并不适用,但当前采用小规模代码片段作为翻译输入的神经程序修复(NPR)方法,尤其容易受到重复内容的影响。NPR 技术在输入粒度方面存在差异,涵盖了从最大 token 数限制的上下文片段到整个含缺陷方法的不同输入形式,这直接决定了模型对语义特征的抽取粒度。 ==为缓解上述问题,应在评估过程中测量并报告训练集与测试集之间的交叉污染情况。==可以参考克隆检测中的相似性度量方法,结合代码中语义特征的粒度,对数据集间的重复程度进行量化。
近重复代码对代码任务的影响
现有的去重方法通常仅搜索并移除完全匹配的样本。然而,对于基于机器学习的自动程序修复,尤其是在新兴大型语言模型的背景下,这种方法远远不够。近重复代码对语言模型构成严重威胁。当训练集与基准测试集中包含近重复代码时,相较于去重后的语料,模型的性能指标可能出现高达一倍的虚高。
当前语言模型中的去污染策略多采用用于自然语言的相似性度量方法,而非针对代码设计的指标。
幸运的是,该问题可通过基于文本的代码克隆检测方法与代码相似度度量加以解决,这些技术常用于检测抄袭或软件许可证违规等场景。尽管某些字符串匹配方法在处理结构变化较大的代码时可能优于通用工具,但与通用的文本相似度度量相比,面向源代码结构设计的专用相似性检测技术在代码分析中表现更加优越。
注:(例如 LLVM 新版本也增加了一个叫结构化 Hash 的内容,用于对一段 LLVM IR 建模)
基准不能执行标准化评估
性能报告
在实验评估中,使用如下两种报告的结果存在显著差异。
- ManyBugs 基准集(一个较早收集的大型开源 C 程序集合)
- Defects4J 基准集(一个较新的、小型开源 Java 库集合)
对于基于 ManyBugs 的实验,研究者通常在报告缺陷修复成功率的同时,还会详细报告运行时间等性能指标。然而,在基于 Defects4J 的研究中,此类运行效率信息往往被省略,研究重点通常仅聚焦于是否生成了候选补丁或是否完成了修复。即使报告了效率信息,呈现方式也存在显著差异,可能包括设定墙钟时间的上限,或限制测试套件的评估次数等,但通常缺乏足够细致的数据,无法在不同研究之间进行有效比较。
故障定位
需要执行故障定位的算法,其面临的问题远比无需执行该任务的算法更为复杂。应当区分“补丁生成”(即生成待评估代码修改)与“完整的自动修复过程”(涵盖故障定位及多方案下的优先级排序等子任务)。
一些最新研究在评估中明确区分了是否假设完美故障定位,并指出其采用的假设方式。 然而,目前尚未形成统一的性能报告规范,这表明在比较不同研究成果时需格外谨慎。有些研究通过运行测试用例与执行跟踪信息,辅助采用基于频谱的故障定位算法来预测缺陷位置。而另一些研究则直接使用基准集中提供的人工修复位置作为输入,仅关注该位置及其周边区域,从而规避故障定位问题。 神经程序修复(NPR)工具通常假设已知的故障定位信息,依赖开发者修复中所涉及的源文件名及对应行号来确定故障位置,而非将其视为修复过程的一部分来进行预测。 在这两个极端之间,还存在多种中间策略,许多自动程序修复算法的设计者在实践中已采用了不同的组合方式。
正确性
许多研究使用某种代理方式来衡量补丁的正确性,最常见的是将生成的补丁与由人工开发者提供的参考修复进行比较。这种做法将“可接受的修复方案”限制为与开发者所选择的修复方式相似的补丁,无论这种方式是否为满足程序功能需求的唯一解,甚至是否为最优解。由于实现某一功能的方式可能存在无限多种,仅依据某一个任意的人为修复样例来定义正确性,显得过于严格。
APR 基准与机器学习数据集的差异
数据集缺乏
由于用途与构建需求的差异,自动程序修复(APR)使用的基准数据集通常规模较小,无法用于训练机器学习模型。
这些基准集由有限数量的缺陷/修复对组成,并附带由开发者编写的补丁与测试用例,用以定义程序行为的约束条件。样本数量的限制使得仅依赖这些基准数据难以支持机器学习模型的有效训练,因而需要额外数据来源。
相比之下,机器学习所需的数据集必须具备足够规模,因此难以达到 APR 基准集所具备的精细人工筛选标准。例如,某些数据集是通过比对缺陷修复提交与其前一个版本间的差异构建的,但这些数据集并不包含可复现的构建环境用于补丁验证,因而在当前的机器学习生成式修复任务中被视为不必要。同样,其他以缺陷-修复对为单位的大型数据集也常缺乏执行环境如测试套件,因为它们本质上仅包含程序文本内容。
对源代码、缺陷信息与修复信息的访问
自动程序修复(APR)工具的实际需求与评估基准的设计存在紧密关联。例如,一些 APR 工具依赖于程序的历史开发信息,利用信息检索(IR)方法分析提交历史或提交信息。从我们的回顾来看,只有少数方法采用了基于缺陷报告的信息检索策略。多数评估基准通过提供与程序公共代码仓库的链接来支持此类方法,但将完整的历史数据完全封装于基准集中往往难以实现。少数关注于小型或初学者编写程序的基准(如 CodeFlaws 和 IntroClass)是例外,因为这些项目的历史较短,便于纳入。
可复现的程序构建
早期的 APR 工具通常依赖于从源代码构建程序的能力;然而,直到近年来,基于机器学习的 APR 方法大多避免了构建过程。即使在容器化环境下,由于依赖冲突或构建需求不兼容,一些 APR 工具也无法与存在缺陷的程序正常构建或运行。对于那些在构建过程中引入额外依赖的工具(如 Angelix 和 Prophet)而言,这一问题尤为突出。相比之下,Gradle 和 Maven 等构建工具在 Java 项目中被广泛采用,可对程序的外部依赖进行严格控制。得益于这些标准构建工具以及 Java 语言与其运行环境的稳定性,Java 程序更适合作为 APR 研究对象。
从我们的文献分析来看,构建开销对基准集的选择产生了显著影响。 例如,ManyBugs 是一个早期的 C 项目集合,构建支持不完整,只有极少数研究对其进行了评估,其中大部分是对已有实验数据的回顾,而非新的评估结果。相比之下,Defects4J 提供了完整的 Maven 构建支持,被大量研究所采用。尽管影响基准集使用差异的因素不止构建支持,例如语言类型的不同等,但有研究者曾因无法成功构建 ManyBugs 项目而转为采用与人工修复的语法相似性作为评估代理。尽管构建复杂度带来了明显劣势,C 和 C++ 程序在实际软件开发中的占比仍然很高。结合多语言支持的代码语言模型的快速发展,这一现状表明 APR 研究将受益于统一构建与运行环境的建立,以支持多样化的工具和语言基础。
一致的评估指标
在机器学习,尤其是自然语言处理任务中,beam search(束搜索) 被广泛用于控制搜索的广度与深度,其计算成本受 beam size(即超参数 k)的控制。在每一评估步骤中,从剩余序列中选取具有最高输出权重的 k 个序列。小的 beam size 趋向于贪婪搜索,而较大的 beam size 接近于穷尽搜索,体现出运行时与生成质量之间的典型权衡。我们发现,当前的神经程序修复方法尚未形成统一的搜索效率度量标准,通常会针对每个缺陷程序生成大量未经验证的候选补丁。尽管有迹象表明 beam size 正逐渐被采用为准则,并在部分研究中借助已有评估进行合理性说明,但其作为搜索效率指标的有效性仍受质疑,因为它未考虑模型的生成词表规模(|Y|)和序列长度的影响。不幸的是,生成词表大小在部分文献中并未报告,使得不同方法间的搜索效率难以直接比较。考虑词表规模后,不同 NPR 模型的有效搜索空间呈现出显著差异,例如:SeqTrans 的搜索范围较小,而 CURE 的搜索空间则极大。这一差异进一步突显了统一评估度量体系的必要性。
讨论
StandUp4NPR
被提出用于标准化基于机器学习的自动程序修复(APR)工具的评估流程。该平台提供了清晰定义的训练与测试接口,并可对所有模型施加统一的资源限制,以便在不同工具间进行公平比较。其训练与测试数据源自现有数据集与基准集,并经过处理与筛选,旨在最大限度地减少完全重复样本的出现。该项目在多个方面展现出良好前景:在不同模型之间统一数据访问方式、资源使用约束、运行时设定及评估标准,有助于建立更为公平的对比环境。然而,StandUp4NPR 的某些设计决策也带来了限制。例如,其数据访问被限定于提供的训练样本,这意味着评估的焦点仅在于模型架构如何高效利用特定数据集,而排除了其他可能提升机器学习 APR 效率的方式,如精心挑选的独立数据源、利用项目历史信息或来自其他项目的补充信息等。此外,由于该框架主要面向神经方法设计,其结构在某些情况下并不适用于传统的 APR 算法。例如,GenProg 和 ARJA 等基于搜索的技术会利用补丁历史效果来引导后续的搜索过程,但 StandUp4NPR 假设所有补丁均在同一时间生成,并独立评估,缺乏反馈回路,这使得许多基于迭代搜索的算法无法在该框架下进行合理比较。
APR-COMP 2024
第一届国际自动程序修复竞赛(APR-COMP)近期已发布,其设置了四个竞赛分支:功能性错误、漏洞修复、学生作业修复以及 AI 生成代码的修复。在功能性修复分支中,所使用的基准程序采样自现有数据集,这意味着其将继承这些基准已有的问题,并且相关内容对参赛模型的设计者来说是可预知的。这与某些年度机器学习竞赛(如 ImageNet)的评估策略不同,后者通常公开训练集而将测试集保密。尽管如此,APR-COMP 提供了统一的 API 用于访问多个基准集,这在提升修复工具的互操作性方面具有显著优势。此外,与 StandUp4NPR 类似,其统一的时间与资源限制机制也有助于不同方法结果的公平比较。最后,竞赛采用公共拉取请求的方式提交作品,在实际操作中也就要求参赛者提供可执行的程序实体,而这在许多现有 APR 研究中尚属缺失。
总结
自动程序修复是软件工程领域一个充满活力且快速发展的研究方向。其在工业界的实际应用与部署已开始产生经济效益,并呈现出日益增长的采纳趋势。然而,随着该领域的逐渐成熟,其评估实践过于集中于少数几个流行基准集,而这些基准在当前的研究需求下已逐步显现出其局限性。 尤其是在机器学习方法迅速发展的背景下,传统基准在评估方面的问题愈加突出。本文回顾了相关问题的起源,并提出了借鉴其他研究领域经验以应对当前挑战的建议。其中,数据泄漏对研究结果的有效性构成严重威胁,尤其是在使用训练语料未公开或不可获取的语言模型时问题更加严重。此外,评估结果在报告方式上的高度差异性,也使得跨研究间的比较变得极具挑战,甚至在某些情况下几乎不可行。在评估方法本身存在诸多根本性问题的前提下,单纯扩大实验规模或增加对比研究的数量,并不能真正提升对自动程序修复方法有效性的理解。因此,亟需在方法层面对当前评估实践进行系统性改进。