记录一下那天晚上的排查过程。把 BM25 和向量检索的结果简单合并,问答准确率提升不明显,某些专有名词查询反而变差。
刚开始盯着「专有名词场景关键词更准,通用语义向量更准」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。两路分数尺度不同,简单相加被一方主导。也可能是合并时没有去重,同一文档占据多个位置。
少数情况下是权重写死,没有按查询类型调整。
第一件事是分别归一化再按权重融合
score = 0.5 * norm(bm25) + 0.5 * norm(vec)
再往下用 RRF 融合避免尺度问题
final = sum(1 / (60 + r) for r in ranks)
接着对含编号与专有名词的查询提高关键词权重
w = 0.7 if has_code(query) else 0.4
末了在标注集上评估两路贡献
python eval_hybrid.py --weights 0.3,0.5,0.7
改完先别撤,确认这几项。混合检索在测试集上优于单路,专有名词查询也能稳定命中,整体延迟增加有限。
补一句。权重不必对称,具体业务里关键词往往负责精确匹配,向量负责语义召回,先看查询分布再定比例。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。