基于ChatGPT自动代码摘要实证研究

互联不一般哥 2024-03-28 08:58:32

引用

Sun W, Fang C, You Y, et al. Automatic Code Summarization via ChatGPT: How Far Are We?[J]. arXiv preprint arXiv:2305.12865, 2023.

论文:https://arxiv.org/abs/2305.12865

摘要

本文探讨大型语言模型ChatGPT在自动代码摘要方面的性能。作者在广泛使用的Python数据集(称为CSN-Python)上评估了ChatGPT,并将其性能与几种最先进的代码摘要模型进行了比较。他们使用三个指标(BLEU、METEOR和ROUGE-L)来衡量ChatGPT和其他模型生成的注释的质量。实验结果表明,ChatGPT的代码摘要性能现在明显比最先进的模型差。随后作者讨论了ChatGPT在代码摘要方面的优点和缺点,并概述了基于ChatGPT的代码摘要中的几个开放挑战和机遇。

1 引言

代码注释在促进程序理解和软件维护方面起着至关重要的作用。编写高质量的代码注释是一种很好的编程习惯。然而,编写注释是一项劳动密集型、耗时的任务。因此,在软件演化过程中,高质量的注释往往是缺位的、不匹配的、过时的。缺乏高质量的代码注释是软件行业普遍存在的问题。自动代码摘要(code summarization)是一个热门的研究课题,旨在设计先进的技术来支持代码摘要(即注释)的自动生成。对于开发人员给出的代码片段(例如,Java方法或Python函数),代码摘要技术可以为其自动生成自然语言摘要。

近年来,大量基于深度学习(deep learning,DL)的代码摘要技术相继被提出,DeepCom、NCS、SIT等。它们利用在大规模代码注释语料库上训练的强大生成模型,将编程语言中的代码片段翻译成自然语言的摘要。利用强大的深度学习,这些技术已经证明在生成摘要的自然性和信息量方面优于传统的基于信息检索(IR)的技术。之后,随着预训练和微调范式在NLP领域的成功(例如BERT和T5),软件工程(SE)中的许多工作引入了该范式来进一步促进代码相关的任务,包括代码总结(例如CodeBERT和CodeT5)。在实践中,这些工作首先用通用语言建模任务(如掩码语言建模(MLM)和单向语言建模(ULM))对大规模语言模型(即LLM)进行预训练。然后,他们在下游任务(如代码克隆检测、代码搜索和代码摘要)上对预训练模型进行微调。

最近,一个名为ChatGPT的智能人机对话LLM引起了极大的关注。ChatGPT是通过从人类反馈(RLHF)中进行强化学习,对GPT-3.5系列模型进行微调而创建的。与之前的DL方法相比,ChatGPT接受较长的输入,并允许用户与语言模型进行对话,同时在生成答案时考虑到以前的聊天历史记录。随着ChatGPT的出现,人们对利用该模型完成各种NLP任务的兴趣越来越大。除了自然语言之外,ChatGPT还可以处理源代码,这引起了人们越来越多地将ChatGPT应用于SE任务。然而,对ChatGPT在代码摘要中的探索仍然缺乏。

在本文中,我们对ChatGPT的零短码汇总性能进行了初步评估。这项研究的概述如图1所示。总体思路是探索ChatGPT在代码摘要中的潜力,并将已探索的使用ChatGPT的策略与最先进的(SOTA)技术进行比较,以得出结论。具体来说,我们首先设计了几个启发式问题来收集ChatGPT的反馈。基于反馈,我们找到一个合适的提示符来引导ChatGPT生成分发注释。然后,我们使用这样的提示符要求ChatGPT为CSN-Python测试集中的所有14,918个代码片段生成注释。我们利用三个广泛使用的指标(即,BLEU,METEOR,ROUGE-L)来衡量ChatGPT生成的注释的质量,并将其与真实注释进行比较。此外,为了更深入地了解ChatGPT的代码摘要性能,我们与三种SOTA代码摘要模型(包括NCS、CodeBERT和CodeT5)获得的结果进行了比较。实验结果表明,总体而言,ChatGPT在BLEU、METEOR和ROUGE-L三个方面都不如SOTA代码总结模型。我们还展示和分析了一些成功的、中等的和较弱的ChatGPT案例。基于这些发现,我们概述了基于ChatGPT的代码摘要在未来工作中仍需解决的几个挑战和机遇,包括如何在现有基准数据集和指标上改进ChatGPT,如何裁剪ChatGPT生成的丰富但冗长的注释,如何通过将现有数据集与ChatGPT生成的注释相结合来创建更高质量的基准数据集,以及如何设计合适的指标来评估基于ChatGPT的ChatGPT代码摘要模型。

