重排时报输入长度超过模型上限,部分长文档被直接跳过,导致最终结果里缺少关键段落。
排查方向其实有限,先把可能性排一排。重排模型的最大长度通常只有 512;整篇文档直接送去重排,长度必然超限;截断策略只保留了开头,关键信息在后半段;批量重排时把多条拼在一起。
动手时先把文档切成不超过上限的片段
python split_doc.py --size 400 --overlap 50 --input docs.txt
接着对片段分别打分后取最大值
score = max(reranker.compute_score([(q, c) for c in chunks]))
截断时保留首尾两段内容
text = text[:200] + text[-200:]
剩下的就是记录被截断的片段比例
python -c "print('truncated', n, 'of', total)")
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
别只看报错消失,验证要多做一步。长文档也能参与重排,关键段落不再被跳过,最终答案的引用完整。
只保留开头对问答类检索非常不利,答案往往在后面,切片加聚合比粗暴截断更可靠。报错文案容易误导,真正的原因往往在相邻那一层的日志里。