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

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


                 base  construction,  retrieval,  and  generation,  with  the  future  research  directions  and  potential  development  paths  pointed  out.  Generally,  this
                 study  provides  a  comprehensive  review  of  RAG  research  for  the  software  engineering  community,  aiming  to  help  researchers  have  a
                 systematic understanding of the current achievements and an insight into key problems, and promote the further development of this field.
                 Key words:  retrieval-augmented generation (RAG); software engineering; large language model (LLM)

                  1   引 言

                    软件工程    (software engineering, SE) 是一个至关重要的领域, 专注于系统化且可预测地设计、开发、测试和
                 维护软件系统     [1] . 随着软件在各个行业   (如交通、医疗和教育) 中的基础设施作用日益增强, 软件工程在现代社会中
                 扮演着不可或缺的角色, 可确保软件以系统化、可靠和高效的方式构建                       [2] . 作为一个非常活跃的研究方向, 软件工
                 程已经得到了广泛的研究, 并且长期以来一直受到学术界和工业界的关注                        [3,4] . 近年来, 预训练语言模型  (pre-trained
                 language model, PLM) 和大语言模型   (large language model, LLM) 的出现进一步推动软件工程的发展. 诸如
                      [5]
                                   [7]
                            [6]
                 BERT 、T5 和     GPT 等模型通过在大规模未标注数据上的自监督训练, 成功地在自然语言处理                             (natural
                 language processing, NLP) 领域解决了多种复杂任务, 并在代码理解、代码生成和程序修复等方面展现出了强大的
                 潜力. 以  ChatGPT  为代表的新一代    LLM  凭借超大规模参数量, 为自动化处理代码相关任务带来了新的机遇. 然而,
                 软件工程流程本身具有较高的复杂度, 包括软件开发、测试和维护等多个环节. 而检索增强生成                             (retrieval-augmented
                 generation, RAG) 框架的提出, 为在软件工程领域高效利用         PLM  和  LLM  提供了一条新路径.
                    在软件工程领域使用的         RAG  框架是一种结合信息检索与代码生成的混合范式, 专门用于提升代码生成和修
                 复的能力. 如图    1  所示, RAG  框架通过两个主要模块协同工作: 检索器模块             (retriever) 通过查询相关的代码库或文
                 档, 获取与当前任务相关的代码片段或文档; 生成器模块                 (generator) 则基于这些检索到的材料生成新的代码片段
                 或修复方案. 具体实现上, 用户输入的自然语言描述、代码片段或两者结合的查询通过分词器进行分词, 并由基
                 于  Transformer 的编码器转化为高维向量表示. 这些向量捕捉了输入的语义和结构信息, 并通过自监督学习方法增
                 强对代码语义的理解. 随后, 检索器利用这些向量在预先构建的向量数据库中执行多种检索方法, 包括稀疏向量检
                                                    [8]
                 索  (如  BM25)、密集向量检索    (如  CodeBERT 编码向量)、混合检索和基于图的检索等, 从庞大的代码库中高效
                 提取相关代码片段或文档. 通过多粒度检索和结果重排序机制, 确保检索结果的相关性与多样性. 检索到的相关信
                 息通过编码器转换为向量, 并与原始查询的向量结合后输入生成器, 生成器采用                          PLM (如  CodeT5 ) 或  LLM (如
                                                                                             [9]
                 Codex [10] ), 通过解码器根据融合后的向量信息生成符合需求的代码或修复建议. 编码器与解码器的深度集成至关
                 重要, 可以通过提示工程       (prompt engineering) 将检索到的代码片段嵌入生成提示中, 或在生成模型内部引入多源
                 注意力机制, 以实现对检索信息的细粒度利用. RAG              模型的优势在于, 通过检索外部知识库, 能够将代码模式、API
                 调用信息、历史修复示例等多源数据灵活整合到代码生成或修复过程中, 显著提升模型在处理复杂或特定场景任
                 务时的表现. 此外, 迭代的检索-生成循环和联合训练方法进一步优化检索与生成的协同效应, 使检索器能够根据
                 生成器的反馈调整检索策略, 确保生成结果的准确性和相关性.

                                            步骤1: 检索器                 步骤2: 生成器





                        输入: 代码查询          代码库     相似代码                                 输出: 最终方案
                                           图 1 基于   RAG  框架的代码检索与生成流程

                    检索增强生成技术在诸多软件工程下游任务中得到广泛应用, 并展现出强大的灵活性和适应性                                 [11–13] . 例如,
                 RAG  在代码生成和补全中       [14–16] , 通过检索外部代码示例、API 文档和库信息, 为生成器提供更丰富的上下文, 帮
                 助模型更好地理解任务需求; 在自动程序修复和漏洞检测与修复中, 通过检索历史修复示例和相关上下文, 增强模
                 型对错误类型和修复模式的理解, 从而提高修复补丁的准确度. 此外, 在代码摘要、Text-to-SQL                        和代码注释生成
   349   350   351   352   353   354   355   356   357   358   359