跳到正文

混合检索为什么用 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. 问法 1 · 场景切入

    假设你在做一个电商客服的检索系统,用户问“有没有红色的手机壳”,你用关键词搜到了,但当他问“适合女生的保护套”,关键词匹配就失灵了。你觉得怎么设计能让两种场景都覆盖好?

  2. 问法 2 · 层层追问

    你平时做检索一般用什么方式……如果只用BM25,遇到“苹果”和“水果”这种同义替换是不是就丢了?那你怎么补上语义理解……那如果只用向量检索,遇到罕见词比如“三羧酸循环”会不会搜不到?

  3. 问法 3 · 直球架构

    混合检索在RAG里几乎成标配了,你给我讲讲为什么需要混合?分别说一下Sparse检索和Dense检索的原理,还有各自用的相似度度量是什么?

同模块相关题目