大型语言模型时代的整形手术假设

互联不一般哥 2024-05-16 21:14:47

引用

Xia C S, Ding Y, Zhang L. The Plastic Surgery Hypothesis in the Era of Large Language Models[C]//2023 38th IEEE/ACM International Conference on Automated Software Engineering (ASE). IEEE, 2023: 522-534.

论文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10298499

摘要

自动化程序修复(APR)旨在为输入的有缺陷程序自动生成补丁。传统的APR工具通常通过使用模板、启发式方法和形式规约来针对特定类型的错误和修复。然而,这些技术在能够产生的错误类型和补丁种类方面受到限制。因此,研究人员设计了各种基于学习的APR工具,最近的工作集中在直接使用大型语言模型(LLMs)进行APR。尽管基于LLM的APR工具能够在许多修复数据集上实现最先进的性能,但用于直接修复的LLMs并未完全意识到项目特定信息,例如独特的变量或方法名称。

整形手术假设是APR的一个众所周知的洞见,它指出修复错误的代码成分通常已经存在于同一项目中。传统的APR工具在很大程度上利用了整形手术假设,通过设计基于手动或启发式的策略来利用这种现有的代码成分。然而,随着最近的APR研究开始关注基于LLM的方法,整形手术假设在很大程度上被忽略了。在本文中,我们提出以下问题:在LLM时代,整形手术假设有多大用处?有趣的是,基于LLM的APR提供了一个独特的机会,可以通过微调和提示来完全自动化整形手术假设。为此,我们提出了FitRepair,它将LLMs的直接使用与两种特定领域的微调策略和一种提示策略结合起来,以实现更强大的APR。虽然传统的APR技术需要在基于整形手术假设生成补丁和保证补丁有效性方面进行密集的手动工作,但我们的方法是完全自动化的且通用的。此外,由于LLMs在代码向量化/理解方面的强大功能,即使部分/不精确的项目特定信息仍然可以指导LLMs生成正确的补丁!我们在广泛研究的Defects4j 1.2和2.0数据集上的实验表明,FitRepair分别修复了89个和44个错误,展示了整形手术假设在LLM时代的光明前景。

1 引言

源代码的日益复杂性对大规模软件系统的可靠性提出了关键挑战。这些系统中的软件错误可能导致全球用户的安全问题,并可能造成不可忽视的财务损失。因此,开发者不得不花费大量精力在错误修复上。因此,自动化程序修复(APR),旨在自动生成补丁以修复软件错误,已经吸引了学术界和工业界的广泛关注。

为了实现APR,一种流行的方法被称为生成与验证(G&V),其通常基于以下流程:首先,应用故障定位技术以确定程序中可能存在错误的可疑位置。然后,APR工具使用这些位置生成一个补丁列表,用正确的行替换错误的行。之后,每个补丁都会通过测试套件进行验证,以识别任何可能的补丁(即通过测试套件中的所有测试)。最后,为了确定正确的补丁,开发者检查可能的补丁,看是否有能够正确修复错误的补丁。

传统的APR工具主要可以分为基于启发式,基于约束和基于模板的工具。在这些传统工具中,基于模板的APR已经能够实现最先进的结果。基于模板的APR工具通常利用预定义的模板(例如,添加空检查)进行错误修复。然而,由于这些修复模板通常是手工制作的,它们能够修复的错误数量和类型可能有限。

为了解决传统APR的限制,研究者们提出了各种基于学习的APR工具,这些工具基于神经机器翻译(NMT)架构,其中输入是错误的代码片段,目标是把这些错误的代码片段翻译成修复后的版本。为了完成这项任务,基于学习的APR工具需要监督式训练数据集,其中包含错误和修复后的代码片段对,以便学习如何执行这个翻译步骤。这些训练数据通常通过使用启发式/关键字挖掘历史错误修复来获得,这可能在识别错误修复提交时不够精确;即使是实际的错误修复提交也可能包括不相关的代码更改,导致数据集中的进一步污染。此外,这类APR工具在训练过程中未见的错误类型上可能难以泛化和修复。

为了更好地利用大型语言模型(LLMs)的最新进展,研究者们直接应用LLMs生成补丁,而不需要错误修复数据集。这些基于LLM的APR工具通过填充给定其周围上下文的正确代码或直接生成完整的代码函数来工作。通过直接使用在数十亿开源代码片段上预训练的LLMs,基于LLM的APR工具在程序修复上已经显示出最先进的性能。

