RAG 检索算法 Hybrid search(混合检索)
Hybrid Search(混合检索) 是将关键词检索(如 BM25)与向量语义检索进行结合的召回策略。
工具:elasticsearch、Milvus
关键词检索和向量检索的优缺点
- 关键词检索(稀疏检索):基于词频 / 逆文档频率(如 BM25、TF-IDF),擅长精确匹配(实体、代码、术语、缩写),但对同义改写、语义泛化不敏感。
- 向量检索(稠密检索):将文本转为向量,通过相似度(余弦 / 内积)匹配,擅长语义理解(同义、近义、概念关联),但对精确关键词、专业术语可能 “跑偏”。
- 混合检索:并行执行两种检索,再通过融合 / 重排得到综合结果,兼顾 “字面对齐” 与 “语义对齐”,尤其适合专业文档、代码库、知识库等场景。
工作流程
- 查询分发:用户 Query 同时送入关键词引擎库(如 Elasticsearch)与向量库(如 Milvus/FAISS)。
- 并行召回
- 稀疏:BM25 召回 Top-K 关键词匹配片段
- 稠密:向量相似度召回 Top-K 语义相似片段
- 结果融合:归一化分数 / 按排名融合(如 RRF),去重、重排得到最终 Top-K
- 送入 LLM:用融合后的上下文生成答案,减少幻觉、提升忠实度
Hybrid Search(混合检索)
- 优势
- 提升召回率:覆盖精确匹配 + 语义泛化
- 抗噪声:减少单一检索的偏差(如向量检索 “跑偏”、关键词检索 “死板”)
- 适配专业场景:代码、术语、实体、缩写、法律 / 医疗文档效果显著
- 适用
- 知识库问答、技术文档检索、代码检索、多源异构数据检索
- 对 “精确命中” 与 “语义理解” 都有要求的业务
融合策略
1. 加权分数融合(Weighted Sum)
- 公式:
Score = α·S_sparse + (1−α)·S_dense - α 控制关键词 / 语义权重(如技术文档 α 偏大,对话场景偏小)
- 需先归一化分数到同一区间(如 0–1),再加权求和排序
2. reciprocal Rank Fusion(RRF,无监督融合)
- 不依赖分数,只看排名:
RRF(d) = Σ 1/(k + rank_i(d))(k 常取 60) - 优点:规避分数归一化难题,鲁棒性强,工业界常用
工业中常用 RRF进行排名混合:
模拟 RAG 中的「BM25 关键词检索」和「向量语义检索」两个结果,演示 RRF 如何融合。
步骤 1:准备两个检索器的返回结果
假设用户查询「Python 如何实现混合检索」,两个检索器各返回 Top 4 文档(用 D1、D2、D3、D4、D5 代表不同文档片段),括号内是本地排名(从 0 开始):
- 检索器 A(BM25)结果:[D1 (0), D3 (1), D5 (2), D2 (3)] (D1 排名最前,相关性最高)
- 检索器 B(向量)结果:[D2 (0), D1 (1), D4 (2), D3 (3)] (D2 排名最前,相关性最高)
平滑系数
k=60(固定不变)。步骤 2:逐个文档计算 RRF 总得分
我们遍历所有出现过的文档(D1、D2、D3、D4、D5),分别计算得分:
- D1:在 A 中排名 0,在 B 中排名 1
得分 = 1/(60+0) + 1/(60+1) = 1/60 + 1/61 ≈ 0.01667 + 0.01639 ≈ 0.03306 - D2:在 A 中排名 3,在 B 中排名 0
得分 = 1/(60+3) + 1/(60+0) = 1/63 + 1/60 ≈ 0.01587 + 0.01667 ≈ 0.03254 - D3:在 A 中排名 1,在 B 中排名 3
得分 = 1/(60+1) + 1/(60+3) = 1/61 + 1/63 ≈ 0.01639 + 0.01587 ≈ 0.03226

浙公网安备 33010602011771号