双栏 PDF 按全页纵坐标提取文本,可能把左右栏逐行交织,导致 RAG 混合无关内容。文章提出利用文本边界框识别跨页稳定的栏间空白,再按栏排序并处理跨栏标题等内容。
一位用户的 RAG pipeline 在回答一篇 ML 论文相关的问题时,把两个毫不相关的章节混在了一起。我找来原始文件:一篇典型的双栏会议论文。提取出来的 Markdown 读起来就像有人把左右两栏的文本隔行交错排列——事实也确实如此,因为它会在句子还没结束时切换到另一栏。
直到那时,我才真正理解这件事:PDF 没有段落,没有分栏,也没有阅读顺序。它只是一组带有位置坐标的字形。提取顺序取决于生成 PDF 的程序把文本操作符写入内容流的先后顺序,而不少工具会按基线的 y 坐标,对整个页面宽度范围内的文本片段进行排序。在双栏布局中,这意味着左栏的第 37 行和右栏的第 37 行会紧挨着输出。
解决办法并不是换一个更好的解析库,而是利用几何位置:
收集每个文本片段及其边界框。
寻找持续存在的栏间留白——也就是一个在一页又一页中始终没有文本片段落入的 x 坐标区间。如果发现这样的留白出现在约 80% 的页面上,就将页面视为双栏布局。
在每一栏的范围内,先按 y 坐标、再按 x 坐标对文本片段排序;然后把横跨整页宽度的文本片段(比如标题、横跨两栏的摘要)放回两栏正文开始之前的位置。
只有完成这些步骤,得到合理、有序的文本之后,才进行段落检测,并用启发式规则识别标题。
为了确认效果,我做了一个小型 benchmark:30 篇双栏论文,100 个问题,每个问题的答案都位于某个特定的栏中。修复之前,检索大约每 10 次就有 4 次取回错误的 chunk——每个词都在,只是被交错混成了碎纸屑。修复之后,这个比例降到了接近每 10 次 1 次,剩下的失败大多来自旋转成横向的表格,那又是另一场硬仗。
同样的经验也适用于脚注、侧边栏和摘引。如果提取出来的文本是流畅的英语,却完全不知所云,应该先怀疑顺序,而不是内容。
最后,我把这套感知布局的重排序逻辑封装进了自己运营的 PDF-to-Markdown API,主要是为了让自己的数据摄取任务不再往 vector store 里塞碎纸屑。
如果需要进一步采取行动,你可以考虑屏蔽此人,或举报滥用行为。