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] 根据

