Page 254 - 《软件学报》2026年第4期
P. 254

汪莹 等: 基于大语言模型的故障复现测试用例生成方法                                                      1695


                 助大语言模型理解和定位问题报告中的问题. 然而, 这些方法并不专注于生成故障复现测试用例, 它们的目标仅是
                 复现问题报告中的问题, 而非生成故障复现测试用例以验证问题的解决.
                    相比于上述基于大语言模型的故障复现测试用例生成方法, 本文方法具有以下创新之处.
                    (1) 本文工作聚焦于     GitHub  问题报告的故障复现测试用例生成问题, 与传统的单元测试和回归测试不同, 本
                 文工作关注的问题涉及更长的上下文, 需要对问题报告及其所在代码仓库有更深入的理解, 更具有挑战性.
                    (2) 本文方法不依赖于问题报告中的错误栈信息, 而是仅将错误栈视为潜在原因, 辅助大语言模型定位故障问
                 题发生的原因, 为生成测试用例提供支持.
                    (3) 本文方法并非在     prompt 中提供简单、固定的指令或输入输出示例, 而是通过检索增强生成技术, 获取与
                 给定问题报告相关的多元上下文信息             (报错根函数、import 语句、测试用例样本), 帮助大语言模型更好地理解问
                 题报告的项目背景和相关测试用例特征, 从而生成更加有效且贴合实际的故障复现测试用例.
                    (4) 相较于  Agent 框架中智能代理生成的故障复现代码, 本文方法不仅关注如何复现问题报告中的问题, 还要
                 求大语言模型通过生成的测试用例验证问题是否已被有效修复, 从而提高修复的准确性和测试用例的实用性.
                  1.2.2    大语言模型在代码方面的应用
                    近年来, 随着    AI 领域和算力的快速发展, 以        ChatGPT [23] 为代表的大语言模型经过大规模语料的训练, 掌握了
                 各个领域的基础知识, 使其能够出色地完成许多自然语言任务. 这一进展也吸引了大量研究者将大语言模型应用
                 于代码相关任务中.
                    在代码生成任务方面, 许多方法通过对已有模型进行微调, 得到了更为优秀的模型. 例如, Li 等人                            [24] 通过在
                 Python  数据上微调  StarCoderBase 模型, 生成了  StarCoder 模型, 该模型在  Python  代码生成任务上表现出色, 并且
                 支持多种编程语言. Luo      等人  [25] 则采用了  Evol-Instruct 方法, 将复杂指令微调引入代码领域, 训练出       WizardCoder
                 模型, 显著提升了其对指令的理解能力和代码生成效果. Fried 等人               [26] 则提出了一种将因果语言建模        (causal language
                 modeling) 和掩码语言建模    (masked language modeling) 相结合的训练方法, 采用因果掩码     (causal masking) 的方法
                 生成了   InCoder 模型, 使得模型具备了同时进行代码生成和代码填充的能力.
                    在程序修复任务方面, 研究者们也提出了不少创新方法. Jin                 等人  [27] 提出的  InferFix  方法, 将大语言模型在有
                 监督程序修复数据上进行微调, 并结合             few-shot 技术和静态分析技术, 开发了一种端到端的程序修复解决方案.
                 Xia 等人  [28] 提出了  ChatRepair 方法, 通过先将测试失败的信息提供给大语言模型, 并利用之前修补类似错误的失
                 败或成功案例进行学习, 以对话方式实现程序修复. 通过这些方法的不断改进, 大语言模型在程序修复任务中的表
                 现得到了显著提升.
                  1.2.3    检索增强生成
                    检索增强生成      (retrieval-augmented generation, RAG) 是当前热门的大语言模型前沿技术之一, 旨在提升生成
                 模型的能力与准确性. 该方法结合信息检索和生成模型的技术, 通过在生成过程中引入外部知识库或文档, 提供更
                 丰富的上下文信息, 从而丰富大语言模型的知识基础. 这种策略有效改善了模型在特定任务中的表现, 使其在处理
                 复杂问题时更具优势.
                    2020  年, Lewis 等人  [29] 首次提出了检索增强生成    (RAG) 框架, 将信息检索与序列生成相结合. 该方法先检索
                 与输入相关的文档, 然后将这些文档与输入一起输入到生成模型中, 有效扩展了模型的知识范围, 提高了回答的准
                 确性和多样性. 近年来, 许多研究者在软件工程领域将检索增强生成技术应用于代码相关任务. Zhou                             等人  [30] 提出
                 了  DocPrompting  方法, 给定自然语言描述意图, 通过检索器从文档池中获取相关文档, 并利用这些文档与意图一
                 起生成代码, 从而提高代码生成效果. Lu          等人  [31] 提出了基于检索增强生成的代码补全框架            ReACC, 该框架由源代
                 码检索器和自回归语言模型组成. ReACC           在给定待补全代码片段时, 首先结合余弦相似度和                 BM25  算法, 从源代
                 码数据库中检索语义相似的代码, 并将其与待补全代码拼接, 生成完整代码. Zhang                      等人  [32] 提出了库级别代码补全
                 框架  RepoCoder, 该框架利用迭代式检索生成范式, 首先使用待补全代码执行检索生成中间补全代码, 然后基于中
                 间结果进行第     2  次检索, 减少了检索上下文和目标代码补全之间的差距, 进一步提高最终代码生成效果. 此外,
                 Luan  等人  [33] 提出了  Aroma 方法, 通过结构化代码搜索进行代码推荐. 该方法首先对包含数千个开源项目的大型
   249   250   251   252   253   254   255   256   257   258   259