Part2.大模型RAG进阶多格式文档解析

0. 这个 Notebook 在做什么(总体目标)

核心目标:把"多格式文档解析"这件事做到能落地的RAG数据入口,并给出一条从"解析 → 清洗/结构化 → 索引 → 检索问答"的实践路径。

主线分 6 个阶段:

  1. RAG 与文档解析基础认知

  2. 工具选型与差异对比(PDF/OCR/结构化能力)

  3. unstructured 入门与多格式 partition_* 实战(重点)

  4. LlamaIndex 框架介绍(为什么要用SDK)

  5. LlamaIndex × unstructured 集成(从 reader 到自定义 pipeline)

  6. 行业场景案例(金融/医疗/法律/教育)


第一阶段:基础认知与准备

1. RAG 基础回顾(文档解析在RAG里处于什么位置)

Notebook强调:RAG的质量上限很大程度由数据入口 决定,而数据入口的第一步就是解析

解析质量影响:

  • chunk 质量(段落边界、标题层级、表格是否还原)

  • 元数据质量(页码、章节、坐标、表格/图片标记)

  • 召回质量(结构乱导致 embedding 无效、检索噪声高)

2. 常见文档类型与解析需求

覆盖的典型类型(在后面实战里都有对应 partition_*):

  • Markdown / HTML:结构相对规整,但要处理标签、实体、层级

  • CSV / Excel:表格结构 + 单元格语义

  • DOCX:段落、标题、列表、表格、图片

  • PDF:最难,分数字原生 vs 扫描件 + 多栏/公式/表格/图

  • Image:图片OCR(含截图、扫描图、含公式图片等)

3. 文档解析挑战认知(为什么PDF特别难)

强调"文档解析难点"主要来自:

  • 版面结构:多栏、分页、脚注、页眉页脚、图文混排

  • 表格结构:行列边界、合并单元格、跨页表格

  • 扫描件:无文本层,只能OCR

  • 公式/代码:识别难、结构恢复难

  • 噪声:目录、页码、页眉脚重复污染chunk


第二阶段:技术选型与工具对比(你该怎么选)

1. 技术选型决策(Notebook给的直观建议)

  • 数字原生PDF(有文本层) :优先 PyMuPDF(快、坐标精度好,适合批量)

  • 扫描PDF :必须走 OCR 流程,可用 unstructured 的 ocr_only

  • 复杂学术/含公式代码:倾向 Marker / MinerU(但可能需要GPU或更高算力/更复杂部署)

  • 同时提到一些偏"表格强项"或"中文方案"的工具(表格/中文RAG建设方向)

Notebook里有一个"工具性能对比表"(HTML表格),但单元格内容有省略号截断,能明确出现的工具包括:PyMuPDF、Unstructured、Marker、MinerU、DoclingAI、DeepDoc 等。

2. PDF解析技术核心差异(讲清楚"为什么会差这么多")

它把差异归结为"如何理解文档结构":

  • PyMuPDF :偏"渲染/绘制指令解析"的路线,提文本极快、坐标强,但不做OCR、对复杂结构(公式/代码)有限

  • OCR路线:解决扫描件,但成本更高,且需要处理布局(layout analysis)与结构恢复

  • 引出:单一方案很难通吃 → 需要组合/分流策略(后面 smart_load 就在做这个思想)

3. OCR生态/大模型(定位:OCR是图像理解)

Notebook这里强调 OCR 本质是"对图片内容的理解",并给出一个生态视角(并插了一张示意图链接),表达:

  • OCR不只是识字,还要配合布局分析、表格结构推断

  • 复杂文档可能要引入更强模型/服务(后面也提到 LlamaParse)

4. 为什么强调 unstructured.io

核心观点:unstructured 的价值在于:

  • 多格式统一为"元素(elements)":标题/段落/表格/图片等统一对象

  • 元数据丰富(页码、坐标、来源、类型等,取决于策略)

  • 支持多策略(auto/fast/hi_res/ocr_only 等语义在Notebook里多次出现)

  • 易于与下游框架(如 LlamaIndex)集成


第三阶段:unstructured.io 入门与实践(Notebook最核心的实操部分)

1. 环境准备与安装(安装方式分层)

Notebook把安装拆成几种"能力等级":

  • 基础安装:只做纯文本类

  • 全量安装:支持更多格式

  • 按类型安装:缺什么装什么

  • Serverless API / Docker 方案:偏生产化部署

2. 核心系统依赖(重点:这些不装好解析会翻车)

逐项解释用途,并提醒常见坑:

  • Tesseract OCR:图像文字识别

    • Notebook代码里直接用 !tesseract -v 检查是否安装
  • Poppler:PDF底层提取/渲染能力(很多PDF处理链路依赖它)

    • 代码提供 mac/windows 的 PATH 设置示例
  • Pandoc:富文本转换

  • libmagic:文件类型检测(跨平台识别文件类型)

  • 还有一个"常见依赖问题解决方案"小节(定位是:装不对就会各种报错)

