文章

RAG 的第一道坎,可能不是大模型,而是 PDF

知识库效果好不好,很大程度上取决于文档有没有被正确解析。复杂 PDF 如果在入口处就把表格、公式和阅读顺序弄错,后面的检索和生成再强也很难补回来。

RAG 的第一道坎,可能不是大模型,而是 PDF

PDF 转 Markdown 是一个绕不开的需求。训练大模型需要干净的文本语料,做知识库和 RAG 要把 PDF 拆成结构化内容,写论文笔记、整理资料也经常需要提取 PDF 里的表格和公式。

PDF 本身是为看而设计的格式,不是为读而设计的。怎么把它转成机器和人都好用的 Markdown,一直是个需求明确、但解决得不够好的问题。

主流开源方案我基本试了一轮,能把双栏论文、跨页表格、公式密集的文档稳定搞定的并不多。实测下来,MinerU2.5 是目前综合体验最好的开源方案之一——识别质量、速度、部署成本三者兼顾,而且完全开源。

此前我写过一篇 MinerU Pipeline 的拆解,介绍了它如何用 Layout Detection → OCR → Formula/Table Recognition → 后处理规则,一步步把 PDF 转成 Markdown。这套方案的问题很直观:多个专业模型串成一条链,Layout 判错一个框,后面全跟着错位;每个模型都要单独部署和维护,后处理规则也越堆越多。

同一团队随后发布的 MinerU2.5 换了一种思路:不用多个专业模型接力,只用一个 1.2B 参数的 VLM,让它跑两遍。

两遍的分工很清楚:

🔭 第一遍,看全局:缩略图扫一眼整页,搞清楚这里有什么、在哪、什么方向、按什么顺序读。
🔬 第二遍,看细节:拿着第一遍标好的位置,去原图裁对应区域放大看,识别出具体内容。

同一个模型,切换 Prompt 就能完成不同的任务。整条流水线的结构:

📄 缩略图 → 🔭 版面分析 → ✂️ 裁剪 + 校正 → 🔬 内容识别 → 📝 Markdown


🔭 第一遍:版面分析——搞清楚有什么、在哪

这一步要回答的问题是:这页文档有什么、在哪、什么方向、什么顺序。

为什么先看缩略图,不看原图

直接在高分辨率原图上做版面分析,有两个绕不开的问题。一是 VLM 的 visual token 数量随像素平方增长,一页 A4 级别的文档动辄产生数千 tokens,页面里大片的空白边缘和行间距都在白白消耗算力。二是版面分析本身不需要看清每个字的笔画——只需要知道“这里有一块表”“那里有一段正文”,缩略图完全够用。

MinerU2.5 把整页降采样到 1036×1036 像素。这个尺寸是权衡过的:太小会丢失细粒度元素的边界(比如小号字体、紧密排列的图注),太大又会落入 VLM 编码器的平方复杂度区间,得不偿失。用固定尺寸而不是保持原始宽高比,是因为固定尺寸下 bbox 的定位更稳定。

一次推理,四样东西一起出

模型用 Prompt Layout Detection: 看这张缩略图,输出页面上每个元素的结构化信息:

1
2
3
4
Box: [163  81 836 129]   Type: Table Caption   Orientation: up   Order: 1
Box: [169 138 831 250]   Type: Table           Orientation: up   Order: 2
Box: [162 264 486 471]   Type: Text            Orientation: up   Order: 3
...

跟 Pipeline 的 Layout Detection 一对比,差异很清楚:

  • Pipeline:只输出 label + bbox → 阅读顺序靠后处理几何规则推断 → 旋转文本需单独判定方向后再校正
  • MinerU2.5:一次输出 label + bbox + 方向 + 顺序 → 下游直接使用,无需再猜

类别也从 Pipeline 的十几种扩展到了 20 多种——除了基础的 text、title、table、formula、image,还细分出了 code、algorithm、list、reference、header、footer、pagenumber、aside text 等。

