乐于分享
好东西不私藏

喂给AI的知识库,不是直接丢文件进去就行——文档解析是第一道坎

喂给AI的知识库,不是直接丢文件进去就行——文档解析是第一道坎

你可能听过这个说法:做 RAG,就是把文档切成块,往向量数据库里一存,检索出来喂给模型。

听起来很简单。

但真正做过的人都知道,第一步就把很多人卡住了——

文件格式那么多(PDF、Word、PPT、Excel、图片……),里面的内容有标题、有段落、有表格、有图表、有页眉页脚。AI 怎么知道哪些是正文、哪些是注释、哪些是页码?

这一步,叫做文档解析

它是 RAG 流水线里最容易被低估的环节,也是决定知识库质量的第一关。

RAG系列·第1篇:文档解析——喂给AI的知识库,不是直接丢文件就行


目录

  • 1. 文档解析,到底在做什么
    • 1.1 一个不准确的类比
    • 1.2 文档解析的定义
    • 1.3 为什么直接复制文字不够用
  • 2. 文档解析的核心步骤
    • 步骤一:布局分析(Layout Analysis)
    • 步骤二:阅读顺序还原
    • 步骤三:内容提取
    • 步骤四:结构化输出
  • 3. 文档解析 vs OCR vs 多模态大模型
    • 3.1 三种技术的核心原理
    • 3.2 一张图说明三者的关系
    • 3.3 实践中三者的真实关系
    • 3.4 适用场景对比
  • 4. 实际工作流:三者怎么配合
  • 5. 选型建议:什么时候用什么
  • 6. 主流工具推荐
  • 7. 一句话总结

1. 文档解析,到底在做什么

1.1 一个不准确的类比

想象你有一本书,想让 AI 理解它的内容。

最笨的做法:把整本书扫描成一张张图片,扔给模型看。

聪明一点的做法:把书里的文字提取出来。

但更聪明的是:不仅提取文字,还要理解书的结构——哪是章节标题,哪是一级内容,哪是图表说明,哪是引用注释。

第三种做法,就是文档解析在做的事情。

1.2 文档解析的定义

文档解析:从原始文档中,识别并提取出具有语义意义的结构化片段,并将其转化为大模型可以理解的格式。

这句话有三个关键词:

原始文档——可能是 PDF、Word、PPT、Excel,甚至是一张截图。注意,并非所有 PDF 都有文字层——某些设计软件导出或加密的 PDF,底层只有图像信息,看起来是文档,实际上文字不可选中、不可复制,这种"假PDF"本质上就是图片。

结构化语义片段——不是把文字全部打成一团,而是识别出:

  • 这段文字是什么类型的(标题、正文、表格、列表)
  • 这段文字和其他内容是什么关系(段落包含关系、引用关系)

大模型可理解的格式——通常指 Markdown、JSON 或纯文本块,加上必要的元信息(这段在第几页、属于哪个章节)。

1.3 为什么直接复制文字不够用

很多人会问:PDF 直接复制文字不行吗?

不行。原因很现实:

原始 PDF 文字:"第三章  RAG 技术详解3.1  什么是 RAGRAG(Retrieval-Augmented Generation)是一种结合检索和生成的..."

复制出来的效果:

  • 丢失了标题和正文的层级关系
  • 丢失了段落之间的逻辑边界
  • 丢失了页眉页脚的噪音
  • 丢失了表格和图表里的信息

好的文档解析后:

{"type""heading","level"1,"text""第三章 RAG 技术详解"}{"type""heading","level"2,"text""3.1 什么是 RAG"}{"type""paragraph","text""RAG(Retrieval-Augmented Generation)是一种...","page"1}{"type""table","headers": ["技术名称""优缺点""适用场景"],"rows": [...]}

2. 文档解析的核心步骤

一个完整的文档解析流程,包含以下四个步骤:

步骤一:布局分析(Layout Analysis)

识别文档的视觉结构——哪块是文字、哪块是表格、哪块是图片、哪块是页眉页脚。

这一步决定了你能不能把"噪音"和"正文"区分开。

传统方法:用规则(PDF 里固定位置通常是页眉页脚)。

现代方法:用布局检测模型(深度学习),识别文档里每个区域的类型,准确率高得多。

步骤二:阅读顺序还原

把二维页面上的元素,按照正确的阅读顺序串起来。

为什么这步很重要?

这取决于 PDF 是怎么生成的:

数字生成的 PDF(Word/WPS/浏览器直接导出):文字流顺序通常就是阅读顺序,不乱,解析起来相对容易。

扫描件或图片转的 PDF:没有文字流信息,靠 OCR 提取后再靠算法推断阅读顺序,这时候多栏排版和跨页表格就容易顺序错乱。

一个三栏 PDF 页面:左边栏 | 中间栏 | 右边栏物理存储顺序可能是:左边栏第1段 → 中间栏第1段 → 右边栏第1段 → 左边栏第2段...阅读顺序应该是:左边栏第1段 → 左边栏第2段 → 中间栏第1段 → 中间栏第2段...

步骤三:内容提取

针对不同类型的内容,用不同的提取策略:

