文档解析
2297 字约 8 分钟
domain/aiai/rag
2026-07-24
文档解析是 RAG 流程的地基工序。地基不稳,调 embedding、换 reranker、改 prompt 都是治标不治本。解析质量通过错误传导链直接影响最终答案质量。
一句话解释
将各种格式的原始文档(PDF、Word、HTML、图片等)转换为保留结构语义的标准化文本(通常是 Markdown),作为后续切分和向量化的输入。
核心问题
文档解析为什么是 RAG 的"最脏的活"?
- 格式多样性:PDF 内部只有字符坐标与字体信息,没有语义层级;Word 有完整结构;HTML 有 DOM 树;扫描件是纯图片
- 结构还原难:双栏布局、跨页表格、页眉页脚、图注、公式——这些视觉元素在纯文本提取中极易丢失或乱序
- 解析质量传导:版面检测偏差 → 阅读顺序错误 → 语义切片断裂 → 检索召回偏差 → LLM 生成错误答案
基础概念
文档解析:将各种格式文档转换为结构化可处理文本的过程,核心目标是从"视觉格式"还原为"语义格式"。
版面分析:识别文档中的物理布局(标题、段落、表格、图片、页眉页脚),是 PDF 解析的核心前置步骤。
OCR:从图片中提取文字,是扫描件 PDF 必经之路。300dpi 以下扫描件通常是识别质量滑坡的起点。
阅读顺序:正确的阅读顺序(先左栏后右栏,先上后下)是 PDF 解析的最大挑战,错误顺序会导致语义断裂。
中间格式:Markdown 是推荐的中间格式,可保留标题层级、表格、列表、代码块等结构语义。
PDF 解析工具对比
PDF 是 RAG 场景中最常见也最难处理的文档格式。当前主流工具分三类:纯规则引擎、AI 模型驱动、云端 API 服务。
| 工具 | 技术路线 | 开源协议 | 文字提取 | 公式(LaTeX) | 表格(HTML) | 阅读顺序 | 速度 |
|---|---|---|---|---|---|---|---|
| MinerU 2.5 | VLM (1.2B) + OCR | Apache 2.0 | 93.2% | 87.4% | 85.6% | 94.1% | 0.3/2.1 页/s |
| LlamaParse | GPT-4o 语义解析 | 商业 SaaS | 82% | 65% | 74% | 78% | ~0.5 页/s |
| Docling | 深度学习多模型 | MIT | 79% | 58% | 72% | 75% | 0.49s/页 |
| Marker | 深度学习模型 | 开源 | 80% | 71% | 68% | 77% | 中等 |
| Unstructured | 规则+轻量CV | 核心开源 | 75% | 22% | 61% | 70% | 0.8 页/s |
| PyMuPDF | 纯规则,无模型 | AGPL/商业 | 91% | 不支持 | 54-60% | 67-85% | 50+ 页/s |
数据来源:OmniDocBench(CVPR 2025 收录),覆盖学术论文、教材、财报、试卷等 9 种文档类型。
选型建议:
- 学术论文/含公式文档 → MinerU(公式识别是核心分水岭)
- 普通原生 PDF,速度优先 → PyMuPDF(50+ 页/s,无需模型)
- 多格式混合(Word/PPTX/HTML) → Docling 或 Unstructured
- 快速验证/不想本地部署 → LlamaParse(免费额度 1000 页/天)
- 不想付费+本地部署 → MinerU 或 Marker
其他文档类型解析
| 文档类型 | 推荐工具 | 说明 |
|---|---|---|
| Word (.docx) | Docling、python-docx | Docling 保留结构层级;python-docx 轻量读取 |
| HTML | Docling、Unstructured、BeautifulSoup | Docling 支持 HTML→Markdown;Unstructured 支持语义提取 |
| PPTX | Docling、python-pptx | Docling 原生支持幻灯片结构提取 |
| Excel/CSV | Unstructured、pandas | 表格不应被切碎,保持原子性 |
| 代码文件 | tree-sitter | 使用 AST 解析器,保留函数签名 + docstring |
| 图片/扫描件 | MinerU、PaddleOCR、GPT-4V | 300dpi+ 保证 OCR 质量;VLM 可绕过字体层 |
Unstructured 格式支持最全(20+ 种文件类型),Docling 统一输出为 Markdown/JSON 最方便。
解析 Pipeline 设计
现代 RAG 的数据摄取管线(Ingestion Pipeline)可类比传统 ETL:
原始文档
│
▼
┌─────────────┐
│ 1. Loader │ ← 文档加载与解析(PDF/Word/HTML → Markdown)
│ (解析) │ 工具:MinerU / Docling / Unstructured / PyMuPDF
└──────┬──────┘
▼
┌─────────────┐
│ 2. Splitter │ ← 文本切分(Chunking)
│ (切分) │ 策略:递归字符切分 / 语义切分 / 标题层级切分
└──────┬──────┘
▼
┌─────────────┐
│ 3. Transform │ ← 增强处理
│ (增强) │ • LLM 重写(指代消解、上下文补全)
│ │ • Image Captioning(图片转文本描述)
│ │ • 元数据提取(作者、来源、章节标签)
└──────┬──────┘
▼
┌─────────────┐
│ 4. Embedding │ ← 向量化
│ (向量化) │ • Dense:语义向量(OpenAI/BGE)
│ │ • Sparse:BM25 词频向量
└──────┬──────┘
▼
┌─────────────┐
│ 5. Upsert │ ← 存储与索引
│ (存储) │ 幂等写入 + 向量数据库
└─────────────┘关键设计原则:
- 选择 Markdown 作为中间格式:保留标题层级、表格、列表等结构语义
- 分块策略必须与检索需求协同设计
- 幂等写入:避免重复解析同一文档
特殊格式处理
表格
表格是文档解析的硬骨头。综合评测(OmniDocBench)中 Docling 的表格(HTML)为 72%,但在部分简单结构化表格场景可达 90%+;没有单一工具全场通吃。
最佳实践:
- 表格标题与表格内容必须合并为同一 chunk,避免检索时只找到标题或只找到数据
- 输出格式:HTML(结构最完整,支持跨页合并)> Markdown(轻量)> LaTeX(学术场景)
- 跨页表格:需要版面分析工具识别并合并
- Docling 在简单结构化表格提取上表现稳健(特定场景准确率可达 90%+),但在 OmniDocBench 综合评测中为 72%,说明复杂表格(跨页、合并单元格、手写体)仍是挑战。趋势:集成多工具的表格提取方案是工业界共识
图片
- 使用 VLM(如 GPT-4V、Qwen-VL)生成描述性文本(Image Captioning),将图像信息转为可检索文本
- 将图片 caption 与邻近文本段落合并为一个 chunk,保持语境完整
- 2025-2026 趋势:原生多模态检索,图片向量化后直接参与向量搜索,不再只依赖 caption
公式
- 优先输出 LaTeX:行内公式用
$...$,块级公式用$$...$$ - 工具选择:MinerU(UniMERNet)> LlamaParse > Marker > Docling >> Unstructured/PyMuPDF
- 公式向量化效果差,通常建议保留原始 LaTeX 文本供 LLM 直接理解
代码块
- 使用 Markdown fenced code block 确保内容"所见即所得"
- 保留原始缩进和语言标签(如 ````python`)
- 代码类 RAG 不应仅依赖 Grep,应使用专门微调的代码 Embedding 模型
解析质量对 RAG 的影响
| 解析缺陷 | 对检索的影响 | 对生成的影响 |
|---|---|---|
| 双栏乱序 | 相关段落被割裂存储,语义相似度失真 | LLM 获得混乱上下文,无法建立逻辑关系 |
| 表格变数字碎片 | 表格无法被正确检索 | LLM 无法判断数字所属行列,引用错误 |
| 公式丢失/乱码 | 含公式的 chunk 语义被污染 | 科学/技术问答中公式推导完全失效 |
| 页眉页脚混入 | 引入无关噪声,降低检索精度 | 生成内容中出现无关的页码、章节提示 |
| 跨页表格断开 | 上下半表被切成两个独立 chunk | 模型只能看到部分数据,结论不完整 |
核心结论:向量数据库和嵌入模型的精心选型,很可能被上游一个粗糙的版面还原步骤悄悄抵消。实践中建议先用小规模文档集跑通全链路并人工抽检切片质量,再批量处理。
常见误区
- 只用 PyMuPDF 处理扫描件:扫描件本质是图片,PyMuPDF 不支持 OCR,识别率骤降至 <40%
- 不验证阅读顺序:双栏 PDF 最容易出现左右栏混排,必须人工抽检
- 解析后直接切分不检查:脏数据直接进入向量库,后续优化都治标不治本
- 忽视表格、公式、代码的特殊处理:这些内容有独特的结构语义,不能用纯文本提取
- 以为解析工具越新越好:老牌工具如 PyMuPDF 在原生 PDF 上速度秒杀所有 AI 工具
2024-2026 趋势
- VLM 驱动解析:MinerU 2.5 采用 1.2B 专项 VLM,在文档解析上超过 72B 通用大模型——专项模型只需理解版面,不需要通用推理
- OmniDocBench 成共识基准:CVPR 2025 收录,覆盖 9 种文档类型,替代了此前碎片化的评测
- Ingestion Pipeline 成为基础设施:PTI(Parse-Transform-Index)管线类比 AI 时代的 ETL
- MCP Server 集成:可能存在社区实现的 MCP Server(待确认),Agent 可直接调用文档解析能力。TODO(agent): verify MCP server availability for MinerU/Docling
综合选型建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 学术研究/论文库 | MinerU + MarkdownHeaderTextSplitter | 公式、阅读顺序、标题层级全面领先 |
| 企业知识库(多格式) | Docling / Unstructured + 本地部署 | 格式覆盖广,合规友好,无数据出境风险 |
| 快速原型/MVP | LlamaParse | 接入简单,效果稳定,按量付费 |
| 简单报告/文字型 PDF | PyMuPDF | 速度极快,无需模型,资源占用低 |
| 扫描件/图片 PDF | MinerU 精准模式 / LlamaParse | OCR + 版面分析一体化 |
| 财务报告/复杂表格 | Docling / MinerU + 多工具兜底 | 复杂表格交叠验证 |
| 代码库 RAG | tree-sitter + 专用代码 Embedding | 保留语法结构 |