探索ChatGPT在自动代码优化中的潜力:一项实证研究

互联不一般哥 2024-06-22 22:29:17

摘要

代码审查是确保软件项目质量和可维护性的基本活动。然而,这是一项耗时且容易出错的任务,可能会严重影响开发过程。最近,ChatGPT,一个前沿的语言模型,已经在各种自然语言处理任务中展示了令人印象深刻的性能,这表明它具有自动化代码审查过程的潜力。然而,ChatGPT在代码审查任务中的表现还不清楚。为了填补这一空白,在本文中,我们进行了第一次实证研究,以了解ChatGPT在代码审查任务中的能力,并特别关注基于给定的代码审查意见的自动代码优化。为了进行研究,我们选择了现有的基准CodeReview,并构建了一个新的高质量代码审查意见数据集。我们使用CodeReviewer,一个最先进的代码审查工具,作为与ChatGPT比较的基准线。我们的结果表明,ChatGPT在代码优化任务中优于CodeReviewer。具体来说,我们的结果表明,ChatGPT在高质量代码审查意见数据集(原文code review dataset,此处的code review是否应该理解为具体的审查意见?)上的EM和BLEU得分分别达到22.78和76.44,而最先进的方法仅达到15.50和62.88。我们进一步确定了ChatGPT表现不佳的根本原因,并提出了一些缓解这些挑战的策略。我们的研究提供了ChatGPT在自动化代码审查过程中的潜力,并强调了潜在的研究方向。

论文地址:https://dl.acm.org/doi/10.1145/3597503.3623306

1 引言

代码审查是软件开发和维护中的一项软件质量保证活动,它涉及到对源代码的系统性检查,以识别和纠正错误,提高代码质量,并确保符合编码标准。代码审查过程通常包括编写代码审查意见和根据收到的审查意见改进代码,其最终目标是提高软件质量。代码审查已经成为许多软件开发项目中不可或缺的一部分,因为它在提高软件系统的整体可靠性和可维护性方面的有效性得到了广泛的认可。

然而,代码审查可能是一个耗时且资源密集的过程,需要大量的手工工作来审查和改进代码,特别是在有大量贡献的流行项目中。例如,Bosu等人[3]发现,平均而言,开发人员每周分配大约6个小时来准备代码以供审查或审查他人的代码。此外,现代软件系统日益增加的复杂性和对更频繁发布的需求使得代码审查更具挑战性。为了解决这个问题,最近的研究[38,40]已经被用于自动化代码审查的各个方面,例如生成审查评论和优化的代码。特别是,依赖于LLM的基于学习的方法[18,42],如CodeT5[43]和CodeBERT[9],已经证明了在自动化代码审查方面有希望的结果,减少了代码审查所需的人工工作量。

最近,OpenAI推出了ChatGPT[26],这是一项能够改变包括软件工程任务在内的各个领域的革命性技术。ChatGPT是GPT-3.5的高级版本[29],是一个精细化的模型,擅长理解和执行指令。这种能力将其与其他预训练模型区分开来,并使其成为处理需要提示或指令的任务的有希望的候选者。代码优化过程取决于代码审查意见和以前的代码版本,这与ChatGPT的优势很好地结合在一起。由于人工审查可以作为代码优化的提示,因此研究使用ChatGPT完成此任务的潜力是很自然的。

在本文中,我们迈出了调查ChatGPT在基于给定评审意见的代码优化方面的潜力的第一步。虽然代码到代码的优化也是一个研究问题,但优化代码的质量仍然是主要关注的问题[41]。(原文 Although code-to-code refinement is also a research problem, there are still major concerns regarding the quality of the refined code [41].)因此,本文将重点放在基于给定评审的优化上,这种改进不同于代码到代码的优化。具体来说,我们关注三个主要问题:1)与最先进的方法相比,ChatGPT的性能如何?2)在哪些情况下,ChatGPT表现不佳,潜在的原因是什么?3)如何缓解这些挑战?通过回答这些问题,我们可以更深入地了解ChatGPT用于自动代码优化任务的潜力和挑战。

为了回答上述问题,我们进行了全面的实验来评估ChatGPT在代码优化任务中的性能。考虑到ChatGPT对不同设置的敏感性,我们首先设计了实验来评估其在不同提示和温度两个主要因素下的性能。然后,我们选择最优配置,并在标准基准测试[18](stand benchmark)上将ChatGPT与最先进的技术[43]进行比较。为了评估不同技术的通用性,我们通过收集标准基准测试中未包含的代码仓库中的代码审查意见,以及标准基准测试中包含的代码仓库中最近的代码审查意见,创建了一个新的数据集。根据评估结果,我们对根本原因进行深入分析,并制定缓解挑战的策略。