3. unstructured 核心功能理解("元素化"思想)

Notebook强调:

  • unstructured 的输出不是单纯一大段文本,而是一系列 Element

  • Element 有:

    • text(内容)

    • category(类型:标题/段落/表格/图片块等)

    • metadata(来源文件、页码、坐标等)

这为后续 RAG 的 chunk 切分、过滤页眉页脚、按类型处理表格/图片提供基础。

4. partition / partition_* 实战(覆盖多格式)

Notebook的实践方式是:

  1. 先用 partition(auto) 演示 element 的基本结构

  2. 再分别对不同格式调用 partition_md/html/xlsx/csv/docx/image/pdf

  3. 打印:

    • elements[0].metadata.__dict__

    • elements[0].text(通常截断前几百字符)

    • elements[0].category

4.1 自动识别解析:partition(filename=..., strategy="auto")

示例(解析 RAG评估.md)展示:

  • partition 会自动检测类型并解析

  • 输出 elements 后,查看 element 的 text/category/metadata

4.2 自定义"通用解析函数" parse_file_with_unstructured(file_path)

Notebook写了一个通用函数,做了三件事:

  • 调用 partition 解析文件

  • 统计元素类型分布type(element).__name__计数)

  • 把所有 element 的 text 拼接为统一文本(\n\n.join)

并输出:

  • 元素总数

  • 元素类型统计

  • 总字符数

  • 文本预览(前200字符)

这段代码的价值:快速评估一个文件解析质量(类型分布是否合理、文本是否大量为空、是否混入噪声等)。

4.3 Markdown:partition_md

.md 文件做更明确的 md 解析(相比 auto 更确定)。

4.4 HTML:partition_html

解析 HTML(强调处理标签、实体解码等常见问题)。

4.5 Excel:partition_xlsx

示例文件 销售数据统计.xlsx

重点:Excel解析得到的 elements 也有 metadata,并可直接输出文本内容。

4.6 CSV:partition_csv

示例 训练数据.csv

思路:把结构化表格转为可用于检索的文本元素。

4.7 DOCX:partition_docx

示例 数组.docx

用于提取 Word 的段落与结构信息。

4.8 Image(图片OCR):partition_image(..., strategy="ocr_only")

示例文件:

  • PDF解析截图.png

  • 数学公式.png

关键参数:

  • strategy="ocr_only":强制走 OCR

  • languages=["eng","chi_sim"]:英文+简体中文识别

  • include_page_breaks=False:不加入分页标记(图像一般无页概念)

输出同样查看 metadata/text/category。

4.9 PDF:partition_pdf(..., strategy="hi_res", infer_table_structure=True, ...)

示例PDF:甬兴证券-AI行业点评报告:海外科技巨头持续发力AI,龙头公司中报业绩亮眼.pdf

这段是 Notebook里参数最完整、最接近生产的示例之一,关键点:

  • strategy="hi_res":高精度解析(更强布局/结构识别,代价更高)

  • extract_images_in_pdf=True

  • extract_image_block_types=["Table","Image"]:抽取表格块和图片块

  • extract_image_block_output_dir="./images":把抽取的图片落盘

  • languages=["eng","zho"]:多语言

  • split_pdf_page=True:大文件分页拆分,优化性能与稳定性

  • infer_table_structure=True:推断表格结构(会触发下载OCR/模型)

  • include_page_breaks=True:包含页码信息(利于溯源/引用)

然后同样输出 elements[0] 的 metadata/text/category 进行检查。

5. 额外:LlamaParse 提示(复杂结构优先)

Notebook给了一个方向性建议:

  • 结构很复杂的PDF ,可以优先用 LlamaParse(注释示例:需要 Llama Cloud API Key)

  • 或者用 LlamaIndex 的 SimpleDirectoryReader 直接读(对简单文件可用)


第四阶段:LlamaIndex 框架介绍(为什么需要它)

1. "大模型开发框架(SDK)是什么"

Notebook定位:SDK把 RAG 常见流程封装好:

  • Reader/Loader(读数据)

  • Node/Chunk(切分)

  • Index(索引)

  • Query Engine(查询)

  • Retriever / Reranker(检索与重排)

  • 工程化配置(embedding/LLM/存储等)

2. LlamaIndex 介绍与核心模块

强调它是"面向数据与索引"的框架,适合做:

  • 文档加载

  • 构建向量索引

  • 一行变成 query engine

3. LangChain vs LlamaIndex(对比视角)

Notebook这里属于概念对比:一个偏链式编排/工具生态,一个偏索引与数据结构(你后续实现 RAG 会更清楚差别)。


