RAG文档解析 - pypdf、LlamaParse、DeepDoc、SimpleDirectoryReader到底怎么选?

最近做 RAG 项目时,很多人第一步就卡在"文档解析"上。

表面看,好像都是把 PDF 里的内容读出来,但不知道要如何选择 pypdf.extract_text()LlamaParseDeepDocSimpleDirectoryReader

text 复制代码
SimpleDirectoryReader 是入口
pypdf.extract_text() 是底层文本抽取
LlamaParse 是面向 LLM 的文档解析服务
DeepDoc 是偏重型的文档理解流水线

1. 如何选择?

简单 PDF,本地快速抽字,用 pypdf.extract_text()

需要保留标题、段落、表格、阅读顺序,做 RAG 数据预处理,优先看 LlamaParse

扫描件、复杂表格、企业知识库、私有化部署场景,可以看 RAGFlow 里的 DeepDoc

如果你只是想把一个目录里的文件统一加载进 LlamaIndex,SimpleDirectoryReader 才是入口,但它本身不决定解析质量。

2. 为什么 pypdf 不是"文档理解"

pypdf.extract_text() 的定位很清楚,就是从 PDF 页面对象里提取文字。

python 复制代码
from pypdf import PdfReader

reader = PdfReader("a.pdf")
text = ""

for page in reader.pages:
    text += page.extract_text() or ""

它的优势是轻、快、本地、不需要 API key。根据 PyPI,pypdf 在 2026-05-09 发布到 6.11.0,说明这个库仍然很活跃。

但它的边界也很明显:PDF 本身不是为了机器理解设计的。pypdf 官方文档也强调,复杂 PDF 中表格、页眉页脚、阅读顺序、扫描件都会带来问题;如果页面本质是图片,pypdf 并不是 OCR 工具。

新版 pypdf 也支持 extraction_mode="layout",可以尽量贴近页面布局:

python 复制代码
text = page.extract_text(extraction_mode="layout")

但要注意,这仍然不是语义解析。它只能尽力还原"看起来像什么",不真正知道哪里是标题、哪里是表格、哪里是引用。

3. LlamaParse 的核心价值

LlamaParse 的思路不是"把字抽出来就完事",而是把复杂文档变成更适合 LLM 使用的数据。

官方文档把它描述为把非结构化文档转成 LLM-ready data 的解析服务,支持文本、Markdown、JSON 等结果,当前 LlamaCloud 还强调 Agentic OCR 和 130+ 格式处理。

这意味着它更适合下面这种链路:

text 复制代码
PDF / DOCX / PPTX
        ↓
LlamaParse
        ↓
Markdown / JSON / 页面结构
        ↓
chunking
        ↓
embedding
        ↓
retrieval
        ↓
RAG answer

比如在 LlamaIndex 里,可以让 SimpleDirectoryReader 把 PDF 分发给 LlamaParse:

python 复制代码
from llama_parse import LlamaParse
from llama_index.core import SimpleDirectoryReader

parser = LlamaParse(
    api_key="llx-...",
    result_type="markdown",
)

documents = SimpleDirectoryReader(
    "./data",
    file_extractor={".pdf": parser},
).load_data()

我的判断是:如果目标是 RAG,而不是单纯抽字,LlamaParse 通常比 pypdf 更接近生产需求。

但它的问题也现实:云服务、成本、延迟、数据上传、合规审查。这些不是技术小问题,而是项目能不能上线的问题。

4. DeepDoc 更像"文档理解基础设施"

这里的 DeepDoc 指 RAGFlow 中的 DeepDoc。

DeepDoc 做的事情更重。官方 README 里把它分成 vision 和 parser 两部分,vision 里有 OCR、layout recognition、table structure recognition。它还会处理表格旋转、表格结构、图表、页面坐标等问题。

它的 PDF parser 输出不只是纯文本,还包括:

text 复制代码
带页面位置的文本块
表格裁剪图和表格内容
图片、caption、图片内文本

所以 DeepDoc 更适合这类场景:

text 复制代码
扫描件 PDF
表格密集型财报
合同、说明书、企业制度文档
需要私有化部署的知识库
对引用、溯源、页面定位要求高的系统

但 DeepDoc 的代价也很明显。RAGFlow 官方自托管要求至少 4 核 CPU、16GB RAM、50GB 磁盘,并依赖 Docker。它不是一个随手 pip install 就能结束的轻量 parser,而更像企业 RAG 平台里的文档处理底座。

