RAG01:文档解析

从PDF、网页、Markdown、表格到图片内容抽取,理解如何将非结构化文档转换为可检索的知识。

字数 1268 阅读时长 ≈ 4 分钟 2026-7-25 2026-7-27
RAG01:文档解析

文档解析是 RAG 的第一步,也是最关键的一步。高质量的文档解析能将非结构化的文档转换为结构化的知识,为后续的检索和生成奠定基础。

文档解析的挑战

非结构化文档的问题

文档类型挑战示例
PDF格式复杂、扫描件难以识别表格、图表、图片
网页HTML 结构复杂、噪音多CSS、JavaScript、广告
Word格式多样、嵌套结构页眉页脚、批注、修订
图片需要 OCR 识别扫描件、截图
Markdown相对简单,但有特殊语法代码块、表格、链接

文档解析的质量影响

解析质量影响后果
高质量准确提取内容RAG 效果好
中等质量部分内容丢失RAG 效果一般
低质量大量内容丢失或错误RAG 效果差

文档类型与解析策略

PDF 解析

PDF 是最常见的文档格式之一,解析策略如下:

方法说明适用场景
文本提取直接提取文本内容纯文本 PDF
OCR 识别使用光学字符识别扫描件 PDF
表格提取专门提取表格内容包含表格的 PDF
图表解析解析图表内容包含图表的 PDF

PDF 解析示例

from PyPDF2 import PdfReader

def parse_pdf(file_path):
    reader = PdfReader(file_path)
    text = ""
    for page in reader.pages:
        text += page.extract_text()
    return text

# 扫描件 PDF 需要 OCR
from pdf2image import convert_from_path
import pytesseract

def parse_scanned_pdf(file_path):
    images = convert_from_path(file_path)
    text = ""
    for image in images:
        text += pytesseract.image_to_string(image)
    return text

网页解析

网页解析需要处理 HTML 结构,提取有效内容:

方法说明适用场景
HTML 解析解析 HTML 结构结构化网页
内容提取提取正文内容文章页面
链接抓取抓取页面链接网站爬取
JavaScript 渲染渲染动态内容单页应用

网页解析示例

import requests
from bs4 import BeautifulSoup

def parse_webpage(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 提取正文内容
    article = soup.find('article')
    if article:
        return article.get_text()
    
    # 如果没有 article 标签,提取所有段落
    paragraphs = soup.find_all('p')
    return '\n'.join([p.get_text() for p in paragraphs])

Markdown 解析

Markdown 相对简单,但需要处理特殊语法:

元素处理方式示例
标题提取标题级别# 标题 → 一级标题
列表提取列表内容- 项目1 → 列表项
代码块保留代码格式java ...
表格提取表格数据`
链接提取链接文本和 URL[text](url)

Markdown 解析示例

import markdown
from bs4 import BeautifulSoup

def parse_markdown(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 转换为 HTML
    html = markdown.markdown(content)
    soup = BeautifulSoup(html, 'html.parser')
    
    # 提取文本内容
    return soup.get_text()

表格解析

表格是常见的数据形式,需要特殊处理:

方法说明适用场景
结构化提取提取为表格数据PDF、Word 表格
文本转换转换为文本描述简单表格
图片表格使用 OCR + 表格识别图片中的表格

表格解析示例

import camelot

def parse_pdf_table(file_path):
    tables = camelot.read_pdf(file_path)
    if tables:
        return tables[0].df.to_dict('records')
    return []

图片内容抽取

图片中的内容需要使用 OCR 技术:

方法说明适用场景
文字识别识别图片中的文字扫描件、截图
表格识别识别图片中的表格表格图片
图表识别识别图表内容图表图片
场景理解理解图片场景复杂图片

图片内容抽取示例

import pytesseract
from PIL import Image

def extract_text_from_image(image_path):
    image = Image.open(image_path)
    text = pytesseract.image_to_string(image)
    return text

文档解析的质量优化

内容清洗

内容清洗去除无用信息:

清洗类型说明示例
去除噪音去除无关内容广告、导航、页眉页脚
统一格式统一文本格式换行、空格、编码
修复错误修复识别错误OCR 识别错误
提取关键信息提取重要内容标题、关键词、摘要

结构保留

结构保留保持文档的层次结构:

结构类型说明示例
标题层级保留标题级别H1、H2、H3
段落结构保留段落划分段落、列表
表格结构保留表格格式行、列、单元格
代码结构保留代码格式代码块、语法高亮

多模态解析

多模态解析处理包含多种内容类型的文档:

文档内容:
1. 文本内容 → 文本提取
2. 表格内容 → 表格提取
3. 图片内容 → OCR 识别
4. 图表内容 → 图表解析
5. 公式内容 → 公式识别

最终输出:
结构化的知识片段,包含文本、表格、图片描述等

文档解析的常见问题

问题1:内容丢失

表现:解析后的内容不完整

解决方案

  • 使用更强大的解析工具
  • 结合多种解析方法
  • 人工检查和补充

问题2:格式混乱

表现:解析后的内容格式混乱

解决方案

  • 使用结构化解析方法
  • 进行内容清洗
  • 统一输出格式

问题3:OCR 识别错误

表现:扫描件识别准确率低

解决方案

  • 使用更高质量的 OCR 引擎
  • 优化图片质量
  • 人工校对

问题4:表格解析困难

表现:复杂表格难以正确解析

解决方案

  • 使用专门的表格解析工具
  • 将表格转换为文本描述
  • 人工处理复杂表格

文档解析的最佳实践

解析流程

1. 文档上传
2. 文档类型识别
3. 选择解析策略
4. 执行解析
5. 内容清洗
6. 结构保留
7. 质量检查
8. 输出结构化知识

质量保障

1. 解析准确率目标:> 95%
2. 关键信息覆盖率:100%
3. 表格解析准确率:> 90%
4. OCR 识别准确率:> 98%
5. 定期人工抽检
6. 使用多个解析工具交叉验证

工具选择

工具功能适用场景
PyPDF2PDF 文本提取纯文本 PDF
pdfplumberPDF 高级解析复杂 PDF
TesseractOCR 识别扫描件
BeautifulSoupHTML 解析网页
CamelotPDF 表格提取PDF 表格
markdownMarkdown 解析Markdown 文件

项目判断清单

  • 需要解析 PDF → 使用 PyPDF2 或 pdfplumber
  • 需要解析扫描件 → 使用 Tesseract OCR
  • 需要解析网页 → 使用 BeautifulSoup
  • 需要解析表格 → 使用 Camelot
  • 内容丢失 → 使用多种工具交叉验证
  • OCR 识别错误 → 优化图片质量或使用更高质量 OCR
  • 表格解析困难 → 使用专门的表格工具
  • 需要长期维护 → 建立解析质量监控和反馈机制