Skip to content

RAG 系统如何处理 PDF、Word、Markdown 等不同格式文档? ​

  • 标签:RAG、文档处理

🏛 业务架构师 ​

RAG 处理多格式文档(PDF/Word/Markdown)的方案,我按"分流解析—差异化策略—统一治理"讲:

1. 按格式分流解析:

  • Markdown/HTML:结构化标记天然保留(标题层级、列表、代码块)——按标题层级切分即可,最省心;
  • Word:python-docx/Unstructured 抽取段落与表格,保留样式线索(标题样式→结构信息);
  • PDF(重灾区):分三类处理——原生 PDF(PyMuPDF 直接抽文本);扫描件(OCR:PaddleOCR + 版面识别);复杂版面(表格密集的财报/标书:MinerU/Unstructured 保表格结构,或转图片用多模态模型抽取——2026 年的主流兜底,鲁棒性远超规则解析)。

2. 差异化切分策略:结构化文档按章节/条款切(引用最干净);表格整块独立入库+生成自然语言摘要(靠摘要被语义命中);PDF 双栏排版要按阅读顺序重组(否则左右栏文本串行错乱)。

3. 统一治理(比解析更重要):

  • 统一元数据规范:所有格式入库时都带来源、时间、版本、部门、密级——跨格式检索的过滤与合规靠它;
  • 解析质量门禁:每类格式抽样质检(表格完整率、乱码率),低于阈值退回清洗,不带病入库;
  • 增量更新:各源接增量同步管线(文档变更→删旧块插新块)。

业务提醒:先统计你的知识库格式分布,把 80% 精力投在占比最高的两三种格式上;解析质量决定 RAG 上限——这里省的每一分工,都会在检索层用十分补。上线后监控"按格式分组的检索质量指标",哪类文档的命中率差就专项治理哪类。

🏗 系统架构师 ​

多格式文档处理是建库管道的"解析分层"问题,我按格式给方案 + 统一架构:

分格式策略:

  • Markdown/HTML(结构最好):直接标记感知分块(标题层级、表格标签保留);元数据从标题路径提取——效果天花板最高,优先归一化目标格式;
  • PDF(最大坑):数字原生 PDF 用 PyMuPDF/pdfplumber 抽文本与表格;扫描件走 OCR(PaddleOCR/PP-Structure 版面分析);复杂版面(双栏、跨页表)与高价值文档用 VLM 整页解析(2026 年主流升级:视觉模型直接输出 Markdown,表格/公式/版式质量上台阶,成本翻倍按文档价值分级使用);
  • Word/PPT:python-docx/poi 保样式语义(标题、表格、列表);
  • Excel(分流处理):说明性小表 → Markdown 表入库;数据型表格不进 RAG,建结构化通道(Text-to-SQL)——数值查询走 SQL,语义查询走向量,多通道架构;
  • 图像/音频:VLM 描述转文本、ASR 转录再入库。

统一架构(关键设计):

  • 归一化管线:所有格式 → 统一中间表示(Markdown/JSON + 结构元数据:标题路径、页码、表格标记、权限标签)——下游分块/嵌入/溯源只认一种格式,新格式只加解析器不动下游;
  • 解析器路由:按文件类型 + 版面复杂度自动选解析器(成本分级:规则 < OCR < VLM);
  • 质量闸门:解析结果打分(乱码率、结构完整度),低分进人工队列——解析质量差一档,检索生成全链路调优白费;
  • 幂等管道:文档指纹(hash)贯穿,变更增量重跑;解析器版本记录(规则升级可定位重建范围)。

容量感:百万页级建库,解析占管道总时长 60%+——解析服务独立无状态部署(CPU 密集)与嵌入服务(GPU)分开扩缩容。

💻 全栈开发专家 ​

多格式文档处理,我的标准方案是**「统一中间格式 + 分类型路由」**:

架构:不同格式走专用解析器,全部转成 Markdown 中间表示(保留标题层级、表格、代码块),后续清洗/分块/入库只认一种格式——解析复杂度被隔离在入口层。

python
PARSERS = {
    ".pdf":  lambda p: MinerU(p).to_markdown(),      # 复杂版式
    ".docx": lambda p: Docling(p).to_markdown(),     # Office 系
    ".md":   lambda p: open(p).read(),               # 原生直用
    ".html": lambda p: trafilatura.extract(p),
    ".xlsx": lambda p: sheets_to_markdown_tables(p), # 表格转 MD 表
}
md = PARSERS[suffix](path)   # 统一出口

分格式的处理要点:

  • PDF:数字原生用 PyMuPDF 快速路径;复杂版式(双栏/表格多)走 MinerU/Docling 版面分析;扫描件识别后分流到 OCR(PaddleOCR)或 VLM 直读(Qwen-VL 转 MD,印章手写体效果好);
  • Word:docx 结构化好处理;表格保留为 Markdown 表,图片抽出配 caption;
  • Markdown:最理想格式,直接进 header 分块(MarkdownHeaderTextSplitter);
  • HTML:正文抽取(trafilatura)去导航广告噪声;
  • 扫描件/图片:OCR 后走文本管道,OCR 置信度低的页标记人工抽检。

工程清单(踩坑所得):

  • 解析结果抽检率指标(每种格式抽 2%)——解析是 RAG 坏例的头号来源之一;
  • 表格绝不当普通文本切(整块保护+描述增强);
  • 元数据在解析层就抽取(标题、作者、时间、章节路径);
  • 解析服务独立部署(CPU 密集),异步队列处理大文件;
  • 版本化:解析器升级后存量文档要重处理(保留原始文件是前提)。