传统的APR工具长期以来一直使用整形手术假设的洞见,该假设指出修复错误的代码成分已经存在于同一项目中。传统的APR工具通过手工设计模式或基于启发式的方法来寻找和使用这些相关的代码成分以生成错误的修复。然而,在基于LLM的APR中,整形手术假设在很大程度上被忽略了。实际上,LLM提供了一个独特的机会,可以通过微调(通过来自错误项目的模型更新学习项目特定信息)和提示(直接向模型提供相关的代码成分)来完全自动化整形手术假设的想法,并使其直接适用于不同的语言(因为LLMs通常是多语言的)。此外,尽管涉及密集的手动工作,传统的APR工具仍然无法充分利用项目特定信息,因为利用/组合现有代码成分的搜索空间很大。相比之下,由于LLMs在代码理解/向量化方面的能力,项目特定信息可以被有效地利用。为此,我们提出问题:在LLM时代,整形手术假设有多大用处?

我们的工作:我们提出了 FitRepair,一种基于LLM的方法,通过系统地结合多种微调和提示策略来自动利用整形手术假设进行APR。FitRepair使用两种新颖的领域特定训练策略对LLM进行微调:

1) 知识强化微调,我们使用原始有缺陷项目进行微调,通过大量屏蔽高比例的标记,使LLM能够学习项目特定的代码标记和编程风格;

2) 修复导向微调,每个训练样本仅屏蔽单个连续的代码序列,使模型适应最终的填空式APR任务,预测单个连续的代码序列。

此外,我们直接利用LLM理解自然语言指令的能力,引入了一种新颖的提示策略,即相关标识符提示,该策略利用信息检索和静态分析获取有缺陷行的相关标识符列表。虽然这些相关标识符对修复一些困难的错误至关重要,但由于上下文窗口大小有限,在推断过程中LLM可能看不到它们。通过使用提示,我们直接告诉模型使用这些提取的标识符生成正确的代码。

尽管我们利用整形手术假设来进行基于LLM的APR的洞察力可以推广到不同类型的LLM,但为了实现FitRepair,我们选择了最近的LLM,CodeT5,它是在数百万个开源代码片段上进行预训练的。CodeT5是一个编码器-解码器模型,使用Masked Span Prediction(MSP)目标进行训练,其中一定比例的标记被屏蔽,每个连续的屏蔽标记序列被称为一个屏蔽跨度。为了进行修复,我们结合了所有四个模型变体(包括基本模型、两个微调模型和带提示的基本模型)。总之,我们做出了以下贡献:

本文是首次在LLM时代重新审视重要的整形手术假设。它为基于LLM的APR开辟了一个新的维度,以整合先前忽视的有关有缺陷项目本身的信息,以提升性能。我们的微调和提示策略对于提升LLM以修复测试项目至关重要,甚至可以实现对LLM预训练期间很少见或完全未见过的语言进行APR。我们基于最近的CodeT5模型实现了FitRepair。我们使用两种新颖的微调策略增强了模型:知识强化微调和修复导向微调,以及一种基于信息检索和静态分析的新颖提示策略:相关标识符提示。我们将所有四个模型生成的补丁结合在一起,并进行补丁排序以加快APR速度。我们对最先进的APR工具进行了广泛评估。在广泛研究的Defects4j 1.2和2.0数据集[43]上,FitRepair能够实现新的最先进结果,分别为89和44个正确的错误修复(比最佳基线多15和8个)。此外,我们进行了广泛的消融研究来证明我们的设计。FitRepair首次证明了整形手术假设可以显著提升基于LLM的APR,同时实现了全自动化和通用性。此外,即使是部分/不精确的代码成分仍然可以有效地指导LLM进行APR。

2 方法

我们描述了我们将整形手术假设纳入基于LLM的APR的方法。虽然我们的整体想法对于基于LLM的APR方法是通用的,但我们主要关注cloze-style APR。图1展示了cloze-style APR的概述,我们的目标是直接在给定原始上下文的情况下生成正确的代码,模型必须根据错误的上下文“填写空白”的缺失代码行/块(由表示)。然而,以前的cloze-style APR工具在很大程度上忽略了整形手术假设已经证明在对修复错误至关重要的丰富项目和错误特定信息。LLM提供了一个自动利用整形手术假设想法的机会,通过其强大的能力直接从错误项目中学习(微调)和利用相关的代码上下文线索(提示)来生成正确的修复。在这项工作中,我们探索使用LLMs通过微调和提示自动捕获项目特定信息。

