【论文阅读】【TSE 25'】RepairLLaMA:程序修复的有效表示和微调适配
文章信息
- 标题:RepairLLaMA: Efficient Representations and Fine-Tuned Adapters for Program Repair
- 链接:TSE
主要问题
作者认为,模型调优对于高质量的修复生成至关重要,原因在于:1)允许模型有监督地内化修复模式;2)允许特定任务的修复表示,不必依赖于手动提示;3)提供训练期间合并特定修复信息的机会。另外,传统的数据调优忽略了输入中故障定位的现实表征,也容易在数据有限时过拟合。
RepairLLaMA利用参数微调来适应LLM处理特定于修复的代码表示。代码表示中包含bug定位信号,支持多位置错误;使用低秩适配(LoRA)训练一个更小的修复适配器,预防过拟合。本文贡献如下:
- 设计一个新的微调框架RepairLLaMA,最大化表示领域知识,保持与预训练的一致性;
- 评估修复微调的不同代码表示,证明框架可以充分利用故障定位和原始错误代码的任务特定信号;
- 证明参数高效调优策略可行
RepairLLaMA(一下简称我们)
概览

上图展示了修复流水线,分为三个连续阶段,其新颖之处在于:APR特定代码表示;端到端的参数微调技术。核心是一个修复适配器,用于修改LLM行为,在给定语言中最大限度地提高修复任务性能。第一个阶段进行核心选择,包含:1)初始预训练模型的选择;2)输入输出代码表示;3)微调数据集。第二阶段训练一个修复适配器。第三阶段使用适配器修复现实错误。
初始LLM的选择
概括来说原则有三:开源、大规模数据训练和在与训练期间以填充目标进行训练。
代码表示的选择
- 故障定位表示
传统方法都是基于线路的思维定位bug,在相应的修复算法中也会提供一条线路作为输入。但是这不适用于多个位置的bug。我们的方法核心思想是将故障定位信息表征为一个区域而非单线,由可疑区域的开始直到结束。 - 输入表示空间
输入表示的设计空间与从有bug的代码中显示的内容以及附加信息的存在有关。例如,故障定位信号在确定应该修改代码的范围时非常有用。但是,在训练前阶段可能看不到这些信息。为了让LLM利用它,必须以一种可以在微调过程中学习的方式来表示它。我们设计了四种针对此的输入表示:
IR1:将bug函数简单表示以标准格式描述编写的代码文本。它与llm在预训练期间观察到的表示相同。当使用这种表示时,主要的限制是模型无法访问故障定位信息,因此需要确定在哪里更改代码,这可以被认为是隐式异常检测。
IR2:增加了两个注释,表示有bug的代码块的开始和结束。
IR3:有问题的块被填充令牌替换,这提示模型填充它。但是,通过屏蔽代码的错误部分,这种表示会导致信息丢失,而这些信息对于生成修复是有用的。
IR4:在IR3基础上,有bug的代码显示在前缀部分末尾的注释中。 - 输出表示空间
自然的输出表示是对有bug代码的差异,也就是补丁。我们设计了四种输出表示:
OR1:完整的输出表示。
OR2:仅输出修复内容,来替换问题代码块
OR3:输出是带有三行上下文的典型上下文diff。
OR4:单行上下文diff。 - 输入输出表示对

有了两种表示,该把它们组合起来了。FL表示组合是否包含故障定位信息;AlignedPT提供了相对于预训练数据/目标的表示对齐的评估;红叉表示代码表示与预训练数据和目标不一致。前三行(即IR1xOR1、IR1xOR3、IR1xOR4)包含不包含故障定位信号的代码表示对。所有对之间的输入是相同的(IR1),而输出可以是完全固定函数(OR1)或diff (OR3, OR4)。这对之间的关键区别在于输出长度和格式。后三行(即IR2xOR2、IR3xOR2、IR4xOR2)包含包含故障定位信息的代码表示对,作为标记或填充,这是特定于程序修复的。与预训练最一致的表示是IR3xOR2,因为预训练模型支持填充。IR2用从未见过的注释表示填充目标,而IR4将有bug的代码作为注释保存。与它们配对的自然输出表示是OR2,因为它只包含替换已经本地化的错误块的新代码,从而最小化输出长度。请注意,我们已经在试点实验中对其他组合进行了实证测试,表1中未列出的组合表现不佳。 - 预训练数据集
一个相关的数据集通常包括一对有bug的和修复的代码样本。其次,包含的样本类型应该与目标bug相似。第三,要考虑数据集的大小。第四,数据集的多样性很重要。 - 适配器
在资源有限的情况下,对当前llm进行微调是一项挑战。RepairLLaMA使用LoRA,这是一种最先进的参数高效微调方法,可以在保持模型性能的同时降低内存需求。LoRA不是对所有模型参数进行微调,而是冻结预训练的LLM权重,并将可训练的低秩矩阵注入特定的注意层。除了减少内存需求外,通过减少可训练参数的数量,LoRA还可以充当正则器,帮助防止微调期间的过拟合。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 西风的那一年!
评论