总的来说,结果为ChatGPT在代码优化任务中的性能提供了有价值的见解。我们的研究结果表明,在代码优化任务中,不同的提示和温度设置可以对ChatGPT的精确匹配(EM)分数产生高达5%和15%的显著影响。较低的温度设置会产生更好、更稳定的结果,并且在提示中描述代码审查场景有助于提高ChatGPT的性能。与最先进的CodeReviewer模型相比,ChatGPT在我们新生成的数据集中展示了更好的泛化能力。具体而言,ChatGPT在新数据集上的EM和BLEU得分分别为22.78和76.44,而CodeReviewer的EM和BLEU得分分别仅为15.50和62.88。然而,我们也发现ChatGPT在涉及优化文档和功能的任务上遇到困难,主要是由于缺乏领域知识,不清晰的位置,以及代码审查评论中不清晰的变更。(原文: However, we also found that ChatGPT struggles on tasks involving refining documentation and functionalities, mainly due to a lack of domain knowledge, unclear location, and unclear changes in the review comments.)这些限制可以通过提高评审质量和使用更先进的大型语言模型(如GPT-4)来解决。我们的研究强调了ChatGPT在代码优化任务中的潜力,并确定了未来研究的重要方向。

综上所述,本文做出了以下贡献:

我们对评估ChatGPT在基于代码评审意见的代码优化任务中的潜力进行了第一次实证研究。我们分析了ChatGPT在代码优化任务中的挑战,并提出了潜在的缓解策略,为未来更好地整合ChatGPT的研究奠定了基础。我们发布了一个包含高质量代码审查意见的新数据集,这可能对该领域的未来研究很有用。

2 研究设计

2.1 概述和研究的问题

本文的主要焦点是评估和理解ChatGPT在代码细化任务中的能力。图1显示了本文的概述。为了进行我们的研究,我们收集了现有的基准,包括CodeReview数据集,以及最先进的代码优化工具,如CodeReviewer[18],以进行比较。然而,考虑到数据集可能被用来在ChatGPT和CodeReviewer中进行训练的潜在风险,我们创建了一个新的代码审查数据集(名为CodeReview- new),由两部分组成:来自与CodeReview数据集相同的代码仓库的新的代码审查意见(即CodeReview- newtime),以及使用不同语言的代码仓库的代码审查意见,这些语言不包括在CodeReview数据集中(即CodeReview- newlanague)。接下来我们将介绍我们要调查的研究问题以及它们之间的关系。

图 1 研究概述

RQ1:ChatGPT设置的影响:在代码优化任务中,不同的提示和温度设置如何影响ChatGPT的性能?由于ChatGPT的有效性高度依赖于所使用的提示和温度,我们首先评估了不同的ChatGPT设置对代码优化的影响。我们根据是否提供具体场景和是否给出详细要求设计了五个提示。我们还选择了从0到2的五个温度设置,间隔为0.5(即0,0.5,1,1.5和2.0)。我们基于CodeReview数据集评估并比较了这五种提示和五种温度设置的25种组合的效果。我们在后续研究问题中对ChatGPT的评估是基于从RQ1获得的最佳提示和温度设置。

RQ2: ChatGPT对代码优化的有效性: ChatGPT的性能与最先进的方法相比如何? 我们的目标是研究ChatGPT在代码优化任务中的有效性,并与最先进的方法进行比较。为了回答这个问题,我们将ChatGPT的性能与最先进的代码优化工具CodeReviewer[18]进行了比较。我们复制并微调了CodeReviewer模型,并在现有的CodeReview数据集和我们创建的新数据集CodeReview- new上与ChatGPT一起评估了它的性能。

RQ3: ChatGPT的优缺点:在哪些情况下,ChatGPT表现得好或不好?为了解决这个问题,我们根据RQ2获得的结果进行了定性研究。具体来说,我们手动标注了来自CodeReview和CodeReview- new数据集的200个样本,标记了审查的质量(即相关性和信息级别)和代码变更类别。然后我们用各种评审质量和代码变更类别评估ChatGPT在数据上的性能。

