把 bge-m3 的余弦相似度和 bge-reranker-v2 的 logits 放在一起排序,发现精排结果反而更差,两个分数一个在 0 到 1 一个在负十几到正十几。
一开始怀疑是「向量分数受长度影响,长文档天然偏高」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。两套分数分布完全不同,直接相加等于让精排失效。也可能是reranker 分数要先过 sigmoid 才能当概率用。
不容易想到的是,阈值是照旧系统抄的,与新分数尺度不匹配。
动手时先把 reranker 分数转成概率
python -c "import math;print(1/(1+math.exp(-3.2)))"
只在召回集内按 reranker 排序,不再和向量分相加
python rerank.py --input recall.jsonl --model BAAI/bge-reranker-v2-m3
等前面都确认过,再按评测集扫一遍阈值
python sweep.py --score rerank_prob --range 0.1,0.9 --step 0.05
改完先别撤,确认这几项。精排后的 top5 命中率高于只做向量召回,阈值扫描能给出稳定的 F1 峰值,排序不再出现明显错位。
容易忽略的是,两阶段检索的分数不能混算,各管一段:向量负责召回广度,reranker 负责精度,混着加权重往往越调越差。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