文字区域 → OCR 或 PDF 文本提取表格区域 → 表格识别(保留行列结构)图片区域 → 提取图片,供后续多模态处理公式区域 → LaTeX 或文本化

步骤四:结构化输出

把提取的内容,按照语义关系组织成模型友好的格式:

# 第三章 RAG 技术详解## 3.1 什么是 RAGRAG(Retrieval-Augmented Generation)是一种...## 3.2 RAG 的核心组件RAG 系统包含以下核心组件...| 组件 | 作用 ||------|------|| 检索器 | 从知识库中找到相关内容 || 生成器 | 根据检索结果生成回答 |

动手试一下:用 PyMuPDF 解析一份 PDF

上面讲的都是原理,下面用一段真实代码感受一下文档解析的过程。这里用 PyMuPDF(也叫 fitz),它是 Python 中最常用的 PDF 解析库之一:

import fitz  # pip install PyMuPDFdefparse_pdf(pdf_path):"""解析 PDF,提取每页的文字和表格信息"""    doc = fitz.open(pdf_path)    pages = []for page_num, page in enumerate(doc, start=1):# 提取文字(带格式信息)        text_blocks = page.get_text("dict")["blocks"]        page_content = []for block in text_blocks:if block["type"] == 0:  # 文字块                lines = [span["text"for line in block["lines"]for span in line["spans"]]                page_content.append({"type""text","content"" ".join(lines),"bbox": block["bbox"]  # 位置信息:用于判断页眉页脚                })elif block["type"] == 1:  # 图片块                page_content.append({"type""image","bbox": block["bbox"]                })        pages.append({"page": page_num,"content": page_content        })return pages# 使用示例result = parse_pdf("product_manual.pdf")for page in result:    print(f"\n=== 第 {page['page']} 页 ===")for block in page["content"]:if block["type"] == "text":            print(f"  [文字] {block['content'][:80]}...")elif block["type"] == "image":            print(f"  [图片] 位置: {block['bbox']}")

这段代码做了什么?

步骤
作用
fitz.open()
打开 PDF 文件
get_text("dict")
获取带格式信息的文字块(含位置、字体等)
block["type"]
区分文字块(0)和图片块(1)
bbox
块的坐标位置——页眉页脚通常在固定 y 坐标,可据此过滤

这是文档解析的最基础实现。实际生产中,你会用 Unstructured、LlamaParse 等工具,它们内部已经集成了更强大的布局分析模型和 OCR 引擎,不需要从零写起。但理解这个基本流程,能帮你选对工具、看懂工具输出。


3. 文档解析 vs OCR vs 多模态大模型

这三个东西,都是"识别原始文件信息"的方式,但原理不同、适用场景不同。

很多人容易混淆,或者认为"有了多模态大模型,OCR 和文档解析就不用了"。

这个理解是错的。

3.1 三种技术的核心原理

技术
原理
输入
输出
OCR
光学字符识别,把图像里的文字转成文本
图片/扫描件/无文本层的PDF
纯文本(丢失结构)
文档解析
深度学习模型,识别版面结构和语义类型
有文本层的PDF/Word/PPT/Excel
结构化内容块(保留层级)
多模态大模型
视觉+语言联合理解,不只识别文字,还理解图表、示意图
图片/PDF页面截图
文字描述/回答

3.2 一张图说明三者的关系

原始文件   │   ├── 有文本层的PDF/Word/Excel   │      │   │      └── 文档解析(布局分析+内容提取+结构化)→ 结构化块   │   ├── 无文本层的文件   │  (扫描件/图片/某些导出的PDF)   │      │   │      └── OCR(提取文字)→ 纯文本   │              │   │              └── 文档解析(识别结构)→ 结构化块   │   └── 复杂视觉内容          (图表、示意图、流程图)              │              └── 多模态大模型(理解图像语义)→ 文字描述

3.3 实践中三者的真实关系

上面这张图是按输入类型区分的,逻辑上清晰,但在实践中,它们并不是独立的三个工具各行其道,而是分层嵌套的关系。

大多数成熟的文档解析工具,内部已经集成了 OCR 引擎。当你丢进去一份扫描件 PDF,它会:

  1. 先在内部调 OCR 引擎做文字提取(OCR 层)
  2. 再做布局分析,识别区域类型(解析层)
  3. 最后还原阅读顺序,生成结构化输出(输出层)

所以你的实际工作流往往是:

扫描件 PDF  → 工具内部:OCR引擎提取文字 → 布局模型分析结构 → 阅读顺序还原 → 结构化块  → 你得到的:可以直接用的结构化内容

你看不到 OCR 的调用过程,但它在背后工作。

这就是为什么前面表格里写着"文档解析的输入是 PDF/Word/图片"——它能处理图片,正是因为内部集成了 OCR。

3.4 适用场景对比

OCR 的适用场景:

  • 手写文件识别(发票、表格、手写笔记)
  • 老旧扫描件的文字提取
  • 截图里的文字识别
  • 纯文字图片(没有复杂排版)
最佳拍档:OCR + 文档解析扫描件 → OCR提取文字 → 文档解析识别结构

