《李传艺-一种基于修复偏好的自动程序修复工具集成策略.pdf》由会员分享,可在线阅读,更多相关《李传艺-一种基于修复偏好的自动程序修复工具集成策略.pdf(37页珍藏版)》请在三个皮匠报告上搜索。
1、一种基于修复偏好的自动程序修复工具集成策略李传艺 南京大学演讲嘉宾李传艺南京大学 助理教授CCF系统软件专委、软件工程专委执行委员。主要研究方向为智能化软件技术,在ACM TOSEM、IEEE TSC、IEEE/ACM TASLP、ACM TKDD、JSS、InS.、FGCS、JPDC、软件学报、计算机学报 和 ICSE、ESEC/FSE、ASE、ACL、AAAI、IJCAI、EMNLP等国内外重要学术期刊和会议发表论文60余篇,获授权专利6项。主持国家自然科学基金项目、CCF-华为胡杨林基金项目,以及华为、腾讯、华夏幸福等企业创新项目10余项,成果研制了一系列智能化软件工具,落地应用于国产编
2、程语言开发环境搭建、国产操作系统生态建设等信创领域。4目 录CONTENTS1.APR研究现状及集成方法2.本工作动机3.基于修复偏好的集成方案4.实验和结果讨论5.总结、展望与补充讨论APR研究现状及集成方法PART 01丰富的APR系统(1)lAPR(Automated Program Repair)旨在自动修复软件系统中的缺陷l目前已经有超过40种的APR工具,包括l 传统的基于规则的工具 l 基于神经机器翻译的工具(NPR)l 基于大语言模型(LLM)的工具71.基于启发式搜索:人工定义启发式规则,指导修复补丁的生成过程例子:GenProg1,采用遗传算法,以能通过的测试用例的数量为优
3、化目标,不断修改缺陷的代码片段直到产生通过所有测试用例的代码2.基于语义约束:通过某种手段推断程序的正确规约,作为约束指导补丁的生成过程例子:Nopol2,针对java程序中的条件语句,首先在出错的代码位置搜集所有变量的取值情况,然后根据期望的条件语句取值情况(true 或 false),将程序语义编码成为Z3约束求解器的约束进行求解3.基于修复模板的方法:根据开发者、研究人员的经验或者数据挖掘的结果预定义一些补丁模板或者补丁生成策略用于指导修复的过程例子:TBar3,基于修复模板的大成之作,集成了大量的补丁模板1 Le Goues,C.,Nguyen,T.,Forrest,S.,&Weime
4、r,W.(2011).Genprog:A generic method for automatic software repair.Ieee transactions on software engineering,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.and B
5、issyand,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)的工具81.Tufano等人1将程序修复定义为神经机器翻译(Neural Machine Translation)任务;CoCoNut2就结合了上下文感知的NM
6、T架构和CNN模型用于程序修复2.目前NPR的改进角度大致可以分为三类:数据预处理、输入表示(recoder)和输出搜索(decoder)3.SequenceR3 能够在类级别的代码上下文中接受最多1,000个令牌作为输入,以确保其在不同场景中的适用性;DLFix4为有bug的代码实现了重命名抽象,这样可以增强修复模型学习如何修复类似错误的能力。Cure5在其NMT架构中添加了一个在源代码上预训练的GPT编码模块,而Circle6和RewardRepair7则利用一个基于Transformer的预训练语言模型T5作为它们的编码器。目前NPR的解码器架构主要分为两种类型:一类是LSTM或Tran
7、sformer序列解码器,由Codit8和SelfAPR9采用;另一类是Recoder10和Tare11自己设计的结构感知解码器,它们将解码阶段建模为AST的修改,而不是生成文本序列。4.最近随着各种大语言模型(LLM)的出现,NPR研究人员开始探索将LLM用于程序修复。RepairLLaMA12,设计了多种输入/输出的内容格式,并采用Lora方法来微调CodeLLaMA丰富的APR系统(2)引用列表91 An Empirical Study on Learning Bug_x0002_Fixing Patches in the Wild via Neural Machine Translat
8、ion.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 A
9、utomatic 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
10、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)的工具101.AlphaRepair1是第一个non-traini
11、ng 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工具
12、,但Codex超过了现存所有NPR。这对于LLM4APR的未来,给了研究人员们极大的信心。4.而随着GPT-3.5的出现,LLM4APR的浪潮达到了顶峰,GPT(3.5/4)4APR成为了目前最主流的修复工具:如利用Bug外部信息与GPT进行对话式修复的ChatRepair4;有利用往复翻译(RTT)进行修复的RTTAPR5;有利用GPT-3.5生成额外信息指导开源模型修复的Srepair6;有利用思维链增强修复性能的ThinkRepair7;也有很多Agent-based的修复工具,如FixAgent8、RepairAgent9。5.目前这些GPT(3.5/4)-based APR在诸如De
13、fects4J、QuixBugs(Python/Java)上远超其他任何APR技术的修复性能。丰富的APR系统(3)引用列表111 Less Training,More Repairing Please:Revisiting Automated Program Repair via Zero-shot Learning2 Impact of Code Language Models on Automated Program Repair3 Automated Program Repair in the Era of Large Pre-trained Language Models4 Keep
14、 the Conversation Going:Fixing 162 out of 337 bugs for$0.42 each using ChatGPT5 A Novel Approach for Automated Program Repair using Round-Trip Translation with Large Language Models6 How Far Can We Go with Practical Function-Level Program Repair?7 ThinkRepair:Self-Directed Automated Program Repair8
15、A Unified Debugging Approach via LLM-Based Multi-Agent Synergy9 RepairAgent:An Autonomous,LLM-Based Agent for Program Repair交叉的修复性能不包括非训练方式LLM-basedl没有一个工具能够超越其他所有工具l 对每一个工具而言,都存在自己不能修复但其他工具能修的Bug单个模型能够修复的Bug数量所有模型能够修复的Bug数量12巨大差距对同一个Bug尝试所有工具 vs.首先尝试最有可能修复Bug的工具基于学习的APR工具集成方法l创新想法:不同于追求单个APR具的性能,次尝
16、试为Bug选择具l 收集能够度量Bug特征的角度,用于关联Bug和APR工具;做特征关联分析l 搜集和构造数据对l 使用SVM、DT、RFC、MLP等相对传统的算法l效果13Aldeida Aleti and Matias Martinez.2021.E-APR:Mapping the effectiveness of automated program repair techniques.Empirical Software Engineering,26,5(2021),99.本工作动机PART 02弥补基于学习的集成方案的不足?l但基于学习的方法存在一些问题l 训练数据构造成本:依赖规模实
17、际修复数据,要求对个Bug尝试多种不同APR具l 特征选取随机性大,和APR工具自身特征的联系松散l 增加新的APR工具代价大:一方面需要构造对应的修复数据,另一方面需要重新训练15可以灵活添加新的APR工具非基于训练的集成方案?不需要构建专门的训练数据随着修复经验积累性能增强如何直接度量一个APR工具是否能够修复一个Bug?通过待修复Bug和APR工具能修复、不能修复的Bug之间的关系度量!l基于学习的集成方法比较常见:代码检索、代码补全、代码摘要等基于修复偏好的集成方案PART 03基础概念17lPreference-based Ensemble Program Repair,P-EPRl
18、修复偏好:APR工具对各类特征(共4类)的Bug的修复能力(能/不能)l工具分成两大类从APR工具的修复操作推理Bug特征直接以列表形式记录对各种特征的Bug的修复情况基于约束的基于启发式规则的基于模板的基于学习的(NPR)未包含LLM-based self-enhancing APR集成框架18Step1:为3类传统APR工具整理其修复能力与Bug特征之间的映射关系Step2/6:根据修复历史数据为所有工具初始化/更新Bug特征与修复能力的映射Step3:抽取待修复Bug的特征Step4:为所有工具计算成功修复输入Bug的得分并排序Step5:按序执行工具并记录结果细节1评分19l修复历史是
19、基础,修复偏好是加分项BaseScore:根据修复历史中记录的修复能力和Bug特征之间的关系就算基础得分;所有类型工具均可计算PatternFactor:如果Bug特征符合传统工具的修复偏好,则通过提升影响因子的方式为传统工具加分Final Score=Base Score*(1+Pattern Factor)优先选择传统APR工具,可解释、更可信可配置的参数细节2更新l添加新的工具:直接更新Repair Patterns、Repair History,不影响其他工具l持续更新修复历史:所有工具的修复历史都会持续更新;不强制新工具有历史数据冷启动问题:得分低,难以被选中PART 04实验和结果
20、讨论实验设置(1)l包括21个APR工具的仿真模拟实验l包括4个APR工具的真实场景下的执行与验证实验l 集成框架仅为测试集中的Bug推荐APR工具的执行顺序l 实际修复与否、修复代价则直接复用已公开数据l 数据集为Defects4J;Repair History设置为空l 输入顺序Random,修复偏好影响因子0.5l 集成框架不仅为测试集中的Bug推荐APR工具的执行顺序l 也实际执行修复任务,包括补丁人工验证l 数据集为Defects4J 和 Bearsl 生成300个Patch,自动验证时间限制2小时,人工10分钟实验设置(2)lBaselinel评估指标l E-APR:和原文设置相同
21、,集成10个APR工具l E-APR(enhanced):和本文设置相同,集成21个APR工具l Random Selection:为每一个Bug随机选择APR工具l Invoking All:执行所有被集成的APR工具最大开销l Optimal Selection:每次Top 1就是能修复Bug的APR工具l 被正确修复的Bug数量、找到Plausible补丁的Bug数量l APR工具调用次数、人工检验Plausible补丁的次数l 相比执行所有工具而节约的工具调用次数、人工检验似真补丁的次数lRQ1.总体性能lRQ2.组件消融lRQ3.实用性能RQ1.总体性能&RQ2.组件消融(1)l与I
22、nvoking All、Optimal Selection对比l 取得接近性能时大幅度降低工具执行、人工检查的开销l与E-APR、E-APR(enhanced)对比;Pattern对P-EPR的贡献RQ2.组件消融(2)l所有组件都有影响l影响较大的l初始修复历史数据l是否动态更新修复历史lPattern影响因子取值影响不大l工具调用开销波动较规律,人工则不是l人工验证开销是更加细粒度的评估RQ3.实用性能l4个NPR工具在Bears数据集中的83个Single-hunk的Bug上真实执行l P-EPR集成策略超越了所有单个NPR工具的修复性能:正确修复数量、精准率l 单位修复正确的Bug节约
23、的工具执行开销、人工验证开销都比单个工具要高很多l 相比单独使用任何一个模型更加实用!PART 05总结、展望与补充讨论28l多种APR工具能力互补 集成的优势 基于学习的集成存在不足 P-EPR总结一种实用的APR集成方案:充分发挥各APR工具的优势,在降低时间、计算资源开销的基础上提升修复性能;容易加入新的APR工具;随着历史数据积累的越多,效果越好。29l提高Top 1选中正确APR的概率展望1:集成方案的优化但是,该集成思路能正确修复的Bug数量,无法超越所有单个模型能修复的Bug并集能力更强的APR工具;在生成补丁程序Token时集成不同的修复工具。l 传统的APR工具根据其修复偏好
24、关联Bug特征,能够有效匹配工具和Bugl 但基于学习的NPR工具主要依赖修复历史,类似用Bug之间的相似度替代NPR和Bug的关联l 尝试用“基于学习的策略”度量NPR和Bug之间的关联收集数据集,训练为Bug预测NPR的分类器,替换基于Repair History的计算模块30l定义:直接用LLM而非Fine-tuning的方式,fine-tuning有时间和费用的成本展望2:集成LLM-based Self-enhancing APR将其放在固定的位次作为候选,例如尝试Top 3都不行,则尝试这类方法l 基于LLM使用Chain-of-Thought、Agents、Additional
25、Generation、Self-correction等技术l 仅使用Bug内部信息:上下文代码、错误代码的位置l 另使用Bug外部信息:测试用例、报错信息、调试信息等C.S.Xia and L.Zhang,Less training,more repairing please:revisiting automated program repair via zero-shot learning.ESEC/FSE,2022,pp.959971.l修复能力较传统APR和NPR都更强,基于Repair History集成可能总是Top 1l除了Repair History,难以度量其与Bug之间的关联
26、l SRepair1修复Defects4J数据集上近300个Bug(共500+);非LLM方案最多能修复不到100个l 使用的额外信息l 缺陷报错信息l 触发缺陷的测试用例l 开发者或用户对缺陷的评论31补充:LLM-based Self-enhancing APR泛化性(1)l使用了大模型的自增强APR方法表现出非常突出的性能1 J.Xiang,X.Xu,F.Kong,M.Wu,H.Zhang,and Y.Zhang,“How far can we go with practical function-level program repair?”arXiv preprint arXiv:24
27、04.12833,2024.不是所有缺陷修复场景下这都很容易获取Magicoder对不同场景的泛化性受到影响SRepair在更多其他数据集上都能表现很好吗?测试了Defects4J、QuixBugsl 完整的Defects4J(835个Bug)l HumanEval-Java(163个Bug)l BugsInPy(493个中的54个Bug,借鉴TypeFix)32补充:LLM-based Self-enhancing APR泛化性(2)l简单扩展对SRepair修复能力的评估;对比相较基础的LLM的提升提升表现和另两个数据集有较大差异LLM本来就知道的才会被激发;本来不知道的没法激发。是不是G
28、PT-3.5-Turbo对前两个数据集知道的就比后面一个多?l 如果LLM对不同数据集的记忆程度不同,且记忆多效果好,记忆少效果差l 只能初步说明:记忆程度是一个影响自增强方法泛化能力的潜在因素33补充:LLM-based Self-enhancing APR泛化性(3)l如何度量LLM对数据集的掌握情况记忆程度?LLM补全的代码和真实代码之间的Tpye-1克隆:数量 和 密度l增大记忆会提升效果吗?+降低记忆会降低效果吗?构造包含BugsInPy general-level和bug-level知识的数据集,并微调Base LLM;对Srepair第二个LLM也使用微调后的LLM。34补充:LLM-based Self-enhancing APR泛化性(4)l增大记忆会提升效果吗?+降低记忆会降低效果吗?对Defects4J分别做三种类型的变换:降低LLM对新数据集的记忆程度,使用新数据集测试记忆与效果之间的关系。lBase LLM对评测数据集的记忆程度会影响对自增强方法性能提升的评测结果l 评测时使用多种不同的评测数据集合、尽可能使用包含新收集数据的评测数据集l 使用新的Bug数据持续更新APR的评测数据集THANKS