人人都会AI编程

6.2 文档解析技术

更新时间:2026-07-12

RAG 系统的知识来源通常是各种格式的现实文档——PDF 手册、Word 制度文件、网页、扫描件、甚至邮件归档。在进入向量化与检索之前,必须将这些五花八门的格式统一解析为干净、结构化、可供后续分块处理的纯文本。文档解析看似基础,却是决定上游数据质量的“第一道分水岭”:解析错一个字,后续的所有环节都会基于错误内容运行。

6.2.1 常见文档格式与解析难点

企业场景中最常遇到的文档类型及其典型问题如下:

| 格式 | 典型场景 | 解析难点 |
|------|----------|----------|
| PDF(纯电子生成) | 技术白皮书、合同、内部规范 | 文本可直接提取,但可能丢失层级结构;多栏、表格、页眉页脚容易混入正文 |
| PDF(扫描件/图片型) | 老旧档案、签章文件、传真件 | 本质上是图像,需要 OCR 识别;印章、手写批注、倾斜矫正容易引入错误 |
| Word/Excel | 通知、报告、数据表格 | 格式相对规整,但嵌入的对象(图片、图形)难以文本化;Excel 表格结构需要特殊处理 |
| 网页/HTML | 内部 Wiki、产品页面 | 导航栏、广告等噪声内容多;需要提取正文,丢弃排版和交互元素 |
| PPT | 培训材料、方案汇报 | 文字分散在多个文本框,顺序关系复杂;图表、备注内容取舍需权衡 |

6.2.2 实用解析流程与工具组合

现实中很少有单一工具能处理所有格式,通常需要组合不同库和策略形成解析流水线。下面是一套经过验证的“渐进式”解析方案:

1. 根据文件类型选择提取器

  • 纯电子 PDF:使用 PyMuPDF(fitz)或 pdfplumber。前者提取速度更快,后者在处理表格和保留空间布局上更有优势。
  • 扫描件 PDF 或图片:先用 pdf2image 将页面转为 PNG,再送入 OCR 引擎。中文场景推荐使用 PaddleOCR(针对中英文混合场景效果很好)或 Tesseract(需配置适宜的中文语言包)。为保证识别率,必要时先用 opencv 进行去噪、动态二值化和倾斜校正。
  • Word 文档:使用 python-docx 逐段提取文本,注意处理列表、表格和页眉页脚。.doc 老格式可先用 LibreOffice 命令行转为 .docx
  • 网页:用 BeautifulSouptrafilatura 专门提取正文;trafilatura 对文章型内容的表现尤其好,能自动剥离广告、菜单。
  • Excelopenpyxlpandas 直接读取每个单元格,将表格内容转化为“带制表分隔的文本”或 Markdown 表格形式,为后续分块保留结构信息。

2. 统一输出为 Markdown 格式

一个实践证明非常有效的做法是,无论原始格式如何,最终都将内容标准化为 Markdown。比如:

  • 标题层级(# ## ###)保留原始文档结构;
  • 表格直接渲染为 Markdown 表格,让 LLM 能更好地“理解”行列关系;
  • 图片替换为图片的描述性标题或 OCR 提取出的文字;
  • 去除页眉、页脚等重复噪声。

这样做的好处是 语言模型天然对 Markdown 格式理解较好,并且后续切片时可以依据标题层级来保障语义连贯性,避免在段落中间截断。

3. 应对结构性复杂文档

  • 多栏 PDF:使用支持版面分析的库(如 pdfplumber + 自定义规则,或 layoutparser)先分割出阅读顺序,再逐区提取。
  • 带有重要表格的文档:务必保持表格的文本表示完整,避免将每一行拆成独立散片。可以在分块策略中设置对“表格区域”的保护,或者将表格单独作为一个 chunk,并标注前后文。
  • 图文混合:对于无法丢弃的图片(如产品参数图、流程示意图),可借助多模态模型(如支持视觉的 LLM)生成图片的文字描述,嵌入正文中,使这部分信息也能被检索到。

6.2.3 实践中的避坑指南

  • 不要迷信“全自动”:格式复杂的文档不要期望一键完美解析。初始阶段可以投入少量人工,做格式归一化和清洗模板,再批量自动化处理。
  • 始终保留原始文件:文档解析过程中,应同时保存原始的 PDF 或 Word 文件,并建立“chunk → 原文页码/段落”的对应关系,方便溯源展示。
  • 解析质量检查:建议在流水线中加入抽检机制。例如,随机抽取 N 个 chunk,人工比对原文档,确保文字准确率、表格完整度均达标。发现问题后回溯解析规则,迭代改进。
  • 注意字符集与特殊字符:PDF 中常会出现复制后乱码的字符(如连字、软换行字符)。使用 ftfy 或正则统一修复,避免出现“退 䃂 金”这类奇怪片段。

6.2.4 解析性能与批量处理

当文档数量达到数万份时,单机串行解析会成为瓶颈。可以采用以下方式:

  • 按文档数量和大小做分批并发处理(multiprocessingcelery 任务队列);
  • OCR 型文档消耗资源多,可独立部署 OCR 服务(如 PaddleOCR 的 GPU 加速版);
  • 解析结果缓存:对同一文档、同一版本只解析一次,将解析后的 Markdown 内容存入对象存储,避免重复计算。

文档解析是 RAG 知识准备阶段中最贴近业务、也最容易出细节纰漏的一环。只要在这一步做到足够严谨,后续的索引与检索就有了可靠的数据基础,整个问答系统的准确率才能从源头得到保障。