欢迎阅读这个系列中最特殊、也最有趣的一篇文章 —— 《大型语言模型在软件工程中的应用:系统性文献综述》。不仅是对一项创新技术的深入解析,更是对软件工程领域的一次深入的探索。
由侯心怡@易忻禾主导的这项研究,汇报时展示了她对该主题论文的全面掌握,思维上闪闪发光。
本文汇总了大型语言模型(LLM)在软件工程(SE)领域的广泛应用,涵盖了从程序开发到软件维护,再到项目管理的每一个关键环节,揭示了LLM在这些领域中的革命性影响和未来发展潜力。
随着LLM在软件工程中的深入应用,我们将探讨这些模型如何彻底改变软件开发的面貌,提高开发效率,以及未来可能带来的更多机遇和挑战。我们将深入分析LLM在需求工程、软件设计、质量保证等多个阶段的关键作用,以及在软件管理中的创新应用。
通过阅读这篇博文,您将获得对LLM在软件工程实践中的应用、挑战和优化方向的全面理解。
请跟我一起探索这个充满创新和机遇的领域,见证LLM如何重新定义软件工程的未来吧。完整论文请访问:Large Language Models for Software Engineering: A Systematic Literature Review。
大型语言模型(LLMs)因其在参数规模上的显著提升。这项研究是首次全面回顾和分析2017至2023年间229篇与LLM4SE相关的论文,以展现LLMs在软件工程中的应用与趋势,展现应用效果、影响范围及潜在局限性的全面理解,重点关注如何利用LLM优化过程和成果。
回答四个关键的研究问题(RQ):
为理解LLM在软件工程中的应用提供了全面视角,突显了它们在优化软件开发过程和提高成果质量方面的潜力,同时为未来在这一快速发展的领域中的研究指明了方向。
在讨论超参数和优化器时,在大型语言模型(LLMs)的应用中,这些并非唯一的重点。虽然提供样本数据对模型的学习至关重要,但我们也发现,模型创新比优化更受重视。例如,在软件工程任务中,更多的关注点放在如何有效地利用现有的LLMs,而不是单纯地追求技术上的优化。因此,在综述中,我们更加关注LLMs的选择和应用策略,以及如何针对特定任务进行微调和改进。
数据量级论文中很少提到,可能是arxiv质量比较参差不齐
模型很少有创新,更多的是应用
尽管文献中对数据量级的描述不多,我们注意到了研究中数据集的多样性和适用性。早期研究侧重于使用现有的大型模型,并根据特定的软件工程任务进行评估。这凸显了对于高质量、具有代表性数据集的需求,以及如何将这些数据集有效地用于LLMs训练的问题。
23年初时纯应用的论文,也能发表在顶会上
在软件开发中应用LLMs时,我们发现实际应用场景可能不总是需要大量数据。例如,在编写自定义程序时,可能需要更灵活的测试方法和评估指标。
我们还讨论了近期趋势,即如何使用LLMs处理更复杂的软件工程任务,并探索了在特定任务中优化和评估LLMs性能的新方法。
对大模型生成的代码的主要是它的功能性,到正确性倒是不怎么追求。因为能编译不一定代表着能用
在编写综述论文时,考虑了如何在细节和方向上做出新的发现和贡献。
重要的是,平衡统计分析和深入探讨LLMs在软件工程中的具体应用。
虽然统计数据对于概述研究趋势很重要,但个别研究的深入分析
(例如,LLM具体应用的性能)同样不可或缺,以揭示LLMs在实际软件工程任务中的潜在价值和应用前景。
近年来,大型语言模型(llm)已经彻底改变了多个领域,包括软件工程(SE)。这些模型在语言理解和生成方面具有先进的能力,已成为解决复杂SE任务的关键工具。
作者进行了一项系统的文献综述,分析了LLM在软件工程中的影响、应用和未来。
传统的语言模型为文本生成和理解奠定了基础,LLM的发展以其庞大的训练数据和模仿人类语言能力的能力为特征,模糊了人类和机器生成语言之间的界限。
这些模型显著地改变了软件工程,重新定义了SE挑战是如何处理的,特别是在代码总结、生成和各种开发任务方面。
这是首次全面审查,涵盖了2017年至2023年间发表的229篇论文。它详细分析了LLM是如何被用来解决SE挑战的,包括:
遵循Kitchenham等人提出的指导方针,审查系统地:计划、执行和分析研究论文,确保对软件工程LLM的当前状态进行健全和全面的评估。
由于不打算写综述,所以这里不展开介绍,感兴趣的朋友可以直接看论文
研究纳入与排除标准、研究质量评估
可视化如上图所示
术语“生成” 和“任务” 强调LLM用于自动代码生成和其他SE任务。
图4:在收集的论文中讨论的llm(以及基于llm)的分布,括号中的数字表示每个LLM已被使用的论文数量
仅编码器的llm是一种仅利用模型的编码器组件的神经网络架构[52]。
编码器的功能 是将输入的句子处理并编码为一个隐藏的表示, 捕捉单词之间的关系和句子的整体上下文
。
值得注意的仅编码llm实例包括BERT[52]及其变体[74,95,159,193]。 作为一个例子,BERT的结构, 基于变压器的编码器架构, 在本研究的41篇论文中被引用。 其独特的双向注意力机制在训练过程中同时考虑了每个单词的左右上下文。
在SE领域,其他著名的模型, 如CodeBERT[74]、 GraphCodeBERT[95]、 RoBERTa[193]和ALBERT[159]已经被广泛使用。
专门的模型, 如BERTOverflow[301]和CodeRetriever[174]已经专门为SE应用程序开发。
这些模型的创新与BERT的不同之处在于利用了程序结构, 引入了新的预训练任务
, 或者采用了新的模式, 从而改进了体系结构对代码相关任务的应用
。
通过预测后续的令牌来理解代码, 增强了对编程语言的理解
, 以完成代码完成和错误检测等任务[74]。引入了边缘类型预测,将代码元素之间的关系识别为一个图
。 这使得GraphCoderBERT能够利用代码结构, 提高其在代码摘要和程序分析等任务中的有效性[95]。这些模型在需要对整个句子或代码片段进行细微理解的任务中显示出了有效性。 示例包括代码审查、 错误报告理解和与代码实体[16,172,220,258,285,359]有关的命名实体识别。
编解码器LLM结构包括编码器和解码器两个模块[319]。
PLBART、T5和CodeT5等模型都采用了这种架构,CodeT5+[337]进一步优化, 而alphcode[177]和CoTexT
[255]展示了该架构对各种SE任务的适应性和灵活性。
这种编解码器设计不仅适用于摘要、翻译和问答
等多方面任务,而且已在代码总结
等SE领域任务中取得成功应用。
特别是,编码器在理解和表达代码的结构和语义方面发挥着关键作用,进而使解码器能够生成简洁且易于理解的代码摘要。
如上图所示
一个重要的趋势是越来越多的人喜欢只有解码器的llm,这表明了向强调顺序预测和最小微调要求的模型的转变。
这种快速转换,可以与仅解码器的LLM的生成能力联系起来。 研究人员[160,277,296]发现, 这些需要最少微调的模型, 例如GPT系列,不仅可以产生语法正确的代码片段, 而且可以产生功能相关的代码片段。 他们掌握代码上下文的熟练程度很快使他们成为首选。
2022年经历了多样性的显著增加, 更多不同的LLM架构找到了表示。 在总共112篇论文中,
这种多样化的分布表明, 研究人员正在积极评估和利用不同的架构以适应不同的需求和挑战的探索阶段。
不同架构之间近乎平等的兴趣强调了该领域的丰富性, 表明没有一种方法已经成为最终选择。
2023年标志着向纯解码器LLM的强烈转变。
令人印象深刻的是, 在138篇独特的论文中记录了258个仅使用解码器的LLM实例, 这反映了一篇论文可能使用多个这样的模型。
这一趋势标志着重点和资源的转移,即探索和利用纯解码器架构作为当前和未来许多LLM4SE研究和应用的主要方法。
为SE任务选择LLM应该仔细考虑, 而不是随意选择。 指导这种选择的关键因素包括模型在理解代码上下文方面的熟练程度, 它生成相关内容的能力,对微调的响应能力, 以及在se特定基准上的演示性能
[168,178,356]。
考虑到严格的语法规则和SE任务固有的功能需求, 能够无缝集成这些复杂方面的模型通常受到青睐。
一个值得注意的趋势是为精确的SE任务定制llm[124,172,384]。
通过对具有针对缺陷检测或代码审查等特定功能定制的数据集的模型进行微调, 研究人员能够实现显著的性能提升[45,152]。
总之, SE llm的演变, 从仅编码器到仅解码器架构的过渡, 突出了该领域的活力和适应性。 这种转变从根本上改变了SE任务的方法, 反映了学科内部正在进行的创新。
下图为llm相关数据集的收集策略
这部分不感兴趣,简单看看
文章中是表,这里为了方便展示用的是图
在大型语言模型(LLMs)的软件工程(SE)应用中,数据类型扮演着决定性角色。它们直接影响模型提取隐式特征和做出决策的方式。正确选择数据类型对于提高LLMs的整体性能和泛化能力至关重要。我们通过对229项研究进行综合分析,来阐释数据类型对LLM4SE应用成功的重要性。
我们将研究中使用的数据集分为五大类:基于代码、基于文本、基于图形、基于软件仓库和组合数据类型。
基于文本的数据集,数量最多,共有104项研究使用,凸显了这些LLMs在自然语言处理方面的出色能力。这些模型擅长理解和处理文本数据,使它们成为处理代码理解、错误修复、代码生成等面向文本的SE挑战的理想选择。
基于代码的数据集,尤其是源代码,是SE任务中训练LLMs的重要资源,因为它们包含定义程序行为的关键逻辑和指令。此外,基于图形的数据集在一些研究中用于构建图形用户界面(GUI)存储库等任务。
基于软件仓库的数据集 通常包含从版本控制和问题跟踪系统中收集的数据,提供软件开发过程的深入见解。这些数据有助于研究软件开发的行为和趋势,提高开发效率和软件质量。
组合数据类型的数据集,如“源代码和注释”等,被用于多种复杂任务。这些组合数据集使模型能够更全面地理解软件开发的各个方面,并在多样化的任务中表现出色。
通过深入分析这些数据类型及其在不同研究中的使用,我们可以更好地理解LLMs在软件工程领域中的潜力和应用前景。
对于基于代码的数据集,预处理是一个多阶段的过程,涵盖从数据提取到最终数据分割的各个方面。这个过程包括以下主要步骤:
与基于代码的数据集相比,基于文本的数据集的预处理步骤略有不同:
不同类型的数据集在预处理时需要采取不同的技术和方法。这些步骤确保了数据的一致性、质量和适用性,从而提高了LLMs在软件工程任务中的性能和有效性。
通过理解和应用这些预处理步骤,研究人员可以为LLMs的训练和应用创建更优化和结构化的数据集。
一旦选定了合适的数据集并通过预处理步骤获得了干净的数据,下一个重要步骤是将这些数据转换为适合作为LLM输入的格式。
这一过程至关重要,因为它直接影响模型训练的有效性和最终性能。不同的输入格式能够捕捉到数据的不同方面,从而影响模型的学习和理解能力。
在研究中,我们观察到四种常见的数据输入类型:基于令牌、基于树/图、基于像素的输入以及混合输入。
基于令牌的输入:这种输入形式涉及将代码和文本表示为令牌序列,包括单词或子单词等小单位。令牌化的代码和文本使LLM能够在细粒度级别上理解编程语言的语法和语义,以及处理和分析自然语言描述。
基于树/图的输入:这种输入形式将代码表示为树或图结构,捕捉代码元素之间的语法关系和依赖关系。树结构输入特别适用于表现代码的层次结构,而图结构输入则能够捕获代码中的非线性依赖关系,适用于如代码摘要和漏洞检测等任务。
基于像素的输入:这种输入方式将代码视觉化为图像,每个像素代表代码元素或标记。这种可视化的表示允许LLM通过图像学习来处理和理解代码,适用于如代码翻译或生成代码可视化等任务。
混合输入:结合多种输入模式的混合输入为LLM提供了不同的视角以更好地理解代码。例如,混合输入可以结合令牌化代码和代码的视觉表示,增强模型理解复杂代码模式的能力,并在代码理解和生成等任务中提高性能。
我们的研究表明,基于令牌的输入是最常见的形式,占据了主导地位,体现了其在各种SE任务中的多功能性和有效性。此外,基于树/图的输入虽然不如基于令牌的输入普遍,但在特定任务中展示了其独特的价值。基于像素和混合输入虽然使用较少,但提供了有趣的可能性,特别是在特定应用中。
不同的输入格式各有优势和适用场景,从基于令牌的输入的广泛应用到基于树/图、像素和混合输入的创新探索。
在LLM4SE(大型语言模型在软件工程领域的应用)的研究中,优化和评估
技术对于提升模型的性能和准确性至关重要。
通过采用有效的优化器、探索提示工程技术,并使用合适的评估指标
,我们能够更好地理解和提升LLMs在软件工程任务中的表现。
讨论了以下几种主要的优化技术
:
这些技术不仅有助于提高模型的效率,还能确保它们在实际应用中的有效性和可靠性。
在评估LLM4SE的性能时,我们采用了不同的评估指标
,这些指标根据任务的性质而异:
回归、分类和推荐任务:对于这些任务,我们总结了多种评估指标,用于量化模型在这些问题类型上的表现。例如,在分类任务中,通常使用准确率、召回率和F1得分等指标来评估模型的分类性能。
生成任务的评估:生成任务是LLM4SE中的一个关键领域,涉及15个不同的评价指标。这些指标帮助评估模型在生成代码、文本或其他输出时的性能,包括创造性、相关性和准确性等方面。
感觉GPT这种都不适用了,所以跳过,感兴趣的同学可以去看原文
在软件工程(SE)任务中,提示工程技术被用来优化大型语言模型(LLMs)的性能。这些技术特别针对预训练模型和下游任务之间的输入格式差异以及数据稀缺的挑战。
评估指标:我们采用了不同的评估指标来量化模型在SE任务中的表现,如回归、分类和推荐任务的准确率、召回率和F1得分,以及生成任务的多样化评价指标。
预训练和微调的挑战:预训练模型在广泛的未标记语料库上训练后,需在下游任务上进行微调。微调的有效性很大程度上取决于下游数据的数量,特别是在数据稀缺的情况下。
提示工程作为一种新兴的微调范式,已在自然语言处理(NLP)领域显示出显著的效果。在SE任务中,提示工程技术的应用包括以下几个方面:
硬提示和软提示:硬提示包括手动预定义的自然语言指令,而软提示则采用替代标记来代替硬提示中的自然语言。前缀软提示在原始输入之前添加替代标记,这种方法在数据稀缺的任务中尤为有效。
提示的设计和应用:提示工程的关键在于设计专门的提示,这已成为与ChatGPT和WizardCoder等LLMs交互的基本技术。定制提示的目的双重:一方面指导LLMs生成特定的输出,另一方面作为访问模型中嵌入知识的接口。
LLM4SE任务中的应用:在LLM4SE的背景下,提示工程在各种任务中发挥着关键作用,包括代码生成、代码总结、程序修复和测试生成等。这些任务通常需要访问预训练模型中的特定知识,提示工程提供了一种有效的方法来实现这一点。
最近的研究强调了提示工程在提高LLM4SE针对目标SE任务性能方面的重要作用。
通过采用这些技术,研究人员能够更有效地利用预训练模型的知识,从而促进自动化软件开发方法的发展。
在大型语言模型(LLM)应用于软件工程(SE)任务的过程中,评估其性能是开发和部署的关键环节。由于SE任务的多样性,我们需要多种评估指标来全面捕捉模型的表现。
根据问题类型将SE任务分为四类:回归、分类、推荐和生成
任务。每种任务类型的评估指标选择因其目标问题而异:
分类任务的评估指标:最常用的指标包括F1分数、精确度(Precision)和召回率(Recall),它们分别用于评估模型在正确分类代码片段
或识别特定SE属性
方面的能力。
例如,自动bug修复模型和基于Transformer的代码摘要模型的性能就是通过这些指标评估的。
推荐任务的评估指标:推荐任务常用的度量指标包括平均倒数排名(MRR)、Precision@k和F1-score@k,用于评估推荐系统在代码完成等方面的有效性。
生成任务的评估指标:在生成任务中,BLEU及其变体、Pass@k、ROUGE、METEOR、精确匹配(EM)和编辑相似度(ES)等指标被广泛使用。这些指标评估模型在生成代码或自然语言描述方面的质量和准确性。
这些指标在实际研究中的应用证明了它们在量化和评估模型性能方面的有效性。
在LLM4SE任务的评估中,选择合适的评估指标至关重要。这些指标不仅帮助研究人员量化模型的性能,还提供了对模型在特定任务中表现的深入理解。通过这些指标,我们能够评估和优化LLM在各种SE任务中的应用,从而推动自动化软件开发方法的发展。
主要讨论了大模型在不同场景下的应用和优势。
首先提到了深度学习在城市任务中的应用最为广泛,如计算机视觉、自然语言处理等;
接着分析了不同类型的任务中哪些任务在大模型中的表现较好,包括程序逻辑、类依赖关系等方面;
此外,还探讨了大模型与其他机器学习技术的结合,以提高其性能。
同时,对于软件维护过程中如何利用大模型的问题进行了分析,认为将大模型应用于代码编写、知识获取等领域有助于提升工作效率。
在软件工程(SE)任务中使用大型语言模型(LLMs)的研究被分为软件开发生命周期(SDLC)的六个阶段:需求工程、软件设计、软件开发、软件质量保证、软件维护和软件管理
大多数研究(64.34%)集中在生成任务上,显示了LLMs在生成代码或文本方面的重要性。大约24.48%的研究属于分类任务,9.79%与推荐任务相关,1.4%分配给回归任务。
在我们收集的LLM4SE研究中,我们还根据所解决的问题类型对研究进行了分类:
生成任务的主导地位:大多数研究(约64.34%)集中在生成任务上,表明LLM在生成代码或文本方面的重要性。
分类任务的相关性:约24.48%的研究涉及分类任务,显示了LLM在软件元素分类方面的能力。
推荐任务的效用:大约9.79%的研究与推荐任务相关,突显了LLM在建议解决方案方面的价值。
回归任务的探索有限:回归任务的研究相对较少,约占1.4%,反映了LLM在预测建模方面的探索受限。
LLM4SE的应用在软件工程的各个阶段和问题类型中显示出广泛的适用性。特别是在代码生成和分类任务中,LLM的影响尤为显著。
这些发现强调了LLM在SE领域中的关键作用,同时也揭示了在其他领域进一步研究的潜在机会。
需求工程是软件开发过程中的关键阶段,涉及多种任务,如指代歧义处理、需求分类、共指检测、需求诱导和软件可追溯性等。LLM在这些领域的应用提高了软件需求管理的效率和准确性。
指代歧义处理:软件需求中的歧义可能导致开发阶段的问题。LLM,如BERT和SpanBERT,已被证明在解决回指歧义方面有效。例如,ChatGPT在处理软件需求中的指代歧义时表现出准确识别先行词
的能力,这有助于提高需求的清晰度和精确性,从而促进更有效的软件开发过程。
需求分类:将需求分为功能性和非功能性需求对早期项目识别至关重要。LLM,如BERT,在使用微调迁移学习技术进行需求分类方面表现优异,超越了传统方法。
需求术语识别:使用BERT和K-means聚类,可以识别和分组在不同语境中使用的术语
。这种方法在多领域语料库上已被验证,提高了术语识别的准确性和效率。
共指检测:LLM在共指检测中的应用有助于解决由不同利益相关者撰写的需求中的表达式差异和不一致问题,提高了需求文档的可理解性。
可追溯性自动化:LLM,如T-BERT,已被用于自然语言工件到编程语言工件(NLA-PLA)的可追溯性,提高了可追溯性的准确性和适应性,即使在训练实例有限的情况下也能保持高效。
LLM在需求工程中的应用展示了其在处理软件需求的多样化挑战中的有效性和多功能性。
从提高需求文档的清晰度和精确性到自动化需求管理和分类,LLM在提高软件开发过程的效率和质量方面发挥了重要作用。
大型语言模型(LLM)在软件工程(SE)中的应用之一是图形用户界面(GUI)的检索。
Kolthoff等人的研究展示了BERT在GUI检索任务中的应用潜力。由于GUI文档文本不是标准的结构化文本,所以为基于文本的排名任务带来了挑战。
研究者微调了基于BERT的学习排序(LTR)模型
,并将自然语言查询与GUI文档文本相结合,以训练不同的BERT-LTR模型。
模型在基于神经网络的GUI排名中的表现证明了其有效性。
快速原型设计对加速软件设计过程至关重要,它使开发人员能够快速可视化和迭代设计。
White等人研究了LLM在促进快速原型设计过程中的作用。
研究引入了提示设计
,提供了解决LLM4SE中常见挑战的结构化方法。
这项研究表明,通过与先进机器学习技术的深度集成,快速原型设计领域将受益,为产生更直观和以用户为中心的软件设计创造新的研究和改进机会。
随着系统规模的增加,软件配置和规格说明的管理变得复杂。
Mandal等人介绍了SpecSyn,一种使用LLM从自然语言源自动合成软件规格说明的框架。
这种端到端方法将任务视为序列到序列的学习问题,在F1分数上超过了先前最先进的工具,并能够从单个或多个句子中提取规格。
LLM在软件设计领域的应用体现了其在处理复杂任务中的多功能性和高效性。
从GUI检索到快速原型设计,再到软件规格合成,LLM提供了加速软件设计过程和提高设计质量的新途径。
这些应用突显了LLM在软件设计领域的潜力,为未来的研究和应用开辟了新的可能性。
LLM在软件开发中的应用主要集中在以下几个方面:
不仅能够理解自然语言描述,还能将其转换为编程代码
,大幅提升编码效率和准确性。在应用于软件开发任务的大型语言模型(LLMs)领域内,围绕代码生成的研究明显占据了学术前沿。如表12所反映,GPT系列,尤其是GPT-4,成为关键焦点,许多研究选择它们进行代码生成领域的应用[60, 62, 168, 186]。分析这些研究,一些值得注意的发现浮现出来:
代码自动完成Code completion:在集成开发环境(IDE)和代码编辑器中,LLM如Codex、BERT系列、GitHub Copilot等在IDE和代码编辑器中,已能提供基于代码上下文和语法结构的智能代码建议
。
这些模型通过大量自然语言文本的预训练,获得了强大的语义理解能力,从而能预测下一步可能的代码片段,并根据上下文提供合适的建议。
不仅节省了编码时间,还减少了编码错误,提升了整体开发效率。
代码总结Code summarization:LLM用于生成代码的自然语言摘要,提高了代码的可读性和维护性。模型如Codex、CodeBERT、T5等能够理解代码的功能和逻辑,生成易于理解的人类语言描述。
代码理解Code understanding:LLM用于解释与代码相关的文本,如注释和文档,帮助开发人员理解代码的功能和依赖关系。
代码搜索Code search:LLM如CodeBERT和GraphCodeBERT在代码搜索和检索中展示了有效性。它们能够理解自然语言和代码语义,并增强代码搜索的能力。
程序合成Program synthesis:LLM在自动生成满足特定规范的代码方面表现出色,特别是在需要从高级输入自动编写代码的情况下。
API推荐recommendation、合成API API synthesis:LLM用于自动生成API调用,解决了API使用中的幻觉和不准确输入参数的问题。如CLEAR和ToolCoder等模型,能够基于自然语言和编程语言的深层语义联系来辅助API选择。
在API合成领域,LLM如GPT-4已显示出生成准确API调用的潜力,解决了输入参数不准确等问题
代码注释生成Code comment generation:LLM如Codex和T5在自动生成代码注释方面表现出色,能够自动创建与代码功能和逻辑相对应的注释,提高代码的可读性和可维护性。
代码表示Code representation:LLM在代码嵌入和表示学习方面发挥作用,帮助捕捉编程语言的复杂模式和依赖关系。助力多种下游任务,如代码补全和代码搜索
方法名称生成Method name generation:方法名称生成方面的应用,如AUMENA,表明了LLM在提升程序可理解性方面的能力。
敏捷故事点估算Agile story point estimation、API文档气味检测API documentation smell detection:LLM在敏捷故事点估算中也显现出其价值,如GPT2SP,可以跨项目转移并提高估算的准确性。同时,LLM在API文档气味检测方面也展现了其潜力,能够自动监控和警告API文档质量问题。
API实体和关系提取API entity and relation extraction、代码优化Code optimization:在从非结构化文本中提取API及其关系的任务中,LLM如BERT和T5也展现出了强大的能力。而在代码优化方面,LLM如Codex和CodeGen则显示了在提高性能方面的潜能。
代码示例推荐Code example recommendation:提供高质量的代码示例。
控制流图生成Control flow graph generation:生成静态类型代码行为的准确CFGs。
控制流程图 (CFGs) 是软件工程 (SE) 的基础,它通过显示语句序列及其执行顺序条件来阐明程序行为
。作为程序行为的图形表示,CFGs 在许多 SE 任务中至关重要,包括代码搜索、代码克隆检测和代码分类。
Huang 等人提出了一种利用LLM的容错和理解能力生成静态类型部分代码行为正确的 CFGs 的新方法。该方法涉及一个思想链 (Chain of Thoughts, CoT),分为四个步骤:①结构层次提取、②嵌套代码块提取、③嵌套代码块的 CFG 生成以及④所有嵌套代码块的 CFG 融合
。根据单一责任原则,将 CoT 分解为 AI 链,并附有有效的提示指令。
与传统的基于程序分析的方法和原始的 CoT 方法相比,这导致了更优越的节点和边缘覆盖
。
词法含义
和开发人员编写的源代码的整体功能
可能对其他开发人员理解具有挑战性。对标识符进行规范化
,目的是将标识符中的词汇与其他软件工件中的自然语言词汇进行对齐
。将 BERT 与问答 (Q&A) 系统和条件随机场 (CRF) 相结合
,将标识符分割作为序列标记,将缩写展开作为问答任务。它使用编程上下文来细化扩展结果,当多个扩展是可能的,对齐标识符词汇与自然语言和增强软件开发的理解和自动化。自动确定数据类型
的过程,在增强可读性、可维护性和减少运行时错误方面起着至关重要的作用。将类和接口声明与其各自的使用上下文唯一地关联起来
,熟练地推断用户定义的类和接口的类型。除了仅仅填补以前方法的空白之外,DIVERSETYPER 还在类型推断方面设立了一个新的基准,特别是对于用户定义的类型。LLM在软件开发的多个方面发挥着至关重要的作用,不仅提高了开发效率,也推进SE领域和简化开发生命周期。
随着技术的不断进步,预计LLM将在未来SE实践中扮演更为关键的角色。
当前研究的趋势表明,将LLM与现有的SE工具和实践相结合,为软件开发带来新的可能性。例如,使用LLM进行方法名称生成、敏捷故事点估算、API文档质量监控和代码表示等任务,都是在不断探索和扩展LLM在SE领域的应用。
LLM在软件开发中的应用正处于快速发展阶段。随着模型的不断进步和创新,未来将在软件工程领域开辟更多新的研究路径和应用场景。
在软件质量保证领域,LLM已经成为一种有价值的工具,应用于包括漏洞检测、测试生成和错误定位等多种任务。
测试生成涉及自动创建测试用例的过程,以评估软件应用的正确性和功能。它包括测试用例生成、单元测试生成等多个方面。LLM在测试生成中提供了多个优势:
LLM还可以帮助生成基于自然语言描述的测试用例,促进开发者与测试人员之间更好的协作,并且帮助识别缺乏测试覆盖的领域,并建议相关测试用例,确保全面测试并降低未发现问题的风险。
近年来,软件漏洞数量迅速增加,因此,漏洞检测对于确保软件系统的安全至关重要。LLM,如BERT,被用于微调漏洞检测模型。例如,Tang等人提出的CSGVD模型结合了序列和图嵌入来进行函数级漏洞检测,优于其他基于深度学习的模型。
自动化测试方法包括变异测试和模糊测试等技术。LLM在变异测试中的应用涉及将错误引入代码库以评估测试套件的有效性。在模糊测试中,LLM帮助生成有效和多样化的输入程序,帮助识别漏洞和bug,尤其在具有挑战性的领域如深度学习库等。
验证技术,如形式化验证,在软件质量保证领域中发挥着关键作用。LLM,特别是GPT-3.5,在形式验证领域被应用。通过将LLM与有界模型检查相结合,可以基于形式化方法自动修复软件,展示了模型理解复杂软件结构并生成准确修复的能力。
错误定位涉及识别源代码中负责特定缺陷或软件错误的具体文件、函数或代码行。Ciborowska等人研究了数据增强技术以增强bug定位模型。通过使用增强的数据训练基于BERT的模型进行缺陷定位,证明了这些技术可以扩展训练数据并提高模型性能。
识别引发错误的测试用例是一个挑战,尤其是当程序版本在语法上相似时。Li等人研究了LLM在这一任务中的应用。为了提高性能,他们设计了一种结合LLM与差异测试的新方法。
Flakify是一种使用CodeBERT预测易变测试用例的黑盒方法。这种预测可以帮助开发者集中调试工作在最可能不稳定的测试用例子集上。
通过这些应用,LLM正在软件质量保证领域扮演着越来越重要的角色,提高了软件测试的效率和有效性。
在软件维护的上下文中,LLM被用于错误预测、程序修复、代码审查、调试和一系列其他活动。
自动程序修复 (APR) 的目标:是自动识别并修复软件中的bug或缺陷。它涉及利用自动化技术来分析有bug的代码,并生成正确的补丁来解决已识别的问题。
LLM的应用:
优化:在特定的代码修复数据集上进行微调,提高生成高质量补丁的能力。
ChatGPT:由于其固有的交互设计而处于领先地位,从而实现连续的反馈循环,从而产生精细且适合上下文的补丁。这种对话动态性,再加上不同基线之间的严格比较,突出了其优越的适应性和效率。
总结程序修复LLM研究的几个关键发现:
互动反馈:与ChatGPT相结合的交互式反馈回路显著提高了程序修复的准确性。这种补丁生成和验证之间的动态相互作用促进了对软件语义的更深入理解,从而导致更有效的修复。
特定领域的集成:将LLM的能力与特定领域的知识和技术相结合,进一步提高了它们的性能。定制的提示、特定项目的微调和利用SE技术可显著提高LLM驱动的程序修复的效率。
比较分析:对不同基线的严格评估揭示了LLM的通用性和适应性,特别是ChatGPT。这种广泛的比较不仅确立了它们的优越性,而且强调了潜在的改进领域。
人提出AdbGPT,利用LLM的自然语言理解和逻辑推理能力,从bug报告中提取S2R实体,并指导bug重放过程。
尽管对LLM在软件管理中应用的研究论文相对有限,Alhamed等人的工作表明,LLM在工作量估算等关键领域中具有显著的潜力。这些研究成果揭示了LLM可以在软件管理的多个方面提供支持,尤其是在决策和预测方面,但同时也提示了在这些应用中需要进一步的探索和改进。
讨论了大模型在SLR过程中的问题及其解决方法。
首先,通过三种搜索方式(手动、自动加滚动雪球)结合,提高了检索效率并减少遗漏。
其次,引入了QACC对论文质量进行评分,并通过邀请两位专家进行复核降低主观因素误差。
主要探讨了大模型在不同场景下的应用和优势。
- 提到了深度学习的应用最为广泛,如计算机视觉、自然语言处理等;
- 分析了不同类型的任务中哪些任务在大模型中的表现较好,包括程序逻辑、类依赖关系等方面;
- 探讨了大模型与其他机器学习技术的结合,以提高其性能。
- 对于软件维护过程中如何利用大模型的问题进行了分析,认为将大模型应用于代码编写、知识获取等领域有助于提升工作效率。
Chatgpt、针对特定领域的优化、集成多个LLM or 机器学习模型等。
高额视角,方便理解LLM4SE任务的相关关系和新兴探索
测试用例生成、错误分类和缺陷预测
方面,LLMs有助于提高测试过程的准确性和效率。
一个关键的未来发展方向是,将专业的代码表示方法+编程领域知识集成到LLMs中
。这种集成旨在提升LLMs生成代码的准确性、安全性和符合编程标准的能力。
通过使用LLMs来分析代码上下文和执行智能比较,可以大幅提升代码审查过程。
微调的LLMs可以提供更精确的错误检测和定制化反馈,为代码质量的提升和潜在改进提供更深入的理解。
LLMs在挖掘GitHub、StackOverflow和应用商店等平台,在需求提取、可追溯性、验证以及各种类型的挖掘任务中的应用,为开发策略和决策提供了宝贵的信息。
LLMs的自动化和增强挖掘任务有助于深入了解用户需求、新兴趋势和开发实践的效率。
在“Extracting insights from data mining”(从数据挖掘中提取洞见)这个表述中,“insights”指的是从大量数据中获得的有价值的信息、知识或理解。在数据挖掘的过程中,算法和模型被用来分析和解释数据,目的是发现有意义的模式、趋势、关联或异常。这些发现称为“洞见”,它们可以帮助组织或个人做出更明智的决策,改进业务策略,或理解复杂的现象。
例如,在软件工程领域,数据挖掘可能揭示用户行为的模式、软件缺陷的趋势、开发过程中的效率问题,或是代码库中的潜在安全风险。这些洞见对于优化软件开发过程、提升产品质量,或预测未来的开发需求非常有价值。
利用LLMs进行工作成本预测、软件分类、代码分类、事件检测和软件质量评估,可以提供更强的数据驱动洞察力和预测分析。这使得组织能够在整个开发生命周期中做出更明智的决策。
LLMs在软件安全领域中的应用提供了新的机遇和挑战。
未来研究的一个有趣方向是:开发新策略来加强LLMs本身的安全性
,包括使LLMs能够自动识别和纠正自身的漏洞,为其底层代码生成自我应用的补丁。
随着LLMs的能力和复杂性的增加,出现了为这些模型的开发、优化和维护量身定制的专门软件工程实践的需求。
这些实践包括:设计可扩展和可维护的架构,开发高效的训练算法,以及实施道德准则和合规机制
。
不仅促进了更复杂和适应性更强的模型的发展,也为跨学科研究和创新开辟了新途径。
在讨论大模型应用于软件开发时,提到了在大公司的项目中,通常需要大量的数据来进行训练。
然而,近期越来越多的任务并不依赖于这样的数据集,而是通过自定义额外指标
来全面评估大模型的性能。
此外,还谈到了大模型生成代码的功能性和正确性问题,以及在不同类型的任务中的适用性。
最后,研究人员如何在特定任务中将大模型用于自己的工作。
在大模型中如何处理超参数和优化器。提到了两种方法:
同时,还介绍了一篇与提升系列模型相关的研究论文,该论文认为现有的模型已经足够强大,可以通过简单的微调实现更好的效果。
此外,还提到了基于提示学习的通用训练模型,可以根据不同任务进行微调。
在本研究的结尾,深入分析了大型语言模型(LLMs)在软件工程(SE)中的广泛应用。通过对软件开发生命周期的六个阶段进行彻底的探讨,总结出了LLMs可以应用于55个不同的SE任务。这些发现不仅揭示了LLMs在当前软件工程领域的多样化应用,而且为未来的研究提供了新的视角和思考。
研究强调了LLMs在解决软件工程任务中的实际效果和潜在贡献。通过对四个关键研究问题(RQs)的回答,不仅提出了现有研究中的不足和挑战,还指出了未来研究可能的方向。特别是,鼓励未来的研究更加关注纯解码器LLM架构的应用,并探讨工业数据集在缩小学术研究和现实世界应用之间差距的潜力。
对这一快速发展的领域进行更多的研究。随着LLMs技术的不断进步和软件工程领域需求的日益增长,认为探索LLMs在实际应用中的更多可能性至关重要。期望本文的发现能够激发更多创新思考,并为未来的研究和实践提供坚实的基础。