问题出现得很突然,日志倒是留得挺全。用 e5 系列模型做检索,向量相似度普遍偏高且区分度差,同义句和无关句的分数几乎一样。

刚开始盯着「前缀带了多余空格或大小写不一致」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。查询侧漏了 query 前缀,与训练方式不一致。少数情况下是文档侧应该加 passage 前缀。

另外,批量编码时把前缀拼在了截断之后。

动手时先查询编码时补上 query 前缀

q = 'query: ' + text; vec = model.encode(q)

文档入库时统一加 passage 前缀

d = 'passage: ' + doc; vec = model.encode(d)

接着确认前缀在截断前拼接

python -c "print(len(tokenizer.encode(q)))"

剩下的就是用标注样本验证区分度

python eval_sim.py --pairs pairs.tsv

怎么算真的好了,看的是同一批现象。正样本相似度明显高于负样本,分布拉开了差距,检索排序恢复正常。

补一句。前缀必须严格照模型卡写,多一个空格都会让效果打折,而系统不会报错,只会安静地变差。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189