图1 克隆风格的自动化程序修复

我们提出了一种新颖的方法——FitRepair,将LLM在cloze-style APR中的直接使用与从整形手术假设中获得的知识相结合。FitRepair首先使用两种新的微调策略训练两个独立的模型:1)知识强化微调——我们使用原始错误项目的源文件来构建一个类似于预训练的相似数据集,通过积极地掩盖大量(50%)的代码标记,这允许LLM学习项目特定的代码标记和编程风格;2)修复导向微调——我们使用原始错误项目对另一个模型进行微调,通过在每个训练样本中掩盖仅单个连续代码序列来构建一个更面向修复的数据集,这使得微调模型更准备好执行只需要生成单个连续代码序列的修复任务。此外,我们提出了一种新的提示策略,3)相关标识符提示,通过使用信息检索和静态分析获得模型在其直接上下文中未见的相关/罕见标识符列表。

虽然我们的方法可以扩展到不同的LLMs,在本文中,我们使用CodeT5,一个使用掩蔽跨度预测(MSP)目标进行训练的编码器-解码器LLM。MSP用单个掩蔽跨度标记替换连续标记,预训练任务是在给定周围上下文的情况下恢复被掩蔽的代码序列。

我们按照以前的工作使用修复模板生成掩蔽行,我们用单个掩蔽跨度标记替换整个或部分错误的行。然后我们使用CodeT5生成正确的代码以替换掩蔽跨度并为错误创建补丁。图2展示了我们方法的概述,其中:

对于1:我们使用知识强化微调从错误项目中提取函数构建训练数据集。我们首先使用高掩蔽率对原始CodeT5模型进行微调,以积极学习项目特定标记。对于2:我们使用修复导向微调策略通过构建另一个训练数据集来微调另一个模型,该数据集只根据修复模板掩蔽单个或部分代码行。我们训练模型直到收敛并获得修复导向微调模型。对于3:我们使用相关标识符提示策略通过信息检索和静态分析提取相关标识符。然后我们创建单独的提示,指示模型在生成补丁时使用提取的标识符。对于4:我们通过使用以前工作[34]中的修复模板执行cloze-style APR,并通过分别使用4个模型(原始CodeT5、知识强化微调模型、修复导向微调模型和带有提示的原始CodeT5)生成补丁。生成的每个补丁都通过对测试套件进行验证来找到可能的补丁列表。

图2 FitRepair概要图

3 实验评估

研究问题:在本文中,我们研究以下研究问题:

• RQ1: FitRepair与最先进的APR工具相比表现如何?

• RQ2: FitRepair的不同配置对结果有什么影响?

• RQ3: FitRepair在修复来自不同项目的额外错误时表现如何?

实验设置:我们首先在Defects4j 1.2数据集上展示了FitRepair相对于最先进的APR工具的修复效果。我们不仅研究总共修复的错误数量,还研究与先前技术相比修复的独特错误数量。此外,我们分析了在使用FitRepair时正确补丁排序的提升,以更快地验证正确补丁。

实现细节:我们使用了Hugging Face的PyTorch版本的CodeT5模型。我们的微调方法基于预训练的CodeT5-large检查点。我们使用JavaParser来执行静态分析,过滤掉作用域中无法访问的标识符。对于知识强化微调和修复导向微调,我们默认重复微调过程10次,以增强我们的微调数据集。我们使用具有48GB内存的NVIDIA RTX A6000以FP16模式微调CodeT5模型。我们使用以下超参数集训练模型:32的批量大小和1e-4的学习率,共15K训练步骤。我们使用Adam优化器更新参数,并使用线性学习率调度器,其中10%为热身比例。对于两种微调策略,我们提取错误项目的最旧版本进行训练,并使用微调模型生成该项目所有错误的补丁。对于相关标识符提示,我们使用最相关的5个标识符。为了修复,我们每个模型采样5000次,并验证每个模型产生的 top 1000个唯一补丁(每个错误最多4000个补丁),这与其他基线相当。为了为每个样本生成更多唯一的补丁,我们使用核采样,top p为1,温度为1。我们在运行Ubuntu 20.04.5 LTS的AMD Ryzen Threadripper PRO 3975WX CPU(32核,256 GB RAM)的工作站上验证补丁。

