问题出现得很突然,日志倒是留得挺全。把一份两百页的产品手册用 PyMuPDF 抽文本后切块入库,用户搜「保修多久」始终搜不到对应章节,抽出来的文本里夹着大量单字换行。
刚开始盯着「切块按固定字数,标题与正文被分到不同块」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。PDF 按视觉行折行,抽出后每行一个短句,语义被切碎。另一种情况是页眉页脚和页码混进正文,稀释了块的主题。
还有一种情况,中文没做全半角与空格归一,检索词匹配不上。
动手时先把换行合并成段落
python -c "import fitz;d=fitz.open('m.pdf');t=''.join(p.get_text() for p in d);print(t.count(chr(10)))"
接着剔除页眉页脚等重复行
python dedup_lines.py --in raw.txt --out clean.txt --min-repeat 5
然后按标题层级切块并保留章节名
python chunk_by_heading.py --in clean.txt --max 400
剩下的就是抽样验证检索命中
python query_test.py --q 保修多久 --topk 5
改完先别撤,确认这几项。同一问题能召回所在章节,块内文本是完整句子而不是单字行,top5 里至少三条与问题相关。
这里还有个坑。中文 PDF 的问题多数出在抽取阶段,向量模型再好也救不回被折行切碎的语义,先在文本层做干净。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
