首页 › RAG › All-in-RAG › 第二章 数据准备 › 第四节 数据加载

第四节 数据加载

虽然本节内容在实际应用中非常重要,但是由于各种文档加载器的迭代更新,以及各类 AI 应用的不同需求,具体选择需要根据实际情况。本节仅作简单引入,但请务必重视数据加载环节,“垃圾进,垃圾出 (Garbage In, Garbage Out)” ——高质量输入是高质量输出的前提。​

一、文档加载器​

1.1 主要功能​

RAG 系统中,数据加载是整个流水线的第一步,也是不可或缺的一步。文档加载器负责将各种格式的非结构化文档(如PDF、Word、Markdown、HTML等)转换为程序可以处理的结构化数据。数据加载的质量会直接影响后续的索引构建、检索效果和最终的生成质量。​

文档加载器在 RAG 的数据管道中一般需要完成三个核心任务,一是解析不同格式的原始文档,将 PDF、Word、Markdown 等内容提取为可处理的纯文本,二是在解析过程中同时抽取文档来源、页码、作者等关键信息作为元数据,三是把文本和元数据整理成统一的数据结构,方便后续进行切分、向量化和入库,其整体流程与传统数据工程中的抽取、转换、加载相似,目标都是把杂乱的原始文档清洗并对齐为适合检索和建模的标准化语料。​

1.2 当前主流RAG文档加载器​

​

#ahoLglrWsVZo text { white-space: pre; }#ahoLglrWsVZo .fb0 { stroke: var(--N900-FG, 0.15); }#ahoLglrWsVZo .fb0 {stroke: rgba(31,35,41, 0.15)}#ahoLglrWsVZo .fx0 { stroke-miterlimit: 10; }#ahoLglrWsVZo .fx0 {stroke-miterlimit: 10}#ahoLglrWsVZo .fa1 { fill: rgb(187, 191, 196); }#ahoLglrWsVZo .fa1 {fill: rgb(187, 191, 196)}#ahoLglrWsVZo .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#ahoLglrWsVZo .fx1 {font-style: normal}#ahoLglrWsVZo .fx2 { text-anchor: middle; }#ahoLglrWsVZo .fx2 {text-anchor: middle}#ahoLglrWsVZo .fx3 { dominant-baseline: central; }#ahoLglrWsVZo .fx3 {dominant-baseline: central}#ahoLglrWsVZo .fx4 { stroke: none; }#ahoLglrWsVZo .fx4 {stroke: none}#ahoLglrWsVZo .fc0 { fill: var(--text-caption); }#ahoLglrWsVZo .fc0 {fill: #646a73}#ahoLglrWsVZo .fa2 { fill: var(--text-link-disabled); }#ahoLglrWsVZo .fa2 {fill: rgb(187, 191, 196)}#ahoLglrWsVZo .fa3 { fill: rgb(31, 35, 41); }#ahoLglrWsVZo .fa3 {fill: rgb(31, 35, 41)}#ahoLglrWsVZo .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#ahoLglrWsVZo .fx5 {font-style: normal}#ahoLglrWsVZo .fx6 { text-anchor: start; }#ahoLglrWsVZo .fx6 {text-anchor: start}#ahoLglrWsVZo .fx7 { dominant-baseline: alphabetic; }#ahoLglrWsVZo .fx7 {dominant-baseline: alphabetic}#ahoLglrWsVZo .fc1 { fill: rgb(255, 255, 255); }#ahoLglrWsVZo .fc1 {fill: rgb(255, 255, 255)}#ahoLglrWsVZo .fc2 { fill: rgb(0, 0, 0); }#ahoLglrWsVZo .fc2 {fill: rgb(0, 0, 0)}#ahoLglrWsVZo .fb1 { fill: var(--N900-FG, 0.15); }#ahoLglrWsVZo .fb1 {fill: rgba(31,35,41, 0.15)}#ahoLglrWsVZo .fb2 { fill: rgb(209, 217, 224); }#ahoLglrWsVZo .fb2 {fill: rgb(209, 217, 224)}#ahoLglrWsVZo .fa4 { fill: var(--bg-body); }#ahoLglrWsVZo .fa4 {fill: #fff}ABCD12345678910工具名称特点适用场景性能表现PyMuPDF4LLMTextLoaderDirectoryLoaderUnstructuredFireCrawlLoaderLlamaParseDoclingMarkerMinerUPDF→Markdown转换,OCR+表格识别基础文本文件加载批量目录文件处理多格式文档解析网页内容抓取深度PDF结构解析模块化企业级解析PDF→Markdown,GPU加速多模态集成解析科研文献、技术手册纯文本处理混合格式文档库PDF、Word、HTML等在线文档、新闻法律合同、学术论文企业合同、报告科研文献、书籍学术文献、财务报表开源免费,GPU加速轻量高效支持多格式扩展统一接口,智能解析实时内容获取解析精度高,商业APIIBM生态兼容专注PDF转换集成LayoutLMv3+YOLOv8

