这道题表面在问[[混合检索]],其实是在考你对检索系统本质的理解,任何单一方法都有先天缺陷,落地时必须在 精确匹配 和 语义理解 之间做取舍。我先分别讲清楚两边,再说为什么实际项目里必须混着来。
先说[[稀疏检索]],典型代表是 [[BM25]]。它的核心是倒排索引加词频统计,说白了就是看 query 和文档里哪些词撞上了,撞得越多分越高。BM25 有个关键参数 k1 和 b,控制词频饱和度和文档长度归一化,这个调参挺讲究的。它的优点很明确:可解释性强,新词零成本,对精确匹配场景特别好用。比如搜「iPhone 15 Pro Max」,你必须匹配到那个准确的产品名,用[[稠密检索]]反而可能因为语义泛化召回一堆「手机」「苹果」这种不相关的。所以它的适用条件就是那些对字面匹配要求极高的场景,比如商品名称、法律条文、医疗术语。但它的短板也明显,无法处理同义词和语义变体,搜「苹果手机」找不到「iPhone」。
再说稠密检索,也就是 Dense Retrieval。它用[[双塔]]模型把 query 和文档编码成稠密向量,然后算向量相似度。常用度量有 余弦相似度、点积,还有欧氏距离,但实际工程里余弦相似度最常用,因为它只关注方向,对向量长度不敏感。稠密检索的优势是语义泛化能力强,能理解「适合聚会的餐厅」背后的「包厢」「多人套餐」这些隐含语义。但它的前提是训练数据要覆盖好,如果遇到训练集里没见过的罕见词或专有名词,召回会崩。而且它依赖 [[ANN]] 索引,比如 [[HNSW]] 或 [[IVF]],内存开销大,冷启动时效果很差。所以它的适用场景是开放域问答、语义搜索这类需要理解用户意图的地方。
真正落地的时候,你会发现这两个方法其实是互补的。我拿外卖搜索举个例子:用户搜「肯德基」,稀疏检索能精确匹配到商家名,稠密检索反而可能因为语义泛化召回一些炸鸡店,这就不对了。但用户搜「适合带小孩吃的餐厅」,稠密检索能抓到「儿童套餐」「亲子区」这些语义特征,稀疏检索就完全无能为力。所以实际线上通常是两阶段:先用稠密检索做语义召回,拿到 Top-K,再用稀疏检索补充那些精确匹配但稠密漏掉的,最后统一走 [[Rerank]] 阶段融合分数。这里有个坑:稠密检索的增益其实集中在头部热门 query,长尾 query 尤其是带数字、型号、错别字的,稀疏检索反而更稳。所以上线前我会特别关注长尾 query 的召回率,如果掉得厉害,可能得调融合权重甚至降级回纯稀疏。
另外还有一个容易被忽略的点,混合检索的代价是系统复杂度翻倍。索引要维护两套,延迟和资源都要额外考虑。所以如果业务场景本身对精确匹配要求不高,比如内部知识库问答,可能纯稠密就够了,没必要强行混合。
所以我的判断是:混合检索不是银弹,而是一个工程取舍。我更倾向先理解业务场景的匹配需求,如果字面匹配是刚需,那混合检索是必选项;如果语义理解就够了,就别给自己找麻烦。面试官可以追问一下:在资源受限的场景下,你会怎么简化混合检索? 比如只保留稀疏检索,或者用 [[ColBERT]] 这种端到端模型替代两阶段?