一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

混合检索实战:兼顾语义与关键词的排序艺术

时间: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)的思路是完全抛开原始得分,只看排名

公式:

RRF得分=1k+ranktext{RRF得分} = sum frac{1}{k + text{rank}}

  • 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 跨编码器

检索阶段用的是双编码器:查询和文档各自独立生成向量,再算向量之间的相似度。速度很快,但两者从未"见面",无法捕捉深层的匹配关系。

重排序阶段用的是跨编码器:把查询和候选文档拼接成一段完整的文字,一起送入模型,让模型逐词比对、输出一个综合的相关性得分。

打个比方:

阶段类比
双编码器(检索)猎头快速筛简历,依靠预先提炼的关键信息做初筛
跨编码器(重排序)面试官和候选人深谈,逐字斟酌、综合判断

重排序的工作方式

  1. 取融合后排名靠前的 N 个候选(比如前 50 个)
  2. 对每一个候选,把"查询 + 文档全文"拼在一起送入重排序模型
  3. 模型输出精确的相关性得分
  4. 按新得分重新排序,产生最终结果

重排序不替代融合:融合负责从两路结果产生统一的候选池,重排序负责在这个候选池上精排。两者分工不同,缺一不可。


六、如何衡量检索质量?

调优这套流水线需要客观的指标,最核心的有三个:

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 → 混合检索系列的第三篇。

热门栏目