RQ4: 性能不佳案例的根本原因和潜在缓解策略: ChatGPT性能不佳的潜在原因是什么,我们如何缓解这些挑战? 基于对RQ3的分析,我们的目标是进一步了解ChatGPT表现不佳的根本原因以及如何解决这一限制。我们调查了RQ3中400个标注样本中的206例,这些样例中ChatGPT未能做出准确的预测,并总结了根本原因的类别。从根本原因出发,我们试图研究提高评审质量和增强模型对缓解ChatGPT问题的影响。

2.2 实验设置

数据集。为了进行研究,我们使用了两个数据集:CodeReview数据集[18]和我们创建的新数据集,标记为CodeReview- new。

CodeReview (CR): 我们首先选择CodeReview[18],这是一个在代码审查任务中广泛使用的数据集。该数据集是从GitHub上排名前10,000个代码仓库中抓取的,包括9种编程语言,即C, c++, c#, Go, Java, JavaScript, PHP和Python。没有明确的数据再分发许可和少于1,500个pull request (pr)的代码仓库将被过滤掉。数据集由审查评论R与相对应的代码变化(code diff)D:C1C2组成。为了确保高质量的数据集,过滤掉与多个代码差异关联的评审评论的样本,或者与多个评论关联的单个代码差异的样本。此外,数据集被分为预训练数据集和多个下游任务数据集,我们在研究中使用了代码优化下游任务数据集。该数据集包括829个代码仓库和125,653个pr。为了公平比较,我们采用与CodeReviewer[18]相同的划分方法,将数据集分为训练集、验证集和测试集,比例分别为85%、7.5%和7.5%。

CodeReview- new (CRN): 另外,由于两个原因,我们创建了一个新的代码审查数据集CodeReview- new: 1)我们观察到CodeReview中有一些低质量的代码审查数据,这可能会影响ChatGPT与基准线CodeReviewer之间的比较;2) CodeReview测试数据中的数据分布可能与预训练和微调数据集中的数据分布非常相似,甚至可能已经被所选模型(即ChatGPT[29]和CodeT5[43])所使用。构建新的数据集是为了更好地评估模型的泛化能力。为了解决这两个问题,我们设计了更严格的过滤规则来过滤低质量的评论;并选择不可能在预训练过程中使用的代码审查。

为了确保CodeReview- new数据集的质量,我们基于对CodeReview中存在的质量问题的分析实施了几个严格的规则。只有满足这些规则的代码审查才会保留在我们的数据集中。首先,我们确保代码更改只涉及单个代码块,这是必要的,因为我们选择的基准线CodeReviewer只接受单个代码块作为输入。其次,我们过滤掉了与代码无关的更改,比如对README文件的更改。最后,我们通过收集包含审查评论R的原始代码段C1来确保审查评论R和代码更改D之间的相关性。

为了防止ChatGPT在预训练过程中使用CodeReview-New,我们只收集了2022年1月1日以后的数据,因为ChatGPT的训练数据只延伸到2021年[26]。此外,CodeReview数据集也不包含2022年1月1日之后的数据,这使得比较CodeReviewer模型和ChatGPT是公平的。除了CodeReview中包含的代码仓库之外,我们还从另外1400个代码仓库(基于每种语言的星级排名前200个存储库)中抓取代码审查意见,使用七种编程语言:Swift, Objective-C, Kotlin, SQL, Perl, Scala和R,这些编程语言不包括在CodeReview中。总的来说,我们选择了2029个代码仓库,其中829个来自CodeReview代码仓库,1200个使用不同编程语言的新代码仓库。

在应用过滤规则并根据时间选择PR之后,我们在最初的2029个代码仓库中只筛选出467个代码仓库。排除其他1,562个代码仓库可归因于两个主要原因: 首先,与CodeReview数据集的构建相比,我们使用了更严格的过滤规则; 其次,我们只选择了在2022年1月1日或之后创建的PR,这导致排除了一些在此期间PR很少的项目。如表1所示,数据集由来自两种类型代码仓库的样本组成:来自232个代码仓库的9,117个样本也包含在CodeReview数据集中,表示为CodeReview- newtime (CRNT);来自240个新代码仓库的5,451个样本,这些代码仓库与CodeReview数据集中的代码仓库具有不同的编程语言,表示为CodeReviewNewLanguage (CRNL)。有些语言,如SQL和Perl,由于PR较少或审查次数较少,数据量较少。

表 1 CodeReview-New数据集的统计数据

3 评论结果

3.1 实验设置

RQ1 提示和温度的影响

