Skip to content
🔗 分享本题
查看我的学习进度 →

27 模块 Q9 教学图:你的 RAG 知识库是如何实现文档解析和内容提取的?PDF、Word、HTML 等不同格式如何处理?

🧠 图解记忆:解析结果要结构正确、位置可追溯、质量可度量;点击图片可查看原图。

💡 答案要点

为什么文档解析是 RAG 项目的基础能力?

"Garbage in, Garbage out" — 如果文档解析质量差,Embedding 就建立在错误内容上

实际项目经验:
- 简历解析:表格布局、多栏设计、照片都要识别
- 合同解析:法务条款、签名位置、日期都要提取
- 论文解析:数学公式、参考文献、图表标题都是关键信息

2026年文档解析技术栈:

格式推荐工具难点
PDF(扫描件)PaddleOCR + 布局检测旋转、阴影、水印
PDF(文字版)PyMuPDF / pdfplumber表格、多栏、页眉页脚
Word (.docx)python-docx / Mammoth宏、嵌入对象、样式继承
HTMLBeautifulSoup / Trafilatura广告移除、JS 渲染内容
Markdown正则 + 语法解析层级结构、代码块

生产级 PDF 解析 pipeline:

展开 Python 代码示例(54 行)
python
from paddleocr import PaddleOCR
from pdf2image import convert_from_path
import fitz  # PyMuPDF

def parse_pdf_advanced(pdf_path: str) -> list[dict]:
    """
    生产级 PDF 解析:自动识别扫描件 / 文字版 / 表格
    """
    results = []
    
    # Step 1: 判断是扫描件还是文字版
    doc = fitz.open(pdf_path)
    first_page_text = doc[0].get_text()
    is_scanned = len(first_page_text.strip()) < 100  # 文字太少 → 扫描件
    
    if is_scanned:
        # 扫描件:用 PaddleOCR 识别
        ocr = PaddleOCR(use_angle_cls=True, lang='ch')
        images = convert_from_path(pdf_path)
        
        for page_num, image in enumerate(images):
            result = ocr.ocr(np.array(image), cls=True)
            for line in result[0]:
                results.append({
                    "page": page_num + 1,
                    "text": line[1][0],
                    "bbox": line[0],
                    "confidence": line[1][1]
                })
    else:
        # 文字版:用 PyMuPDF 提取文字 + 表格
        for page_num, page in enumerate(doc):
            blocks = page.get_text("blocks")
            tables = page.extract_tables()
            
            for block in blocks:
                if block[4].strip():  # 非空文本块
                    results.append({
                        "page": page_num + 1,
                        "text": block[4],
                        "bbox": block[:4],
                        "type": "text"
                    })
            
            # 表格单独处理
            for table in tables:
                table_text = table_to_markdown(table)
                results.append({
                    "page": page_num + 1,
                    "text": table_text,
                    "type": "table"
                })
    
    return results

表格解析专项(合同、财务报表):

python
importtabula  # Java 写的表格提取,准确性高
import camelot  # Python 表格提取,API 更友好

def extract_tables_with_camelot(pdf_path: str) -> list[str]:
    """用 camelot 提取表格,转 Markdown"""
    tables = camelot.read_pdf(pdf_path, pages='all', flavor='stream')
    
    markdown_tables = []
    for table in tables:
        # camelot 会自动检测表格边界
        df = table.df
        # 转成 Markdown 格式,方便后续 Chunk
        md = df.to_markdown(index=False)
        markdown_tables.append(md)
    
    return markdown_tables

面试话术:

示例表达(仅在能用本人经历或可复现实验佐证时使用): "我的项目里 PDF 解析遇到过两个坑:一是扫描件用纯文字提取是空的,必须上 OCR;二是合同表格用 naive 提取会把一格拆成多格。后来我用了'分层解析'策略——先判断是扫描件还是文字版,再分别走 PaddleOCR 和 PyMuPDF,表格再用 Camelot 二次提取。生产环境准确率从 70% 提到了 95%。简历、合同、论文不同文档类型要选对工具,不能一套方案打天下。"

📚 参考:Unstructured(企业文档解析框架官方文档)