Large Language Models for Software Engineering: A Systematic Literature Review
写在最前面 论文名片 课堂讨论 RQ1部分:LLMs的选择和优化 RQ2部分:LLMs的数据集大小 RQ3部分:LLMs在软件开发中的应用 关于综述论文的写作 1.介绍Introduction LLM和SE是什么? 大型语言模型在软件工程中的兴起 文献综述的主要贡献 2.方法:怎么挑选论文的 2.1 研究问题 2.2 搜索策略:人工搜索+纳入排除+领域知识 2.3 研究选择 2.4 滚雪球式搜索 2.5 数据提取和分析 Research Question 3 研究问题1:目前用于解决SE任务的LLMs是什么? LLM 只有编码器的llm 编解码器llm 主要发现和趋势分析(很有意思的视角,从时间的维度进行归纳) 2021年LLM架构的演变 2022年LLM架构的多样性 2023年纯解码器架构的主导地位 在SE任务中选择LLM的标准 特定于任务的微调 4.研究问题2:SE相关数据集是如何收集、预处理和使用的? 训练llm的数据集是从哪来的 在现有的LLM4SE研究中使用了哪些类型的SE数据集 数据类型在LLM架构和选择中的关键作用 数据类型分类及其对LLM4SE的影响 数据类型对数据预处理技术选择的影响 基于代码的数据集的预处理步骤 基于文本的数据集的预处理步骤 结论 将数据集转换为LLM训练的输入格式 数据转换的重要性 常见的LLM输入格式 输入格式的选择与应用 结论 5.研究问题3: 用于优化和评估LLM4SE的技术 使用了哪些优化器来提升模型性能 提高LLM性能的提示工程技术在SE任务中的应用 优化LLM4SE性能的技术介绍 提示工程技术的应用 结论 利用评估指标来评估LLM4SE任务的性能 评估LLM4SE的重要性 针对不同问题类型的评估指标 评估指标的应用实例 结论 6.研究问题4:目前使用LLM4SE有效解决了哪些SE任务? 6.1到目前为止, LLM4SE解决了哪些发行版SE活动和问题类型?What are the distributions SE activities and problem types addressed to date with LLM4SE? LLM4SE在SDLC各阶段的分布 LLM4SE解决的问题类型 6.2在需求工程中如何使用LLM? How are LLMs used in requirements engineering? 需求工程的重要性 6.3LLM如何用于软件设计?How are LLMs used in software design? GUI检索的应用 快速原型设计 软件规格合成 总结 6.4 LLM在软件开发中是如何使用的? How are LLMs used in software development? 总结 未来方向:人类与机器的协作 6.5 LLM如何用于软件质量保证?How are LLMs used in software quality assurance? 测试生成 漏洞检测 测试自动化 验证 错误定位 诱导失败的测试识别 不靠谱的测试预测 6.6 LLM在软件维护中的应用How are LLMs used in software maintenance? 自动程序修复 (APR) 代码评审 调试 Bug报告分析 代码克隆检测 日志记录 错误的预测 缺陷分类 Bug报告回放 重复bug报告检测 反编译 程序合并冲突修复 情绪分析 标签推荐 漏洞修复 可追溯性复苏 6.7 如何在软件管理中使用LLMHow are LLMs used in software management? 工作量估算 7.有效性威胁 8.大模型及其应用的挑战和机会(重点:未来优化方向) 挑战 LLM适用性 LLM泛化能力 机会 LLM4SE的优化 在更多SE阶段扩展LLM的NLP能力 提高LLM在现有SE任务中的表现 LLM4SE的发展路线图 自动化编码、开发和个性化开发人员协助。 提升软件测试和分析的效率 整合编程知识到LLMs 增强代码审查和质量保证 从数据挖掘中提取洞见 Extracting insights from data mining insights(洞察力) 赋能预测分析和决策支持 软件安全LLM的新机遇和挑战 大型语言模型的软件工程实践SE4LLM 大模型在软件工程中的应用与挑战 大模型在软件开发中的应用与挑战 大模型优化的实践与探索 9.结论和未来方向 深入探索LLMs在软件工程中的多维应用 指出研究的贡献和未来研究方向 快速发展领域的深入研究写在最前面
欢迎阅读这个系列中最特殊、也最有趣的一篇文章 —— 《大型语言模型在软件工程中的应用:系统性文献综述》。不仅是对一项创新技术的深入解析,更是对软件工程领域的一次深入的探索。
由侯心怡@易忻禾主导的这项研究,汇报时展示了她对该主题论文的全面掌握,思维上闪闪发光。
本文汇总了大型语言模型(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):
RQ1中,分类了在SE任务中使用的不同LLM,并描述了它们的特点和用途。 RQ2中,分析了数据收集、预处理和应用过程中采用的方法,强调了精心准备的数据集对成功实施SE中LLM的重要性。 RQ3探讨了用于优化和评估LLM在SE中性能的策略。 RQ4考察了LLM到目前为止在SE任务中取得的具体案例,展示了它们对该领域的实际贡献。为理解LLM在软件工程中的应用提供了全面视角,突显了它们在优化软件开发过程和提高成果质量方面的潜力,同时为未来在这一快速发展的领域中的研究指明了方向。
课堂讨论
RQ1部分:LLMs的选择和优化
在讨论超参数和优化器时,在大型语言模型(LLMs)的应用中,这些并非唯一的重点。虽然提供样本数据对模型的学习至关重要,但我们也发现,模型创新比优化更受重视。例如,在软件工程任务中,更多的关注点放在如何有效地利用现有的LLMs,而不是单纯地追求技术上的优化。因此,在综述中,我们更加关注LLMs的选择和应用策略,以及如何针对特定任务进行微调和改进。
RQ2部分:LLMs的数据集大小
数据量级论文中很少提到,可能是arxiv质量比较参差不齐
模型很少有创新,更多的是应用
尽管文献中对数据量级的描述不多,我们注意到了研究中数据集的多样性和适用性。早期研究侧重于使用现有的大型模型,并根据特定的软件工程任务进行评估。这凸显了对于高质量、具有代表性数据集的需求,以及如何将这些数据集有效地用于LLMs训练的问题。
23年初时纯应用的论文,也能发表在顶会上
RQ3部分:LLMs在软件开发中的应用
在软件开发中应用LLMs时,我们发现实际应用场景可能不总是需要大量数据。例如,在编写自定义程序时,可能需要更灵活的测试方法和评估指标。
我们还讨论了近期趋势,即如何使用LLMs处理更复杂的软件工程任务,并探索了在特定任务中优化和评估LLMs性能的新方法。
对大模型生成的代码的主要是它的功能性,到正确性倒是不怎么追求。因为能编译不一定代表着能用
关于综述论文的写作
在编写综述论文时,考虑了如何在细节和方向上做出新的发现和贡献。
重要的是,平衡统计分析和深入探讨LLMs在软件工程中的具体应用。
虽然统计数据对于概述研究趋势很重要,但个别研究的深入分析
(例如,LLM具体应用的性能)同样不可或缺,以揭示LLMs在实际软件工程任务中的潜在价值和应用前景。
1.介绍Introduction
LLM和SE是什么?
表1为关于LLMs for SE最先进的调查
大型语言模型在软件工程中的兴起
近年来,大型语言模型(llm)已经彻底改变了多个领域,包括软件工程(SE)。这些模型在语言理解和生成方面具有先进的能力,已成为解决复杂SE任务的关键工具。
作者进行了一项系统的文献综述,分析了LLM在软件工程中的影响、应用和未来。
传统的语言模型为文本生成和理解奠定了基础,LLM的发展以其庞大的训练数据和模仿人类语言能力的能力为特征,模糊了人类和机器生成语言之间的界限。
这些模型显著地改变了软件工程,重新定义了SE挑战是如何处理的,特别是在代码总结、生成和各种开发任务方面。
文献综述的主要贡献
这是首次全面审查,涵盖了2017年至2023年间发表的229篇论文。它详细分析了LLM是如何被用来解决SE挑战的,包括:
根据llm的架构和在SE中的应用进行分类。 数据收集、预处理和表示方法的总结。 讨论SE llm的优化技术和评价指标。 llm处理的55个特定SE任务的广泛列表,范围从需求工程到软件管理【11†来源】。2.方法:怎么挑选论文的
遵循Kitchenham等人提出的指导方针,审查系统地:计划、执行和分析研究论文,确保对软件工程LLM的当前状态进行健全和全面的评估。
2.1 研究问题
2.2 搜索策略:人工搜索+纳入排除+领域知识
由于不打算写综述,所以这里不展开介绍,感兴趣的朋友可以直接看论文
2.3 研究选择
研究纳入与排除标准、研究质量评估
2.4 滚雪球式搜索
2.5 数据提取和分析
可视化如上图所示
术语“生成” 和“任务” 强调LLM用于自动代码生成和其他SE任务。
Research Question
3 研究问题1:目前用于解决SE任务的LLMs是什么?
LLM
发现超过50种LLMs被应用于SE任务。 对LLMs进行分类,包括编码器仅、编解码器和解码器仅三种架构。 分析了各种LLMs的选择标准,如对代码上下文的理解能力、内容生成能力、对微调的响应性和在特定SE基准上的性能。图4:在收集的论文中讨论的llm(以及基于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]。
GraphCodeBERT 引入了边缘类型预测,将代码元素之间的关系识别为一个图
。 这使得GraphCoderBERT能够利用代码结构, 提高其在代码摘要和程序分析等任务中的有效性[95]。
这些模型在需要对整个句子或代码片段进行细微理解的任务中显示出了有效性。 示例包括代码审查、 错误报告理解和与代码实体[16,172,220,258,285,359]有关的命名实体识别。
编解码器llm
编解码器LLM结构包括编码器和解码器两个模块[319]。
编码器 部分负责将输入语句转换成隐藏空间中的表达,以捕获句子的结构和语义信息。这种隐藏的表达形式起到桥接作用,使不同的输入和输出格式能够相互转换。 解码器 利用隐藏空间的信息来生成目标输出文本,将抽象的概念转换成具体且与上下文相关的表达。PLBART、T5和CodeT5等模型都采用了这种架构,CodeT5+[337]进一步优化, 而alphcode[177]和CoTexT
[255]展示了该架构对各种SE任务的适应性和灵活性。
这种编解码器设计不仅适用于摘要、翻译和问答
等多方面任务,而且已在代码总结
等SE领域任务中取得成功应用。
特别是,编码器在理解和表达代码的结构和语义方面发挥着关键作用,进而使解码器能够生成简洁且易于理解的代码摘要。
主要发现和趋势分析(很有意思的视角,从时间的维度进行归纳)
如上图所示
一个重要的趋势是越来越多的人喜欢只有解码器的llm,这表明了向强调顺序预测和最小微调要求的模型的转变。
2021年LLM架构的演变
2020年的研究论文主要集中在SE任务的编码器LLM上, 共八篇论文。只有解码器的LLM或编码器-解码器的LMM在那一年的研究中没有出现。 2021年发生了明显的变化。 在2021年的15篇论文中, 有5篇是专门针对解码器的LLM的, 占33.33%; 三篇论文, 或20%专注于编码器-解码器LLM。 只有编码器的LLM略有下降, 占该领域的46.67%, 有7篇论文。
这种快速转换,可以与仅解码器的LLM的生成能力联系起来。 研究人员[160,277,296]发现, 这些需要最少微调的模型, 例如GPT系列,不仅可以产生语法正确的代码片段, 而且可以产生功能相关的代码片段。 他们掌握代码上下文的熟练程度很快使他们成为首选。
2022年LLM架构的多样性
2022年经历了多样性的显著增加, 更多不同的LLM架构找到了表示。 在总共112篇论文中,
47篇集中在仅解码器的LLM, 占41.96%的研究。 编码器-解码器LLM共发表论文16篇, 占14.29%。 与此同时, 只有编码器的LLM以49篇论文略微领先, 占据了43.75%的研究兴趣。这种多样化的分布表明, 研究人员正在积极评估和利用不同的架构以适应不同的需求和挑战的探索阶段。
不同架构之间近乎平等的兴趣强调了该领域的丰富性, 表明没有一种方法已经成为最终选择。
2023年纯解码器架构的主导地位
2023年标志着向纯解码器LLM的强烈转变。
令人印象深刻的是, 在138篇独特的论文中记录了258个仅使用解码器的LLM实例, 这反映了一篇论文可能使用多个这样的模型。
这一趋势标志着重点和资源的转移,即探索和利用纯解码器架构作为当前和未来许多LLM4SE研究和应用的主要方法。
在SE任务中选择LLM的标准
为SE任务选择LLM应该仔细考虑, 而不是随意选择。 指导这种选择的关键因素包括模型在理解代码上下文方面的熟练程度, 它生成相关内容的能力,对微调的响应能力, 以及在se特定基准上的演示性能
[168,178,356]。
考虑到严格的语法规则和SE任务固有的功能需求, 能够无缝集成这些复杂方面的模型通常受到青睐。
特定于任务的微调
一个值得注意的趋势是为精确的SE任务定制llm[124,172,384]。
通过对具有针对缺陷检测或代码审查等特定功能定制的数据集的模型进行微调, 研究人员能够实现显著的性能提升[45,152]。
总之, SE llm的演变, 从仅编码器到仅解码器架构的过渡, 突出了该领域的活力和适应性。 这种转变从根本上改变了SE任务的方法, 反映了学科内部正在进行的创新。
4.研究问题2:SE相关数据集是如何收集、预处理和使用的?
探讨了LLMs训练数据集的来源,包括开源数据集、收集的数据集、构建的数据集和工业数据集。开源数据集的使用最为普遍, 在214篇明确陈述该数据集的论文中, 约占59.35%。 将所有数据集内的数据类型分为五组:基于代码的、 基于文本的、 基于图的、 基于软件仓库的和结合的。 在将LLM应用于SE任务时, 基于文本和基于代码的类型是最常用的。 这种模式表明LLM特别擅长处理SE任务中的文本和基于代码的数据,利用他们的自然语言处理能力。 总结了不同数据类型的数据预处理过程, 发现了几个常见的预处理过程, 即数据提取、 不合格数据删除、 重复实例删除和数据分割。 讨论了将数据集转换为LLM训练的各种输入格式。训练llm的数据集是从哪来的
下图为llm相关数据集的收集策略
这部分不感兴趣,简单看看
在现有的LLM4SE研究中使用了哪些类型的SE数据集
文章中是表,这里为了方便展示用的是图
数据类型在LLM架构和选择中的关键作用
在大型语言模型(LLMs)的软件工程(SE)应用中,数据类型扮演着决定性角色。它们直接影响模型提取隐式特征和做出决策的方式。正确选择数据类型对于提高LLMs的整体性能和泛化能力至关重要。我们通过对229项研究进行综合分析,来阐释数据类型对LLM4SE应用成功的重要性。
数据类型分类及其对LLM4SE的影响
我们将研究中使用的数据集分为五大类:基于代码、基于文本、基于图形、基于软件仓库和组合数据类型。
基于文本的数据集,数量最多,共有104项研究使用,凸显了这些LLMs在自然语言处理方面的出色能力。这些模型擅长理解和处理文本数据,使它们成为处理代码理解、错误修复、代码生成等面向文本的SE挑战的理想选择。
基于代码的数据集,尤其是源代码,是SE任务中训练LLMs的重要资源,因为它们包含定义程序行为的关键逻辑和指令。此外,基于图形的数据集在一些研究中用于构建图形用户界面(GUI)存储库等任务。
基于软件仓库的数据集 通常包含从版本控制和问题跟踪系统中收集的数据,提供软件开发过程的深入见解。这些数据有助于研究软件开发的行为和趋势,提高开发效率和软件质量。
组合数据类型的数据集,如“源代码和注释”等,被用于多种复杂任务。这些组合数据集使模型能够更全面地理解软件开发的各个方面,并在多样化的任务中表现出色。
通过深入分析这些数据类型及其在不同研究中的使用,我们可以更好地理解LLMs在软件工程领域中的潜力和应用前景。
数据类型对数据预处理技术选择的影响
基于代码的数据集的预处理步骤
对于基于代码的数据集,预处理是一个多阶段的过程,涵盖从数据提取到最终数据分割的各个方面。这个过程包括以下主要步骤:
数据提取:涉及从软件库或版本控制系统等来源检索相关代码段,确保代码片段与特定SE任务相关。 不合格数据删除:去除不符合预定义质量标准的代码段,以保证数据的相关性和完整性。 删除重复实例:识别并删除重复的代码实例,增加数据的独特性和多样性。 数据编译:将提取和过滤后的代码段合并编译成统一的数据集,便于后续的分析和训练。 去除无效代码:删除不能编译或执行的代码段,确保数据集中的代码是有效和可用的。 代码表示:将代码段转换为模型可处理的适当表示形式,如基于标记、树或图的表示。 数据分割:将预处理后的数据集划分为训练、验证和测试子集,以支持模型的训练和评估。基于文本的数据集的预处理步骤
与基于代码的数据集相比,基于文本的数据集的预处理步骤略有不同:
数据提取:从各种SE文档中提取相关文本,如bug报告、需求文档、代码注释和API文档。 初步文本处理:根据需要对文本进行切分和分类,以便进行更详细的分析。 不合格数据删除:过滤掉无效或不相关的文本,确保数据集的质量和相关性。 文本预处理:进行标准化和清理操作,如删除某些符号、停用词和特殊字符。 消除重复实例:删除重复的文本样本,增强数据集的多样性。 数据标记化:将文本切分为更小的单元(如单词或子单词),以便模型的管理和处理。 数据分割:将预处理后的数据集分为训练集、验证集和测试集,支持模型的训练和评估。结论
不同类型的数据集在预处理时需要采取不同的技术和方法。这些步骤确保了数据的一致性、质量和适用性,从而提高了LLMs在软件工程任务中的性能和有效性。
通过理解和应用这些预处理步骤,研究人员可以为LLMs的训练和应用创建更优化和结构化的数据集。
将数据集转换为LLM训练的输入格式
数据转换的重要性
一旦选定了合适的数据集并通过预处理步骤获得了干净的数据,下一个重要步骤是将这些数据转换为适合作为LLM输入的格式。
这一过程至关重要,因为它直接影响模型训练的有效性和最终性能。不同的输入格式能够捕捉到数据的不同方面,从而影响模型的学习和理解能力。
常见的LLM输入格式
在研究中,我们观察到四种常见的数据输入类型:基于令牌、基于树/图、基于像素的输入以及混合输入。
基于令牌的输入:这种输入形式涉及将代码和文本表示为令牌序列,包括单词或子单词等小单位。令牌化的代码和文本使LLM能够在细粒度级别上理解编程语言的语法和语义,以及处理和分析自然语言描述。
基于树/图的输入:这种输入形式将代码表示为树或图结构,捕捉代码元素之间的语法关系和依赖关系。树结构输入特别适用于表现代码的层次结构,而图结构输入则能够捕获代码中的非线性依赖关系,适用于如代码摘要和漏洞检测等任务。
基于像素的输入:这种输入方式将代码视觉化为图像,每个像素代表代码元素或标记。这种可视化的表示允许LLM通过图像学习来处理和理解代码,适用于如代码翻译或生成代码可视化等任务。
混合输入:结合多种输入模式的混合输入为LLM提供了不同的视角以更好地理解代码。例如,混合输入可以结合令牌化代码和代码的视觉表示,增强模型理解复杂代码模式的能力,并在代码理解和生成等任务中提高性能。
输入格式的选择与应用
我们的研究表明,基于令牌的输入是最常见的形式,占据了主导地位,体现了其在各种SE任务中的多功能性和有效性。此外,基于树/图的输入虽然不如基于令牌的输入普遍,但在特定任务中展示了其独特的价值。基于像素和混合输入虽然使用较少,但提供了有趣的可能性,特别是在特定应用中。
结论
不同的输入格式各有优势和适用场景,从基于令牌的输入的广泛应用到基于树/图、像素和混合输入的创新探索。
5.研究问题3: 用于优化和评估LLM4SE的技术
在LLM4SE(大型语言模型在软件工程领域的应用)的研究中,优化和评估
技术对于提升模型的性能和准确性至关重要。
通过采用有效的优化器、探索提示工程技术,并使用合适的评估指标
,我们能够更好地理解和提升LLMs在软件工程任务中的表现。
讨论了以下几种主要的优化技术
:
这些技术不仅有助于提高模型的效率,还能确保它们在实际应用中的有效性和可靠性。
在评估LLM4SE的性能时,我们采用了不同的评估指标
,这些指标根据任务的性质而异:
回归、分类和推荐任务:对于这些任务,我们总结了多种评估指标,用于量化模型在这些问题类型上的表现。例如,在分类任务中,通常使用准确率、召回率和F1得分等指标来评估模型的分类性能。
生成任务的评估:生成任务是LLM4SE中的一个关键领域,涉及15个不同的评价指标。这些指标帮助评估模型在生成代码、文本或其他输出时的性能,包括创造性、相关性和准确性等方面。
使用了哪些优化器来提升模型性能
感觉GPT这种都不适用了,所以跳过,感兴趣的同学可以去看原文
提高LLM性能的提示工程技术在SE任务中的应用
优化LLM4SE性能的技术介绍
在软件工程(SE)任务中,提示工程技术被用来优化大型语言模型(LLMs)的性能。这些技术特别针对预训练模型和下游任务之间的输入格式差异以及数据稀缺的挑战。
评估指标:我们采用了不同的评估指标来量化模型在SE任务中的表现,如回归、分类和推荐任务的准确率、召回率和F1得分,以及生成任务的多样化评价指标。
预训练和微调的挑战:预训练模型在广泛的未标记语料库上训练后,需在下游任务上进行微调。微调的有效性很大程度上取决于下游数据的数量,特别是在数据稀缺的情况下。
提示工程技术的应用
提示工程作为一种新兴的微调范式,已在自然语言处理(NLP)领域显示出显著的效果。在SE任务中,提示工程技术的应用包括以下几个方面:
硬提示和软提示:硬提示包括手动预定义的自然语言指令,而软提示则采用替代标记来代替硬提示中的自然语言。前缀软提示在原始输入之前添加替代标记,这种方法在数据稀缺的任务中尤为有效。
提示的设计和应用:提示工程的关键在于设计专门的提示,这已成为与ChatGPT和WizardCoder等LLMs交互的基本技术。定制提示的目的双重:一方面指导LLMs生成特定的输出,另一方面作为访问模型中嵌入知识的接口。
LLM4SE任务中的应用:在LLM4SE的背景下,提示工程在各种任务中发挥着关键作用,包括代码生成、代码总结、程序修复和测试生成等。这些任务通常需要访问预训练模型中的特定知识,提示工程提供了一种有效的方法来实现这一点。
结论
最近的研究强调了提示工程在提高LLM4SE针对目标SE任务性能方面的重要作用。
通过采用这些技术,研究人员能够更有效地利用预训练模型的知识,从而促进自动化软件开发方法的发展。
利用评估指标来评估LLM4SE任务的性能
评估LLM4SE的重要性
在大型语言模型(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任务中的应用,从而推动自动化软件开发方法的发展。
6.研究问题4:目前使用LLM4SE有效解决了哪些SE任务?
分析了LLMs在软件开发生命周期(SDLC)中的应用,特别强调了在软件开发和维护中的集中使用。 按六大SE活动类别细化了55种SE任务,其中代码生成和程序修复是使用LLMs最普遍的任务。主要讨论了大模型在不同场景下的应用和优势。
首先提到了深度学习在城市任务中的应用最为广泛,如计算机视觉、自然语言处理等;
接着分析了不同类型的任务中哪些任务在大模型中的表现较好,包括程序逻辑、类依赖关系等方面;
此外,还探讨了大模型与其他机器学习技术的结合,以提高其性能。
同时,对于软件维护过程中如何利用大模型的问题进行了分析,认为将大模型应用于代码编写、知识获取等领域有助于提升工作效率。
6.1到目前为止, LLM4SE解决了哪些发行版SE活动和问题类型?What are the distributions SE activities and problem types addressed to date with LLM4SE?
LLM4SE在SDLC各阶段的分布
在软件工程(SE)任务中使用大型语言模型(LLMs)的研究被分为软件开发生命周期(SDLC)的六个阶段:需求工程、软件设计、软件开发、软件质量保证、软件维护和软件管理
软件开发:占研究总量的约58.37%,主要关注增强编码和开发流程。 软件维护:约占研究总量的24.89%,突出了LLMs在帮助软件更新和改进中的重要性。 软件质量保证:占研究总量的约10.3%,表明了对自动化测试程序的日益关注。 需求工程:约占研究总量的4.72%,包括处理指代歧义、需求分类、共指检测、需求提取和软件可追溯性等任务。 软件设计:约占研究总量的1.29%,包括GUI检索、快速原型设计和软件规格合成等任务。 软件管理:研究最少,仅占0.43%。大多数研究(64.34%)集中在生成任务上,显示了LLMs在生成代码或文本方面的重要性。大约24.48%的研究属于分类任务,9.79%与推荐任务相关,1.4%分配给回归任务。
LLM4SE解决的问题类型
在我们收集的LLM4SE研究中,我们还根据所解决的问题类型对研究进行了分类:
生成任务的主导地位:大多数研究(约64.34%)集中在生成任务上,表明LLM在生成代码或文本方面的重要性。
分类任务的相关性:约24.48%的研究涉及分类任务,显示了LLM在软件元素分类方面的能力。
推荐任务的效用:大约9.79%的研究与推荐任务相关,突显了LLM在建议解决方案方面的价值。
回归任务的探索有限:回归任务的研究相对较少,约占1.4%,反映了LLM在预测建模方面的探索受限。
LLM4SE的应用在软件工程的各个阶段和问题类型中显示出广泛的适用性。特别是在代码生成和分类任务中,LLM的影响尤为显著。
这些发现强调了LLM在SE领域中的关键作用,同时也揭示了在其他领域进一步研究的潜在机会。
6.2在需求工程中如何使用LLM? How are LLMs used in requirements engineering?
需求工程的重要性
需求工程是软件开发过程中的关键阶段,涉及多种任务,如指代歧义处理、需求分类、共指检测、需求诱导和软件可追溯性等。LLM在这些领域的应用提高了软件需求管理的效率和准确性。
指代歧义处理:软件需求中的歧义可能导致开发阶段的问题。LLM,如BERT和SpanBERT,已被证明在解决回指歧义方面有效。例如,ChatGPT在处理软件需求中的指代歧义时表现出准确识别先行词
的能力,这有助于提高需求的清晰度和精确性,从而促进更有效的软件开发过程。
需求分类:将需求分为功能性和非功能性需求对早期项目识别至关重要。LLM,如BERT,在使用微调迁移学习技术进行需求分类方面表现优异,超越了传统方法。
需求术语识别:使用BERT和K-means聚类,可以识别和分组在不同语境中使用的术语
。这种方法在多领域语料库上已被验证,提高了术语识别的准确性和效率。
共指检测:LLM在共指检测中的应用有助于解决由不同利益相关者撰写的需求中的表达式差异和不一致问题,提高了需求文档的可理解性。
可追溯性自动化:LLM,如T-BERT,已被用于自然语言工件到编程语言工件(NLA-PLA)的可追溯性,提高了可追溯性的准确性和适应性,即使在训练实例有限的情况下也能保持高效。
LLM在需求工程中的应用展示了其在处理软件需求的多样化挑战中的有效性和多功能性。
从提高需求文档的清晰度和精确性到自动化需求管理和分类,LLM在提高软件开发过程的效率和质量方面发挥了重要作用。
6.3LLM如何用于软件设计?How are LLMs used in software design?
GUI检索的应用
大型语言模型(LLM)在软件工程(SE)中的应用之一是图形用户界面(GUI)的检索。
Kolthoff等人的研究展示了BERT在GUI检索任务中的应用潜力。由于GUI文档文本不是标准的结构化文本,所以为基于文本的排名任务带来了挑战。
研究者微调了基于BERT的学习排序(LTR)模型
,并将自然语言查询与GUI文档文本相结合,以训练不同的BERT-LTR模型。
模型在基于神经网络的GUI排名中的表现证明了其有效性。
快速原型设计
快速原型设计对加速软件设计过程至关重要,它使开发人员能够快速可视化和迭代设计。
White等人研究了LLM在促进快速原型设计过程中的作用。
研究引入了提示设计
,提供了解决LLM4SE中常见挑战的结构化方法。
这项研究表明,通过与先进机器学习技术的深度集成,快速原型设计领域将受益,为产生更直观和以用户为中心的软件设计创造新的研究和改进机会。
软件规格合成
随着系统规模的增加,软件配置和规格说明的管理变得复杂。
Mandal等人介绍了SpecSyn,一种使用LLM从自然语言源自动合成软件规格说明的框架。
这种端到端方法将任务视为序列到序列的学习问题,在F1分数上超过了先前最先进的工具,并能够从单个或多个句子中提取规格。
总结
LLM在软件设计领域的应用体现了其在处理复杂任务中的多功能性和高效性。
从GUI检索到快速原型设计,再到软件规格合成,LLM提供了加速软件设计过程和提高设计质量的新途径。
这些应用突显了LLM在软件设计领域的潜力,为未来的研究和应用开辟了新的可能性。
6.4 LLM在软件开发中是如何使用的? How are LLMs used in software development?
LLM在软件开发中的应用主要集中在以下几个方面:
代码生成(热点任务):LLM能够自动将自然语言描述转换成程序代码,提高了代码编写的效率和准确性。GPT-4、GPT-3、Codex等模型在这一领域显示了显著的能力。这些模型通过预训练学习丰富的语言学知识和语义表示,使其
不仅能够理解自然语言描述,还能将其转换为编程代码
,大幅提升编码效率和准确性。这些模型的出现,代表了从传统程序合成方法向基于自然语言的编程思维的转变。
在应用于软件开发任务的大型语言模型(LLMs)领域内,围绕代码生成的研究明显占据了学术前沿。如表12所反映,GPT系列,尤其是GPT-4,成为关键焦点,许多研究选择它们进行代码生成领域的应用[60, 62, 168, 186]。分析这些研究,一些值得注意的发现浮现出来:
LLM中的编程思维:唤起LLM内“编程思维”的技术,如TIP(即Thinking in Programming,编程思维)[168]方法,已显示出有希望的进步。通过引导LLM首先制作高级代码草图,再深入详细的实现,合成的代码表现出更高的准确性和健壮性。 类级别vs方法级别生成:LLM在方法级别的代码生成上虽然娴熟,但在面对类级别生成任务时,表现出不同的性能指标[62]。这种差异突显了随着代码合成粒度的变化,挑战的演变性质。 扩展LLM能力:这一学科的下一个前沿似乎在于将LLM与现有的软件工程(SE)工具和实践和谐地整合在一起。像EvalPlus [60]这样的框架的出现,预示着增强LLM生成代码的评估和准确性的趋势,可能会迎来一个人类开发者和LLM共同创造软件解决方案的时代。代码自动完成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 方法相比,这导致了更优越的节点和边缘覆盖
。
标识符通常由多个单词组成,且一定数量的标识符包含缩写。因此,标识符的
词法含义
和开发人员编写的源代码的整体功能
可能对其他开发人员理解具有挑战性。源代码无法与其他用自然语言描述的软件工件中的词汇相匹配,使一些自动化算法失效。因此,有强烈的需要
对标识符进行规范化
,目的是将标识符中的词汇与其他软件工件中的自然语言词汇进行对齐
。Zhang 等人通过引入标识符规范化方法 BEQAIN 解决了这个问题。BEQAIN
将 BERT 与问答 (Q&A) 系统和条件随机场 (CRF) 相结合
,将标识符分割作为序列标记,将缩写展开作为问答任务。它使用编程上下文来细化扩展结果,当多个扩展是可能的,对齐标识符词汇与自然语言和增强软件开发的理解和自动化。
类型推断Type inference:类型推断是编程中自动确定数据类型
的过程,在增强可读性、可维护性和减少运行时错误方面起着至关重要的作用。TypeScript 以其独特的可选类型混合方式提出了一个微妙的挑战,尤其是在导航用户定义类型的广阔天地时。为了解决这种复杂性,Jesse 等人提出了一种利用 bert 风格的预训练模型的能力的方法。他们的解决方案 DIVERSETYPER 通过
将类和接口声明与其各自的使用上下文唯一地关联起来
,熟练地推断用户定义的类和接口的类型。除了仅仅填补以前方法的空白之外,DIVERSETYPER 还在类型推断方面设立了一个新的基准,特别是对于用户定义的类型。
总结
LLM在软件开发的多个方面发挥着至关重要的作用,不仅提高了开发效率,也推进SE领域和简化开发生命周期。
随着技术的不断进步,预计LLM将在未来SE实践中扮演更为关键的角色。
未来方向:人类与机器的协作
当前研究的趋势表明,将LLM与现有的SE工具和实践相结合,为软件开发带来新的可能性。例如,使用LLM进行方法名称生成、敏捷故事点估算、API文档质量监控和代码表示等任务,都是在不断探索和扩展LLM在SE领域的应用。
LLM在软件开发中的应用正处于快速发展阶段。随着模型的不断进步和创新,未来将在软件工程领域开辟更多新的研究路径和应用场景。
6.5 LLM如何用于软件质量保证?How are LLMs used in software quality assurance?
在软件质量保证领域,LLM已经成为一种有价值的工具,应用于包括漏洞检测、测试生成和错误定位等多种任务。
测试生成
测试生成涉及自动创建测试用例的过程,以评估软件应用的正确性和功能。它包括测试用例生成、单元测试生成等多个方面。LLM在测试生成中提供了多个优势:
自动生成多样化的测试用例 提高测试覆盖率 识别潜在缺陷LLM还可以帮助生成基于自然语言描述的测试用例,促进开发者与测试人员之间更好的协作,并且帮助识别缺乏测试覆盖的领域,并建议相关测试用例,确保全面测试并降低未发现问题的风险。
漏洞检测
近年来,软件漏洞数量迅速增加,因此,漏洞检测对于确保软件系统的安全至关重要。LLM,如BERT,被用于微调漏洞检测模型。例如,Tang等人提出的CSGVD模型结合了序列和图嵌入来进行函数级漏洞检测,优于其他基于深度学习的模型。
测试自动化
自动化测试方法包括变异测试和模糊测试等技术。LLM在变异测试中的应用涉及将错误引入代码库以评估测试套件的有效性。在模糊测试中,LLM帮助生成有效和多样化的输入程序,帮助识别漏洞和bug,尤其在具有挑战性的领域如深度学习库等。
验证
验证技术,如形式化验证,在软件质量保证领域中发挥着关键作用。LLM,特别是GPT-3.5,在形式验证领域被应用。通过将LLM与有界模型检查相结合,可以基于形式化方法自动修复软件,展示了模型理解复杂软件结构并生成准确修复的能力。
错误定位
错误定位涉及识别源代码中负责特定缺陷或软件错误的具体文件、函数或代码行。Ciborowska等人研究了数据增强技术以增强bug定位模型。通过使用增强的数据训练基于BERT的模型进行缺陷定位,证明了这些技术可以扩展训练数据并提高模型性能。
诱导失败的测试识别
识别引发错误的测试用例是一个挑战,尤其是当程序版本在语法上相似时。Li等人研究了LLM在这一任务中的应用。为了提高性能,他们设计了一种结合LLM与差异测试的新方法。
不靠谱的测试预测
Flakify是一种使用CodeBERT预测易变测试用例的黑盒方法。这种预测可以帮助开发者集中调试工作在最可能不稳定的测试用例子集上。
通过这些应用,LLM正在软件质量保证领域扮演着越来越重要的角色,提高了软件测试的效率和有效性。
6.6 LLM在软件维护中的应用How are LLMs used in software maintenance?
在软件维护的上下文中,LLM被用于错误预测、程序修复、代码审查、调试和一系列其他活动。
自动程序修复 (APR)
自动程序修复 (APR) 的目标:是自动识别并修复软件中的bug或缺陷。它涉及利用自动化技术来分析有bug的代码,并生成正确的补丁来解决已识别的问题。
LLM的应用:
优化:在特定的代码修复数据集上进行微调,提高生成高质量补丁的能力。
ChatGPT:由于其固有的交互设计而处于领先地位,从而实现连续的反馈循环,从而产生精细且适合上下文的补丁。这种对话动态性,再加上不同基线之间的严格比较,突出了其优越的适应性和效率。
总结程序修复LLM研究的几个关键发现:
互动反馈:与ChatGPT相结合的交互式反馈回路显著提高了程序修复的准确性。这种补丁生成和验证之间的动态相互作用促进了对软件语义的更深入理解,从而导致更有效的修复。
特定领域的集成:将LLM的能力与特定领域的知识和技术相结合,进一步提高了它们的性能。定制的提示、特定项目的微调和利用SE技术可显著提高LLM驱动的程序修复的效率。
比较分析:对不同基线的严格评估揭示了LLM的通用性和适应性,特别是ChatGPT。这种广泛的比较不仅确立了它们的优越性,而且强调了潜在的改进领域。
代码评审
代码评审的重要性:代码评审是一种关键的质量保证实践,用于检查、评估和验证软件代码的质量和一致性。 目的:旨在识别潜在的错误、漏洞和代码质量问题,同时提高代码的可维护性、可读性和可扩展性。 LLM在代码评审中的应用: 模型:如BERT, ChatGPT和T5等LLM。 能力:在海量代码上训练,掌握代码语义、结构和上下文信息的理解与学习。 效果:帮助审查者全面理解代码意图和实现细节,更准确地发现潜在问题和错误。 产出:生成代码改进和优化的建议,为审查人员提供有价值的见解和指导。 综合效益:将LLM的智能与人类审查人员的专业知识相结合,使代码评审变得更高效和精确。调试
调试的目标:识别、定位和解决软件中的缺陷或错误(通常称为bug)。 调试过程:包括仔细检查代码、跟踪执行流程,并隔离问题的根本原因。 LLM在调试中的应用: 模型:如BERT和其他基于变换器的架构。 方法:利用上下文信息和自然语言理解能力模拟科学调试过程。 特定技术:例如Kang等人提出的AutoSD,生成关于代码问题的假设,并识别潜在问题。 自调试方法:由Chen等人提出,使LLM通过学习演示和解释来提高代码生成的准确性。 效益:不仅提高修复性能,而且提供对模型决策过程的洞察,成为提高软件质量的重要工具。Bug报告分析
分析内容:Codex和BERT等LLM分析bug报告中的自然语言文本、代码片段和上下文信息。 产出:生成精确的代码修复建议、测试用例或重现错误的步骤。 深入理解:通过理解问题的语义和上下文,为开发人员提供更智能的解决方案。 效果:加快错误修复过程,减轻开发负担。 性能:这些模型在代码生成和识别错误报告中的关键信息方面表现出色。 综合效益:与LLM的集成使得bug报告分析任务更高效、更准确。代码克隆检测
定义: 代码克隆指彼此相同的代码样本,可具有结构或语义等价性。 研究: Sharma等人进行了探索性研究,探讨了BERT在代码克隆检测中的应用。 发现: 分析发现BERT特别关注代码标记中的标识符。 应用: 研究提倡在克隆检测中使用BERT,因其对标识符的高关注度。 影响: 这种洞察力增强了跨所有层的克隆检测,超出了BERT的传统应用。 潜在效果: 研究表明这些发现可能导致开发出性能类似于大型模型的小型模型,解决计算可访问性问题。日志记录
重要性: 日志记录是软件应用程序运行期间对事件、消息或信息的系统记录,对理解应用程序的行为、性能和潜在问题至关重要。 开发实践: 开发人员在代码库中战略性地插入日志语句,捕获关键数据(如变量值、函数调用、错误信息)。 工具作用: 日志是测试、调试、监控以及分析软件操作行为的重要工具。 LANCE系统: Mastropaolo等人介绍了LANCE,一个使用T5模型自动生成并将完整日志语句注入到Java代码中的系统。 ChatGPT应用: Sridhara等人认为ChatGPT在日志摘要任务中表现良好,优于当前技术水平。错误的预测
研究背景: Gomes等人在FLOSS项目中进行了BERT和TF-IDF在长寿命错误预测的应用研究。 结果: 结果显示基于BERT的特征提取始终优于TF-IDF。 BERT的优势: 证明了BERT在捕获错误报告中的语义上下文方面的能力。 较小的BERT架构: 较小的BERT架构也表现出具有竞争力的结果。 潜在应用: 这种方法有望在FLOSS项目中实现更准确的错误检测,改善软件质量和维护。缺陷分类
重要性: Bug分流对于大型项目中有效的问题管理至关重要。 挑战: 小项目的缺陷分配简单,但可扩展性带来了复杂性。 专业技能需求: 找到具有所需技能的合适开发人员变得复杂,尤其是需要综合技能的情况。 LBT-P框架: Lee等人介绍了Light Bug Triage框架 (LBT-P),使用BERT从bug报告中提取语义信息。 解决挑战: 研究人员采用了模型压缩、知识保留微调和新的损失函数等技术来克服LLM在错误分类方面的挑战。Bug报告回放
重要性: Bug报告对于软件维护至关重要,用户可以报告在使用软件时遇到的问题。 研究投入: 研究人员投入大量资源于自动化错误回放,加快软件维护过程。 方法局限性: 目前的自动化方法成功程度大多取决于错误报告的特征和质量。 AdbGPT方法: Feng等人提出AdbGPT,利用LLM的自然语言理解和逻辑推理能力,从bug报告中提取S2R实体,并指导bug重放过程。
研究描述: 描述了如何利用cue工程、少量学习和思维链推理来利用LLM的知识进行自动错误重放。 比较优势: 与传统方法相比,这种方法轻量级且高效,利用单个LLM解决S2R实体提取和重播引导。重复bug报告检测
背景: 在大型软件项目中,多个用户可能独立报告相同或相似的bug,导致重复bug报告增多。 检测过程: 涉及分析bug报告的文本内容并进行比较,以发现相似性和冗余性。 LLM的作用: 模型如BERT、ChatGPT及其他基于变压器的体系结构适合于自然语言理解和上下文表示。 应用效果: 当应用于重复bug报告检测时,LLM可以有效捕获错误报告之间的语义相似性,即使在语言或短语略有变化的情况下。 管理效率: LLM的使用提高了管理bug报告的效率。 整体改进: 有助于改善整个软件开发和维护工作流程,减少冗余,确保及时解决bug。反编译
重要性: 反编译在许多安全和软件工程(SE)任务中至关重要。 应用场景: 常用于恶意软件分析、二进制漏洞分析、软件供应链分析和代码重用。 工具应用: 反编译工具如IDA和Ghidra在安全威胁分析中有显著作用。 新技术: Xu等人提出一种新技术,在反编译过程中恢复符号名称,利用了LLM(特别是ChatGPT)和程序分析之间的协同作用。 算法方法: 采用基于程序语义的迭代算法,传播ChatGPT查询结果。 ChatGPT的贡献: 这种传播为ChatGPT提供更好的上下文,增强了反编译的效果和精度。程序合并冲突修复
问题: 程序合并冲突修复解决整合单个代码更改时面临的挑战,这些更改可能导致文本或语义不一致。 研究: Zhang等人探索了在GPT-3等LLM中使用k-shot学习自动化修复过程的潜力。 结果: 这些模型在为Microsoft Edge解决语义冲突方面显示出希望,但并没有完全取代特定领域语言对某些合成模式的好处。情绪分析
目的: 情感分析涉及在与软件产品相关的文本数据中确定情感,例如用户反馈或评论。 目标: 自动将文本的情感分类为积极、消极或中性,为用户如何感知和对软件应用作出反应提供有价值的见解。 研究: Zhang等人进行的研究比较了预训练的Transformer模型(如BERT、RoBERTa、XLNet和ALBERT)与现有的SA4SE工具。 结果: Transformer模型在宏/微平均f1值上比之前的工具高出6.5%到35.6%,尽管在运行时效率上有所权衡。标签推荐
问题: 软件问答网站中标签标注不当会导致冗余以及标签爆炸等问题。 解决方案: PTM4Tag是一个利用具有三重体系结构的PLMs为帖子推荐标签的框架。 方法: 通过分别对帖子的标题、描述和代码片段进行建模,PTM4Tag使用五种流行的PLMs进行比较,包括BERT和CodeBERT。 结果: SE-specialized CodeBERT表现出最好的性能,明显优于基于CNN的方法。漏洞修复
目的: 漏洞修复是识别并修复软件应用中的安全漏洞或弱点的过程。 研究: Pearce等人研究了如何使用LLM进行软件零点漏洞修复。 挑战: 探讨了在设计提示以诱导LLM生成不安全代码的固定版本时所面临的挑战。 结果: 虽然该方法很有前途,LLM能够修复100%的合成和手工创建的场景,但在历史现实生活示例的语料库上对模型性能的定性评估显示,在生成功能正确的代码方面存在挑战。可追溯性复苏
重点: 可追溯性恢复的重点是重新建立相关软件制品之间丢失或不明确的联系,从而促进一致的软件演化和维护。 潜力: 虽然传统方法提供了一些解决方案,但LLM的集成最近成为提高该任务准确性和效率的有希望的途径。 方案: Zhu等人提出了TRACEFUN,一个使用未标记数据增强的可追溯性链接恢复框架,作为这种潜力的证明,利用LLM来弥合标记和未标记数据之间的差距,从而改进可追溯性链接预测。6.7 如何在软件管理中使用LLMHow are LLMs used in software management?
工作量估算
定义: 工作量估算是指预测完成一个软件开发项目所需的时间、资源和人力的数量的过程。 研究: Alhamed等人对BERT在软件维护工作量估计任务中的应用进行了评估。 发现: 他们的研究强调了BERT在提供有价值的见解和帮助决策过程中的潜力。 挑战与进一步研究: 同时也强调了相关的挑战和进一步研究的必要性。尽管对LLM在软件管理中应用的研究论文相对有限,Alhamed等人的工作表明,LLM在工作量估算等关键领域中具有显著的潜力。这些研究成果揭示了LLM可以在软件管理的多个方面提供支持,尤其是在决策和预测方面,但同时也提示了在这些应用中需要进一步的探索和改进。
7.有效性威胁
讨论了大模型在SLR过程中的问题及其解决方法。
首先,通过三种搜索方式(手动、自动加滚动雪球)结合,提高了检索效率并减少遗漏。
其次,引入了QACC对论文质量进行评分,并通过邀请两位专家进行复核降低主观因素误差。
8.大模型及其应用的挑战和机会(重点:未来优化方向)
主要探讨了大模型在不同场景下的应用和优势。
提到了深度学习的应用最为广泛,如计算机视觉、自然语言处理等; 分析了不同类型的任务中哪些任务在大模型中的表现较好,包括程序逻辑、类依赖关系等方面; 探讨了大模型与其他机器学习技术的结合,以提高其性能。 对于软件维护过程中如何利用大模型的问题进行了分析,认为将大模型应用于代码编写、知识获取等领域有助于提升工作效率。挑战
LLM适用性
模型大小和部署。针对大型模型的优化,如参数压缩技术和大规模计算等,以提高训练速度和性能。 训练过程中:存在的数据依赖性和代码生成奇异性等问题,采取相应措施加以改进。LLM泛化能力
训练之外的特殊任务。 LLM评估。采用更多可广泛使用的评价指标的建议。 可解释性、可信度和道德问题的重要性。只有当其生成结果足够可靠时才能被使用。机会
LLM4SE的优化
Chatgpt、针对特定领域的优化、集成多个LLM or 机器学习模型等。
在更多SE阶段扩展LLM的NLP能力
整合新的输入:之前更多是code和text的数据集,后面可以增添图表、音频等多模态输入,提供更全面的上下文理解。基于图可以捕获代码结构关系和依赖关系 拓展大模型在不同阶段的应用:之前更多是代码填充和bug检测。后面可以尝试需求工程、软件设计和软件管理。
提高LLM在现有SE任务中的表现
缺乏开源数据,解决特定领域。 建立综合评估框架。模型偏差、 代码语义误解和特定于上下文的限制等挑战。LLM4SE的发展路线图
高额视角,方便理解LLM4SE任务的相关关系和新兴探索
自动化编码、开发和个性化开发人员协助。
编码自动化:代码片段的自动生成、 bug修复、 系统优化, 为开发人员创建智能、 个性化的辅助, 这些辅助可以感知上下文并适应个人需求,更好地理解需求并生成语法和语义上正确的代码, 从而加快开发周期并提高软件质量,以更直观和响应的方式与开发人员进行交互。 针对特定的编码任务和开发人员协助对LLM进行微调,可以进一步提高其准确性和效率。提升软件测试和分析的效率
测试用例生成、错误分类和缺陷预测
方面,LLMs有助于提高测试过程的准确性和效率。
整合编程知识到LLMs
一个关键的未来发展方向是,将专业的代码表示方法+编程领域知识集成到LLMs中
。这种集成旨在提升LLMs生成代码的准确性、安全性和符合编程标准的能力。
增强代码审查和质量保证
通过使用LLMs来分析代码上下文和执行智能比较,可以大幅提升代码审查过程。
微调的LLMs可以提供更精确的错误检测和定制化反馈,为代码质量的提升和潜在改进提供更深入的理解。
从数据挖掘中提取洞见 Extracting insights from data mining
LLMs在挖掘GitHub、StackOverflow和应用商店等平台,在需求提取、可追溯性、验证以及各种类型的挖掘任务中的应用,为开发策略和决策提供了宝贵的信息。
LLMs的自动化和增强挖掘任务有助于深入了解用户需求、新兴趋势和开发实践的效率。
insights(洞察力)
在“Extracting insights from data mining”(从数据挖掘中提取洞见)这个表述中,“insights”指的是从大量数据中获得的有价值的信息、知识或理解。在数据挖掘的过程中,算法和模型被用来分析和解释数据,目的是发现有意义的模式、趋势、关联或异常。这些发现称为“洞见”,它们可以帮助组织或个人做出更明智的决策,改进业务策略,或理解复杂的现象。
例如,在软件工程领域,数据挖掘可能揭示用户行为的模式、软件缺陷的趋势、开发过程中的效率问题,或是代码库中的潜在安全风险。这些洞见对于优化软件开发过程、提升产品质量,或预测未来的开发需求非常有价值。
赋能预测分析和决策支持
利用LLMs进行工作成本预测、软件分类、代码分类、事件检测和软件质量评估,可以提供更强的数据驱动洞察力和预测分析。这使得组织能够在整个开发生命周期中做出更明智的决策。
软件安全LLM的新机遇和挑战
LLMs在软件安全领域中的应用提供了新的机遇和挑战。
一方面,LLMs为自动安全审计和漏洞检测提供了有前途的解决方案。 另一方面,它们的复杂性也带来了新的安全挑战。未来研究的一个有趣方向是:开发新策略来加强LLMs本身的安全性
,包括使LLMs能够自动识别和纠正自身的漏洞,为其底层代码生成自我应用的补丁。
大型语言模型的软件工程实践SE4LLM
随着LLMs的能力和复杂性的增加,出现了为这些模型的开发、优化和维护量身定制的专门软件工程实践的需求。
这些实践包括:设计可扩展和可维护的架构,开发高效的训练算法,以及实施道德准则和合规机制
。
不仅促进了更复杂和适应性更强的模型的发展,也为跨学科研究和创新开辟了新途径。
大模型在软件工程中的应用与挑战
由于其复杂性和潜在的安全性问题,研究人员正在寻找新的技术策略来加强模型本身的性能。其中一个解决方案是通过让大模型自行修复自身存在的漏洞来实现。 探讨了大模型在不同软件工程任务中的应用情况,如自然语言处理、知识图谱等。 介绍了一个用于处理和编码输入句子的编码器和解码器模块,它们可以根据任务的类型选择不同的功能。大模型在软件开发中的应用与挑战
在讨论大模型应用于软件开发时,提到了在大公司的项目中,通常需要大量的数据来进行训练。
然而,近期越来越多的任务并不依赖于这样的数据集,而是通过自定义额外指标
来全面评估大模型的性能。
此外,还谈到了大模型生成代码的功能性和正确性问题,以及在不同类型的任务中的适用性。
最后,研究人员如何在特定任务中将大模型用于自己的工作。
大模型优化的实践与探索
在大模型中如何处理超参数和优化器。提到了两种方法:
一种是让机器学习模型自动调整; 另一种是通过人工干预来实现优化。同时,还介绍了一篇与提升系列模型相关的研究论文,该论文认为现有的模型已经足够强大,可以通过简单的微调实现更好的效果。
此外,还提到了基于提示学习的通用训练模型,可以根据不同任务进行微调。
9.结论和未来方向
深入探索LLMs在软件工程中的多维应用
在本研究的结尾,深入分析了大型语言模型(LLMs)在软件工程(SE)中的广泛应用。通过对软件开发生命周期的六个阶段进行彻底的探讨,总结出了LLMs可以应用于55个不同的SE任务。这些发现不仅揭示了LLMs在当前软件工程领域的多样化应用,而且为未来的研究提供了新的视角和思考。
指出研究的贡献和未来研究方向
研究强调了LLMs在解决软件工程任务中的实际效果和潜在贡献。通过对四个关键研究问题(RQs)的回答,不仅提出了现有研究中的不足和挑战,还指出了未来研究可能的方向。特别是,鼓励未来的研究更加关注纯解码器LLM架构的应用,并探讨工业数据集在缩小学术研究和现实世界应用之间差距的潜力。
快速发展领域的深入研究
对这一快速发展的领域进行更多的研究。随着LLMs技术的不断进步和软件工程领域需求的日益增长,认为探索LLMs在实际应用中的更多可能性至关重要。期望本文的发现能够激发更多创新思考,并为未来的研究和实践提供坚实的基础。