提示和温度是两个至关重要的参数,它们会在代码优化任务中显著影响ChatGPT的性能。为了确定这些参数的最优值,我们进行了一个实验来评估它们对代码优化的影响。请注意,虽然温度和提示是ChatGPT使用的参数,但它们不适用于运行CodeReviewer。CodeReviewer仅依赖于旧代码和代码审查意见的连接(concatenation)作为其输入。

具体来说,温度是控制ChatGPT生成的输出中的随机性和创造性水平的参数。较高的温度设置往往会产生更多样化和创新的回复,但产生无意义或不相关输出的风险更高。由于ChatGPT API的高成本,为了探索不同温度设置在ChatGPT中(范围从0到2)的影响,我们选择了五个特定的温度值(即0、0.5、1.0、1.5和2.0)。

为了选择提示,我们遵循了已有的最佳实践[1,13],这表明提示可以包括四种类型的元素,即指令、上下文、输入数据和输出指标。我们已经尝试了这四个元素的各种组合提示。在我们的初步探索阶段,我们总共试验了14个提示。由于预算限制,我们选择了5个表现最好、最具代表性的提示:

(1)提示1 (P1):最简单的提示。我们只提供了基于旧代码和审查生成新代码的基本需求,没有额外的描述。

(2)提示2 (P2): P1 +场景说明。P2是基于提示1设计的,但包含了一个场景描述,要求ChatGPT作为开发人员,并根据来自团队领导的PR的审查信息修改代码。

(3)提示3 (P3): P1 +详细要求。P3包含了详细的需求信息,例如尽可能保持代码的原始内容和格式,不要完成旧代码中的任何代码片段,也不修改审查中未提及的任何代码。

(4)提示4 (P4): P1 +简明要求。与P3类似,P4也包含了更简洁的需求信息。

(5)提示5 (P5): P4 +场景描述。P5是提示2和提示4的组合,包含场景描述和需求信息。

具体来说,P1中的指令、上下文和输出指示器都是最简单的。P2建立在P1的基础上,提供了更详细的上下文描述,而P3也建立在P1的基础上,提供了更详细的输出指标[8]。图2说明了提示1和提示2的构造策略。其他提示的详细信息可在我们的网站上找到[6]。

图 2 提示1和提示2的构建策略

为了评估ChatGPT在不同参数下的有效性,我们访问了ChatGPT API并对CodeReview数据集进行了代码优化。由于运行ChatGPT API的成本,我们从CodeReview数据集的测试集中随机选择了500个数据条目,以减少API调用的数量。为了考虑ChatGPT预测的随机性,我们将每个设置重复10次,即在每个设置下对每个样本进行10次ChatGPT API请求。我们得到了这十次重复的平均值作为最后的结果。

3.2 实验结果

表2显示了我们在不同温度和提示设置下对ChatGPT的评估结果。括号内的值表示标准差。值得注意的是,评估结果表明,将温度设置为0可以获得每个提示的最佳性能。随着温度的升高,ChatGPT的性能明显下降。例如,2.0的温度达到最差的结果。这种现象可能是由于生成新代码是一项复杂而精确的任务,而高温会导致不稳定和随机的结果,这更有创造性,但不太可靠。此外,我们研究了500个采样数据的结果,温度设置为0,提示为P2,发现大多数结果保持一致。具体来说,309个数据在所有10次运行中产生相同的答案,而110个数据在10次运行中仅产生2个不同的答案。这一发现进一步强调了在代码生成任务中使用温度设置为0的强大稳定性。总的来说,结果表明,使用较低的温度设置倾向于为代码生成任务产生更稳定和更好的输出。

表 2 不同提示和温度对于ChatGPT表现的影响

比较不同提示在稳定温度设置(0、0.5和1.0)下的效果,我们发现P2和P5的效果明显好于其他提示。结合P1和P2的对比结果,以及P4和P5的对比结果,我们可以推断,加入额外的场景描述有利于提高对ChatGPT的理解和性能。此外,我们注意到P3的性能比P4差,尽管两个提示都包含更多的需求信息。有时,P3的表现甚至比最简单的提示P1还要差。例如,在所有三种温度设置中,P1的EM-trim得分都高于P3,但P1通常低于P4。这表明,虽然提供额外的需求信息可能会有所帮助(与P1和P4相比),但太多复杂的信息可能会损害性能(P3)。这可能是因为详细的需求信息对于ChatGPT来说更难以理解,从而导致了不稳定的结果。

