把 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 负责精度,混着加权重往往越调越差。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189