用户问“工单 AB-2048 的结案规则”,编号必须尽量精确命中;用户换一种说法问“客户确认之后什么时候算处理完成”,语义检索又更容易发现写着“验收通过后关闭”的段落。只用其中一种检索,都会遇到盲区。
一种简单的混合流程是分别取关键词和向量候选,按文档与片段 ID 去重,再合并排序,最后交给重排器判断与问题是否真正相关。两个检索器的原始分数未必在同一尺度,不能未经校准就直接相加;可以先比较基于名次的融合方法,再用标注问题验证效果。
不要把混合检索当作万能药
如果源文档解析时把编号拆坏,关键词路径也找不到它;如果权限或版本过滤错误,两条路径都可能召回不该用的内容。混合检索主要解决候选覆盖,而不是文档质量、授权和答案忠实性。
评估时分别记录关键词独有命中、向量独有命中、二者共同命中和最终被引用的证据。若混合后的 Recall@K 没有提升,或大量无关片段推高重排成本,就应该回头检查字段、分词和查询类型,而不是继续叠加复杂策略。
分数为什么不能直接相加
关键词检索和向量检索使用不同的打分机制,数值范围还会随查询变化。假设某次关键词结果分数在 2 到 15 之间,而向量相似度集中在 0.7 到 0.9;直接各乘 0.5 再相加,表面上“权重相同”,实际上关键词分数几乎总会主导排序。
倒数排名融合(RRF)绕开了原始分数尺度:只看候选在各列表中的名次,两个列表都靠前的片段得到加分。它是合适的基线,但也有代价:某个结果在关键词路径里以极高置信度精确命中编号,RRF 仍只知道它排第一,不知道领先第二多少。因此有标注集后,可以比较 RRF、分数归一化和按查询类型调整权重的方案,而不是提前宣布一种方法永远最好。Qdrant 的混合查询文档给出了 RRF 与基于分数分布的融合方式。
一个应当保留的反例
问“AB-2048 的状态”时,如果语义路径拉回大量相似工单,融合可能把精确编号结果挤下去。此时更合理的是先识别结构化编号,执行精确过滤或关键词优先检索;混合检索作为兜底,而不是让所有查询都走同一公式。
最终仍要看答案层:正确证据是否被引用,错误证据是否被排除,延迟增加是否换来实际收益。混合检索提高的是找到候选的机会,不能替代后续的证据判断。
先给查询分类,再决定融合是否必要
把一批真实问题按精确标识符、术语问答、自然语言改写和多条件问题分组。精确标识符通常优先走字段过滤与关键词;自然语言改写更依赖语义召回;多条件问题可能需要更宽的候选集和重排。给所有类别套一组融合权重,可能在平均分上好看,却牺牲编号问题的准确性。
做离线对比时,分别记录纯关键词、纯向量和融合的 Recall@K,并抽查每类新增命中的片段是否真的支持答案。若融合召回提高但最终引用准确率下降,问题可能是重排容量不足或融合引入太多同主题但不同实体的段落。此时应先改候选去重、实体约束或重排,而不急于再加第三种检索器。
一个实用的上线门槛是:在固定问题集里,融合至少救回某些单一路径失败的样本,而且不能明显伤害精确查询;线上则观察新增候选是否真的被引用,以及 P95 延迟是否可接受。若只有离线候选数变多、用户回答没有改善,混合检索只是让系统更复杂了。