总而言之,我们做出了以下贡献。

据我们所知,我们是第一个调查和分析ChatGPT代码摘要性能的。我们找到了一个适当的提示,引导ChatGPT通过精心设计的启发式问题和反馈来生成分发注释。我们在一个广泛使用的代码摘要数据集上评估ChatGPT,并将其与三种SOTA代码摘要模型进行比较。基于研究结果,我们概述了基于ChatGPT代码摘要的几个挑战和机遇。

图1 论文概述

2 实验方法

在本节中,我们将提出五个精心设计的启发式问题,用于探索ChatGPT在代码摘要中的性能。这五个启发式问题如下:

Q1:ChatGPT可以执行代码摘要任务吗?

Q2:ChatGPT生成的注释是什么样子的?

Q3:如何使用ChatGPT生成简洁的注释?

Q4:ChatGPT建议使用什么类型的提示来生成简短的注释?

Q5:根据ChatGPT建议的提示,哪一个表现更好是在Q4还是在Q3提出的提示?基于对来自ChatGPT的答案(反馈)的观察,我们提供了一个适当的提示来指导ChatGPT生成发行版中的注释。

2.1 Q1:ChatGPT可以执行代码摘要任务吗?

在这个问题中,我们想弄清楚ChatGPT是否可以用于代码摘要。图2(a)和(b)分别显示了我们用于查询ChatGPT的提示符和ChatGPT的答案。从图2(b)中可以观察到,ChatGPT清楚地回答了它可以为给定的编程语言函数生成注释。因此,我们可以得出结论,虽然ChatGPT不是主要用于自动代码摘要,它仍然可以应用于它。

图2 Q1的提示和ChatGPT对Q1的回答

2.2 Q2:ChatGPT生成的注释是什么样子的?

在这个问题中,我们想看一下ChatGPT为特定代码片段生成的注释。我们以图3(a)中的代码片段C1为例,并要求ChatGPT为其生成注释。图4显示了我们用来询问ChatGPT的两个提示以及ChatGPT给出的相应答案。为了避免不必要的冗余,在图4中,我们使用占位符“<code>”来指代代码片段C1。从图4(b)中可以看出,与图3所示的ground-truth注释S1相比,ChatGPT对C1生成的注释非常详细。直观地看,不同的编程语言(如Java和Python)在语法、风格、编码标准上都有明显的差异。因此,顺带一提,我们验证了在提供代码片段的前提下,是否可以不指定编程语言。图4(c)展示了一个例子。与图4(a)中的P1提示相比,P2提示没有指定编程语言,ChatGPT给出的对应答案如图4(d)所示。可以观察到,提示P2虽然没有指定编程语言,但P2的答案在第一行就明确描述了“This is a Python function”。这意味着ChatGPT识别出C1是用Python编写的。此外,虽然总体上有一些差异,但在P2的答案中(即“这是一个以整数列表为输入,并返回列表中出现频率最高的偶数的Python函数。”)的核心函数摘要在语义上与P1的答案中(即“此函数以整数列表为输入,并返回列表中出现频率最高的偶数”)是等价的。它表示ChatGPT可以识别给定代码本身的编程语言,因此我们不在下面的提示符中指定编程语言。基于上述观察,我们可以得出结论,使用ChatGPT进行代码摘要而不指定编程语言是可行的。

图3 代码片段和真实总结或注释的例子

图4 Q2的两个提示和ChatGPT对Q2的相应回答。图中的“<code>”代表一个占位符,我们在实验过程中填充的代码片段为C1,如图6(a)所示

2.3 Q3:如何使用ChatGPT生成简洁的注释?

