这个坑值得记一笔。RAG 先召回 50 条,再用 bge-reranker-v2-m3 重排取 top3,答案里缺了关键数字,把中间结果落盘后发现正确块排在第 4,刚好被截掉。

刚开始盯着「分数阈值过滤掉了边界样本」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。top_k 设得太小,重排波动就会挤掉正确块;reranker 的输入被截到 512 token,长块信息丢失;去重时把包含正确数字的块合并掉了。

先把重排后的前 10 条分数和片段落盘

python rerank_dump.py --topk 10 --out rerank.jsonl

然后把 top_k 放宽到 8 再生成一次答案

python rag_answer.py --topk 8 --question q.txt

再往下对超长块先切分再送进重排模型

python split_blocks.py --max-tokens 400 --input blocks.jsonl

末了检查去重逻辑是否按内容哈希误合并

python dedup_blocks.py --dry-run --show-merged

别只看报错消失,验证要多做一步。正确块稳定出现在前 3,答案里的数字与原文一致,抽 20 个问题复核命中率明显上升。

容易忽略的是,重排分数在相邻名次之间差别很小,取 top3 等于把排序噪声直接变成召回损失,多留几条再交给模型判断通常更划算。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189