重排时报输入长度超过模型上限,部分长文档被直接跳过,导致最终结果里缺少关键段落。

排查方向其实有限,先把可能性排一排。重排模型的最大长度通常只有 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)")

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

别只看报错消失,验证要多做一步。长文档也能参与重排,关键段落不再被跳过,最终答案的引用完整。

只保留开头对问答类检索非常不利,答案往往在后面,切片加聚合比粗暴截断更可靠。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189