从Q2的回答中,我们观察到一个现象,即ChatGPT生成的注释太长,比基本事实的注释长得多。通常情况下,我们希望在一句话之内得到注释。通常,人类开发人员也不会写那么长的注释。因此,在这个问题中,我们将探讨如何修改提示以指导ChatGPT生成更简洁的注释。一个天真的想法是,在提示语中添加一些具有“简洁”含义的形容词。具体来说,我们尝试了三个形容词,包括“简短”、“简洁”、“简洁”。表1的第(1)-(3)行显示了ChatGPT的详细提示和相应的答案。可以观察到,这三条注释明显短于图4(b)和(d)中的注释,但仍然比图3所示的groundtruth(包含11个单词)要长。与使用包含“简洁”的提示符(行(3))生成的注释相比,使用包含“简短”的提示符(行(1))生成的注释更接近于真实值。

表1 Q3的提示和ChatGPT的相应答案。#Words:单词数。

2.4 Q4:ChatGPT建议使用什么类型的提示来生成简短的注释?

在前面的Q3中,我们发现了一个看似不错的提示符,它可以指示ChatGPT生成简短的注释。在这个问题中,我们想知道ChatGPT建议使用哪种类型的提示来生成简短的注释。表2列出了我们为Q4设计的四个提示以及ChatGPT的相应答案。从表2的第(1)行和第(2)行可以看出,ChatGPT期望用户提示提供输入代码片段所做的事情的简要描述。然而,这种期望正是人们期望ChatGPT所做的。因此,第(1)、(2)行的答案中建议的提示是不恰当的。从表2的第(3)行和第(4)行可以看出,ChatGPT提供了三个建议提示的示例(用蓝色字体突出显示)。

表2 Q4的提示和ChatGPT的相应答案

2.5 Q5:Q4中ChatGPT建议的提示符和Q3中建议的提示符,哪个性能更好?

基于这些例子,我们设计了三个新的提示。在表3中,第(1)行显示了我们在Q3中找到的提示和ChatGPT的相应答案,而第(2)-(4)行显示了我们根据Q4中ChatGPT建议的提示设计的三个提示。可以观察到,使用row(2)-(4)中的提示生成的注释明显比使用row(1)中的提示生成的注释要长。进一步,我们使用更多的数据来验证包含“short”的提示。具体来说,我们从CSN-Python测试集中随机选择50个样本,然后使用包含“short”的提示符要求ChatGPT生成注释。图5显示了ChatGPT在所有50个样本上使用包含“短”(即ChatGPT(短))和基本真实注释(即基本真实)的提示符生成的注释的长度分布。可以观察到,与ChatGPT(简称)相关的中位数、第一四分位数和第三四分位数大于与基本真实相关的四分位数。来测试是否两种方法之间存在统计学上的显著差异,我们在5%的显著性水平下进行配对Wilcoxon-Mann-Whitneysigned-rank检验,遵循此前报道的涉及随机算法[3]的推断统计分析指南。ChatGPT(简称)与Ground-truth之间的P-value小于显著性阈值0.05,说明ChatGPT(简称)生成的注释不在分布范围内。

表3 ChatGPT对Q5的提示和答案

图5 由ChatGPT生成的注释长度和真实注释。‘****’(P<0,0001)代表两组之间的差异极其显著。

我们通过在包含“短”的提示上添加额外的约束,设计了两个新的提示。具体来说,我们使用了两种类型的约束:句子限制和单词限制。我们首先分析了CSN-Python测试集中的基真注释的数据分布。

图6显示了根据句子数对注释数量的统计。可以观察到,大多数ground-truth注释(约90%)只包含一个句子。图7显示了根据注释包含的字数统计的注释数量。可以观察到,大多数ground-truth注释(约99%)的字数少于40个。表4第(1)行显示了带有句子限制的提示符(即用红色字体突出显示的“inonesentence”)以及ChatGPT生成的相应注释。第(2)-(4)行显示了带有字数限制的提示(即以红色字体突出显示的“在/在/不超过40个单词”)以及ChatGPT生成的相应注释。虽然我们明确要求ChatGPT生成少于40字的注释,但它无法理解。

图6 注释中句子数量的统计