为了调查关于提示和温度的发现是否也适用于整个数据集,我们进行了一个额外的实验。我们从CodeReview数据集的训练集和验证集中随机抽取1000个数据点,进行重复实验。由于预算限制,我们在温度大于1.5时只重复了两次实验,而在其他温度设置下,我们重复了10次。表3中显示的结果与表2中的发现密切相关。总体而言,EM和BLEU指标都显示出与测试数据相当的性能,进一步加强了上述关于温度和提示设置影响的一致结论。

表 3 训练集和验证集上的影响

表4给出了P2与其他提示EM-T和BLUE-T的p值,并进行了t检验[35]。我们可以观察到,除了P2和P5之间的EM-T p值(0.5320)外,所有p值都小于0.005。这意味着P2在EM-T和BLEU-T评分方面明显优于P1, P3和P4。P5方面,在EM-T方面,P2与P5之间没有显著差异。但考虑BLEU-T值,P2明显优于P5。考虑到这些因素,我们最终选择P2进行本文的实验。

表 4 提示2和其他提示的对比

在温度设置不稳定的情况下(1.5和2.0),我们观察到整体性能下降。请注意,我们还在P2上尝试了细粒度温度区间(即0,0.1,0.2,…, 0.9, 1.0),这与逐步增大0.5的结果呈现相似的趋势。结果可以在网站上找到。但是,我们仍然注意到P1和P4总体上优于其他提示。这可能是因为P1和P4更简单,提供的信息更少,因此在更高的温度设置下结果更稳定。相反,包含更多信息的提示可能会使ChatGPT更具创造性,但在设置较高温度时也更不稳定。

对RQ1的回答: 参数和温度的配置对ChatGPT在代码优化方面的性能有重大影响。在大多数情况下,较低的温度设置往往会产生更好和更稳定的结果。包含简明场景描述的提示往往会产生更好的结果。

RQ2 ChatGPT的有效性

基于RQ1的最佳参数(即温度= 0和提示2),我们在CodeReview (CR)和CodeReview- new (CRN)的测试数据集上评估ChatGPT。表5给出了ChatGPT和CodeReviewer之间的比较结果。#Samples列显示了样本的数量。CodeReview-NewTime (CRNT)和CodeReview-NewLanguage (CRNL)分别表示我们构建的两个新数据集的结果(参见表1),其中CodeReview-NewTime指的是相同代码仓库中的代码审查意见,CodeReview-NewLanguage指的是带有新编程语言的不同代码仓库中的代码审查意见。注意,我们还在CodeReviewer的训练和验证数据集上评估了ChatGPT的性能。由于篇幅限制,这些评估的详细结果可以在我们的网站上找到[6]。结果显示了与在测试数据集上观察到的相似的性能,并显示了关于RQ1中温度和提示设置的影响得出的一致结论。我们可以看到,ChatGPT在不同的数据集上实现了稳定的结果。特别是,评估结果表明,由于CodeReview- new中的评论质量更高,ChatGPT在CodeReview- new上的表现优于CodeReview。

表 5 定量评价结果

我们进一步进行了深入的分析,以了解CodeReviewer在新数据集上与ChatGPT相比性能较低的原因。我们从新数据集中确定了2,283个案例,其中ChatGPT提供了正确的响应,而CodeReviewer没有。我们随机选择其中的150个进行人工分析。通过我们的分析,我们确定了4个主要的根本原因:

(34)对评审内容的理解不准确。我们已经观察到一些代码审查意见包含不明确的信息,例如不明确的位置引用,不明确的变更,或者需要特定于领域的知识,这对于CodeReviewer模型来说是具有挑战性的。

(62)过度删除。CodeReviewer模型显示出不准确地删除代码片段的倾向。具体来说,在30种情况下,CodeReviewer模型错误地删除了应该保留的正确代码片段。此外,在32个案例中,模型删除了需要修改的代码片段的重要部分,导致了过多的删除。

(10)额外修改。在某些情况下,CodeReviewer模型可能会对不需要任何更改的代码片段引入不必要的修改。

(44)很难理解代码块中提供的基本事实。我们的分析显示,在某些情况下,审查者已经准确地建议了代码块中的更改。然而,CodeReviewer无法识别这些块中的代码代表基本事实,从而导致不正确的修改。

总之,主要的根本原因似乎是模型的不同理解能力。CodeReviewer模型难以理解一些不清楚的评论,而ChatGPT则展示了更强的准确捕获底层语义的能力。在我们的网站上,我们已经包含了一些例子来说明根本原因和模型的不同性能[6]。