基线设置:我们将FitRepair与20种不同的APR工具进行比较,包括最先进的基于学习和传统的APR工具。我们选择了8种最近的基于学习的APR工具:AlphaRepair,SelfAPR,RewardRepair,Recoder,CURE,CoCoNuT,DLFix和SequenceR。AlphaRepair是一种最近提出的最先进的cloze-style APR工具,直接使用LLM(CodeBERT)。此外,我们还与12种代表性的传统APR工具进行比较:TBar,PraPR,AVATAR,SimFix,FixMiner,CapGen,JAID,SketchFix,NOPOL,jGenProg,jMutRepair和jKali。最后,由于FitRepair提出将基本CodeT5(有无提示)与两个微调模型结合起来,我们也与一个基线进行比较,该基线使用四个随机不同的种子运行基本CodeT5四次。这是一个公平且必要的基线比较,因为CodeT5可以根据随机种子产生不同的采样输出,并且希望使用我们结合四个模型的方法的开发者也可能分配相同的GPU资源来运行CodeT5四次。我们在评估中称这个基线为CodeT5×4。 我们使用完美故障定位设置对这些基线进行比较,在这种设置中,通过将参考开发者补丁与错误代码进行比较。

Answer to RQ1

动机:与最先进技术的比较,验证FitRepair的能力。

方法:为了验证FitRepair的能力。我们从三个方面对它们进行评估:

(1)FitRepair的bug修复能力;

(2)FitRepair的单一策略效果;

(3)FitRepair的补丁排序能力。

具体来说,对于(1),我们首先在Defects4j 1.2上比较FitRepair与传统和基于学习的APR工具。并且为了说明FitRepair的能力,我们展示了一个无法被任何先前工具修复的错误(Closure-71)的修复示例。通过这个例子展示了整形手术假设,其中补丁通常可以通过重用项目其他部分中的代码片段/成分来构建。FitRepair直接利用了这个假设,通过从当前文件中的相似代码行提取相关标识符,并通过自然语言提示提供给模型生成正确的修复。对于(2),我们对比了FitRepair中每个单个策略修复的能力,证明我们的三种策略都能够提供独特的修复。对于(3),我们检查FitRepair执行补丁排序的能力,以便为正确的补丁优先进行更快的验证。

RQ1 的结果分析

FitRepair的bug修复能力:我们在表1上展示了FitRepair和最顶级的基线工具能够修复的正确补丁的数量。并且除了FitRepair,我们还包括了使用四个不同种子独立运行基本CodeT5四次的单独结果(CodeT5×4列)。与CodeT5×4相比,我们观察到我们的微调模型和提示策略能够提供额外的修复,将正确修复的错误数量从80增加到89。总的来说,FitRepair在Defects4j 1.2上能够实现89个正确修复的错误,比当前最先进的APR工具多修复了15个。图3a显示了FitRepair与最顶级的APR基线以及所有其他工具(Other)相比生成的唯一修复的数量。我们观察到,即使与所有以前的APR方法相比,FitRepair仍然能够提供16个其他APR工具无法在Defects4j 1.2上修复的独特修复。

表1 Defects4j 1.2 上正确修复的评估结果

图3提示独特补丁的相关标识符

FitRepair的单一策略效果:我们观察到,与基础的CodeT5模型相比,我们的三种策略都能够提供独特的修复,并将整体FitRepair的正确补丁数量提升至89个。有趣的是,每个单独的策略已经是一个强大的APR工具,例如,相关标识符提示策略可以单独修复79个错误,已经超过了所有现有工具。这表明了我们的三种策略提供额外修复的能力,直接应用基础的CodeT5无法提供。此外,没有进行任何更改的基础CodeT5模型也产生了2个独特的修复,显示了将基础模型应用于覆盖可能仅需要通用正确代码知识的错误的有用性。

FitRepair的补丁排序能力:我们将FitRepair与使用不同种子运行基础CodeT5四次的基线进行比较。表II显示了在相同一组可修复的Defects4j 1.2项目的相同错误上,FitRepair和CodeT5×4的平均正确补丁排名。我们观察到,在所有六个项目中,FitRepair为正确的补丁提供了更好的平均排名。平均而言,使用FitRepair,我们可以将正确补丁的排名减少41%。由于正确的补丁通常使用项目特定的标识符,而这些标识符在基础CodeT5模型中的优先级较低,因此FitRepair可以学习/使用项目特定的信息来使正确的补丁排名更高。通过这种方式,FitRepair不仅可以修复更多的错误,而且还可以更快地找到正确的修复,并减少用于补丁验证的计算成本。

Answer to RQ2

