做 Agent 绕不开 RAG,做 RAG 绕不开 PDF。而 PDF 恰恰是文档格式里最难啃的那块骨头------它本质上是「打印指令」而不是「结构化数据」。本文把 PDF 进入 RAG 的完整链路拆成六步,讲清楚每一步该做什么、为什么这么做、容易踩什么坑。
目录
-
一、为什么 PDF 是 RAG 的地狱级输入
-
二、整体链路总览
-
三、Step 1:识别 PDF 的类型
-
四、Step 2:文本 / OCR / 视觉 三路解析
-
五、Step 3:还原文档结构
-
六、Step 4:语义切片 + Metadata
-
七、Step 5:混合检索 + Rerank
-
八、Step 6:把 PDF 处理封装成 Agent 工具
-
九、按需检索:读页、抽表、看图
-
十、引用与评测闭环
-
十一、总结
一、为什么 PDF 是 RAG 的地狱级输入
很多人对 PDF 的认知停留在「一个能装文字的容器」,于是随便找个库抽一把文本,结果线上效果惨不忍睹。原因在于 PDF 的真实身份:
PDF 描述的是「在什么坐标画什么字形」,而不是「这段文字属于哪个段落」。
由此衍生出一堆坑:
| 坑 | 表现 | 后果 |
|---|---|---|
| 无文本层 | 扫描件抽出来是空字符串 | 检索直接失效 |
| 阅读顺序错乱 | 双栏论文被按行拼接 | 语义完全颠倒 |
| 表格塌陷 | 单元格变成一堆空格分隔的数字 | 数值问答必错 |
| 页眉页脚污染 | 每页都出现「XX公司 内部资料」 | 召回一堆噪声 |
| 公式/图表丢失 | 关键结论在图片里 | 答不出来 |
| 跨页断裂 | 一个表格横跨 3 页 | 切片后语义不完整 |
所以正确的思路不是「抽文本」,而是把 PDF 逆向工程回它原本的文档语义。
二、整体链路总览
整条链路可以概括为八个环节:
识别类型 → 多模态解析 → 还原结构 → 切片标注 → 检索 + Rerank → 封装成工具 → 按需检索(读页、抽表、看图)→ 引用与评测闭环
拆开来看:
-
类型识别:判断这份 PDF 是文本型、扫描型还是混合型,逐页打标。
-
多模态解析:文本层抽取、OCR、视觉模型三条路按需路由,表格和公式单独处理。
-
结构还原:还原标题层级、阅读顺序,把解析结果归一化成统一的中间表示。
-
语义切片 + Metadata:按结构切而不是按字数切,每个切片携带页码、坐标、章节路径。
-
索引与检索:稀疏检索 + 稠密检索双路召回,再用 Rerank 精排。
-
封装成 Agent 工具:把 PDF 能力变成 Agent 可调用的工具集。
-
按需检索:读页、抽表、看图,不把整份 PDF 塞进上下文。
-
引用与评测闭环:每个结论可回溯到原文位置,bad case 能分层归因。
下面逐步展开。
三、Step 1:识别 PDF 的类型
不要一上来就 OCR,OCR 又慢又贵还可能引入错误。第一步永远是逐页探测,判断这一页到底该怎么处理。
判定主要看三个维度:
-
文本层字符数:这一页能抽出多少有效字符。
-
图片覆盖面积占比:图片面积占整页面积的比例。
-
字体信息:是否有嵌入字体、字符是否带坐标框。
根据这三个维度,把每一页归为三类:
-
文本型:文本层字符充足,图片占比低,正常电子版 PDF。
-
扫描型:几乎没有文本层,整页基本是图片。
-
混合型:文本层有一些内容,但图片占比很高,或者部分区域是图片。
拿到逐页报告后做文档级决策:
-
全部是文本型 → 走快速文本通道。
-
全部是扫描型 → 走 OCR / 视觉通道。
-
出现混合型,或者文本页里图片占比过高 → 走逐页路由,混合处理。
💡 实战经验:真实业务里 80% 的「扫描件」其实是混合型------正文有文本层,但关键表格、印章、签字是图片。只做全文 OCR 会浪费算力,只做文本抽取又会丢关键信息。逐页路由是性价比最高的方案。
顺便在入口做几个防御性检查:文件是否加密、是否为零页、是否超大文件、是否损坏。这些检查能在管线最开始就拦住问题,避免后续所有环节白跑。
四、Step 2:文本 / OCR / 视觉 三路解析
三种解析路线的定位完全不同,不是替代关系而是互补关系:
| 路线 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 文本层抽取 | 电子版 PDF | 快、准、免费 | 无文本层就废 |
| OCR | 扫描件、图片页 | 可控、可私有化 | 版面复杂时顺序乱 |
| 视觉模型 | 复杂版面、图表、公式 | 理解力强,直接出结构化结果 | 贵、慢、可能幻觉 |
4.1 文本层抽取
文本层抽取不只是把字抽出来,还要保留样式线索------字号、字体、是否加粗、字符坐标。这些信息是后面判断标题层级、还原阅读顺序的关键,丢了就补不回来。
4.2 OCR
扫描页的处理链路通常是:
页面渲染成高清图 → 版面分析(分出标题、正文、表格、图片区域)→ 分区域 OCR → 按版面顺序重排
不要直接用最基础的 OCR 引擎裸跑,它对中文和复杂版面效果很差。推荐几类更成熟的方案:
-
轻量级方案:速度快、部署友好,适合大批量简单扫描件。
-
中文成熟方案:自带版面分析,对中文场景支持好。
-
阅读顺序方案:版面分析、阅读顺序预测、OCR 一体,多栏文档表现优秀。
4.3 视觉解析
对于版面极度复杂的页(多栏 + 表格 + 公式 + 图注),现在越来越流行直接让视觉模型「看图转 Markdown」。提示词一般要求它:
-
用标题层级还原结构;
-
表格用 Markdown 表格,保持行列对齐,不漏单元格;
-
公式用 LaTeX;
-
图片保留图注文字;
-
保持阅读顺序,不遗漏文字。
优点是省事、效果好;缺点是贵、慢、有幻觉风险。生产上建议:
-
只对「文本层抽取质量差」的页启用视觉模型,用置信度触发;
-
要求输出带页码的引用锚点,方便回溯;
-
关键数字类内容用 OCR 结果交叉校验。
4.4 表格与公式专项
表格是 RAG 里最容易翻车的地方,必须单独处理。常见三条路:
-
规则法:适合有框线的规则表格,靠线条和空白区域切分。
-
模型法:适合无框线表格,用专门的表格识别模型。
-
视觉模型法:直接把表格区域截图丢给多模态模型转 Markdown,适合结构复杂、合并单元格多的表格。
核心原则:表格是一个原子单元,后续切片时绝对不能切开。
4.5 解析路由
把上面几路串成一个路由器,逻辑是:
-
文本型页 → 先走文本层抽取,质量自检不过关再降级到视觉模型。
-
扫描型页 → 走 OCR 或视觉模型。
-
混合型页 → 文本层抽取 + 图片区域单独处理,最后合并。
这样每一页都走最适合它的那条路,成本和效果都能兼顾。
五、Step 3:还原文档结构
解析出来还是一堆扁平的文字块,这一步要把它们「重新组装成文档」。
5.1 判断标题层级
用三个信号综合判断:
-
字号:与正文字号对比,明显更大的大概率是标题。
-
加粗:加粗且长度不长的,很可能是标题。
-
编号模式:像「第X章」「1.2.3」「一、」这类编号,几乎可以确定是标题。
三个信号一起用,比单独看字号或单独看编号都稳。
5.2 阅读顺序还原
多栏排版是重灾区。单靠坐标排序会得到「左栏第一行 → 右栏第一行 → 左栏第二行」这种灾难。常见解法:
-
简单法:检测页面列分割线,按列分块后再各自纵向排序。
-
模型法:用专门的版面分析模型预测阅读顺序。
-
视觉模型法:让多模态模型直接按阅读顺序输出内容。
简单法适合结构规整的双栏文档,模型法和视觉模型法适合复杂版面。
5.3 统一中间表示
不管前面用哪条路线解析,最后都归一化成同一个结构。这个结构一般包含:
-
唯一标识:文档 ID、块 ID;
-
位置信息:页码、坐标框;
-
类型:标题、正文、表格、图片、公式、列表、图注;
-
内容:Markdown、纯文本或 LaTeX;
-
层级:标题层级,非标题为 0;
-
章节路径 :像
["第3章", "3.2 模型"]这样的路径; -
扩展元数据:其他辅助信息。
有了统一中间表示,后面的切片、索引、检索、引用全部基于它,与具体的解析器解耦。换 OCR 引擎不用改下游代码,这是工程上非常重要的一点。
六、Step 4:语义切片 + Metadata
6.1 别再用固定长度切分了
按固定字数切片对 PDF 是灾难。正确做法是先按结构切,再按长度兜底:
-
按章节路径分组;
-
组内按块类型合并;
-
标题不单独成块,作为上下文前缀;
-
表格、公式、图注是原子块,不切;
-
长正文超过阈值才按语义切。
这样切出来的每一块都语义完整,而不是「半句话 + 半句话」的拼接。
6.2 小块检索,大块生成
这是提升 RAG 效果最立竿见影的技巧之一:
-
检索用小块(几百字):向量表征更聚焦,召回更准。
-
生成用大块(父块或整节):上下文更完整,答案更全。
实现方式是每个小切片存一个父块引用,检索命中后向上取父块内容喂给 LLM。这样兼顾了召回的精度和生成的完整性。
6.3 Metadata:决定引用能不能落地
Metadata 不是可选项,是引用溯源的生命线。建议字段分四类:
溯源三要素(缺一不可):
-
文档 ID;
-
页码;
-
坐标框。
结构信息:
-
章节路径;
-
块类型(正文 / 表格 / 图片)。
文档级信息:
- 文档标题、版本、来源链接、文件哈希、更新时间。
检索辅助信息:
- 是否含表格、关键词等。
其中页码 + 坐标框 是让前端能在原文上高亮命中位置的关键。没有它,Agent 的引用就是一句空话。
七、Step 5:混合检索 + Rerank
7.1 为什么必须混合检索
纯向量检索对专有名词、编号、数字极不敏感------「第 3.2 条」和「第 3.3 条」在向量空间里几乎一样。而 PDF 场景里这类精确匹配恰恰是刚需。
所以走 稀疏检索 + 稠密检索双路召回 → 融合 → Rerank 的路线:
-
稀疏检索:基于关键词匹配,对编号、条款号、数字非常敏感。
-
稠密检索:基于向量语义,对同义表达、模糊描述更友好。
-
融合:常用 RRF(倒数排名融合),把两路结果按排名合并,比手动调权重更稳。
-
Rerank:召回几十条,用 Cross-Encoder 精排到几条。
7.2 Rerank
召回阶段追求「不漏」,Rerank 阶段追求「精准」。常用方案:
-
中文效果好、可私有化的 Rerank 模型;
-
API 方便、多语言强的商业 Rerank 服务;
-
轻量级开源 Rerank 模型。
Rerank 的本质是用一个更强的模型重新打分,把真正相关的排到最前面。
7.3 特殊类型走专属索引
-
表格:单独建表索引,把表头 + 表名 + Markdown 一起做向量化,检索时优先命中。
-
图片 / 图表:用多模态向量建图索引,或让视觉模型生成图片描述后入文本索引。
-
公式:转 LaTeX 后入索引。
不同类型的内容用不同的索引策略,比全部混在一起效果好得多。
八、Step 6:把 PDF 处理封装成 Agent 工具
前面都是「离线管线」,但 Agent 场景下,在线按需检索同样重要。因为:
-
一份几百页的 PDF,全量塞进上下文不现实;
-
用户可能只想看某一页的表格;
-
图表信息只有「看图」才能拿到。
所以把 PDF 能力封装成一组 Agent 工具,常见的有:
-
列出文档:列出知识库中所有 PDF 及其元信息。
-
获取目录:返回章节标题 + 页码,用于快速了解文档全貌。
-
混合检索:在指定文档或全库中做检索,返回相关片段及其页码、坐标。
-
读取整页:读取指定页完整内容,含前后各一页作为上下文。
-
抽取表格:抽取指定页的表格,返回 Markdown 格式。
-
查看图片:把某页指定区域渲染成图片,交给视觉模型理解。
每个工具的返回值都必须带引用信息:文档 ID、页码、坐标、章节路径。这样 Agent 拿到结果后,可以自然地生成带页码的引用,比如「根据《XX采购合同》第 12 页第 3.2 节......」。
九、按需检索:读页、抽表、看图
Agent 使用 PDF 工具的典型决策路径:
用户提问 → 判断问题类型 → 选择工具 → 拿到结果 → 判断信息是否足够 → 不够则继续取用
具体分几种情况:
-
问题泛(「这份合同讲了什么」)→ 先取目录 → 生成摘要。
-
问题具体(「违约金怎么算」)→ 混合检索 → 命中片段信息够就直接回答,不够就读取整页。
-
问题涉及数值(「2023年Q3营收多少」)→ 检索命中表格所在页 → 抽表 → 转 Markdown → 回答。
-
问题涉及图示(「系统架构是怎样的」)→ 检索命中图片块 → 查看图片 → 视觉模型理解 → 回答。
关键设计原则:按需检索,不要一次把整份 PDF 塞进上下文。 这既省 token,又避免「大海捞针」式的注意力稀释。
另外一个实用技巧:读取整页时自动带上前后各一页作为上下文。因为 PDF 里的表格、条款经常跨页断裂,多读一页能显著降低「读了一半」的错误。
十、引用与评测闭环
10.1 引用:让每个结论都能回溯
RAG 没有引用就等于没有可信度。要做到三个级别:
-
切片级别:每个切片保留文档 ID、页码、坐标。
-
回答级别:LLM 输出时强制标注来源,格式如「合同2024 §3.2, p.12」。
-
前端级别:点击引用 → 打开 PDF 对应页 → 坐标高亮。
提示词里也要明确要求:只依据提供的资料回答,资料中没有的信息明确说「未找到」;每个事实性结论后必须附来源;表格数据请完整引用,不要四舍五入。
10.2 评测闭环:分层归因
RAG 出问题时,必须先判断是哪一层坏了,否则改错地方白费功夫。分层来看:
| 层级 | 关注指标 |
|---|---|
| 解析层 | 文本抽取准确率、表格还原准确率、阅读顺序正确率 |
| 检索层 | Recall@k、MRR、nDCG@k、命中率 |
| 重排层 | Rerank 后 Top-3 命中率 |
| 生成层 | 忠实度、答案相关性、引用准确率 |
| 端到端 | 答案正确率、幻觉率、用户满意度 |
构建评测集时,每条样本应包含:问题、标准答案、标准文档 ID、标准页码、标准原文片段、问题类型(文本 / 表格 / 图片)。这样一旦出错,能立刻定位到具体是哪一环。
Bad case 回流机制(最重要的一环):
-
检索没召回 → 检查解析是否丢内容、切片是否切开语义、embedding 是否合适;
-
召回了但没排上 → 调整 Rerank、加混合检索权重;
-
排上了但答错 → 检查提示词、大块上下文是否完整;
-
引用了不存在的页码 → 检查 metadata 传递链路。
每次 bad case 修复后,把它加入评测集,防止回归。没有评测闭环的 RAG 系统,本质上是不可维护的。
十一、总结
回到最开始那张图,把整条链路再压缩一遍:
识别类型(文本 / 扫描 / 混合)→ 多模态解析(文本层 / OCR / 视觉 / 表格 / 公式)→ 还原结构(标题层级 + 阅读顺序 + 统一中间表示)→ 语义切片 + Metadata(结构优先、小块检索大块生成、页码坐标必带)→ 混合检索 + Rerank(稀疏 + 稠密 + 精排)→ 封装成 Agent 工具(检索 / 读页 / 抽表 / 看图)→ 按需检索 → 做好引用和评测闭环。
几个最容易踩的坑,最后强调一下:
-
别一把梭 OCR:先做类型识别,逐页路由,省钱又省时。
-
别按字数切:PDF 切片的单位是「结构」,表格和公式是原子块。
-
别丢页码和坐标:没有它们,引用就是空中楼阁。
-
别只做向量检索:PDF 里的编号、条款号、数字,必须靠稀疏检索兜底。
-
别把整个 PDF 塞进上下文:把它变成工具,让 Agent 按需取用。
-
别不做评测:分层归因 + bad case 回流,才是系统持续变好的唯一路径。
PDF 处理没有银弹,但只要把这条链路每一环做扎实,Agent 的 RAG 效果会有肉眼可见的提升。
参考方案与工具方向
-
解析:PyMuPDF、pdfplumber、MinerU、Docling、marker、unstructured
-
OCR / 版面:PaddleOCR(PP-StructureV2)、RapidOCR、Surya
-
表格:Camelot、Table Transformer、pdfplumber
-
模型:Qwen2.5-VL、InternVL、GPT-4o(视觉);bge-m3、bge-reranker-v2-m3(检索)
-
评测:RAGAS、TruLens