两种检索各自擅长什么
向量检索把文本压成向量,比的是语义距离:问「怎么压缩图片体积」,它能召回讲「减小图片文件大小」的段落,即使两者没有一个字相同。
代价是:它对精确字面不敏感。查产品编号、错误码、罕见专有名词时,向量可能把「长得像」的内容排在前面,而把真正包含那个编号的段落漏在后面。
关键词检索(BM25 一类)恰好相反:它统计词频与逆文档频率,字面命中权重高,查编号、查术语一次就中;但它不理解同义改写,问「减小文件大小」就找不到只写「压缩图片体积」的段落。
混合检索的做法
- 两路召回:同一个查询分别走向量与关键词检索,各取前 N 条(例如各 50 条);
- 分数归一化:两路分数量纲不同,必须先归一化(或改用排名倒数 RRF),否则一路会凭数值大小压倒另一路;
- 合并去重:按文档 ID 合并,同一篇被两路都召回的,通常更可信;
- 重排(可选):用更贵的模型对合并后的候选做精排,取最终前 K 条。
三种合并方式的取舍
- 加权求和:实现最简单,但权重需要按语料调,换一个语料往往要重调;
- RRF(排名倒数融合):只用排名不用分数,跨路可比、免调参,工程上最省心,缺点是丢掉了分数强弱信息;
- 学习式融合:效果上限更高,但需要标注数据与持续维护,小团队往往不划算。
常见坑
- 只调一路:把权重压到 0.9 以上,等于退化成单路检索,混合的意义就没了;
- 忘了归一化:向量余弦相似度多在 0.7~0.9,BM25 分数动辄几十,直接相加等于只看 BM25;
- 切分粒度不一致:两路用不同切分,合并时对不上同一段落,去重会失效;
- 把重排当召回:重排只能在候选里选,候选阶段漏掉的文档,后面再贵也找不回来。
什么时候不必上混合
如果查询几乎都是自然语言长问句、语料里也少有编号与专有名词,纯向量检索通常够用。先看真实查询日志再决定,不要因为「混合听起来更强」就默认加上——多一路就多一份索引维护与延迟成本。