0. 这个 Notebook 在做什么(总体目标)
核心目标:把"多格式文档解析"这件事做到能落地的RAG数据入口,并给出一条从"解析 → 清洗/结构化 → 索引 → 检索问答"的实践路径。
主线分 6 个阶段:
-
RAG 与文档解析基础认知
-
工具选型与差异对比(PDF/OCR/结构化能力)
-
unstructured 入门与多格式
partition_*实战(重点) -
LlamaIndex 框架介绍(为什么要用SDK)
-
LlamaIndex × unstructured 集成(从 reader 到自定义 pipeline)
-
行业场景案例(金融/医疗/法律/教育)
第一阶段:基础认知与准备
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检查是否安装
- Notebook代码里直接用
-
Poppler:PDF底层提取/渲染能力(很多PDF处理链路依赖它)
- 代码提供 mac/windows 的 PATH 设置示例
-
Pandoc:富文本转换
-
libmagic:文件类型检测(跨平台识别文件类型)
-
还有一个"常见依赖问题解决方案"小节(定位是:装不对就会各种报错)
3. unstructured 核心功能理解("元素化"思想)
Notebook强调:
-
unstructured 的输出不是单纯一大段文本,而是一系列 Element
-
Element 有:
-
text(内容) -
category(类型:标题/段落/表格/图片块等) -
metadata(来源文件、页码、坐标等)
-
这为后续 RAG 的 chunk 切分、过滤页眉页脚、按类型处理表格/图片提供基础。
4. partition / partition_* 实战(覆盖多格式)
Notebook的实践方式是:
-
先用
partition(auto)演示 element 的基本结构 -
再分别对不同格式调用
partition_md/html/xlsx/csv/docx/image/pdf -
打印:
-
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 能直接复用的"关键产物"
-
解析质量评估方法 :元素类型统计 + 文本预览(
parse_file_with_unstructured) -
多格式解析模板 :md/html/xlsx/csv/docx/image/pdf 的
partition_*参数范式 -
PDF高精解析参数组合 :
hi_res + infer_table_structure + split_pdf_page + extract_images... -
工程化解析路由 :
smart_load(分流 + fallback) -
最小RAG闭环 :
smart_load → VectorStoreIndex → query_engine.query