Page 87 - 《软件学报》2025年第4期
P. 87

香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述                                                     1493


                 定的所有前缀预测下一个标记. 这种遵从先后顺序的预测方式使这类模型特别适合于文本生成任务. 近期, 解码器
                 模型如   CodeX [39] 和  ChatGPT [40] 在代码任务和文本生成任务上的优异表现, 吸引了诸多研究者的兴趣.
                    (2) 编码器模型: 这类模型只使用编码器组件来生成输入的编码表示. BERT                   [15] 是典型的编码器架构模型. 它采
                 用了一种被称为掩码语言模型           (masked language model, MLM) 的预训练机制. 在掩码语言模型中, 训练数据中的
                 一部分标记     (例如  15%) 会被随机遮蔽, 然后模型的任务是利用该标记前后的上下文信息来预测这个被遮蔽的
                 标记. 由于能同时考虑标记的前后上下文, 相较于单向模型, 编码器模型在理解和生成复杂句子结构方面具有一定
                 优势.
                    (3) 编码器-解码器模型: 这类模型结合了上述两类模型的特点, 它们由一个编码器和一个解码器组成. 编码器
                 用于理解输入的上下文, 而解码器则用于生成输出. T5              [41] 和  BART [42] 是这类模型的典型代表. 这类模型通常采用一
                 种被称为掩码范围预测        (masked span prediction, MSP) 的预训练机制. 掩码范围预测机制与掩码语言模型类似, 但
                 该机制会使用一个范围标记替换一个连续的标记序列, 而不是遮蔽个别的标记, 而模型的任务是根据范围标记的
                 上下文信息恢复被替换的标记序列. 编码器-解码器模型结合了上述两种模型的特点, 可以利用上下文信息进行文
                 本生成任务.
                 问题, 对于不依赖推理的任务使用思维链提示可能效果不佳.

                                                                 <掩码>: int i = 0; i < arr.length; i++
                                          i < arr.length  <掩码>: i < arr.length  解码器
                                           解码器           编码器          编码器
                                          ...        ...              ...
                                          for(int i = 0;  for(int i = 0; <掩码>; i++){  for(<掩码>){
                                                       ...             ...
                                         (a) 仅解码器     (b) 仅编码器    (c) 编码器-解码器
                                                 图 3 大语言模型的      3  种架构

                    进而, 研究人员尝试将模型应用在下游任务中               [43,44] , 常见的方法是通过微调  (通过在下游任务上进一步训练来
                 更新预训练模型的参数) 或提示          (将任务描述、示范或中间步骤以自然语言的形式表达) 增强其处理特定任务的
                 能力. 如图   4  所示, 以大模型应用于软件缺陷自动修复任务为例: 图               4(a) 使用任务描述和修复样例对模型进行微
                 调, 首先使模型理解和熟悉缺陷修复任务, 然后将待修复的缺陷代码输入至微调后的大模型, 即可使模型生成对应
                 的补丁代码; 图    4(b) 将任务描述、修复样例和缺陷代码组成输入大模型的提示词, 从而使模型理解修复任务, 进
                 而生成补丁代码. 具体而言, 微调是使用少量格式化实例对已完成预训练的模型进行受监督训练的过程. 当对模型
                 进行微调时, 输入的指令包括任务描述和输入输出的实例. 微调能够增强各种规模的语言模型处理特定任务的能
                 力, 经过微调的较小模型甚至可以比未经微调的较大模型表现得更好                       [45] . 早期将大模型应用于单元测试和软件修
                 复等软工任务时, 微调技术被大量应用以增强模型的表现. 然而微调可能依赖数据集的质量和数量, 以及需要面对
                 在微调数据集上过拟合的风险等问题. 在经过预训练或者微调后, 使用大模型的主要方法是为解决各种任务设计
                 适当的提示    (prompt) [46,47] . 目前主要的提示策略有两种: 上下文学习和思维链提示         [48] , 具体如下.
                    (1) 上下文学习是一种无需进一步训练就能直接将大模型用于下游任务的方法. 上下文学习使用一种由任务
                 描述和几个用于示范的任务样例构成的自然语言提示. 首先, 以任务描述为开始, 从任务数据集中选择一些样例作
                 为示范. 然后, 以特别设计的模板格式将它们按照特定的顺序组合成自然语言提示. 最后, 将待解决的任务添加到
                 输入中以生成输出. 根据任务示范, 模型可以在没有更改参数权重的情况下理解和执行新任务.
                    (2) 思维链提示旨在提高大模型在复杂推理任务中的性能, 例如算术推理、常识推理等任务. 不同于上下文学
                 习中仅使用输入输出对来构造提示, 思维链提示可以将中间推理步骤纳入提示中. 然而, 思维链提示主要解决推理

                    目前, 研究人员通过向模型提供任务的自然语言描述, 并尝试使用上下文学习方法提供相关任务示例, 已成功
                 将提示策略应用于如代码补全和代码修复              [49] 等任务.
                    基于此, 我们将介绍近期大模型发展中有广泛影响和优异表现的模型, 并且这些模型已经被应用于各种软件
                 工程下游任务上. 2021    年  8  月, OpenAI 推出了名为  CodeX [39] 的代码大模型, 它是一款专门为编程任务设计的大语
   82   83   84   85   86   87   88   89   90   91   92