最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
混合检索实战:兼顾语义与关键词的排序艺术
时间:2026-09-11 20:26:01 编辑:袖梨 来源:一聚教程网
单独依赖向量语义检索或 BM25 关键词检索,都可能在真实查询中遗漏重要结果:前者不一定能准确捕捉技术术语,后者又难以识别同义表达。要构建更稳健的检索链路,需要让两类召回方式协同工作,再通过排名融合与神经重排序得到统一且更可靠的结果。
前两篇讲了稀疏检索(BM25)和稠密检索(向量语义匹配)。两者各有盲区,混合检索就是把它们合在一起——本文从零讲清楚它的三个阶段,以及如何客观衡量检索质量。
一、为什么需要混合检索?
先回顾两种检索方式各自的短板:
| 检索方式 | 优势 | 盲区 |
|---|---|---|
| 稠密检索(向量语义) | 懂语义,能匹配同义词 | 可能漏掉关键词,搜"HTTP-403"返回泛泛的"服务器错误" |
| 稀疏检索(BM25关键词) | 精确匹配,技术术语准确 | 读不懂同义词,搜"kitty"找不到只写了"cat"的文档 |
混合检索的思路很简单:两个引擎都跑,结果合并。难点在于如何把分布迥异的两组得分整合成一个有意义的排序。
二、流程图解读
以查询 "kitty behavior" 为例,整条流水线长这样:
用户查询 "kitty behavior"
│
├──→ 稠密检索(语义匹配:kitty ≈ cat)
│ doc3: "feline habits and cat play..." cos=0.87
│ doc7: "cat grooming patterns..." cos=0.82
│ doc1: "pet care basics..." cos=0.71
│
└──→ 稀疏检索 BM25(精确匹配:"kitty"关键词)
doc5: "kitty litter training..." BM25=8.4
doc9: "kitty adoption guide..." BM25=6.1
doc2: "kitten health tips..." BM25=3.2
│
结果融合(RRF)
│
神经重排序(跨编码器精排)
│
最终排序 Top-N
注意两路结果的得分单位完全不同:稠密检索用余弦相似度(0 到 1),稀疏检索用 BM25 得分(0 到几十)。它们不能直接比较,这正是"结果融合"要解决的问题。
三、第一阶段:并行检索
系统同时向稠密和稀疏两个引擎发送查询,各自独立召回一批候选文档。
两路结果可能重叠(同一篇文档被两个引擎都找到),也可能互补(各自找到对方找不到的文档)。这一步的目标是召回,尽量把相关文档都网进来。
四、第二阶段:结果融合(RRF)
问题:两路得分不能直接比
稠密检索的 cos=0.87 和 BM25=8.4,不是同一把尺子量出来的,无法直接加减比较。
解法:倒数排名融合(RRF)
RRF(Reciprocal Rank Fusion)的思路是完全抛开原始得分,只看排名。
公式:
- rank = 这篇文档在某一路结果里的排名(第1名、第2名……)
- k = 平滑常数,通常取 60
- 对每篇文档,把它在稠密检索和稀疏检索中的 RRF 得分加起来
为什么要加平滑常数 k?
如果不加 k,第1名得分是 1/1=1,第2名是 1/2=0.5,差距很大。加上 k=60 之后:
- 第1名:1/(60+1) ≈ 0.0164
- 第2名:1/(60+2) ≈ 0.0161
排名靠前的几名之间差距被压小了,避免"第一名通吃"的问题,让融合结果更稳健。
手算一个例子:
| 文档 | 稠密检索排名 | 稀疏检索排名 | RRF得分(k=60) |
|---|---|---|---|
| doc3 | 第1名 | 未命中 | 1/61 ≈ 0.0164 |
| doc5 | 未命中 | 第1名 | 1/61 ≈ 0.0164 |
| doc7 | 第2名 | 未命中 | 1/62 ≈ 0.0161 |
| doc1 | 第3名 | 未命中 | 1/63 ≈ 0.0159 |
如果某篇文档同时被两路召回(两路都排第1),它的 RRF 得分会是 1/61 + 1/61 ≈ 0.0328,远高于只被一路命中的文档——同时命中两路是最强信号。
RRF 的代价: 只用了排名信息,丢掉了原始得分里蕴含的相关性细节。这就是为什么还需要第三阶段。
五、第三阶段:神经重排序
双编码器 vs 跨编码器
检索阶段用的是双编码器:查询和文档各自独立生成向量,再算向量之间的相似度。速度很快,但两者从未"见面",无法捕捉深层的匹配关系。
重排序阶段用的是跨编码器:把查询和候选文档拼接成一段完整的文字,一起送入模型,让模型逐词比对、输出一个综合的相关性得分。
打个比方:
| 阶段 | 类比 |
|---|---|
| 双编码器(检索) | 猎头快速筛简历,依靠预先提炼的关键信息做初筛 |
| 跨编码器(重排序) | 面试官和候选人深谈,逐字斟酌、综合判断 |
重排序的工作方式
- 取融合后排名靠前的 N 个候选(比如前 50 个)
- 对每一个候选,把"查询 + 文档全文"拼在一起送入重排序模型
- 模型输出精确的相关性得分
- 按新得分重新排序,产生最终结果
重排序不替代融合:融合负责从两路结果产生统一的候选池,重排序负责在这个候选池上精排。两者分工不同,缺一不可。
六、如何衡量检索质量?
调优这套流水线需要客观的指标,最核心的有三个:
Recall@k(召回率@k)
该找的文档,有没有出现在前 k 个结果里?
比如 Recall@10 = 0.8,意思是 80% 的查询,正确答案都出现在了前 10 个结果里。
这是 RAG 系统最关心的指标——只要相关文档进入了上下文,大模型就有机会利用它。
MRR(平均倒数排名)
找到了,但排得够不够靠前?
对每条查询,取第一个相关文档的排名,算它的倒数,再对所有查询取平均:
| 相关文档排在第几名 | 倒数得分 |
|---|---|
| 第1名 | 1/1 = 1.0 |
| 第2名 | 1/2 = 0.5 |
| 第10名 | 1/10 = 0.1 |
排名越靠前,得分越高。
nDCG(归一化折损累积增益)
整个排序列表的质量如何?
综合考虑所有相关文档的排名和相关程度——排名越靠后的相关文档,得分折扣越大。比 MRR 更全面,因为它不只看"第一个相关文档",而是评估整个列表。
七、三阶段总结
第一阶段:并行检索
稠密检索(语义)+ 稀疏检索(关键词)同时跑
目标:召回,把相关文档都网进来
第二阶段:结果融合(RRF)
抛开原始得分,只按排名融合
目标:把两路结果合成统一的候选池
第三阶段:神经重排序
跨编码器逐一精确打分
目标:在候选池上精排,产生最终结果
没有哪种单一检索策略在所有场景下都可靠。把稠密、稀疏和重排序组合起来,才是构建生产级 RAG 系统的正确做法。
本文是 TF-IDF → BM25 → 混合检索系列的第三篇。