这个问题其实是在问,为什么不能只靠关键词或只靠语义把检索搞定。我的理解是,单一方案都有明显的边界。[[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拓容,提升语义泛化。具体选哪种融合方式,要看业务对精度和召回率的要求。