动机:进行详细的消融研究,验证FitRepair的不同配置对结果的影响。

方法:对于这个RQ,我们设置了四个子任务:

(1)知识强化微调的影响;

(2)修复导向微调的影响;

(3)相关标识符提示的影响;

(4)FitRepair的开销。

对于(1),我们研究这两个超参数对生成正确/合理的补丁数量、与基本CodeT5模型相比修复的独特错误数量(通过正确/合理的补丁)、编译错误率和每个错误生成的独特可编译补丁数量的影响。对于(2),除了观察使用知识强化微调时不同配置的影响外,我们还研究了应用修复导向微调的不同方式。对于(3),我们检查我们的相关标识符提示策略的不同参数。对于(4),我们调查了使用FitRepair相对于仅使用基础CodeT5的额外开销。

RQ2的结果分析

知识强化微调的影响:首先,我们研究在训练期间多次重复掩码对生成额外训练样本的影响。表2展示了使用10次重复迭代生成的Closure错误的结果 — — 生成10个训练集(重复行)和没有重复迭代次数 — — 仅生成1个训练集(非重复行)。我们观察到重复训练方法产生的宗正确和合理补丁数量更高。此外,当我们在每次迭代中生成新的掩码训练样本时,与基本CodeT5模型相比,模型能够生成两个独特的错误修复。当我们同时查看编译错误率和生成的独特可编译补丁数量时,我们可以找到类似的结果。我们发现,虽然非重复方法具有较低的编译错误率,但生成的可编译补丁数量要少得多。通过在训练期间多次重复掩码,我们能够微调模型以学习更多项目特定的信息,从而产生可编译的补丁并修复更多独特的错误。

表2 重复强化知识

表3 知识强化的掩码率

接下来,我们研究不同掩码率的影响。在这个实验中,我们通过在微调期间生成10个独特的训练样本来使用默认的10次重复迭代,并检查不同的掩码率对性能的影响。由于搜索空间非常大(考虑到无限的选择的掩码率),我们从10%到90%选择掩码率,间隔为10%。表3展示了我们在Closure项目中的错误上的实验结果。首先,我们观察到极端高的掩码率(70%,80%,90%)在修复的错误数量和编译率方面表现较差。虽然高掩码率可能迫使模型在训练期间学习更多项目特定的标记,但每个训练样本将有大多数标记被遮蔽。与生成单行或部分行的最终修复任务相比,极端高的掩码率使得结果模型不适合修复。我们观察到默认设置的50%掩码率在实现高总错误修复数量、与基本CodeT5相比修复更多独特错误以及相对较低的编译错误率之间达到了良好的平衡。通过使用50%的平衡掩码率,知识强化微调模型能够最好地补充基本CodeT5,产生更多独特的错误修复。

修复导向微调的影响:我们设计了两种额外的策略,可以在训练期间生成屏蔽的训练样本。表4显示了我们的默认“模板屏蔽”、“AST屏蔽”和“单行屏蔽”在Closure项目中的结果。回想一下,我们的默认设置会将用于填空式APR的修复模板直接应用于训练数据,以生成屏蔽的行。AST屏蔽将选择的行解析为AST,并随机选择一个子树进行屏蔽。另一方面,单行屏蔽将简单地屏蔽一个训练样本中的整行。我们观察到,单行屏蔽在正确和合理补丁的数量方面表现最差。这是因为在修复过程中,我们使用的修复模板不仅重新生成完整行,还屏蔽了行的一部分。模型只需重新生成行内的部分代码。单行屏蔽只能训练生成完整行,并且在与修复模板一起使用时效果不佳。另外,与AST屏蔽相比,模板屏蔽能够修复更多与基础CodeT5相比的独特错误,因为它直接利用推理修复模板创建训练样本。虽然AST屏蔽利用了结构信息,但并未完全模拟填空式APR的推理设置。此外,两个基线与我们提出的模板屏蔽策略相比,都导致了大量编译错误率高的补丁。模板屏蔽能够直接学习最终修复任务将作为模型输入的修复模板类型,从而减少编译失败。通过使用模板屏蔽进行修复导向微调,我们可以训练出针对修复任务进行优化的模型,以生成更多的错误修复,以补充基础CodeT5模型,这表明使用组装底层修复技术的训练策略对模型进行微调能够进一步提升其错误修复性能。

表4 以修复为导向的掩蔽策略