5. SimpleDirectoryReader 不负责"变聪明"

SimpleDirectoryReader 很容易被误解。

它的作用是读取目录、识别文件类型、调用对应 reader,最后返回 LlamaIndex 的 Document 对象。

python 复制代码
from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader(
    input_dir="./data",
    recursive=True,
    required_exts=[".pdf", ".docx"],
).load_data()

它可以扫描目录、递归读取、限制后缀、附加文件元数据,也可以通过 file_extractor 替换默认解析器。

但它自己不是高级解析器。

所以真正影响质量的是:

text 复制代码
.pdf 默认 reader 是谁?
是否替换成 LlamaParse?
是否走 DeepDoc?
是否需要 OCR?
是否要保留表格结构?

SimpleDirectoryReader 更像调度入口,不是解析能力本身。

6. 四者对比

组件 定位 适合场景 优点 主要问题
pypdf.extract_text() 底层 PDF 文本抽取 简单 PDF、本地 baseline 免费、本地、快 结构弱,不做 OCR
LlamaParse 云端 LLM 文档解析 RAG 数据预处理、复杂 PDF Markdown/JSON 友好,结构更好 成本、延迟、数据合规
DeepDoc 文档理解流水线 扫描件、表格、企业知识库 OCR、布局、表格能力强 部署重、维护成本高
SimpleDirectoryReader 文件加载入口 LlamaIndex 多文件导入 简单统一,可扩展 解析质量取决于背后 parser

7. 现在的技术趋势

截至 2026-05-10,文档解析已经不只是"PDF 转文本"了。

RAGFlow 已经把 DeepDoc 放在"深度文档理解"位置,并且在更新记录里提到支持 MinerU、Docling 等文档解析方法。LlamaCloud 也把 Parse、Extract、Classify、Split、Index 拆成更完整的文档智能链路。

这里有个变化值得注意:

text 复制代码
过去:提取文本 → 分块 → 向量化
现在:解析结构 → 保留版面 → 表格/图片理解 → 生成可引用 chunk → 检索

也就是说,RAG 的质量问题,很多时候不是 embedding 模型不行,而是文档一开始就被解析坏了。

8. 选型建议

如果只是做 demo:

text 复制代码
SimpleDirectoryReader + 默认 PDF reader
或
pypdf.extract_text()

如果要做一个像样的 RAG:

text 复制代码
SimpleDirectoryReader + LlamaParse

如果数据不能出内网:

text 复制代码
Docling / MinerU / DeepDoc / 自建 OCR pipeline

如果是企业知识库,并且文档质量很差:

text 复制代码
RAGFlow + DeepDoc
或者自建 DeepDoc 类似流水线

如果文档主要是电子版 PDF,排版简单,不要一上来就上重型方案。先用 pypdf 做 baseline,把失败样本收集出来,再决定是否升级到 LlamaParse 或 DeepDoc。

结尾

这四个工具不是谁替代谁,而是处在不同的层级,选择的不是最优,而是最合适。

真正合理的架构应该是:

text 复制代码
目录入口:SimpleDirectoryReader
简单文件:pypdf
复杂文件:LlamaParse
扫描件/企业复杂文档:DeepDoc
最终目标:高质量 Document / chunk / citation
相关推荐
AI科技星1 小时前
基于代数拓扑与等腰梯形素数对网格【乖乖数学】
人工智能·算法·决策树·机器学习·数学建模·数据挖掘·机器人
jghhh011 小时前
基于时差(TDOA)与 频差(FDOA) 的无源定位
算法
㳺三才人子1 小时前
初探 OpenCV 圖像處理
人工智能·python·opencv·计算机视觉
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月10日
人工智能·python·信息可视化·自然语言处理·ai编程
_深海凉_1 小时前
LeetCode热题100-回文链表
算法·leetcode·链表
EntyIU1 小时前
claude code集成deepseek模型以及安装skill完整教程
ai
周易宅1 小时前
Hermes Agent 完整实战:安装部署、记忆系统、自动进化与 OpenClaw 深度对比
ai·hermes
hmywillstronger1 小时前
【Python】从SAP2000 XML截面库提取数据到Excel
xml·python·excel
前端摸鱼匠1 小时前
【AI大模型春招面试题30】交叉熵损失(Cross-Entropy Loss)在大模型训练中的作用?为何适合语言生成任务?
人工智能·ai·面试·大模型·求职招聘