第五阶段:LlamaIndex 集成与进阶(把解析接到RAG里)

1. 集成关系:LlamaIndex 如何用 unstructured

Notebook明确两类用法:

方式一:直接用 UnstructuredReader(最省事)

代码示例:

python 复制代码
from llama_index.readers.file.unstructured import UnstructuredReader
reader = UnstructuredReader()
documents = reader.load_data(file=Path("xxx.pdf"))

特点:上手快,但可控性相对弱(细粒度策略/参数可定制程度有限)。

方式二:自己调用 unstructured.partition 然后转 Document(更灵活)

你可以按 element 类型过滤、按页码切分、把表格/图片单独处理等。

方式三:混合方案(Notebook推荐)

也就是:能 Reader 就 Reader,复杂的走 partition hi_res / ocr_only,并且做 fallback。

2. smart_load(file_path):智能分流加载器(Notebook的"工程化核心思想")

这段函数实现了"按文件类型选择解析策略":

  • 定义 complex_types(复杂格式,如 .pdf/.docx/.pptx/.xlsx 等)

  • 如果是复杂类型:

    • 优先用 partition(... strategy="hi_res", languages=["eng","chi_sim"], infer_table_structure=True)

    • 将每个 element 转成 llama_index.core.Document(text=..., metadata=...)

    • 过滤空文本 element(if e.text.strip()

    • 如果 hi_res 失败 → 回退到 UnstructuredReader

  • 如果是简单类型(如 .txt/.md/.csv/.html/.xml/.json):

    • 优先 UnstructuredReader

    • 失败再回退到 partition(strategy="auto")

这段的价值:
把"工具选型"从文档里的概念,落成了可执行的解析路由策略(且带容错)。

3. 基础索引案例(VectorStoreIndex)

Notebook最后串起一个最小闭环(解析PDF → 建索引 → 发起提问):

  • 配置 embedding 与 LLM(使用 OpenAI 的 embedding/LLM)

    • embedding:text-embedding-3-small

    • API Key 从 .env 读取

  • documents = smart_load(pdf_path)

  • index = VectorStoreIndex.from_documents(documents)

  • query_engine = index.as_query_engine()

  • query_engine.query("请用中文总结这些文档的主要内容")

注意:Notebook里 LLM 的设置位置出现了 ... 占位(说明这里需要你补全 Settings.llm = OpenAI(...) 或按你的模型供应商改写)。


第六阶段:特定领域应用(给你方向,不是完整实现)

Notebook列举了典型落地场景,强调"解析质量决定行业RAG效果":

  • 金融:财报/研报解析与问答(PDF表格多、图多、结构复杂)

  • 医疗:论文/指南检索分析(多栏、术语密集、引用多)

  • 法律:合同解析、条款抽取(条款层级、引用、编号结构很重要)

  • 教育:教材内容问答(章节层级、公式图表)


学习资源与参考(Notebook末尾)

包含:

  • 官方资源入口(unstructured / LlamaIndex 等)

  • LlamaIndex 更多功能(引导你继续扩展:更复杂索引、工具、重排等)


你从这份 Notebook 能直接复用的"关键产物"

  1. 解析质量评估方法 :元素类型统计 + 文本预览(parse_file_with_unstructured

  2. 多格式解析模板 :md/html/xlsx/csv/docx/image/pdf 的 partition_* 参数范式

  3. PDF高精解析参数组合hi_res + infer_table_structure + split_pdf_page + extract_images...

  4. 工程化解析路由smart_load(分流 + fallback)

  5. 最小RAG闭环smart_load → VectorStoreIndex → query_engine.query


相关推荐
im_AMBER几秒前
Leetcode 97 移除链表元素
c++·笔记·学习·算法·leetcode·链表
Toky丶1 分钟前
【文献阅读】ARB-LLM: Alternating Refined Binarizations for Large Language Models
人工智能·语言模型·自然语言处理
AI视觉网奇5 分钟前
ue 动画重定向 实战笔记2026
笔记·ue5
代码游侠5 分钟前
学习笔记——MQTT协议
开发语言·笔记·php
love530love6 分钟前
Flash Attention 2.8.3 在 Windows + RTX 3090 上成功编译与运行复盘笔记(2026年1月版)
人工智能·windows·笔记·python·flash_attn·flash attention·z-image
喜欢吃豆8 分钟前
2025年大语言模型技术全景报告
人工智能·语言模型·大模型·2025博客之星
Aliex_git9 分钟前
性能指标笔记
前端·笔记·性能优化
@zulnger12 分钟前
python 学习笔记(异常对象)
笔记·python·学习
其美杰布-富贵-李12 分钟前
x-transformers 完整学习笔记
笔记·学习·transformer
sunfove25 分钟前
光学学习笔记:详解光通量、照度、强度与亮度
笔记·学习