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

1326                                                       软件学报  2026  年第  37  卷第  3  期


                                                                                     更新参数


                                       检索模块                                生成模块
                                                        Top-k
                                      检索Top-k
                                Retrieval     相似度分数s i  示例 {r i }  拼接   Generation
                                encoder                                  encoder     Loss 1      Loss
                                       r 1 , r 2 ,..., r k  查询向量v
                                                                        Generation
                   原始输入x                                                 encoder    生成损失      联合优化模块
                                           检索库 (示例库)
                                                                         输出y
                                                                  更新参数
                                                    图 7 联合训练示例      [70]

                  4.4   研究问题  2  结论
                    本节系统梳理了 RAG 框架中检索器与生成器的设计与集成策略. 首先, 在检索器层面, 稀疏检索侧重关键
                 词匹配的高效性, 密集检索强化了语义建模能力, 混合检索兼顾两者优势, 并结合对比学习与强化学习等方法, 提
                 升了检索结果的精度与多样性. 其次, 在生成器层面, 根据是否微调模型参数, 可分为参数微调式                              (如 CodeT5、
                 PLBART) 与参数冻结式     (如 GPT-4、CodeLLaMA) 两类模型, 分别适用于不同计算资源和部署需求的场景. 最后,
                 在模块集成策略上, 从轻量级的提示工程, 到架构层的模型融合, 再到优化级的联合训练与迭代交互机制, 各类策
                 略展现出不同的适配性与工程效果. 这些进展共同推动了 RAG 在软件工程任务中的高效落地与持续演化.

                  5   研究问题  3: RAG  在软件工程中的主要应用领域是什么?

                    本节在分析了所有收集的论文后, 总结了现有               RAG  在软件工程的应用涉及的下游任务. 同时为了进一步补充
                 研究问题   1  中对文献趋势的时间分析, 我们在后文图            8  中展示了  2021–2024  年间  RAG  方法在各类软件工程任务
                 中的应用频次变化情况. 从后文图           8  中可以看出, 早期研究主要聚焦于代码生成与代码摘要等基础任务, 而近年
                 来, 随着大模型能力的提升和         RAG  框架的完善, 其应用逐步拓展到程序修复、测试生成、日志生成                    [71] 等更复杂、
                 更具工程意义的任务中, 反映出          RAG  技术在软件工程中的研究热点正在不断外延与深化. 下面将对不同软工阶段
                 的部分典型任务进行具体介绍.
                  5.1   软件开发
                    软件开发是一项创造性的过程, 涉及使用计算机编程语言、工具和技术, 将用户需求、功能需求和性能需求
                 转化为计算机程序.
                    (1) 代码生成
                    RAG  在代码生成中的应用主要通过引入外部知识资源                 (如代码示例、API 文档、库信息等) 作为输入, 传递
                 给生成器, 生成器再基于大规模预训练模型在检索器提供的上下文基础上实现代码生成                                 [72–75] . 如图  9  所示,
                 CodeRAG-Bench [46] 将代码生成任务划分为    4  大类共  8  种任务, 包括基础编程任务、开放域任务、仓库级任务和代
                 码检索任务, 并集成了      5 种文档检索来源     (如编程解决方案、库文档、GitHub 等). 通过结合           9k 编程问题和   2 500 万
                                                              [29]          [25]      [26]
                 检索文档, 提供可复现的检索和执行评估方法. REDCODER                、ACECODER     和  SkCoder  等工作利用检索到的
                 代码示例丰富上下文信息, 帮助模型更好地理解任务需求, 减少生成错误. ACECODER                       采用引导式生成策略, 让生
                 成器在生成代码前先生成测试用例, 明确需求. SkCoder 通过提取代码草图, 模仿开发者的代码重用行为, 为生成
                 器提供代码结构的模板. 其次, RAG 通过检索 API 文档和信息, 帮助生成器生成正确调用                      API 的代码. Zan  等人  [76]
                 设计了   APIRetriever 和 APICoder 模块, 专注于私有库的   API 文档检索, 指导生成器生成正确调用私有             API 的代
                 码, 弥补了模型对未见过的私有库           API 不了解的缺陷, 提高了代码生成的实用性. ToolCoder          [77] 将  API 搜索工具集
   358   359   360   361   362   363   364   365   366   367   368