记录一下那天晚上的排查过程。向量、BM25、标题三路召回合并时用 doc_id 去重,结果同一份 PDF 只留下第一条,后面命中更准的那页被丢掉,回答里引用的页码经常和问题对不上。

刚开始盯着「合并时先截断再去重,优质片段被挤掉」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。去重键选得太粗,doc_id 相同就当成重复。也可能是三路召回的 chunk id 生成规则不一致,无法对齐。

不容易想到的是,同一文档的多个版本共用了一个 doc_id。

动手时先打印三路结果的 id 字段看规则

python -c "import json;d=json.load(open('merged.json'));print([x['id'] for x in d[:10]])"

接着改用 chunk_id 做去重键

python merge.py --dedup-key chunk_id --in merged.json

去重之后再按分数截断

python merge.py --dedup-key chunk_id --truncate-after 8

末了抽查引用页码与原文是否一致

python verify_citation.py --q '报销标准' --topk 5

别只看报错消失,验证要多做一步。同一文档不同页的片段都保留,最终前五条没有重复内容,引用的页码与原文一致。

容易忽略的是,去重键的粒度决定召回的丰富度,按文档去重适合做统计,按片段去重才适合喂模型。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189