​

表 2-1 当前主流 RAG 文档加载器​

二、Unstructured文档处理库​

2.1 Unstructured 的核心优势​

Unstructured (1)是一个专业的文档处理库,专门设计用于RAG和AI微调场景的非结构化数据预处理。提供了统一的接口来处理多种文档格式,是目前应用较广泛的文档加载解决方案之一。Unstructured 在格式支持和内容解析方面具有明显优势,它一方面支持 PDF、Word、Excel、HTML、Markdown 等多种文档格式,并通过统一的 API 接口避免为不同格式分别编写代码,另一方面可以自动识别标题、段落、表格、列表等文档结构,同时保留相应的元数据信息。​

​

飞书文档 - 图片

​

图 2-1 Unstructured 官网界面​

2.2 支持的文档元素类型​

Unstructured 能够识别和分类以下文档元素 (2):​

​

#cioweHQRlRrI text { white-space: pre; }#cioweHQRlRrI .fb0 { stroke: var(--N900-FG, 0.15); }#cioweHQRlRrI .fb0 {stroke: rgba(31,35,41, 0.15)}#cioweHQRlRrI .fx0 { stroke-miterlimit: 10; }#cioweHQRlRrI .fx0 {stroke-miterlimit: 10}#cioweHQRlRrI .fa1 { fill: rgb(187, 191, 196); }#cioweHQRlRrI .fa1 {fill: rgb(187, 191, 196)}#cioweHQRlRrI .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#cioweHQRlRrI .fx1 {font-style: normal}#cioweHQRlRrI .fx2 { text-anchor: middle; }#cioweHQRlRrI .fx2 {text-anchor: middle}#cioweHQRlRrI .fx3 { dominant-baseline: central; }#cioweHQRlRrI .fx3 {dominant-baseline: central}#cioweHQRlRrI .fx4 { stroke: none; }#cioweHQRlRrI .fx4 {stroke: none}#cioweHQRlRrI .fc0 { fill: var(--text-caption); }#cioweHQRlRrI .fc0 {fill: #646a73}#cioweHQRlRrI .fa2 { fill: var(--text-link-disabled); }#cioweHQRlRrI .fa2 {fill: rgb(187, 191, 196)}#cioweHQRlRrI .fa3 { fill: rgb(31, 35, 41); }#cioweHQRlRrI .fa3 {fill: rgb(31, 35, 41)}#cioweHQRlRrI .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#cioweHQRlRrI .fx5 {font-style: normal}#cioweHQRlRrI .fx6 { text-anchor: start; }#cioweHQRlRrI .fx6 {text-anchor: start}#cioweHQRlRrI .fx7 { dominant-baseline: alphabetic; }#cioweHQRlRrI .fx7 {dominant-baseline: alphabetic}#cioweHQRlRrI .fc1 { fill: rgb(255, 255, 255); }#cioweHQRlRrI .fc1 {fill: rgb(255, 255, 255)}#cioweHQRlRrI .fx8 { font: 400 13px LarkHackSafariFont, LarkEmojiFont, ui-monospace, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, "Noto Sans", Tahoma, "Nimbus Sans L", Arial, "Liberation Sans", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans SC", "Source Han Sans CN", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", STHeiti, SimHei, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", system-ui; }#cioweHQRlRrI .fx8 {font-style: normal}#cioweHQRlRrI .fc2 { fill: rgb(0, 0, 0); }#cioweHQRlRrI .fc2 {fill: rgb(0, 0, 0)}#cioweHQRlRrI .fb1 { fill: var(--N900-FG, 0.15); }#cioweHQRlRrI .fb1 {fill: rgba(31,35,41, 0.15)}#cioweHQRlRrI .fb2 { fill: rgb(209, 217, 224); }#cioweHQRlRrI .fb2 {fill: rgb(209, 217, 224)}#cioweHQRlRrI .fa4 { fill: var(--bg-body); }#cioweHQRlRrI .fa4 {fill: #fff}AB1234567891011121314151617元素类型描述TitleNarrativeTextListItemTableImageFormulaAddressEmailAddressFigureCaptionHeaderFooterCodeSnippetPageBreakPageNumberUncategorizedTextCompositeElement文档标题由多个完整句子组成的正文文本,不包括标题、页眉、页脚和说明文字列表项,属于列表的正文文本元素表格图像元数据公式物理地址邮箱地址图片标题/说明文字文档页眉文档页脚代码片段页面分隔符页码未分类的自由文本分块处理时产生的复合元素*

