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

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


                 关的上下文信息, 而生成器则在此基础上结合用户需求, 输出符合语义和功能要求的代码、修复建议或其他任务
                 结果. 本节将围绕 RAG 框架中的关键模块展开系统梳理: 首先介绍不同类型检索器的实现机制与核心组件, 包括
                 稀疏、密集、混合等主流检索方法及其适配场景; 随后探讨基于不同训练策略的生成器实现; 最后总结检索与生
                 成在 RAG 框架下的典型集成方法, 为后续研究和实际应用提供系统参考.
                  4.1   检索器组件
                    检索器从外部知识库中提取与输入查询相关的信息, 它们通常基于输入与候选信息之间的相似度进行相关性
                 匹配. 根据其底层的信息表示方式和相似度计算机制, 当前主流的检索器可划分为                         3  类: 稀疏检索器、密集检索器
                 和混合检索器. 本节将从类型视角出发, 系统梳理这               3  类检索器的核心机制与适用场景.
                  4.1.1    稀疏检索器
                    稀疏检索器利用传统的信息检索方法, 通过显式词项统计特征进行相关性评估, 而不依赖于深层语义表示. 通
                 常来说, 首先在离线阶段, 对文档集合进行分词和规范化处理, 并建立词项的倒排索引, 记录每个词项在各文档中
                 的出现位置和频率; 随后在在线阶段, 用户输入的查询将被解析为一组关键词, 检索器根据这些关键词在索引中检
                 索相关文档, 并结合相关性函数 (例如           Jaccard  距离) 对候选文档进行打分排序. 在当前软件工程研究中, BM25             是
                 使用最为广泛的稀疏检索策略           [25–27] , 该策略使用词袋模型, 通过评估查询词在文档中的出现频率、文档长度以及
                 词项的逆文档频率等因素来衡量文档与查询的相关性. 在检索器中, 首先对整个文档集合构建倒排索引, 记录每个
                 词项在各个文档中的出现位置和频率. 用户提交查询后, 系统解析查询词并利用                         BM25  算法计算每个文档与查询
                 之间的相关性得分. 具体而言, BM25         会根据查询词在文档中的频次           (词频)、文档的长度以及词项在整个文档集
                 中的普遍性    (逆文档频率) 来调整得分, 从而减少常见词对得分的影响. 最后, 系统根据这些得分对文档进行排序,
                 返回与查询最相关的文档列表. 由于其实现简单、计算效率高, 稀疏检索器广泛应用于轻量级查询或资源受限的
                 检索任务中. 但由于不具备语义建模能力, 它们通常难以识别语义相近但词汇不同的查询表达.
                  4.1.2    密集检索器
                    密集检索利用模型编码器          (如  CodeBERT [28–33] 、GraphCodeBERT [34] 和  UniXcoder [35–38] ) 将查询和文档编码成
                 高维向量表示, 这些向量能够捕捉文本的深层语义信息. 通常来说, 首先使用编码器模型对代码文档进行向量化处
                 理, 并将这些向量存储在向量数据库中            [39] ; 随后, 当用户提交查询时, 系统会将查询同样通过编码器转换为向量;
                 同时检索器通过计算查询向量与存储文档向量之间的相似度                      (如余弦相似度) 来评估相关性; 最后根据相似度得
                 分对文档进行排序, 返回与查询语义上最相关的文档列表. 与传统稀疏检索器相比, 密集检索器依赖于编码器对代
                 码或文本的语义建模能力, 能够识别语义相似但词汇不同的查询表达, 因此在处理代码生成、代码搜索与修复等
                 任务中表现出更强的适应性和泛化能力. 例如               RRG [40] 设置了查询编码器和代码库编码器分别将查询和代码库中
                 的每一条文档转化为向量.
                    从检索器优化角度来看, 密集检索器可以进一步细分为两类: 一类采用现成的预训练编码器, 另一类则针对特
                 定任务需求对编码器进行训练优化. 对于第              1  类方法, 研究者直接使用已有的预训练模型作为编码器, 不对模型参
                 数进行微调或额外训练. 这类检索器主要依赖于自监督学习方法, 从大规模的代码语料库中学习代码的语义表征,
                 适用于通用的语义匹配场景. 例如          CodeT5  或  GraphCodeBERT  被广泛用于编码代码片段. 第     2  类方法则通过特定
                 的训练策略对编码器进行针对性的适配, 以提升向量表示的语义判别能力. 对比学习是一种常用的密集检索器训
                 练策略, 该策略通过构造正负样本对, 引导编码器学习将语义相似的查询和文档映射到相近的向量空间, 同时将不
                 相关的样本推远, 从而增强语义建模效果. 例如              RAP-Gen [41] 通过设计功能相近与无关的代码片段对, 结合 CodeT5
                 编码器进行对比学习训练, 显著提升了编码器在补丁代码语义层面的感知能力. ReACC                         [42] 框架展示了如何通过结
                 合代码的多种表示形式        (如代码文本、AST      等) 来丰富代码的语义建模. 这种多模态融合方法有助于从不同角度
                 捕获代码的语义特征, 提高了模型在处理复杂代码结构时的准确性和鲁棒性.
                    除对比学习之外, 也有研究采用强化学习方法对密集检索器进行动态优化. 强化学习优化检索使用强化学习
                 方法训练检索器, 使其能够学习最有效的检索策略, 优化检索器的性能. 该方法的具体结构包括: 首先, 建立强化学
   354   355   356   357   358   359   360   361   362   363   364