reranker 输出 0 到 1 的相关性分数,不同查询的分布差别很大,固定 0.5 的阈值在长问题上全过、在短问题上全挂,拦不住也放不全。

一开始怀疑是「模型对否定句判断偏保守,分数被压低」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。交叉编码器的分数是相对值,不同 query 之间不可比。另一种情况是长 query 与文档的 token 重叠多,分数整体上移。

少数情况下是用绝对阈值而不是同批内的相对排序。

上来先按 query 看分数的分位数分布

python -c "import numpy as np;print(round(float(np.percentile([0.91,0.62,0.35],50)),3))"

然后改用分数落差截断而不是绝对值

python -c "print([s for s in [0.91,0.62,0.35] if s>=0.91-0.3])"

接着按同批内的相对排名取前二

python -c "print(sorted([0.91,0.62,0.35],reverse=True)[:2])"

等前面都确认过,再用评测集对比两种截断的命中率

python -c "import pandas as pd;print(pd.read_csv('th.csv').groupby('mode').hit.mean())"

改完先别撤,确认这几项。长短两类问题的命中率差距从 0.3 缩到 0.05 以内,超长上下文不再整批通过。

容易忽略的是,reranker 分数适合排序不适合设死阈值,要拦截就用同批相对落差或者再接一层判定。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189