RAG-02索引召回-Hybrid-RAG

本文属于 RAG 工程框架中的「2 索引与召回」环节,聚焦「Hybrid RAG」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

并行使用 BM25 。Dense 向量检索,再融合去重并重排。

1
2
3
4
5
6
7
flowchart TD
Q[Query] --> S1[BM25]
Q --> S2[Dense Retriever]
S1 --> F[融合/去重]
S2 --> F
F --> RR[Rerank]
RR --> LLM[生成]

优缺。

  • 优点:关键词匹配与语义匹配互补,召回稳定。
  • 缺点:组件增多,线上维护复杂。

性能/资源

  • 相比 Naive 增加一次检索与重排开销。
  • 但质量提升通常“性价比最高”。

应用场景

  • 通用企业知识库、客服检索问答。
  • 多语言、缩写、术语并存语料。

统一合成数据示例

输入数据片段

1
2
3
4
5
6
7
{
"query": "报销 deadline",
"docs": [
{"doc_id": "D01", "text": "出差结束后 30 天内提交报销。"},
{"doc_id": "D04", "text": "deadline 逾期不予报销。"}
]
}

中间结果(BM25 + Dense 融合)

1
2
3
4
5
{
"bm25_top": [{"doc_id": "D04", "score": 9.2}, {"doc_id": "D01", "score": 7.8}],
"dense_top": [{"doc_id": "D01", "score": 0.82}, {"doc_id": "D04", "score": 0.74}],
"fused_top": [{"rank": 1, "doc_id": "D01"}, {"rank": 2, "doc_id": "D04"}]
}

最终生成示例(含引用)

1
2
3
4
5
6
7
{
"answer": "报销需在出差结束后 30 天内提交,逾期不予报销。",
"citations": [
{"doc_id": "D01", "evidence_span": "30 天内提交"},
{"doc_id": "D04", "evidence_span": "逾期不予报销"}
]
}

原始发表与工程实现

  • 代表性原始发表:BM25 + DPR 组合实践 (2009/2020)。
  • 核心解决问题:解决关键词与语义检索互补。
  • 成熟实现工具:Elasticsearch/OpenSearch + 向量库。

详细原理拆解

  • BM25 与 Dense 互补,常用 RRF 融合:RRF(d)=sum_i 1/(k+rank_i(d))。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
def hybrid_retrieve(query, bm25_index, dense_index, fusion):
b_rank = bm25_index.rank(query, top_k=50)
d_rank = dense_index.rank(query, top_k=50)
# Hybrid 的典型落点:两路 rank list 先做并集,再融合(RRF / 加权)
return fusion.merge([b_rank, d_rank])

参数示例

1
2
3
4
5
bm25_top_k: 50
dense_top_k: 50
fusion: RRF
rrf_k: 60
per_channel_timeout_ms: 400

常见失败案例

  • 失败模式 1:英文术语 + 中文法规并存时,BM25 极准、Dense 极泛(或相反),未融合会偏科。
  • 失败模式 2:一路超时返回空列表,未做通道级回退,融合结果被另一路绑架。
  • 失败模式 3:RRF 的 k 与业务列表长度不匹配,融合分数区分度不足

Demo 数据带入计算示例

1
2
3
4
Hybrid 要解决的正是「两路排序不一致」:  
BM25: D1(rank=1), D2(rank=2) —— 关键词命中「deadline」
Dense: D2(rank=1), D1(rank=2) —— 语义更接近「时限」表述
k=60 时 RRF(D1)=RRF(D2)=0.03252 平局;引入第三路或微调 k 后打破平局——体现 **rank 融合**而非单点相似度。
-------------本文结束感谢您的阅读-------------