Layout Detection 效果示例

交给下一步

第一遍产出的是一份 bbox 列表。程序对每个 bbox 做三件事:

  1. 从原始高清图(不是缩略图)按坐标裁出对应区域;
  2. 如果旋转方向不是 up,直接旋转校正;
  3. 根据类别,决定接下来用哪个 Prompt。

💡 关键设计:高清像素只在裁剪后的局部区域进入推理,整页高清从头到尾不进入 VLM——token 爆炸从根源上被规避。旋转校正也顺带完成,Pipeline 中“先判方向、再校正、再识别”的串行开销不复存在。


🔬 第二遍:内容识别——搞清楚具体是什么

第一遍告诉你这里是什么,第二遍负责把内容真正识别出来。

同一个 MinerU2.5,根据类别切换不同 Prompt:文字用 Text Recognition:,公式用 Formula Recognition:,表格用 Table Recognition:。输入都是从原始高清图里裁出来的局部区域。

📄 文本:最直接的识别路径

Prompt 用 Text Recognition:,输入是裁剪出的文字区域图片(原生分辨率),模型直接输出纯文本:

1
2
The results of the analyses of the uncertainty of the field data
and related assumptions are shown in Figs 13 and 14.

没有坐标、没有标签,输出即所得。这一点跟 Pipeline 不同——Pipeline 的文字来源要分两条路:扫描件跑 OCR 模型,数字 PDF 直接读文本层。MinerU2.5 统一走 VLM 识别,无论原文件是扫描件还是数字 PDF。

🧮 公式:复杂的先拆开再识别

短公式可以直接识别成 LaTeX。遇到长公式或多行推导,MinerU2.5 会先把它拆成几个更简单的公式片段,分别识别,再按原来的位置关系拼回去。

论文把这套方法叫做 ADR(Atomic Decomposition and Recomposition)。

🧮 复杂公式 → ✂️ 拆开 → 🔍 分别识别 → 🧩 重新组合

核心思路就一句话:一个复杂任务不好做,就先拆成几个简单任务。

📊 表格:先识别结构,再转成 HTML

表格也没有直接让模型生成一长串 HTML,而是先输出一种更简洁的表格结构表示——OTSL,再通过规则转换成标准 HTML。

📊 表格 → 🔍 识别结构 → 🧱 OTSL → 🔄 HTML

这样模型只负责看懂表格,而格式转换交给确定性的规则处理。对于大表格和复杂合并单元格,这种方式也更稳定。

换句话说,公式和表格虽然各自有一点特殊处理,但都没有改变第二阶段的核心:只对第一阶段找出来的局部高清区域做精细识别。


📐 与 Pipeline 的对比

环节MinerU PipelineMinerU2.5
Layout专用检测模型(label + bbox)VLM 看缩略图(label + bbox + 方向 + 顺序)
文字OCR 模型 / 直接读取 PDF 文本层(两套路径)VLM 第二遍统一识别
公式专用公式模型 → LaTeX第二遍 + ADR 拆-合
表格专用表格模型 → HTML第二遍 → 表格中间表示 → HTML
阅读顺序后处理靠几何规则推断第一遍直接给编号
后处理大量几何规则(框归属、段落合并等)极简,核心只剩表格格式转换

💡 Pipeline 的复杂性散落在一堆专业模型和海量规则里;MinerU2.5 把它们收回到一个 VLM 中,靠两次推理的分工和 Prompt 切换组织起整条流水线。


知识库和 RAG 的上限,很多时候就是被 PDF 解析这一层卡住的。如果你正在被表格错位、公式乱码折磨,建议直接拿自己的文档去跑一遍——这种事听别人说没用,十分钟就能验证。

你目前在用什么方案解析 PDF?欢迎在评论区聊聊踩过的坑。

📄 论文:MinerU2.5: A Decoupled Vision-Language Model for Efficient High-Resolution Document Parsing

本文由作者按照 CC BY 4.0 进行授权