Appearance
2.2.4 图片、表格、图表、PDF 等复杂格式为什么更难处理?
先给结论:复杂格式之所以难,不是因为它们“不能进 RAG”,而是因为其中大量有价值信息并不直接以干净文本形式存在。
对普通 Markdown 或网页正文来说,系统往往比较容易提取文字和层级。
但图片、表格、图表、PDF、扫描件里的知识,常常藏在版面结构里,而不只是藏在字面文本里。
难点一:文字不一定能被直接读出来
比如:
- 扫描版 PDF 的文字其实是一张图片
- 图表里的标签和数值嵌在图像里
- 截图里的说明文字需要 OCR 才能识别
这意味着系统第一步就不是“做检索”,而是“先想办法把内容读出来”。
而且“读出来”本身也分层次:
- 能不能识别出文字
- 能不能识别对位置
- 能不能把标题、正文、表头、脚注分开
很多系统的问题不在于 OCR 完全失败,而在于它只识别出了字,却没有识别出字和结构的关系。
难点二:即使读出了文字,也可能丢掉结构
复杂格式里,结构往往决定语义。
例如:
- 表格的表头决定字段含义
- 行列关系决定数字属于谁
- 图表的坐标轴决定趋势含义
- PDF 的章节和版面位置决定内容归属
如果只把这些内容粗暴转成一串文本,很多关键关系就会丢失。
这类结构一旦丢失,后面最容易出现的不是“一个字没识别出来”,而是“识别结果看起来像文本,但意思已经变了”。这比纯粹漏字更麻烦,因为它会让系统产生一种“看起来能用”的错觉。
难点三:阅读顺序不稳定
对网页和 Markdown 来说,阅读顺序通常比较明确。
但在复杂 PDF 或版面文档里,系统可能会遇到:
- 多栏排版
- 浮动标题
- 跨页表格
- 图文穿插
这会导致提取后的文本顺序和人真正阅读时的顺序不一致,从而影响后续切块和检索。
比如一个双栏 PDF,如果系统先读左栏一半,再跳到右栏,再回到左栏,提取出来的文本可能句子都对,但前后逻辑已经乱了。后面即使再精细切块,也是在错误顺序上继续加工。
难点四:语义经常不只在文本里
比如一张图表,真正重要的信息可能是:
- 走势上升还是下降
- 峰值出现在什么时间
- 两条曲线之间谁更高
这些信息不是单纯 OCR 出文字就能完整表达的。
同样,一张复杂表格的意义也常常取决于:
- 合并单元格
- 缺失值
- 单位说明
- 脚注解释
所以复杂格式处理难,不只是“抽字难”,而是“语义恢复难”。
从工程视角看,这类问题往往至少有三种不同层级:
识别问题:字有没有识别出来结构问题:表头、段落、图注、脚注有没有对应正确语义问题:图表趋势、表格关系、版面归属有没有被正确表达
不同层级的问题,需要的处理手段也不一样。OCR 只能解决一部分识别问题,不能自动解决全部结构和语义问题。
为什么这会直接影响 RAG
如果复杂格式处理不好,后面会出现几种典型问题:
- 重要字段被漏掉
- 表格数值和对应维度错配
- 图表文字被抽出来,但趋势关系丢了
- PDF 正文和页眉页脚混在一起
- 同一段内容被拆得支离破碎
这样即使后面检索到了相关内容,模型看到的也已经不是原本正确的知识形态了。
更麻烦的是,这些错误往往不像“文档不存在”那样明显,而是会变成:
- 检索结果看起来很相关,但关键数字对不上
- 模型引用了表格内容,但维度和数值配错了
- 答案里提到了趋势,但趋势方向说反了
- 章节标题和正文错位,导致引用出处看起来不可信
这类错误最容易骗过只看表面流畅度的 Demo。
复杂格式通常要多走一步“结构恢复”
和普通纯文本不同,这类内容更常见的处理顺序通常是:
- 先做 OCR 或文本抽取。
- 再做版面分析,恢复标题、段落、表格、图片、图注、脚注这些块级结构。
- 对表格、图表做额外结构化处理。
- 最后才决定哪些内容可以进入常规切块和检索链路。
这一步之所以重要,是因为很多复杂内容真正该切的,不是“抽出来的整段文本”,而是“恢复结构之后的语义单元”。
比如:
- 表格更适合按表为单位或按行列关系整理后再处理
- 图表更适合补一层结构化描述或人工摘要
- PDF 正文更适合在章节边界上切块,而不是按页硬切
表格、图表、扫描件,其实不是同一种难
很多时候它们会被统称为“复杂格式”,但难点并不完全一样。
表格
表格最难的是关系恢复。真正有意义的通常不是某个单元格,而是:
- 它所在的行和列
- 它对应的表头
- 它的单位和统计口径
- 它是不是合并单元格的一部分
图表
图表最难的是趋势和比较关系。即使 OCR 把标题、坐标轴、图例全读出来,也未必能自动得到:
- 哪条曲线更高
- 什么时候拐点出现
- 哪个时间段变化最快
扫描件和图片 PDF
扫描件最难的是基础识别质量和版面稳定性。它们经常同时存在:
- 倾斜
- 模糊
- 印章遮挡
- 复印噪声
- 手写标注
这时后面的问题可能还没开始,前面的识别结果就已经不稳了。
处理复杂格式时,更应该关注什么
做这类数据接入时,重点通常不是“先堆更多模型”,而是:
- 文本提取是否完整
- 版面结构是否保留
- 表格关系是否恢复
- 图片和图表是否需要额外描述
- 提取结果是否做人工抽检
很多场景下,复杂格式要先做结构恢复,再进入常规 RAG 流程。
如果你正在设计接入方案,更实用的检查点通常是:
- OCR 后的文本是否和原文大致一致
- 标题和正文有没有串位
- 表格是否保留了表头、单位和行列对应关系
- 图片、图表是否需要额外的说明文本
- 页眉页脚、页码、目录是否已被当作噪声处理
- 提取结果是否做过人工抽样校验
这些检查比单纯看“抽出了多少文本”更重要。
一个更现实的落地顺序
如果你现在要接这类数据,比较现实的推进方式通常是:
先选价值最高、格式最稳定的一批文档。 不要一开始就把所有扫描件、表格、图表一起接进来。
先建立抽样校验机制。 至少随机抽一些页面,人工对比原文和解析结果,确认主要结构没有明显错位。
再决定不同格式分别怎么处理。 表格、图表、扫描件最好分开看,不要期望一条解析链路全都做得同样好。
最后再进入常规 RAG 流程。 也就是在结构质量已经基本可信之后,再谈切块、索引、检索和生成。
这比一开始就追求“全部自动化入库”更现实。
哪些情况先不要急着进 RAG
如果你遇到下面这些情况,通常更应该先补解析质量,而不是急着入库:
- OCR 结果错误很多,关键数字经常识别错
- 表格表头经常丢失或串列
- 双栏、多栏 PDF 的阅读顺序经常混乱
- 图表里的趋势关系无法稳定恢复
- 页眉页脚、目录、页码大量混入正文
因为这时候继续往后做检索和生成,只会把前面的错误放大。
一个实用判断
如果某类内容的核心意义严重依赖下面这些因素:
- 版面位置
- 行列关系
- 图形关系
- 视觉布局
那它就不适合被简单当成普通纯文本处理。
更直接一点说:
如果你把它转成一段纯文本之后,读者已经很难再还原原意,那说明这类内容还没准备好进入最基础的文本型 RAG 流程。
一句话总结
复杂格式更难处理,不是因为它们不能成为知识源,而是因为它们的知识往往嵌在“文字 + 结构 + 视觉关系”里。RAG 要真正用好这类内容,首先要尽量把这些关系保留下来。