为什么纯向量检索会漏召回?什么 query 天生适合 BM25?
谁在问:一二面;是通向混合检索追问链的入口题
口语化问法
- 向量检索这么强,为什么还要关键词检索?
- 你们遇到过向量检索搜不到的情况吗?什么样的?
- BM25 是不是已经过时了?
考察意图
这题是混合检索追问链的入口,也是「有没有看过真实 badcase」的探针。面试官想听到具体的失败案例,而不是抽象的「向量检索有局限」。能立刻举出「型号搜不到」「错误码搜不到」这类例子的人,一定是排查过线上问题的。
参考答案
60 分答案(及格线)
向量检索擅长语义泛化,但对精确字面匹配很弱。因为 embedding 把整段文本压缩成一个固定向量,低频的专有名词、型号、编号在这个压缩过程中几乎没有独立的语义位置——「SK-3200」和「SK-3500」在模型眼里长得差不多。所以用户搜一个具体型号或错误码时,向量检索经常漏。
天生适合 BM25 的 query:产品型号、错误码、订单号、人名、法条编号、API 名称、异常类名等精确符号类查询。BM25 靠词频和逆文档频率打分,稀有词权重极高,正好抓这类词。
90 分答案(有生产经验的回答)
补三层:
给出具体故障场景:用户问「SK-3200 报 E05 错误怎么处理」,纯向量检索返回的是《常见故障处理总览》,而真正的《SK-3200 错误码对照表》根本没进候选。反向 badcase 同样存在:用户问「机器出毛病了保修吗」,文档写的是「设备异常」「质保条款」,BM25 一个词都对不上。两种检索各有盲区,谁也替代不了谁——这就是混合检索存在的理由。
说清 BM25 为什么擅长这个:三个设计——词频饱和(出现 100 次不比 10 次重要多少)、IDF 让稀有词更值钱(全库都有的「设备」没信息量,只出现几次的「E05」权重极高)、长文档惩罚。第二条正是它抓型号编号的底气。
中文的关键前提(很多人漏):BM25 依赖分词。「混合检索效果差」经常不是算法的锅,而是分词器把「SK-3200」切碎了。加自定义词典往往比调任何参数都见效。
再补一个 2026 年的视角:BM25 没过时,但有了新形态——**learned sparse(学习型稀疏向量,如 BGE-M3、SPLADE)**兼顾字面匹配与轻量语义扩展。但有明确边界:如果语料里全是模型没见过的内部代号,传统 BM25 反而更稳,因为稀疏模型的词汇扩展在这些词上会引入噪声。
追问链
为什么 embedding 对型号、编号这类词效果差?
期望低频符号,训练语料里出现少、缺乏稳定语义;整段文本压成一个定长向量时,单个稀有 token 的信息被稀释 —— 本质是有损压缩丢掉了字面细节信号说到「压缩有损」这层 → 理解到位;只说「模型不认识这个词」→ 停在表层那把型号加到 embedding 的训练里、做领域微调行不行?
期望可以,但性价比低 —— 型号不断新增,每次都要重训;而 BM25 对新词天然有效、零成本 → 工程上优先混合检索,微调只留给「领域术语体系稳定且量大」的场景信号会对比「重训成本 vs 混合检索成本」→ 工程判断;张口「微调更好」→ 方案惯性中文场景下 BM25 要注意什么?
期望分词是前提,分词器切错就全废;型号、产品名、内部代号必须进自定义词典;再加停用词处理。中文同义表述多,BM25 这一路本身覆盖不了,得靠向量那一路补信号完全不提分词 → 大概率没在中文语料上做过 BM25既然两路互补,你怎么把它们合起来?
期望接进 Q2-10 的领域:分数量纲不可比 —— 要么归一化后加权,要么用 RRF 只看排名信号答「两路结果直接拼起来去重」→ 没意识到排序融合是个真问题;能自然衔接到 RRF → 知识成体系加了 BM25 之后,某些语义类 query 反而变差了,怎么办?
期望先分桶归因确认是哪类 query 劣化 → 大概率是 BM25 路引入字面相似但语义无关的噪声、融合时又被过度加权。解法按成本排序:调融合参数(RRF 的k或加权的α)→ 做 query 分类路由,语义类降 BM25 权重甚至单走向量 → 靠 rerank 在精排阶段纠正 → 修完进回归集信号第一反应「那就不用 BM25 了」→ 缺分桶归因意识:混合检索的收益本来就分桶看,总平均会藏住局部劣化
评分要点
- 明确指出向量检索弱在精确字面匹配
- 能解释原因(低频符号 + 定长向量有损压缩)
- 能举出具体 query 类型(型号/错误码/订单号/人名/API 名)
- 能说出反向盲区(BM25 对同义改写无能为力)
- 知道 BM25 的 IDF 机制是它抓稀有词的原因
- 加分:中文分词是 BM25 的前提,自定义词典很关键
- 加分:知道 learned sparse 及其「没见过内部代号就失效」的边界