报错是这么冒出来的。bge-reranker-v2-m3 打分集中在 0.85 到 0.95 之间,之前按 0.5 做阈值,结果所有候选都过,等于没过滤;改用固定 0.9 又有三成正常问题被全过滤。

中间走过弯路,把「阈值来自另一批语料,口径没对齐」当成主因,改完现象没变。

原因不止一个,得分开看。不同批次查询的分数分布差异很大,固定阈值失效。也可能是重排输入被截断到 512 token,长文档分数偏低。

少数情况下是只用一个绝对分数,没有结合排序位置。

上来先导出打分分布看分位数

python -c "import json,statistics;ss=[json.loads(l)['score'] for l in open('rr.jsonl')];print(min(ss),statistics.median(ss),max(ss))"

随后按每批查询取相对分位做截断

python cut_by_quantile.py --in rr.jsonl --q 0.6 --keep 5

接着检查被截断的输入是否超过模型长度

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode(open('doc.txt').read())))"

等前面都确认过,再用标注集验证截断后的答案命中率

python eval_answer.py --cases cases.jsonl --config cut.yaml

恢复的判定其实很直接。同一批问题里不再出现全过或全灭,答案命中率提升,阈值改为按批相对分位后跨语料仍稳定。

提醒一点。重排分数是相对量,不同查询的分布不一样,按批取分位比拍一个绝对值靠谱,前提是每批候选数量差不多。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189