混合检索为什么用 Sparse+Dense?
Sparse 检索与 Dense 检索原理及相似度度量方法对比
原题:在构建检索系统时,为什么要采用混合检索(结合Sparse和Dense检索)?请分别说明Sparse检索和Dense检索的工作原理,并指出它们各自使用的相似度度量方法。
向量检索 · 美团真题
回答与解析
为什么需要混合检索
单一检索方式都有明显短板:
- Sparse检索:擅长精确匹配关键词,但无法理解同义词、语义变体
- Dense检索:擅长语义理解,但对罕见词、专有名词容易失配
混合检索=精确性+语义泛化能力,是生产RAG系统的标配。
Sparse检索(稀疏检索)
原理:基于倒排索引的词频统计方法,典型代表BM25
BM25(q,d) = Σ IDF(q_i) · [f(q_i,d)·(k1+1)] / [f(q_i,d) + k1·(1-b+b·|d|/avgdl)]
- 只关注查询词是否出现在文档中,向量极度稀疏(维度=词表大小)
- 相似度度量:BM25 score(基于TF-IDF的改进版)
特点:对高频词降权、对文档长度归一化,检索速度快
Dense检索(稠密检索)
原理:将查询和文档编码为低维稠密向量(通常768/1024维),通过向量空间中的距离衡量语义相关性
- 使用双塔模型(如BGE、GTE)分别编码query和doc
- 相似度度量:余弦相似度 或 点积(dot product)
score = cos_sim(E_query, E_doc) = (E_q · E_d) / (||E_q|| · ||E_d||)
特点:能捕捉"苹果-水果"这类语义关联,但对字面匹配不敏感
典型融合策略
| 策略 | 做法 |
|---|---|
| 线性加权 | score = α·BM25 + (1-α)·cos_sim |
| RRF倒数排序融合 | 综合两者的排序位置,无需调权重 |
| 两阶段 | Dense召回Top-K → Sparse精排 |
实际中α通常取0.3-0.5,或用RRF更稳健。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 问题本质:单一检索都有短板,混合是取长补短
- Sparse检索:精确匹配、BM25原理与适用场景
- Dense检索:语义理解、余弦相似度与风险
- 混合策略:线性加权或RRF,以及落地注意点
- 收尾与可延伸点:倾向RRF,追问融合权重调优
这个问题其实是在问,为什么不能只靠关键词或只靠语义把检索搞定。我的理解是,单一方案都有明显的边界。Sparse Retrieval,比如BM25,它擅长精确匹配,你搜订单号、错误码、产品型号,它不会漏。但遇到同义词,比如用户说“退货”,文档里写的是“退款申请”,它就可能匹配不上。反过来,Dense Retrieval,也就是向量检索,能理解语义相关性,“苹果”和“水果”它能关联起来,但对罕见词、专有名词很敏感,训练时没见过的词,向量表达就很差,容易失配。所以真正落地,我一般不会只用一种,而是混合用,把精确性和泛化能力结合起来。
先说Sparse检索。它的核心是倒排索引加词频统计,BM25是典型代表。你搜一个词,它看这个词在文档里出现多少次,同时打压高频词,比如“的”、“是”,再对长文档做长度归一化。相似度就是BM25分数,直接算出来。它的特点是快,索引结构简单,适合做精确召回。比如在客服系统里,用户报一个订单号,你用BM25能秒级定位到那条记录,不会因为向量化丢信息。
再讲Dense检索。它是把查询和文档都编码成低维稠密向量,比如768维,然后用余弦相似度或点积算距离。相似度度量我常用余弦相似度,因为对向量长度不敏感,更关注方向。它能捕捉语义关联,比如用户搜“怎么退款”,它能召回“取消订单流程”这种语义近似的文档。但这里有个坑:如果文档里包含冷僻词,或者用户的query有拼写错误,向量检索的效果会明显下降。因为Embedding模型没见过这些词,表达会偏移。所以上线前我会特别关注词汇覆盖率,如果领域术语太偏,可能需要微调Embedding模型,否则召回质量会崩。
那混合起来怎么做?常见策略有两种。一种是线性加权,比如score = α BM25分数 + (1-α) 余弦相似度,α通常取0.3到0.5。另一种是RRF,也就是倒数排序融合,它不看分数绝对值,只看排序位置,把两路结果的位置倒数加起来,这样不用调权重,更稳健。我个人更倾向RRF,因为分数尺度不一样,BM25和余弦相似度直接加权容易出问题,RRF对异常值更鲁棒。
说到这,其实混合检索还有个前提:两路检索的候选集要能对齐,比如都召回同样的数量级,否则RRF会偏向召回多的那一路。这个细节在调优时特别关键,面试官如果追问,我可以展开讲怎么平衡两路的召回深度。
所以总结一下,我不会把Sparse和Dense对立起来,而是把它们看作互补的工具。Sparse保底,保证精确匹配不丢;Dense拓容,提升语义泛化。具体选哪种融合方式,要看业务对精度和召回率的要求。
关键一句:混合检索时RRF比线性加权更鲁棒,但前提是两路候选集数量级要对齐,否则会偏向召回多的一路。
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服的检索系统,用户问“有没有红色的手机壳”,你用关键词搜到了,但当他问“适合女生的保护套”,关键词匹配就失灵了。你觉得怎么设计能让两种场景都覆盖好?
- 问法 2 · 层层追问
你平时做检索一般用什么方式……如果只用BM25,遇到“苹果”和“水果”这种同义替换是不是就丢了?那你怎么补上语义理解……那如果只用向量检索,遇到罕见词比如“三羧酸循环”会不会搜不到?
- 问法 3 · 直球架构
混合检索在RAG里几乎成标配了,你给我讲讲为什么需要混合?分别说一下Sparse检索和Dense检索的原理,还有各自用的相似度度量是什么?