文档解析的适用场景:

  • 结构化文档(论文、合同、报告)
  • 多栏排版文档(报纸、杂志)
  • 跨页表格
  • 目录、章节层级需要保留的文档
最佳拍档:文档解析 + 后续处理PDF → 文档解析 → 语义分块 → 向量检索

多模态大模型的适用场景:

  • 图表理解(柱状图、折线图、饼图表达的是什么)
  • 示意图、流程图理解(这个架构图里的组件是什么关系)
  • 复杂排版(OCR 识别不出的内容,多模态模型能理解上下文)
  • 图片问答(给一张截图,问这个界面里有什么按钮)

不过要注意:多模态模型擅长的是概括性理解,而不是精确提取

多模态模型擅长的:✓ 图表概括:"这张图是产品的月度销售趋势图"✓ 流程图理解:"这个架构图展示了三层架构:前端、服务层、数据层"✓ 截图问答:"这个界面右上角的按钮是什么功能"多模态模型不擅长的:✗ 精确读取图表数值:"2026年3月的销售额是 12,847 元"✗ 还原表格结构:"第三行第二列的值是 XXX"✗ 多页文档的连贯理解(上下文窗口再大也有极限)

如果需要精确的结构化数据提取(比如表格里的具体数值),多模态大模型目前不如专门的 OCR + 结构化解析方案可靠。所以应该是:多模态做语义理解,专门的引擎做精确提取,两者组合使用。

最佳拍档:多模态模型 + 文档解析复杂 PDF → 文档解析(文字+结构) + 多模态模型(图表+图片) → 合并输出

4. 实际工作流:三者怎么配合

举一个真实场景:处理一份产品说明书 PDF。

这份 PDF 包含:

  • 封面(图片)
  • 目录(文字)
  • 章节正文(多栏排版)
  • 多个数据表格
  • 多个产品架构图

方案一:只用 OCR(面对是扫描件或纯图片)

扫描件 PDF → OCR → 纯文字结果:文字倒是提取出来了,但:- 没有层级信息,目录和正文混在一起- 表格结构丢了(行列对不上)- 图片里的内容完全丢失- 多栏排版顺序混乱

方案二:处理数字 PDF(只用文档解析,不需 OCR)

有文字层的 PDF → 文档解析 → 结构化块(文字+表格+图片位置)图片位置 → OCR → 图片里的文字结果:结构保留了,图片里的文字也识别了但:图表里的语义信息("这张图说明了什么")还是丢失

方案三:完整方案——不同内容用不同手段

PDF → 文档解析 → 结构化块          │          ├── 文字区域 → 直接使用          ├── 表格区域 → 结构化提取          └── 图片/图表区域 → 多模态模型理解 → 文字描述最终输出:{"text_blocks": [...],"tables": [...],"image_descriptions": ["图1展示了产品架构,包含前端层、服务层、数据层...","图2是用户使用流程,从登录到下单到支付..."  ]}

三种技术配合,才能拿到最完整的知识库内容。


5. 选型建议:什么时候用什么

场景
推荐方案
纯文字 PDF,结构简单
文档解析即可
扫描件(图片为主)
OCR + 文档解析
大量发票、表格、手写文件
OCR(选支持表格识别的引擎)
论文、技术文档、合同
文档解析(选支持多栏、公式识别的引擎)
包含大量图表的技术文档
文档解析 + 多模态模型
需要理解截图含义
多模态大模型
生产级 RAG 知识库
文档解析(主)+ OCR(辅助)+ 多模态(处理图表)

6. 主流工具推荐

文档解析目前没有一站式完美方案,以下是实践中常用的组合:

文档解析工具:

  • Unstructured:开源,支持多种文件格式,社区活跃,适合快速原型
  • LlamaParse:由 LlamaIndex 团队出品,对复杂 PDF 效果好
  • Marker:开源,支持 PDF 转 Markdown,效果不错
  • 国产:庖丁科技 PDFlux、达观数据:对中文文档支持更好

OCR 工具:

  • PaddleOCR:百度开源,中文识别效果好,免费
  • Tesseract:老牌开源,英文为主
  • 腾讯云 OCR / 阿里云 OCR:付费 API,中文和表格识别强

多模态模型:

  • GPT-4o / Claude 3.5:效果最好,成本最高
  • Gemini 1.5:上下文窗口大,适合处理大量图片
  • 国产:通义千问 VL、智谱 GLM-4V:成本低,效果够用

7. 一句话总结

文档解析、OCR、多模态大模型,是处理原始文件信息的三种不同层次的手段——OCR 解决"有没有文字层",文档解析解决"结构清不清楚",多模态模型解决"图能不能看懂"。在实践中,好用的文档解析工具内部已经集成了 OCR,你无需刻意"选择"而是"组合"使用。

构建 RAG 知识库时,先搞清你的文档属于哪种类型,再决定用什么手段。多模态做语义理解,专用引擎做精确提取,彼此配合才是最优解。

不是贵的就好,也不是新的就强,适合文档类型的才是对的


下一篇预告:分块策略——把文档切成什么形状,直接决定RAG效果 · RAG系列第2篇