基于本文回答
0
评论

在 RAG 中,如何处理复杂的非结构化数据,特别是 PDF 中的表格和图片?

知识点图片

在 RAG(检索增强生成)系统中,PDF 文档中的表格(Tables)图片(Images/Charts)确实是最大的痛点。传统的文本提取工具(如 PyPDF2)往往会将表格变成一堆乱码,完全忽略图片。

处理这些复杂的非结构化数据,通常需要一套“解析(Parsing) -> 处理(Processing) -> 索引(Indexing)”的组合策略。以下是目前业界最主流且有效的处理方案:


一、 表格(Tables)的处理策略

表格包含行、列和标题的二维关系,如果直接展平为一维文本,语义会完全丢失。

1. 提取阶段 (Extraction)

  • 基于规则/流的工具:如果 PDF 是原生的(非扫描件),可以使用 CamelotTabula。它们利用 PDF 内部的线条坐标来重建表格。
  • 基于视觉模型的工具(推荐):对于复杂表格(无边框、合并单元格)或扫描件,必须使用视觉模型。
    • Microsoft Azure Document Intelligence (前 Form Recognizer):目前业界公认表格识别效果最好的商业 API。
    • LlamaParse:LlamaIndex 推出的工具,专门针对 RAG 优化,能很好地将表格转换为 Markdown。
    • Unstructured.io:开源界的瑞士军刀,结合了 OCR 和布局分析模型(如 YOLOX)来检测表格区域。
    • GMFT (Grid Match Format Transformer): 最近比较火的轻量级表格提取库。

2. 格式化与表示 (Representation)

提取出来后,如何喂给 LLM 是关键:

  • Markdown 格式(最佳实践):LLM 对 Markdown 表格的理解能力非常强。将提取的数据转换为 | Header | Header | 格式。
  • HTML 格式:对于极其复杂的嵌套表格,保留 <table> 标签有时比 Markdown 更好。
  • JSON/CSV:适合数据密集型表格,尤其是如果你打算让 LLM 写代码(Code Interpreter)来分析数据时。

3. 索引策略 (Indexing)

不要直接把大表格切碎进不同的 Chunk 里,那样会丢失上下文。

  • 表格摘要(Table Summarization):提取表格后,单独发给 LLM 生成一段自然语言摘要(例如:“这张表展示了 2023 年 Q1-Q4 的营收增长...”)。
  • 多向量检索(Multi-Vector Retriever)
    1. 对“表格摘要”进行 Embedding 并存入向量库。
    2. 当检索命中摘要时,返回原始的 Markdown 表格给 LLM,而不是返回摘要。

二、 图片与图表(Images & Charts)的处理策略

图片通常包含文本无法替代的信息(趋势线、架构图、照片)。

1. 提取阶段

  • 使用 PyMuPDF (fitz)Unstructured 将 PDF 中的图片对象裁剪并保存为单独的图像文件。

2. 理解与转化 (Understanding)

由于目前的向量数据库主要基于文本 Embedding,我们需要将图片“文本化”或使用多模态能力。

  • 方案 A:OCR(光学字符识别)
    • 仅提取图片中的文字。对于含有大量文字的截屏有效,但对于折线图、饼图,仅有文字是不够的。
  • 方案 B:VLM 生成描述(Image Captioning - 主流方案)
    • 利用多模态大模型(如 GPT-4o, Claude 3.5 Sonnet, LLaVA)对提取的图片进行分析。
    • Prompt 示例:“请详细描述这张图片的内容。如果是图表,请提取所有数据点并总结趋势。”
    • 将生成的文本描述用于 Embedding 和检索。
  • 方案 C:多模态 Embedding (Multi-modal Embedding)
    • 使用 CLIPGoogle Multimodal Embedding 模型,直接将图片映射到向量空间。
    • 用户可以用文本搜索图片,也可以用图片搜索图片。

3. 检索策略

与表格类似,建议使用多向量检索

  • 对“图片描述”做索引。
  • 检索命中后,将原始图片(如果是支持多模态输入的 LLM)或详细文本描述(如果是纯文本 LLM)放入 Context Window。

三、 进阶架构模式(Advanced Patterns)

针对 PDF 这种混合排版文档,以下三种 RAG 架构最为有效:

1. "Small-to-Big" (Parent-Child Indexing)

  • 原理:将文档切分成非常小的块(Child chunks)进行检索,但检索到后,返回其所属的更大的块(Parent chunk)甚至整页内容。
  • 优势:表格或图片周围的文字通常是对它们的解释。这种方式能保证上下文完整。

2. 多向量检索器 (Multi-Vector / Summary Indexing)

  • 这是处理混合数据的神器(LangChain 和 LlamaIndex 均支持)。
  • 流程
    • 文本 -> 正常 Chunk -> Embedding。
    • 表格 -> LLM 总结 -> 摘要 Embedding (指向原始表格)。
    • 图片 -> VLM 描述 -> 描述 Embedding (指向原始图片)。
  • 效果:搜索时匹配的是摘要/描述,生成时使用的是原始高保真数据。

3. ColPali / Visual RAG (最新趋势)

  • 原理:不再进行繁琐的 OCR 和布局分析。直接将 PDF 的每一页截图,通过视觉语言模型(如 ColPali - 基于 PaliGemma)直接生成 Embedding。
  • 流程
    • 用户提问 -> 模型直接在“页面图像”级别进行检索 -> 找到相关页面图片 -> 喂给 GPT-4o 等多模态模型回答。
  • 优势:完全保留了排版、表格和图片的视觉语义,省去了清洗数据的巨大工程。

四、 推荐工具栈总结

任务 开源/免费工具 商业/付费工具 (效果更佳)
PDF 解析 PyMuPDF, PyPDF2 LlamaParse, Azure Doc Intelligence
表格提取 Camelot, Tabula, GMFT LlamaParse, Azure, Textract
文档拆解 Unstructured.io (开源版) Unstructured API
图片理解 LLaVA, Qwen-VL GPT-4o, Claude 3.5 Sonnet, Gemini Pro Vision
学术论文 Nougat, Marker (基于视觉的转换) -

总结建议

  1. 如果预算允许:直接使用 LlamaParseAzure Document Intelligence。它们能直接把 PDF 变成完美的 Markdown(包含表格),省去 80% 的工程时间。
  2. 如果必须开源:使用 Unstructured 库配合 YOLOX 做布局分析,把表格和图片切出来。
  3. 对于图片:务必使用 VLM (如 GPT-4o-mini) 生成详细描述,不要只靠 OCR。
  4. 存储结构:采用 多向量检索(Multi-Vector Retriever) 模式,将索引(摘要)与内容(原始数据)分离。
右滑查看面试常问