在实际的 RAG 系统中,单靠一种检索方式往往难以全面覆盖用户问题的多样性。不同的问题类型、表达习惯和知识结构,对检索策略的要求并不相同。多路召回(Multi‑channel Retrieval)就是通过同时运行多个检索器,从不同角度捕获相关文档,再将各路的召回结果合并,得到更完整、更精准的候选集。
8.4.1 为什么单路召回不够
以最常用的向量相似度检索为例,它擅长捕捉语义相近的内容,但也有明显短板:
- 对于精确的关键词匹配(如产品型号、法规编号、专有术语),向量检索可能因为少见词在嵌入空间中表示较弱而漏掉相关内容。
- 用户提问中的模糊表达或同义词,容易导致向量匹配的歧义。
- 某些结构化信息(如时间范围、数值过滤)单纯靠向量难以处理。
如果只依赖一种检索方式,召回的结果很容易在某一类问题上出现系统性盲区。
8.4.2 常见的多路召回策略
根据不同的知识特性和业务需求,可以组合以下检索策略:
1. 向量语义召回
将问题和文档片段分别编码为向量,通过余弦相似度等度量找出最相关的 top‑k。适合捕获换一种说法但意思相同的匹配,是 RAG 中最基础的一路。
2. 关键词倒排索引召回(BM25)
基于分词后的词频和逆文档频率进行匹配,对专有名词、数字、低频术语等精确查找非常有效。直接使用 Elasticsearch 或类似的全文检索引擎即可实现。向量召回可能漏掉的精确型号如“XPS‑15‑9520”,关键词检索能准确命中。
3. 元数据过滤
在知识入库时标记每个片段的属性,比如文档类型、创建时间、适用部门等。检索时基于这些条件做前置或后置过滤,大幅缩小检索范围,提高精度。例如用户问“最新的报销流程”,可以先限定文档时间在近半年内,再进行语义检索。
4. 问题–问题相似召回
维护一个包含历史高频问题及其对应答案引用的向量库,当新用户提问时,先检索最相似的历史问题,再返回那些问题对应的文档片段。这种方式尤其适合 FAQ 场景,能快速匹配已有标准问法。
5. 父文档/子文档召回
对于长文档,可以同时索引摘要(父文档)和详细段落(子文档),用小粒度片段做精确匹配,用大粒度上下文补充信息,避免切分导致的信息割裂。
8.4.3 多路结果的合并排序
多路召回后,不同的路径返回各自的一组结果,每路结果的得分分布和量纲可能完全不同,直接拼接会出现排序混乱。常用的合并策略有:
- 分数归一化后加权求和
对每路召回的分数进行最大最小归一化或 Z‑score 归一化,然后根据各路的重要性加权合并。例如:最终分数 = 0.4 × 语义归一化分 + 0.3 × 关键词归一化分 + 0.3 × 时间衰减因子。
- 倒数排名融合(Reciprocal Rank Fusion, RRF)
不依赖原始分数,只依据各片段在不同路中的排名计算一个融合得分。公式为:RRF得分 = Σ ( 1 / (k + rank_i) )
其中 rank_i 是片段在第 i 路中的排名,k 是一个常数(通常取 60)。这种方法实现简单、鲁棒性强,特别适合各路得分不可比或得分置信度差异大的情况。
- 基于精排模型的二次排序
将多路召回的候选去重后得到一个较大集合(比如 50~100 条),再使用一个小型、快速的交叉编码器或轻量分类器重新打分排序,选出最终的 top‑k 送入生成模型。这种方式能更好地理解问题与片段的深层语义关系,但推理开销较大,需要在效果与延迟间做权衡。
8.4.4 实践中的一些建议
- 从问题出发设计召回通道。先收集一批真实用户问题,分析哪些问题被漏召回了,再有针对性地增加新的召回策略,而不是一开始就堆砌多种方法。
- 控制每路召回的数量。不必每路都召回很多结果,语义和关键词通常 10~20 条即可,各类的总候选集经去重后控制在 20~50 条左右,质量与效率均衡。
- 记录召回来源以便调优。在日志中保留每条候选片段来自哪路召回、原始得分和排名,后续发现问题时能快速定位是某一通路失效还是合并逻辑不合理。
- 对时效性资料加入时间权重。在加权求和或 RRF 前,对更新越新的文档赋予轻微加成,让系统更倾向给出最新政策或公告,避免旧版本文档干扰。
多路召回是 RAG 系统中从“能搜到”到“能搜全、搜准”的关键一步。通过合理搭配不同的检索策略并在合并排序上花一些心思,能在不显著增加复杂度的前提下,大幅提升最终回答的质量和覆盖面。