相关标识符提示的影响:我们检查我们的相关标识符提示策略的不同参数。表5显示了我们的默认(行默认)方法和Closure上其他配置的结果。首先,我们观察了变化的前N个标识符对结果的影响,发现当每个错误仅考虑前1个标识符时,我们不会生成更多的正确修复,因为修复错误所需的相关标识符不一定总是排名最高的。另一方面,考虑每个错误的较多标识符(前10个、前20个)也不理想,因为我们限制模型每个错误只能进行5000次采样,并且生成更多提示会减少每个提示的样本数。接下来,我们观察了在哪个范围内项目中可以找到相关令牌。我们的默认设置仅考虑错误所在文件的当前文件,并将其与考虑整个项目的情况进行了比较(即将算法1的第1行更改为考虑项目中的所有文件)。我们观察到正确和合理修复的数量减少了,这反映了先前工作中的类似发现,即在同一文件中已经可以找到大量正确的修复元素(相关标识符)。此外,通过考虑整个项目,我们可能会引入更多的噪声,其中潜在的不相关标识符可能会被高度排名。接下来,我们比较了在提示中包含标识符类型信息的效果。我们观察到我们的默认设置(带类型)能够生成更多的正确修复,与没有类型的情况相比,表明这种信息在帮助模型生成补丁中标识符的正确使用方面是有用的。最后,我们检查了默认提示方法,即一次只提供一个相关标识符。我们将其与另一种方法进行比较,即在同一个提示中包含所有前5个相关令牌。我们发现将每个相关标识符分开到单独的提示中提供更多的修复,因为将所有标识符一起包含可能会使模型混淆。

表5 相关标识符的配置

FitRepair的开销:由于FitRepair提议同时微调两个独立的模型,并通过信息检索和静态分析进行提示,我们调查了使用FitRepair相对于仅使用基础CodeT5的额外开销。回想一下,对于Defects4j 1.2的最老版本,FitRepair仅进行一次微调(一次性成本),然后使用训练好的模型为该项目内的所有错误生成补丁。我们发现,在Closure中,对于每个错误,FitRepair平均增加了14.3分钟(与直接使用基础CodeT5模型相比,每个微调策略增加了6.6分钟,提示策略增加了1.0分钟)。这表明总体而言,FitRepair增加的开销很小(仍在包括开销在内的5小时限制之内)。对于实际使用,微调步骤可以在实际修复任务之前完成。

Answer to RQ3

动机:进一步评估了FitRepair在包含新错误和项目的额外修复数据集Defects4j 2.0上的泛化能力。

RQ3的结果分析

表6显示了在Defects4j 2.0中单行错误上的正确错误修复数量。我们观察到,FitRepair能够实现最先进的状态,正确修复的错误数量最多为44个(比最佳基线高出8个)。与其他基于NMT或传统模板的APR工具不同,FitRepair不会受到仅在基础Defects4j 1.2数据集上表现良好的数据集过拟合问题的困扰。事实上,在修复的总错误数量方面,与1.2相比,对于Defects4j 2.0的相对改进更高(增加了22.2%与20.3%)。此外,与基线(列CodeT5×4)比较,FitRepair能够将总错误修复数量从42提高到44,并产生3个独特的错误修复。

表6对 Defects4j 2.0 的评估

图4显示了一个由FitRepair修复的错误(Codec-3),但任何其他研究过的APR工具都无法修复。这个错误的根本原因是一个偏移错误。虽然这个错误看起来很容易修复,但以前基于学习的APR无法提供正确的修复的一个原因可能是“4”和“3”的非常规值。在训练期间,基于NMT的APR可以从修复错误的数据集中学习,在这些数据集中,通常使用交换“0”和“1”来修复错误。然而,将“4”更改为“3”在修复错误的数据集中可能不常见。直接利用LLM的填空式APR工具在这个错误上也可能遇到困难,因为即使可以应用直接修复模板,变化也非常小。由于这个变化非常小,LLM在生成代码时不应该添加任何额外的代码,只需将“4”更改为“3”。然而,在训练期间,一个单一的屏蔽跨度通常代表多个不同的标记,这可能导致基础CodeT5模型生成比所需更多的标记。使用FitRepair,特别是修复导向微调策略,微调后的CodeT5可以学习到通常源自修复模板的短代码生成,例如参数替换。因此,FitRepair能够生成这个简单的补丁来修复潜在的错误。

图4 以修复为导向的微调独特补丁

转述:何家伟

0 阅读:0

互联不一般哥

简介:感谢大家的关注