图7注释字数统计

表5 不同提示符下ChatGPT的性能

图8 50个样本的注释长度分布。“*”(0.01<P<0.05)、“**”(0.001<P<0.01)、“***”(0.0001<P<0.001)、“****”(P<0.0001)分别代表两组之间的差异显著、极显著、极显著和极显著。而‘ns’(P≥0.05)表示不显著

3 实验评估

3.1 实验设置

评估数据集。我们在Code-SearchNet(CSN)语料库提供的Python数据集上进行实验。Lu等人表明,CSN语料库中的一些注释包含与代码片段无关的内容,并对CSN语料库进行了数据清洗。因此,在本文中,使用Lu等人提供的CSN语料库的干净版本,其中训练/验证/测试集分别包含251,820/13,914/14,918个样本。

对比方法。为了进行全面评估,本研究将ChatGPT与基DL的代码摘要模型,包括NCS、CodeBERT和CodeT5。

评估指标。我们使用BLEU、ME-TEOR和ROUGE-L三个指标来评估由不同模型生成的注释的质量,这些模型广泛用于代码摘要。BLEU、METEOR和ROUGE-L的评分范围为[0,1],通常以百分比报告。分数越高,生成的摘要越接近参考摘要,代码摘要性能越好。所有的分数都由提供的相同实现来计算。

3.2 结果分析

在本节中,我们报告并比较了ChatGPT(一句话)和三种SOTA模型(包括NCS、CodeBERT和CodeT5)在CSN-Python数据集的整个测试集上生成的注释。ChatGPT(一句话)表示我们统一使用以下提示符引导ChatGPT为CSN-Python测试集中的所有代码片段生成注释:

表6显示了ChatGPT(一个句子)、NCS、CodeBERT和CodeT5的总体性能。从表中可以看出,1)在BLEU和ROUGEL方面,ChatGPT在BLEU和ROUGE-L方面得分最低,分别为10.28分和20.81分,低于SOTA三条基线;在METEOR方面,ChatGPT与CodeT5相当,优于NCS和CodeBERT。

表6 ChatGPT和三种SOTA模型的性能

图9显示了由ChatGPT生成的注释的分数分布,以及CSNPython数据集测试集中所有样本上的最佳基线CodeT5。观察到1)BLEU和ROUGE-L与CodeT5相关的中位数、第一四分位数和第三四分位数大于ChatGPT相关的中位数;2)在METEOR方面,与CodeT5相关的第三个四分位数大于与ChatGPT相关的四分位数。为了检验CodeT5与ChatGPT之间是否存在统计学显著性差异,我们在显著性水平为5%的情况下进行配对Wilcoxon-MannWhitney符号秩检验。所有三个指标的CodeT5和ChatGPT之间的所有P-values都小于0.05的显著阈值,这意味着CodeT5生成的注释明显优于ChatGPT生成的注释。

图9 CodeT5和ChatGPT获得的度量得分分布(一个句子)

3.3 案例研究

在本节中,我们提供案例研究,以了解ChatGPT与CodeT5的生成摘要,以演示ChatGPT的优点和缺点。

4.2.1成功案例。图10(a)是CSN-Python中的代码片段,图10(b)显示了由CodeT5和ChatGPT生成的参考摘要和注释。ChatGPT生成的注释涵盖了“建立连接”和“到德鲁伊经纪人”的主要语义。但是CodeT5生成的注释使用了错误的动词“Get”而不是“Establish”,这可能是由于代码中频繁出现“Getconnection”造成的。这表明ChatGPT可以更好地理解代码的内在含义,而不受代码词汇表的干扰。此外,ChatGPT倾向于在生成的注释中描述更详细的代码行为,例如“返回连接对象”。

图10 ChatGPT的一个成功示例

4.2.2中等案例。图11(b)显示了由CodeT5和ChatGPT为图11(a)中的代码片段(CSN-Python中的代码片段)生成的引用摘要和注释。由CodeT5和ChatGPT生成的注释都涵盖了参考摘要中“打印日志消息”的主要语义。然而,ChatGPT生成的注释中忽略了第二部分“tostandarderror”,并将不相关的信息替换为“用颜色编码”。值得一提的是,CodeT5生成的注释包含“tostderr”,这可能从“sys.stderr”中得到了暗示。在代码中写"这表明,与CodeT5相比,ChatGPT对编程语言的特征或关键字不太敏感。

