本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Hybrid RAG」方法。可先阅读 RAG-00.方法概述 再进入本篇。
原理
并行使用 BM25 。Dense 向量检索,再融合去重并重排。
1 | flowchart TD |
优缺。
- 优点:关键词匹配与语义匹配互补,召回稳定。
- 缺点:组件增多,线上维护复杂。
性能/资源
- 相比 Naive 增加一次检索与重排开销。
- 但质量提升通常“性价比最高”。
应用场景
- 通用企业知识库、客服检索问答。
- 多语言、缩写、术语并存语料。
统一合成数据示例
输入数据片段
1 | { |
中间结果(BM25 + Dense 融合)
1 | { |
最终生成示例(含引用)
1 | { |
原始发表与工程实现
- 代表性原始发表:BM25 + DPR 组合实践 (2009/2020)。
- 核心解决问题:解决关键词与语义检索互补。
- 成熟实现工具:Elasticsearch/OpenSearch + 向量库。
详细原理拆解
- BM25 与 Dense 互补,常用 RRF 融合:RRF(d)=sum_i 1/(k+rank_i(d))。
- 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
- 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1 | flowchart LR |
工程落地扩展示例
伪代码
1 | def hybrid_retrieve(query, bm25_index, dense_index, fusion): |
参数示例
1 | bm25_top_k: 50 |
常见失败案例
- 失败模式 1:英文术语 + 中文法规并存时,BM25 极准、Dense 极泛(或相反),未融合会偏科。
- 失败模式 2:一路超时返回空列表,未做通道级回退,融合结果被另一路绑架。
- 失败模式 3:RRF 的 k 与业务列表长度不匹配,融合分数区分度不足。
Demo 数据带入计算示例
1 | Hybrid 要解决的正是「两路排序不一致」: |