虽然ChatGPT在新数据集上的表现优于CodeReviewer,但结果仍然不如预期的好,EM-trim得分仅为22.78。这表明ChatGPT在代码优化任务上仍然需要显著的改进,这促使人们进一步探索它在RQ3和RQ4中的优缺点。

此外,我们的观察表明,ChatGPT经常生成解释其代码改进的附加文本。这种额外的文本既有利也有弊。一方面,它提供了帮助用户理解代码改进和评估所做更改的合理性的解释。另一方面,它可能要求用户在提交修改后的代码时额外努力删除这些额外的文本。然而,我们认为自动过滤掉这些额外的文本相对容易,因为ChatGPT经常用代码块(通常用三个反号表示)将代码括起来。

对RQ2的回答: 总的来说,ChatGPT在应用于没见过的数据集时比CodeReviewer展示了更好的泛化能力。然而,其有效性仍然有限,EM-trim和BLEU-trim评分分别仅为22.78和76.55。

3.3 实验设置

RQ3 ChatGPT的优缺点

为了更深入地了解ChatGPT的优缺点,我们对RQ2的结果进行了定性分析。具体而言,我们随机抽取了400个样本,其中CodeReview和CodeReviewNew数据集各200个样本,达到90%的置信水平和5.8%的置信区间。然后,我们沿着三个维度对它们进行手动标注: 审查意见与代码优化的相关性(Comment Relevance,意见相关性),审查意见提供的信息(Comment Information,意见信息),以及代码更改的类别(Code Change Category,代码更改类别)。我们的目标是基于这三个维度来确定ChatGPT的优势和劣势。

我们采用了严格的标注过程,对选定的样本进行ChatGPT的手工研究。为了方便标注过程,我们开发了一个标注网站,允许标注者在一个页面中查看审查评论、原始代码C1、标准答案修订代码C2和原始PR链接。如果需要确定标注的类别,标注者可以参考原始PR中的代码、讨论和提交。两位共同作者分别在三个维度上对样本进行了标注。当两位共同作者的标注出现差异时,会咨询第三位,通过讨论解决问题。每50个样本解决冲突,并在8轮中对齐标注标准,以确保标注过程中的一致性和准确性。(原文 Conflicts were resolved every 50 samples, and annotation standards were aligned over eight rounds to ensure consistency and accuracy in the annotation process.)标注总共花费了14天的时间。意见相关性、意见信息和代码更改类别的最终Cohen’s Kappa系数[25]分别为0.675、0.696和0.888,表明两种标注者之间存在中度、中度和强一致性。

意见相关性度量测试数据集中评审意见和代码变更之间的关联程度,反映数据集的质量。意见的相关性分为三个层次:

第1级(Not):代码变更和评审注释之间没有明显的关系。

第2级(Partial):评审评论中的建议在代码变更中部分实现,或者在代码变更中的一些改进没有在评论的建议中出现。

第3级(Perfect):代码更改严格遵循评审意见,并且两者之间有明确的对应关系。换句话说,评审意见的建议在代码变更中得到了充分的实现,而代码的优化则完全包含在评审意见中。

意见信息度量关于代码变更的注释中包含的指令的充分性和清晰度,这反映了贡献者或模型改进代码的难度。例如,像“缺少空格”这样的注释比“这个函数名没有很好地描述它的功能”更能提供信息。我们按照[18]对意见信息的定义,将意见信息分为三个层次:

第1级(模糊问题):评审意见只给出了修改的大致方向(例如,“我们应该保持变量命名的一致性”),没有明确的修改建议。

第2级(模糊建议):审查意见为修改提供了具体的建议(例如,“用驼峰式样式更改它”),但不直接指定应该修改的代码的位置。

第3级(具体建议):审查意见包括添加或修改代码片段的明确请求(例如,“将变量名' testfile '更改为' testfile '”)或明确标识要删除的代码片段。

代码变更类别用于度量代码变更的意图。我们遵循[42]中的分类法,并根据我们的标注定义类别。有4个主要类别,包括文档类别、功能类别、重构类别和文档与代码类别。

文档类别表示仅添加、修改或删除文档的代码更改。根据约定(文档约定)进行的修改也可能涉及添加、修改或删除,但是我们将其分开,以便更容易地分析它对模型对修订代码的预测所带来的独特挑战。

功能类别表示功能逻辑方面的代码更改,例如添加、修改或删除代码。

