先看现象。接入重排模型后,所有候选的分数都是零或完全一致,排序没有任何变化,日志里也没有报错。
真正麻烦的地方在于,几个原因的现象几乎一样。输入拼成了单个字符串,模型拿不到查询与文档对。少数情况下是批处理时 padding 掩盖了真实长度。
少数情况下是输出取了错误的维度,拿到的是 logits 之外的字段。
不容易想到的是,模型没有切换到评估模式,dropout 仍在生效。
先按查询与文档成对的格式传参
pairs = [(query, doc) for doc in docs]; scores = reranker.compute_score(pairs)
再往下确认输出长度与候选数量一致
python -c "print(len(scores), scores[:5])"
随后切到评估模式并关闭梯度
model.eval(); torch.no_grad()
末了用一对明显相关与无关的文本做对照
python -c "print(reranker.compute_score([('苹果','水果'),('苹果','汽车')]))"
怎么算真的好了,看的是同一批现象。相关文本得分明显高于无关文本,重排后前几条质量提升,分数分布也拉开了。
容易忽略的是,分数全零通常是格式问题而不是模型问题,先拿一对极端的正负样本验证,能立刻判断是接口用错还是模型坏了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。