图11 ChatGPT的一个中等案例

4.2.3弱案例。图12(a)是CSN-Python中的代码片段。图12(b)显示了由CodeT5和ChatGPT生成的引用摘要和注释。CodeT5和ChatGPT都没有意识到代码的功能是“执行SQL”状态。他们将其误解为复制操作,这可能是忽略了“conn.commit()”这句话造成的。它揭示了ChatGPT在理解代码的深层逻辑方面可能仍然有一些困难。

图12 ChatGPT的一个弱案例

3.4 机遇

(1)现有数据集有很大的改进空间。

在本文中,我们直接在CSN-Python测试集上运行ChatGPT,没有任何微调过程。这是一个零样本的应用场景。从表6的结果中可以观察到,Chat-GPT的零短代码摘要性能还有很大的不足CSN-Python数据集的改进空间。由于ChatGPT背后的大型语言模型GPT3.5/4不是开源的,因此对其进行微调是不切实际的。提高其代码摘要性能的一个可行方法是探索更高效的提示符。然而,依赖人工尝试是耗时耗力的。如何利用提示工程自动探索更好的提示是值得进一步研究的。在本文中,我们提供了两个优化方向来探索合适的提示来引导ChatGPT生成分发注释,即句子限制和单词限制。其他优化方向也值得进一步探索。

(2)裁剪和模板化ChatGPT默认生成的丰富但冗长的注释。

在第2节中,我们发现ChatGPT可以生成丰富而冗长的注释。需要注意的是,虽然ChatGPT生成的注释相对较长,但这并不意味着这些长注释是无用的。图13显示了一个示例,其中(a)显示了ChatGPT为函数“validate_value()”生成的提示和注释;(b)显示了函数“validate_value()”的ground-truth注释;(c)显示了将ChatGPT生成的裁剪和模板注释插入到函数“validate_value()”中的示例。从图中可以看出,1)与ground-truth注释相比,ChatGPT生成的注释包含了更多的细节;2)裁剪由ChatGPT生成的注释,并用模板(例如,图13(a)中突出显示的黄色注释)包装裁剪的注释(例如,图13(c)中插入的文档字符串)对开发人员来说非常有用和友好。因此,如何从这样的注释中自动提取简洁有用的信息也是值得进一步研究的。Python增强提案[56]提供了详细的编码约定,可以用来指导注释模板的设计。

图13 ChatGPT生成的裁剪和模板注释的例子

(3)创建新的基准数据集。

目前,代码摘要中广泛使用的数据集(如CSN语料库[29])的质量尚未得到验证。这些数据集通常是从开源平台(如GitHub[16])爬取,然后进行简单的数据清洗。我们发现一些ground-truth注释的质量很低。图14展示了一个低质量的groundtruth注释的例子。从图14(c)可以观察到,C5的ground-truth注释太短,没有总结C5的功能。与ground-truth注释相比,ChatGPT为C5生成的注释信息量更大,并且总结了C5的核心语义。因此,我们认为如何利用ChatGPT构建高质量的基准数据集进行代码总结是值得进一步探索的。

图14 一个低质量的事实基础注释的例子

(4)设计新的指标来评估代码摘要模型。

图15(a)显示了一个代码片段C6,图15(b)显示了基本事实注释以及由CodeT5和ChatGPT生成的注释。从图中可以看出,虽然CodeT5生成的注释在BLEU、METEOR和ROUGE-L中优于ChatGPT生成的注释,但是在CodeT5生成的注释中缺少了语义“一个有效的文件名”。然而,ChatGPT生成的注释涵盖了“转换字符串”和“到有效文件名”的语义,尽管没有使用确切的单词。这是一个强有力的证据,表明传统的评估指标不再适合评估由ChatGPT生成的注释的质量。

图15 传统度量标准不适合评估由Chat-GPT生成的注释质量的例子

转述:王朝澜

0 阅读:0

互联不一般哥

简介:感谢大家的关注