重构类别指的是非功能性代码重构,包括重命名代码实体(Refactoring-rename)、交换两个代码片段(Refactoring-swap),以及基于编码标准更新代码(Refactoring-conventions)。

文档和代码类别表示包括文档和代码修改的代码变更。

图3显示了CodeReview数据集和CodeReview- new数据集上的标注结果,它们衡量意见相关性和意见信息。结果表明,与CodeReview数据集相比,采用更严格过滤规则构建的CodeReview- new数据集具有完美相关水平的样本更多(150比135),不相关水平的样本更少(21比36),表明质量更高。此外,与CodeReview数据集相比,CodeReview- new数据集具有模糊建议级别的样本更少(40对59),具有模糊问题级别的样本更多(65对46)。

图 3 CodeReview和CodeReview-New的数据质量

图4展示了ChatGPT在不同意见相关性和信息级别上的结果。该图突出显示,当意见被分类为完全相关时,ChatGPT的表现最好,优于部分相关和不相关级别。此外,ChatGPT在包含具体建议信息的评论上表现最好,而在模糊建议和模糊问题上表现相似。结果表明,数据的质量显著影响ChatGPT的性能,因为低相关性和低信息的评论不能为ChatGPT提供足够的上下文和信息来做出准确的预测。

图 4 ChatGPT对不同评审信息级别的数据的定性结果

表6总结了不同代码更改类别的结果。它表明ChatGPT在重构类别中表现最好,EM-trim为37.50%,BLEU-trim为83.58%,这表明ChatGPT对如何执行代码重构有很好的理解。然而,文档和代码类别是表现最差的类别,EM-trim为0%,BLEU-trim为64.09%,这突出了在保持一致性的同时对代码和文档进行更改的困难。在比较次要类别时,ChatGPT最擅长处理删除类型的代码更改,其次是修改和添加类别。此外,我们观察到一些关于更新和添加的预测实际上是正确的,但并不严格匹配基本事实答案,这将在RQ4中讨论。结果还表明,ChatGPT擅长基于约定更新代码,文档约定和重构约定样本的EM-trim值分别为23.08%和44.12%,而文档和重构类别的平均EM-trim值分别较低,分别为17.78%和37.50%。

表 6 不同类型代码变更上ChatGPT的结果

对RQ3的回答: ChatGPT在具有具体建议的高质量评论上表现更好,而在具有低相关性和低信息的评论上表现更差。此外,ChatGPT在代码重构任务上表现出最高的性能,而在涉及优化文档和功能的任务上表现较差。

RQ4 根本原因分析和缓解

在RQ4中,我们的目标是进一步了解ChatGPT表现不佳的根本原因,并确定潜在的改进解决方案。具体来说,我们收集了206个表现不佳的案例,这些案例满足两个标准:1)评论具有完美的相关性,2)基于ChatGPT输出计算的EM-trim分数为0。

3.4 根本原因分析

表7给出了根本原因分析的结果,其中包括两大类根本原因:测量不准确和预测不正确。

表 7 根本原因分析结果

不准确的测量类别指的是假阳性,其中,基于我们的人工检查,ChatGPT预测的改进是正确的,但测量指标,如EM或EMtrim,由于严格匹配而较低。在此类别中确定了四种类型的根本原因:微不足道的遗漏(Insignificant Omission,IO), ChatGPT没有返回未修改的代码段,而是正确返回修改的部分; 意想不到的语法修复(Unexpected Grammar Fix,UGF), ChatGPT修复了文档中没有出现在基本事实修订代码中的语法错误; 代码风格差异(Code Style Difference, CSD),其中ChatGPT预测的代码在语义上与实际修改的代码相同,只有空格、换行符和其他不影响代码语义的代码风格方面存在差异,并且审查注释没有明确禁止更改代码风格。合理改进(Reasonable Improvement,RI),指的是ChatGPT的修改非常合理,并且比原始版本有所改进的情况。

