Page 368 - 《软件学报》2026年第3期
P. 368

张犬俊 等: 检索增强生成在软件工程中的应用综述                                                        1331


                    在提升生成器的上下文理解方面, CEDAR            [96] 通过检索最相关的代码示例作为        few-shot 提示, 利用嵌入检索和
                 频率检索策略, 增强了生成器在程序修复任务中的表现. InferFix              [69] 将静态分析工具与    RAG  框架结合, 检索语义相
                 似的修复示例, 生成器利用错误类型和上下文信息, 生成针对关键安全和性能错误的修复代码, 实现了端到端的自
                 动程序修复. 此外, RepoGraph   [50] 构建仓库级代码图, 检索与目标代码相关的上下文和依赖关系, 生成器利用这些
                 信息生成符合仓库整体一致性的修复代码, 解决了复杂的软件工程任务中的自动程序修复问题. RQ-RAG                               [104] 通过
                 学习优化查询, 提升了检索器获取相关上下文的能力, 生成器利用优化后的上下文, 生成更准确的修复代码, 特别
                 适用于处理复杂或模糊的程序错误.
                    (2) 漏洞修复
                    在漏洞修复方面, RAG      的应用主要聚焦于利用模板引导的检索增强生成框架, 从历史漏洞修复数据库中检索
                 相似的修复补丁, 为生成器提供上下文支持              [63] . T-RAP  [105] 利用模板引导的检索增强生成框架, 从历史漏洞修复数
                 据库中检索相似的修复补丁, 为生成器提供上下文支持. 生成器基于                     CodeT5  架构, 结合检索到的补丁信息生成精
                 准的修复补丁, 即使在无匹配补丁的情况下, 也能单独生成有效的修复代码. 这种设计通过迁移历史修复经验, 降
                 低了生成器的推理难度, 提高了补丁生成的准确性和多样性.
                    (3) 代码重构
                    在代码重构旨在保持语义不变的前提下, 通过调整代码结构提升程序运行效率. SBLLM                          [106] 将  RAG  和启发式
                 搜索策略结合, 将其引入        LLM  驱动的代码重构流程中. SBLLM        通过执行反馈、模式检索与遗传提示三重机制,
                 协同引导    LLM  进行多轮优化推理与代码演化, 显著提升了最终重构结果的质量与效率. 具体而言, SBLLM                          首先
                 执行反馈驱动的代表性样本选择, 通过运行候选重构代码并评估其正确性, 从多个优化版本中筛选出具备代表性
                 和互补性的样本作为“代表种群”, 引导后续迭代; 随后进行自适应优化模式检索, 基于训练数据构建的模式库, 从
                 中检索出与当前样本相似或互补的重构模式                (例如常见算法替换、API 调用等), 为         LLM  提供语义对照和重构提
                 示; 最后设计遗传操作启发的思维链提示, 融合遗传算法中“交叉”与“变异”思想, 设计结构化多步提示指令, 引导
                 LLM  分析现有重构代码、从而发现潜在优化策略并生成新的重构代码版本.
                  5.4   RAG  应用方式对比分析
                    第  5.1–5.3  节表明, RAG 技术已广泛应用于软件工程各阶段的多类任务. 然而, 由于不同任务的特性存在显著
                 差异, RAG 在具体使用过程中呈现出多样化的融合方式.
                    首先, 相较于自然语言任务, 软件工程任务的输入不仅包括自然语言, 还涉及大量结构化代码与开发文档. 这
                 一特点促使研究者必须设计更具结构意识的建模与检索机制. 代码片段通常包含变量定义、函数调用、控制流与
                 数据依赖等结构信息. 例如, 为了更有效地捕获这些结构关系, 研究人员提出了基于图结构的检索方法, 通过构建
                 代码图   (如 AST、调用图、依赖图), 帮助模型更好地理解代码结构和上下文依赖关系. 这些工作往往首先将代码
                 构建为图结构, 其中节点表示类、函数、变量等语义单元, 边表示调用、继承、依赖等结构关系; 随后使用图数据
                 库  (如 Neo4j) 存储与查询代码图, 利用图查询语言         (如 Cypher) 提取与任务相关的子图上下文; 最后将图结构转化
                 为向量表示, 与向量数据库结合实现结构-语义双重检索. 该类方法广泛应用于结构依赖显著的任务, 如仓库级代
                 码补全和代码生成. 比如, LightRAG      [107] 引入图结构与向量检索的融合机制, GraphCoder      [81] 构建代码上下文图并基
                 于其实现粗到细的多层级检索, CodexGraph         [53] 利用代码图数据库实现结构感知的精确检索, RepoGraph           [50] 则将仓
                 库级结构信息与 LLM 融合, 提供仓库级别的代码结构信息. 其次, 不同软件工程任务间的差异性也对 RAG 的应
                 用方式产生了直接影响. 不同任务使用的知识来源和检索目标各不相同. 在代码生成中, 常见检索源为 API 文档、
                 项目仓库、代码示例; 而在测试生成和程序修复中, 更依赖历史测试样例或缺陷-修复对等标注语料; Text-to-SQL
                 任务强调结构化表格与 SQL 模板; GUI 测试则因涉及界面控件、用户交互等信息, 常需引入图像元信息或界面布
                 局作为检索输入. 因此, 研究者需依据任务需求灵活调整 RAG 框架的各模块设计. 例如, GUI 任务中可能采用控
                 件识别与布局设计专门的检索策略, 而在代码生成中会考虑                   docstring  和  StackOverflow [108,109] 作为检索查询. 此外,
                 即使在同一类任务中, 不同方法在 RAG 模块上的设计亦存在显著差异. 以代码补全任务为例, RepoCoder                          [35] 根据
   363   364   365   366   367   368   369   370   371   372   373