RAG-01数据切分-Document-Parsing-RAG

本文属于 RAG 工程框架中的「1 数据接入与文档切分」环节,聚焦「Document Parsing(文档解析)」方法。可先阅读 RAG-00.方法概述 再进入本篇。

原理

先解析版面与结构(标题、段落、表格、图片 OCR、页眉页脚),再输出标准化文本块供切分(Chunking)与索引(Indexing)。

关键技术/实现路径

  • PDF 版面分析(Layout)与阅读顺序恢复。
  • 表格抽取与单元格关系重建。
  • OCR 与文本纠错。
  • 元数据补齐(章节路径、页码、来源、版本)。

优缺点

  • 优点:显著降低脏数据与错切分,提升后续召回(Retrieval)稳定性。
  • 缺点:多格式适配成本高,解析失败会级联影响下游。

性能与资源

  • 离线成本:中到高(尤其是 PDF + OCR)。
  • 在线影响:低(主要在离线预处理)。

应用场景

  • 制度文档、合同、财报、扫描件知识库。

统一合成数据示例

输入数据片段

1
{"doc_id":"D20","type":"pdf","raw":"第1页: 报销制度... 表1: 机票上限 2000 元"}

中间结果(解析输出)

1
2
3
4
[
{"block_id":"B1","kind":"heading","text":"差旅报销制度"},
{"block_id":"B2","kind":"table_row","text":"机票 | 上限2000元"}
]

下游就绪输出(供切分/索引,非生成环节)

1
2
3
4
5
6
7
8
9
{
"doc_id": "D20",
"reading_order": ["B1", "B2"],
"blocks": [
{"block_id": "B1", "kind": "heading", "text": "差旅报销制度", "page": 1},
{"block_id": "B2", "kind": "table_row", "text": "机票 | 上限2000元", "page": 1, "table_id": "T1"}
],
"chunk_hints": {"prefer_boundaries": ["B1", "B2"], "merge_table": true}
}

要点:解析的价值在于 reading_order + block 类型,避免把表格当普通段落乱切。

原始发表与工程实现

  • 代表性原始发表:LayoutParser (Shen et al., 2021)。
  • 核心解决问题:解决 PDF/扫描件结构化还原。
  • 成熟实现工具:unstructured, layoutparser, pymupdf, docling。

详细原理拆解

  • 版面解析核心是 layout -> reading_order -> text_blocks,确保表格和标题层级不丢失。
  • 典型实现可拆为:输入预处理 -> 方法核心计算 -> 候选/证据构建 -> 生成与引用。
  • 工程调优重点:质量(准确率/引用率)与成本(时延/token)的联合优化。
1
2
3
4
5
flowchart LR
In[输入 Query 与知识] --> Core[方法核心计算]
Core --> Rank[匹配/路由/排序]
Rank --> Build[证据组装]
Build --> Out[答案与引用]

工程落地扩展示例

伪代码

1
2
3
4
5
6
7
def parse_then_chunk(pdf_bytes, layout_model, chunker):
layout = layout_model.detect(pdf_bytes) # 块 + 阅读顺序
blocks = restore_reading_order(layout)
blocks = merge_table_cells(blocks) # 表格关系
plain = [b.text for b in blocks]
chunks = chunker.split_with_block_boundaries(plain, block_spans=blocks)
return {"blocks": blocks, "chunks": chunks}

参数示例

1
2
3
4
5
layout_engine: docling
ocr_min_confidence: 0.82
table_merge: true
reading_order: "left_to_right_top_to_bottom"
drop_headers_footers: true

常见失败案例

  • 失败模式 1:双栏 PDF 阅读顺序错乱,chunk 语义前后颠倒,向量检索全错。
  • 失败模式 2:表格被当成连续正文切,单元格边界丢失,「上限」与「品类」错配。
  • 失败模式 3:OCR 将 2000 识别为 2OOO,下游 关键词与数值检索双失败

Demo 数据带入计算示例

1
2
3
块 B2 为表格行「机票 | 上限2000元」:若错误顺序先于标题 B1,则问句「机票上限」
的 embedding 与 chunk 重叠度下降;修正 reading_order 为 [B1,B2] 后,同一 chunk
与查询余弦相似度由 0.41 → 0.78,说明解析直接影响可检索性。
-------------本文结束感谢您的阅读-------------