AI智能总结
一种基于修复偏好的自动程序修复工具集成策略 李传艺南京大学 演讲嘉宾 李传艺 南京大学助理教授 CCF系统软件专委、软件工程专委执行委员。主要研究方向为智能化软件技术,在ACMTOSEM、IEEETSC、IEEE/ACMTASLP、ACMTKDD、JSS、InS.、FGCS、JPDC、软件学报、计算机学报和ICSE、ESEC/FSE、ASE、ACL、AAAI、IJCAI、EMNLP等国内外重要学术期刊和会议发表论文60余篇,获授权专利6项。主持国家自然科学基金项目、CCF-华为胡杨林基金项目,以及华为、腾讯、华夏幸福等企业创新项目10余项,成果研制了一系列智能化软件工具,落地应用于国产编程语言开发环境搭建、国产操作系统生态建设等信创领域。 1.APR研究现状及集成方法2.本工作动机3.基于修复偏好的集成方案4.实验和结果讨论5.总结、展望与补充讨论 目录CONTENTS APR研究现状及集成方法PART 01 丰富的APR系统(1) lAPR(Automated Program Repair)旨在自动修复软件系统中的缺陷l目前已经有超过40种的APR工具,包括 l传统的基于规则的工具l基于神经机器翻译的工具(NPR)l基于大语言模型(LLM)的工具 1.基于启发式搜索:人工定义启发式规则,指导修复补丁的生成过程例子:GenProg[1],采用遗传算法,以能通过的测试用例的数量为优化目标,不断修改缺陷的代码片段直到产生通过所有测试用例的代码 2.基于语义约束:通过某种手段推断程序的正确规约,作为约束指导补丁的生成过程例子:Nopol[2],针对java程序中的条件语句,首先在出错的代码位置搜集所有变量的取值情况,然后根据期望的条件语句取值情况(true或false),将程序语义编码成为Z3约束求解器的约束进行求解 3.基于修复模板的方法:根据开发者、研究人员的经验或者数据挖掘的结果预定义一些补丁模板或者补丁生成策略用于指导修复的过程例子:TBar[3],基于修复模板的大成之作,集成了大量的补丁模板 [1] LeGoues, C., Nguyen, T., Forrest, S., & Weimer, W. (2011).Genprog: A generic method for automatic software repair.Ieeetransactions on softwareengineering, 38(1), 54-72.[2] Xuan,Jifeng, et al. "Nopol: Automatic repair of conditional statement bugs in java programs." IEEE Transactions on Software Engineering 43.1(2016): 34-55.[3] Liu, K.,Koyuncu, A., Kim, D. andBissyandé, T.F., 2019, July.TBar: Revisiting template-based automated program repair. ISSTA 2019(pp. 31-42). 丰富的APR系统(2) lAPR(Automated Program Repair)旨在自动修复软件系统中的缺陷l目前已经有超过40种的APR工具,包括 l传统的基于规则的工具l基于神经机器翻译的工具(NPR)l基于大语言模型(LLM)的工具 1.Tufano等人[1]将程序修复定义为神经机器翻译(Neural Machine Translation)任务;CoCoNut[2]就结合了上下文感知的NMT架构和CNN模型用于程序修复 2.目前NPR的改进角度大致可以分为三类:数据预处理、输入表示(recoder)和输出搜索(decoder) 3.SequenceR[3]能够在类级别的代码上下文中接受最多1,000个令牌作为输入,以确保其在不同场景中的适用性;DLFix[4]为有bug的代码实现了重命名抽象,这样可以增强修复模型学习如何修复类似错误的能力。Cure[5]在其NMT架构中添加了一个在源代码上预训练的GPT编码模块,而Circle[6]和RewardRepair[7]则利用一个基于Transformer的预训练语言模型T5作为它们的编码器。目前NPR的解码器架构主要分为两种类型:一类是LSTM或Transformer序列解码器,由Codit[8]和SelfAPR[9]采用;另一类是Recoder[10]和Tare[11]自己设计的结构感知解码器,它们将解码阶段建模为AST的修改,而不是生成文本序列。4.最近随着各种大语言模型(LLM)的出现,NPR研究人员开始探索将LLM用于程序修复。RepairLLaMA[12],设 计了多种输入/输出的内容格式,并采用Lora方法来微调CodeLLaMA 丰富的APR系统(2)——引用列表 [1]An Empirical Study on Learning Bug_x0002_Fixing Patches in the Wild via Neural Machine Translation.[2]CoCoNuT: combining context-aware neural translation models using ensemble for program repair.[3]SequenceR: Sequence-to-Sequence Learning for End-to-End Program Repair.[4]DLFix: context-based code transformation learning for automated program repair.[5] CURE: Code-Aware Neural Machine Translation for Automatic Program Repair.[6] CIRCLE: continual repair across programming languages.[7] Neural Program Repair with Execution-based Backpropagation.[8] CODIT: Code Editing With Tree-Based Neural Models.[9]SelfAPR: Self-supervised Program Repair with Test Execution Diagnostics.[10] A syntax-guided edit decoder for neural program repair.[11] Tare: Type-Aware Neural Program Repair.[12]RepairLLaMA: Efficient Representations and Fine-Tuned Adapters for Program Repair. 丰富的APR系统(3) lAPR(Automated Program Repair)旨在自动修复软件系统中的缺陷l目前已经有超过40种的APR工具,包括 l传统的基于规则的工具l基于神经机器翻译的工具(NPR)l基于大语言模型(LLM)的工具 1.AlphaRepair[1]是第一个non-training LLM-based APR工具:将缺陷修复转化为MLM任务,在遮蔽缺陷行后,利用CodeBERT对遮蔽进行预测,从而修复缺陷行。 2.Jiang等人[2]对于PLBART、CodeT5、CodeGen和InCoder四种LLM进行了实证,实验结果发现,在不微调的情况下,这四种LLM的修复性能在Defects4J v2.0、QuixBugs和HumanEval-Java上优于传统的NPR模型,而在Defects4J v1.2上与最先进的NPR模型修复性能基本持平; 3.Xia等人[3]也进行了相似的研究,发现GPT-Neo、GPT-J、GPT-NeoX和InCoder的修复性能仍逊于最先进的NPR工具,但Codex超过了现存所有NPR。这对于LLM4APR的未来,给了研究人员们极大的信心。 4.而随着GPT-3.5的出现,LLM4APR的浪潮达到了顶峰,GPT(3.5/4)4APR成为了目前最主流的修复工具:如利用Bug外部信息与GPT进行对话式修复的ChatRepair[4];有利用往复翻译(RTT)进行修复的RTTAPR[5];有利用GPT-3.5生成额外信息指导开源模型修复的Srepair[6];有利用思维链增强修复性能的ThinkRepair[7];也有很多Agent-based的修复工具,如FixAgent[8]、RepairAgent[9]。 5.目前这些GPT(3.5/4)-basedAPR在诸如Defects4J、QuixBugs(Python/Java)上远超其他任何APR技术的修复性能。 丰富的APR系统(3)——引用列表 [3] Automated Program Repair in the Era of Large Pre-trained Language Models [5] A Novel Approach for Automated Program Repair using Round-Trip Translation with Large LanguageModels [6] How Far Can We Go with Practical Function-Level Program Repair?[7]ThinkRepair: Self-Directed Automated Program Repair[8] A Unified Debugging Approach via LLM-Based Multi-Agent Synergy[9]RepairAgent: An Autonomous, LLM-Based Agent for Program Repair 交叉的修复性能——不包括非训练方式LLM-based l没有一个工具能够超越其他所有工具 单个模型能够修复的Bug数量所有模型能够修复的Bug数量巨大差距 对同一个Bug尝试所有工具vs.首先尝试最有可能修复Bug的工具 基于学习的APR工具集成方法 AldeidaAletiand Matias Martinez. 2021.E-APR: Mapping the effectiveness of automatedprogram repair techniques.Empirical Software Engineering,26, 5 (2021), 99. l创新想法:不同于追求单个APR⼯具的性能,⾸次尝试为Bug选择⼯具 l收集能够度量Bug特征的角度,用于关联Bug和APR工具;做特征关联分析l搜集和构造<Bug,APR工具>数据对l使用SVM、DT、RFC、MLP等相对传统的算法 l效果 本工作动机PART 02 弥补基于学习的集成方案的不足? l基于学习的集成方法比较常见:代码检索、代码补全、代码摘要等 l但基于学习的方法存在一些问题 l训练数据构造成本⾼:依赖⼤规模实际修复数据,要求对⼀个Bug尝试多种不同APR⼯具l特征选取随机性大,和APR工具自身特征的联系松散l增加新的APR工具代价大:一方面需要构造对应的修复数据,另一方面需要重新训练 如何直接度量一个APR工具是否能够修复一个Bug?通过待修复Bug和APR工具能修复、不能修复的Bug之间的关系度量! 基于修复偏好的集成方案PART 03 基础概念 lPreference-basedEnsembleProgramRepair,P-EPR l修复偏好:APR工具对各类特