​

表 2-2 Unstructured 支持的文档元素类型​

​

CompositeElement 是通过分块处理产生的特殊元素类型,由一个或多个连续的文本元素组合而成。例如,多个列表项可能会被组合成一个单独的块。​

​

三、从 LangChain 封装到原始 Unstructured​

在第一章的示例中,我们使用了LangChain的UnstructuredMarkdownLoader,它是 LangChain 对 Unstructured 库的封装。接下来展示如何直接使用 Unstructured 库,这样可以获得更大的灵活性和控制力。​

​

代码块​

Python

from unstructured.partition.auto import partition​

​

# PDF文件路径​

pdf_path = "../../data/C2/pdf/rag.pdf"​

​

# 使用Unstructured加载并解析PDF文档​

elements = partition(​

filename=pdf_path,​

content_type="application/pdf"​

)​

​

# 打印解析结果​

print(f"解析完成: {len(elements)} 个元素, {sum(len(str(e)) for e in elements)} 字符")​

​

# 统计元素类型​

​

3.1 代码示例​

创建一个简单的示例,尝试使用 Unstructured 库加载并解析一个PDF文件。​

​

代码块​

Python

from unstructured.partition.auto import partition​

​

# PDF文件路径​

​

​

若代码运行出现报错 ImportError: libgl.so.1 cannot open shared object file no such file or directory, 执行 sudo apt-get install python3-opencv 安装依赖库。​

​

partition 函数参数解析:​

•

filename: 文档文件路径,支持本地文件路径;​

•

content_type: 可选参数,指定MIME类型(如"application/pdf"),可绕过自动文件类型检测;​

•

file: 可选参数,文件对象,与 filename 二选一使用;​

•

url: 可选参数,远程文档 URL,支持直接处理网络文档;​

•

include_page_breaks: 布尔值,是否在输出中包含页面分隔符;​

•

strategy: 处理策略,可选 "auto"、"fast"、"hi_res" 等;​

•

encoding: 文本编码格式,默认自动检测。​

partition函数使用自动文件类型检测,内部会根据文件类型路由到对应的专用函数(如PDF文件会调用partition_pdf)。如果需要更专业的PDF处理,可以直接使用from unstructured.partition.pdf import partition_pdf,它提供更多PDF特有的参数选项,如OCR语言设置、图像提取、表格结构推理等高级功能,同时性能更优。​

​

在实际应用中,针对 pdf 的处理,目前更多选用的是 PaddleOCR、MinerU 等模型或工具。​

​

练习​

•

使用partition_pdf替换当前partition函数并分别尝试用hi_res和ocr_only进行解析,观察输出结果有何变化。​

参考文献​

Footnotes​

Unstructured Open-Source Documentation ↩​

Unstructured Open-Source: Document Elements ↩​