不正确预测类别是指ChatGPT与基本事实修改代码相比做出错误答案的情况。我们在这一类别中确定了三种类型的根本原因。需要领域知识(Need Domain Knowledge , NDK)指的是评审评论没有提供完成修改所需的与代码仓库相关的领域知识的情况(例如,“将此更改为另一个文件中的样式”)。不明确的位置(Unclear Location,UL)是指评审注释没有提供要修改代码的具体位置的情况。例如,在图5中,检查并没有清楚地指出更改的位置,而且ChatGPT (GPT-3.5)也错误地修改了函数名。虽然贡献者可以在GitHub PR界面上看到评审评论的具体位置,但这些信息不会提供给ChatGPT,这里遵循与CodeReviewer相同的设置[18]。不明确变更(Unclear Changes,UC)是指评审意见的信息级别较低,导致ChatGPT无法确定需要进行的具体修改,从而导致性能不佳的情况。例如,在图6中,ChatGPT (GPT-3.5)错误地假设审查建议返回“data.apply…”的结果,因为这个模糊的评论。模型谬误(Model Fallacy, MF)是指从人类的角度来看,审查是准确和清晰的,但ChatGPT未能正确处理的情况。这表明观察到的问题更有可能是模型本身固有的,而不是仅仅源于审查的质量。如图7所示,ChatGPT (GPT-3.5)错误地认为审查建议将default(1)更改为default(false)。

图 5 一个修改位置不明确和缓解的例子

图 6 一个不明确的变化和缓解的例子

图 7 一个模型谬误的例子

如表7所示,51例(20.39%)表现不佳的案例是由不准确的EM计算引起的。在剩下的164例(79.61%)ChatGPT输出错误答案中,大多数107例(51.94%)是由于缺乏完成修改所需的领域知识造成的。另有44例(21.36%)是由于评审意见中的位置信息不清楚所致,13例(6.31%)是由于评审意见中提供的说明不清楚所致。

3.5 缓解策略

我们进一步研究了可能的缓解措施,以改进 ChatGPT 在错误预测类别中的表现,因为需要领域知识的情况需要更多的信息。(原文 We further investigated potential mitigation to improve ChatGPT on the underperforming cases in the Incorrect Prediction category as Need Domain Knowledge requires more information.)一般来说,缓解可以从两个主要方向进行:改进评审评论的质量和增强用于代码优化的模型。改进评审质量可以通过两种途径实现:为评审人员设计最佳实践,以提供高质量的评审;如果评审人员不能提供高质量的评审,则使用开发工具来帮助改进低质量的评审。在这项研究中,我们想要研究提供更精确的评审和使用更先进的模型是否可以提高LLM在代码优化任务上的性能。我们将高级缓解策略(例如,自动评审优化)的研究留给未来的工作。

对于与不清楚的位置和不清楚的变化相关的案例,我们确定了三种提高评论和模型质量的策略:在评论中加入特定的位置信息(缩写为Loc.),提供更明确的评论意见(缩写为Exp.),以及在ChatGPT中使用更先进的GPT-4模型。在使用GPT-4时,除了直接使用原始评审(缩写为Dir.)外,我们还可以根据需要添加特定的位置信息或提供更明确的评审意见。我们的目标是研究这些策略是否可以减轻ChatGPT的这些挑战。

表8显示了使用不同缓解策略的结果。“UL”和“UC”分别为“定位不清”和“变更不清”的情况。结果表明,GPT-3.5结合相应的缓解技术,可以解决24/32(75%)的不明确位置案例和6/11(54.54%)的不明确变化案例。通过简单地切换到GPT-4而不使用缓解技术,它可以解决与使用缓解技术的GPT-3.5非常接近的情况。应用缓解技术后,GPT-4可以解决31/32(96.88%)的不清楚位置和10/11(90.91%)的不清楚变化情况。图5和图6显示了两个具有不同缓解的示例。ChatGPT (GPT-3.5)通过修改原始评审(即添加位置信息并使其更明确),可以准确地改进代码。另一种方法是使用更高级的LLM,即GPT-4,它可以直接产生正确的结果,而无需复查修改。此外,我们展示了GPT-4生成的部分解释,这些解释清晰合理。此外,与GPT-3.5不同的是,当GPT-4无法从审稿人的评论中推断出具体的修改位置或内容时,它经常要求审稿人提供具体的修改位置或内容。当应用于实际场景时,这是特别有用的,因为它允许迭代地帮助审阅者改进他们的审阅注释,直到模型能够更好地理解它,最终提高预测代码更改的准确性。

对RQ4的回答: 在我们的分析中确定的主要根本原因是缺乏领域知识,不明确的位置,以及不明确的更改。确定了缓解这些问题的两个潜在方向:改进LLM,例如使用GPT-4代替GPT-3.5,以及提高评论的质量,例如提供更清晰的信息。

转述:陈宇琛

0 阅读:0

互联不一般哥

简介:感谢大家的关注