ContrastRepair:通过对比测试用例对提升基于对话的自动化程序修复能力
《ACM Transactions on Software Engineering and Methodology》:ContrastRepair: Enhancing Conversation-Based Automated Program Repair via Contrastive Test Case Pairs
【字体:
大
中
小
】
时间:2025年11月07日
来源:ACM Transactions on Software Engineering and Methodology
编辑推荐:
ContrastRepair是一种基于对话的自动程序修复方法,通过生成对比测试对( failing test和passing test)为LLM提供更精准的反馈,结合上下文依赖函数信息,显著提升修复效果。实验表明其在Defects4J、QuixBugs和HumanEval-Java上正确修复率比基线提高15.32%-60%,并减少20.91%的API调用,实现新状态艺界。
随着软件系统日益复杂,软件中的错误和漏洞变得不可避免。这些问题可能导致系统故障、安全漏洞以及用户体验的下降。手动调试和修复这些问题是一个耗时且繁琐的过程,需要开发人员投入大量资源和精力。据报告,每年用于发现和修复错误的支出高达数十亿美元,而开发人员大约有50%的时间用于调试和修复错误。鉴于这一挑战,自动程序修复(APR)作为一种解决方案,逐渐受到重视,它通过自动产生补丁来修复错误。
传统的APR技术可以分为基于模板、启发式和基于约束的方法。然而,这些传统方法的效果仍不令人满意。基于模板的APR需要手动设计模板,这需要大量的开发人员工作量和领域知识,因此它们的泛化能力有限,通常只在特定类型的错误上表现良好。近年来,深度学习(DL)技术在APR领域受到广泛关注。这些DL模型能够从大量的数据中学习各种错误模式,超越了传统方法的性能。然而,DL方法仍然面临一些挑战。其中,一个主要问题是训练数据的依赖性;如果训练数据未能涵盖某些错误类型,模型可能仍然难以有效地泛化到未见过的错误。此外,构建全面的修复数据集需要大量的人力和资源。同时,虽然DL方法在APR中展现出潜力,但它们的有效性仍受到限制。这些方法通常会生成大量候选补丁,导致验证过程耗时费力,这限制了其在实际应用中的可行性。
为了解决这些问题,近期的研究开始关注使用大型语言模型(LLMs)进行APR。LLMs在大规模代码语料库上进行训练,展示了在各种任务中出色的性能。研究表明,即使不进行微调,LLMs也能在APR任务中表现出与传统DL方法相当的能力。通过微调LLMs,其修复能力可以进一步增强。在对话驱动的APR方法中,利用LLMs进行交互式修复已成为一个重要的研究方向。其中,基于ChatGPT的对话驱动APR方法取得了新的研究进展。其基本思路是生成补丁,并在对话中逐步优化。在每次对话中,系统结合之前的错误补丁和测试失败信息,引导LLM生成新的补丁。这种对话驱动的APR方法已被证明能够显著提高LLM在修复程序中的效率和准确性。
然而,对话驱动的APR方法仍然面临挑战。其中一个关键问题是对话中反馈信息的质量。反馈信息的质量直接影响到LLM对错误的识别和修复效果。为了解决这一问题,本文提出了一种新的对话驱动APR方法,称为ContrastRepair。该方法通过为LLM提供对比测试对,增强了对话驱动APR的效果。一个测试对由一个失败的测试和一个通过的测试组成,为LLM提供对比反馈。本文的核心思想是,通过最小化生成的通过测试与给定的失败测试之间的差异,从而更好地定位错误的根本原因。通过提供这样的信息对,ContrastRepair能够使LLM更有效地修复程序错误。
在实现ContrastRepair时,我们基于最先进的LLM,即ChatGPT,并在交互过程中不断调整和优化补丁。我们对ContrastRepair在多个基准数据集上进行了评估,包括Defects4J、QuixBugs和HumanEval-Java。结果表明,ContrastRepair显著优于现有的方法,实现了APR领域的新状态。例如,在Defects4J 1.2和2.0中,ContrastRepair能够正确修复143个错误案例,而最佳的基线方法只能修复124个错误。这表明,通过引入对比测试对,ContrastRepair能够显著提高错误修复的准确性和效率。
本文的主要贡献包括:(1)提出了一种新颖的基于对话的APR方法,通过结合正负反馈信息,使LLM能够生成高质量的修复补丁;(2)设计了一种方法来构建和选择合适的测试对,以确保提供给LLM的提示信息更加丰富和准确,有助于精确地定位错误并生成有效的补丁;(3)进行了全面的评估,以验证ContrastRepair在修复程序错误方面的有效性,结果表明其在多个数据集上的表现优于现有方法。
为了进一步探讨ContrastRepair的有效性,我们进行了多个研究问题的评估。首先,我们评估了ContrastRepair在Defects4J数据集上的表现,发现其修复错误的能力显著优于其他方法。其次,我们评估了ContrastRepair在未知数据集上的表现,如HumanEval-Java,结果表明其在修复错误的数量和效率方面都有显著提升。此外,我们还评估了不同超参数对ContrastRepair性能的影响,发现使用测试对可以显著提高修复效果,同时减少对LLM的调用次数。最后,我们进行了消融研究,分析了ContrastRepair中不同组件的贡献,发现对比测试对和上下文信息对于提高修复效果具有重要作用。
在修复过程中,我们采用了一种迭代的方法,通过与LLM的交互逐步修复程序。具体来说,我们利用对比测试对构建提示信息,将这些提示信息输入LLM,以获得修复补丁。在每次交互中,我们根据修复结果调整补丁,直到生成一个能够通过所有测试的补丁,或者修复预算耗尽。为了确保提示信息的准确性和有效性,我们引入了上下文信息,包括依赖函数和测试对。这些信息帮助LLM更好地理解程序的语义,从而生成更精确的修复补丁。
在评估ContrastRepair的性能时,我们发现其在多个方面都有显著的优势。首先,ContrastRepair在修复错误的数量上优于现有的方法,特别是在Defects4J数据集上,其修复错误的能力达到了新的高度。其次,ContrastRepair在修复效率方面也表现出色,其平均调用次数比其他方法减少了20.91%。此外,我们的消融研究进一步验证了对比测试对和上下文信息对提高修复效果的重要性。通过引入这些组件,ContrastRepair能够更准确地定位错误,并生成更高质量的修复补丁。
总的来说,ContrastRepair是一种基于对话的APR方法,它通过提供对比测试对,使LLM能够更有效地定位错误并生成修复补丁。这种方法不仅提高了修复的准确性,还减少了对LLM的调用次数,从而提高了整体的修复效率。通过在多个基准数据集上的实验,我们验证了ContrastRepair的有效性,并发现其在修复错误的数量和质量上都优于现有的方法。此外,我们还探讨了不同组件对修复效果的贡献,发现对比测试对和上下文信息在提高修复效果方面起到了关键作用。这些结果表明,ContrastRepair是一种有前景的APR方法,能够显著提高修复程序错误的能力。
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号