什么是 RAG 混合检索?如何实现向量检索和关键词检索结合?
什么是 RAG 混合检索?如何实现向量检索和关键词检索结合?
这道题考的是混合检索的设计思路,看你能不能说清楚"为什么单靠一种检索不够用"以及"怎么把两种检索方式融合起来"。
我从四个方面来讲:为什么需要混合检索、两种检索的核心原理、RRF融合算法、以及完整实现流程。
为什么RAG需要混合检索
先说一个现实问题:单一检索方式有硬伤。
向量检索厉害的地方是语义理解。你输入"电脑开不了机怎么办",它能找到"机器无法启动"、"系统无法开机"这些说法不一样的答案,因为它理解"开不了机"和"无法启动"是一个意思。
但它有个弱点:精确匹配能力差。你搜"ERR_PAYMENT_TIMEOUT",它可能找不到精确的错误码文档,因为这个词太专用了,语义相似度高的其他错误码反而排在前面。
关键词检索正好反过来。它找精确匹配很强,像错误代码、产品型号、人名地名,一搜一个准。但它理解不了语义。"手机充不进电"和"电池不充电"说的是一回事,它搜不到一起。
所以实际场景中,你既需要找精确的东西,又需要找语义相关的东西。混合检索就是把这两种能力结合起来,互补短板。
两种检索方式的核心原理
向量检索:找"意思相近的"
向量检索的核心是把文字转成一组数字(embedding向量),然后在向量空间里找"离得近的"。
举个例子,"苹果"和"Apple"在向量空间里距离很近,因为模型知道它们意思相同。你搜"水果",向量检索能找到所有关于水果的文档,即使文档里没写"水果"这个词。
向量检索适合这些场景:
- 语义查询:"怎么处理客户投诉" → 找到相关的客服话术
- 跨语言查询:用中文embedding搜英文文档
- 同义词替换:"购买"和"下单"能找到同样的商品页面
关键词检索:找"完全一致的"
关键词检索用的是BM25算法,本质上是倒排索引 + TF-IDF变种。
BM25有三个关键机制:
- TF(词频):一个词在文档里出现越多越相关,但出现太多会扣分(防止长文档占优势)
- IDF(逆文档频率):一个词越罕见越有价值,"RAG"比"的"重要得多
- 长度归一化:短文档匹配到关键词更容易被优先推荐
简单说,关键词检索就是数你搜的词在文档里出现了多少次、这个次稀有不稀有。
它擅长的场景:
- 精确匹配:订单号、错误码、缩写词
- 专有名词:Python、MySQL、React
- 人名地名:具体的产品名称
RRF融合算法——解决量纲不一致问题
两种检索方式的结果得分不能直接比较。
向量检索的相似度得分一般是 -1 到 1 之间,或者 0 到 1。BM25得分没有上限,跟文档长度、词频都有关系。这两个分数直接加权融合,等于把公斤和磅混在一起算。
RRF(倒数排名融合) 的思路很聪明:不比较分数,比较排名。
RRF公式:
RRF_score = Σ 1/(k + rank)
其中 k 是默认60,rank是这个结果在某种检索方式里的排名。
举个例子。假设你搜"ERR_PAYMENT_GATEWAY_TIMEOUT":
| 文档 | BM25排名 | 向量排名 |
|---|---|---|
| 错误码文档 | 1 | 6 |
| 网络超时方案 | 8 | 2 |
| 支付失败FAQ | 3 | 10 |
RRF计算(k=60):
- 错误码文档:1/(60+1) + 1/(60+6) = 0.0164 + 0.0152 = 0.0316
- 网络超时方案:1/(60+8) + 1/(60+2) = 0.0147 + 0.0161 = 0.0308
- 支付失败FAQ:1/(60+3) + 1/(60+10) = 0.0159 + 0.0143 = 0.0302
最终排名:错误码文档 > 网络超时方案 > 支付失败FAQ。BM25第1的文档虽然向量检索只排第6,但综合起来还是第一名。
k值怎么调:
- k小(20-30):高排名贡献更大,适合精确匹配优先的场景
- k大(80-100):排名差异被缩小,召回率高,适合语义为主的场景
- 默认60是个平衡值
混合检索的完整实现流程
实际工程中,混合检索分四步走:
第一步:并行执行两种检索
向量检索和关键词检索同时跑,各自返回一批候选结果。向量检索一般返回100-300条,BM25也返回100-300条。
第二步:RRF融合
把两个检索结果按RRF算法打分合并,按得分排序。
第三步:候选筛选
从融合结果里取前20-50条作为候选。这一步是粗筛,保证质量和速度的平衡。
第四步:交叉编码器重排序
这是精细化排序。用交叉编码器对候选文档和查询做一次深度语义理解,重新打分排序。
交叉编码器比向量检索的异步双编码器更准,但计算成本高,只能对少量候选使用。
整个流程可以类比成招聘:
- 并行检索 → 多渠道收集简历(内推+校招+社招)
- RRF融合 → 合并不同渠道的候选人,按综合评分排序
- 候选筛选 → HR初筛,去掉明显不匹配的
- 交叉编码器 → 面试官深度面试,选出最终录用的人
面试怎么答
基础版(直接背):
混合检索就是结合向量检索和关键词检索两种方式。向量检索基于语义embedding,擅长找语义相关的内容,但精确匹配能力弱;关键词检索基于BM25倒排索引,擅长精确匹配专有名词、错误码、缩写词,但无法理解语义相似性。两种检索分别执行后,用RRF算法融合结果。RRF用排名而非得分来融合,解决了向量相似度和BM25得分量纲不一致的问题。
加分版(扩展深度):
除了基本原理,RRF的k值可以根据场景调整。k小(20-30)追求高精度,适合精确匹配优先;k大(80-100)侧重召回率,适合语义理解为主。在RAG五层架构里,混合检索属于Level 3的查询优化,需要配合Level 4的Reranking阶段做交叉编码器重排序。实际效果上,比如搜索"ERR_PAYMENT_GATEWAY_TIMEOUT"这种错误码,BM25能排第1但向量可能排第6,RRF融合后综合排名最优,既保证了精确匹配又兼顾了语义相关。
一句话总结
混合检索通过RRF融合向量检索和关键词检索,互补各自的能力边界,让RAG既能精准匹配专有名词,又能理解语义相似性。
