在 RAG 系统中,检索环节的好坏直接决定了整个回答质量的下限。如果检索无法召回正确的文档片段,后续生成无论多强都无法给出准确答案。本节聚焦于实践中经过验证的检索性能优化方法,从索引构建、查询处理、多路召回到排序精排,逐层提升检索命中率和相关性。
16.1.1 明确优化目标:召回率与精确率的平衡
在动手优化前,需要先明确当前系统的瓶颈是什么。通常用两个指标衡量检索质量:
- 召回率(Recall):相关片段中有多少被检索到。召回率不足时,答案缺失关键信息,容易导致“答非所问”或“不知道”。
- 精确率(Precision):检索到的片段中有多少是真正相关的。精确率不足时,噪声信息会干扰模型,稀释有效内容,甚至引发幻觉。
实践中,RAG 系统往往优先保证召回率(宁可多召回一些,也不漏掉关键片段),再通过重排序等手段提升精确率。
16.1.2 索引端优化:从源头提升匹配质量
索引的质量决定了检索的天花板。以下几个方面值得优先关注:
1. 合理的文档切分策略
切分方式直接影响检索粒度。过大的 chunk 包含过多内容,检索相关性被稀释;过小的 chunk 则可能丢失必要上下文,导致信息碎片化。
- 按语义边界切分:尽量以段落、小节等自然边界分割,避免在句子中间截断。
- 设置合理的大小范围:常见区间为 256~1024 个 token,具体取决于文档类型。技术文档偏短,政策文件可稍长。
- 引入重叠(overlap):相邻 chunk 保留约 10%~20% 的重叠文本,防止关键信息恰好落在切割边界上而被割裂。
- 保留层级元数据:在 chunk 的元数据中记录所属文档标题、章节号等,便于后续过滤和溯源。
2. 嵌入模型的选择与微调
通用嵌入模型虽然开箱即用,但在垂直领域往往表现不佳。优化方向包括:
- 选用高质量的开源嵌入模型:如 BGE、E5、text2vec 等中文友好的模型,在中文语料上的检索效果明显优于早期多语言模型。
- 领域微调:若拥有足够的查询-文档对数据(如历史问答日志),可以对嵌入模型进行微调,让向量空间更贴合业务语义。
- 模型版本管理:升级嵌入模型时,需全量重建索引,避免新旧向量混用导致检索异常。预先评估性能提升与重建成本的平衡。
3. 向量数据库的配置优化
- 索引算法选择:根据数据规模在精度与速度之间取舍。小规模(<10 万 chunk)可用精确检索(如 FLAT),大规模用近似最近邻(如 HNSW、IVF),并调整 ef_search、nprobe 等参数。
- 分片与副本:高并发场景下合理配置分片数,提升并行检索能力。
- 属性过滤前置:对于需要按文档类型、时间范围过滤的查询,利用向量数据库的标量过滤能力,先缩小候选集再向量检索,大幅减少无效计算。
16.1.3 查询端优化:让问题表述更易于检索
用户原始提问往往口语化、不完整,甚至包含错别字,直接向量检索效果不佳。可在查询进入检索引擎前进行预处理:
1. 查询重写(Query Rewriting)
用轻量级规则或小模型对原始问题改写,提升召回率:
- 补全与消歧:将“年假几天?”改写为“公司员工每年可享受的年假天数是多少?”
- 专业术语映射:将口语表达转为文档中使用的术语,如“打车报销”映射为“市内交通费报销政策”。
- 使用 LLM 辅助改写:通过提示词让模型在不改变原意的前提下,生成更完整、更接近文档表述风格的检索查询。需注意延迟和成本,一般使用小模型或缓存常见改写。
2. 多查询生成(Multi-Query)
对同一个问题生成多个变体查询(如同义词替换、从不同角度提问),分别检索后合并结果。有效提升召回,尤其在信息分散在不同表述中的场景。可设置生成 2~3 个变体,避免过多拖慢响应。
3. 混合查询:结合关键词检索
纯向量检索擅长语义匹配,但对精确关键词(如产品型号、条款编号)可能不够敏感。引入关键词检索(如 BM25)作为补充,形成混合召回:
- 全文索引:在 Elasticsearch 或向量数据库内置的全文索引上建立关键词倒排索引。
- 融合策略:向量召回 top-k,关键词召回 top-k,合并去重后共同进入重排序。常用融合算法如 RRF(倒数排列融合),简单有效,无需调权。
16.1.4 检索后重排序:将最相关片段提到最前面
即使多路召回,送入模型的上下文顺序也很重要。模型倾向于更关注靠前的内容,因此需要将最相关的片段排序。
1. 重排序模型(Reranker)
使用专门的交叉编码器模型(如 Cohere Rerank、bge-reranker)对候选片段逐一与问题计算相关性分数,精度远高于双编码器的向量相似度。流程:
- 粗排:用向量/关键词检索召回 top-n(如 50~100 个片段)。
- 精排:用 Reranker 对 top-n 逐个打分,保留 top-k(如 5~10 个)送入生成。
- 注意权衡:Reranker 延迟随 n 线性增长,需在效果和耗时间折中。
2. 规则辅助排序
在特定领域可叠加简单规则:
- 来源权威性加权:优先展示来自核心政策文件而非会议纪要的片段。
- 时效性衰减:对较旧文档片段降权,除非用户明确要求历史信息。
- 上下文完整性:尝试将相邻 chunk 的信息合并,避免孤立的片段因缺少上下文而被低估。
16.1.5 缓存与预加载:降低延迟,提升吞吐
检索并非每次都需要完整执行。合理利用缓存可大幅降低响应时间:
- 热门问题缓存:将高频查询及其检索结果(甚至最终回答)缓存,设置合理过期时间。命中缓存后直接跳过检索和生成,延迟降至毫秒级。
- 语义缓存:不限于精确匹配问题文本,对语义相似度高的问题(向量相似度 >0.95)也视为命中,扩大缓存受益范围。
- 预热机制:对于可预见的查询(如新产品上市相关的常见问题),提前检索并缓存,上线即快。
16.1.6 实际优化路径建议
检索优化是持续迭代的过程,建议按以下步骤推进:
- 建立评测集:收集真实用户问题,并人工标注期望的参考文档片段。这是所有优化的客观基准。
- 基线评测:跑出当前系统的召回率、精确率,定位短板。
- 单点优化:依次尝试切分策略调整、查询重写、混合检索、Reranker,每次只改一个变量,记录指标变化。
- 端到端验证:最后用生成质量评估(如人工抽检或自动化评分)确认检索改善确实带来了更好的回答。
检索性能优化的核心在于:理解用户会怎么问、文档是怎样写的,然后用组合拳让两者在检索空间中尽可能精准地相遇。没有一套参数适应所有场景,但上述方法覆盖了大多数实践中行之有效的改进方向。