为什么你的RAG效果差?可能PDF没准备好!
将PDF转换为文本,过去只是“勉强可用”,如今已能“轻松实现”。但许多RAG系统表现不佳,根源往往在于PDF解析阶段丢失了关键的结构化信息。本教程将带你从PDF解析工具选型到大规模并行处理方案,全面掌握构建高质量RAG数据管道的核心技术。

1. 为什么选择GraphRAG?
最近我搭建了一个图数据库,用于RAG系统——换句话说,我们构建了一个GraphRAG。相比传统向量数据库支持的RAG,GraphRAG拥有一个显著优势——推理能力更强。例如:
问题A:「XYZ公司去年CFO是谁?」
这种问题,向量搜索就能轻松解决,因为年报中通常直接写明。
但换成这样:
问题B:「XYZ公司有哪两位董事是同一所学校毕业的?」
如果年报没有直接提及学校名称,向量搜索就“无能为力”了。而GraphRAG则能胜任,因为它可以推理出隐含关系。
但问题来了——如何构建这个图? 如果我们再深入一步思考:如何从PDF中提取信息来构建知识图谱? 这篇文章就来讲解这个过程。
2. 主流PDF解析工具效果对比
所有工程步骤都从一件事开始:将PDF转化为文本数据。但年报并非普通PDF,它们包含大量图表、表格、结构化数据。大多数Python开发者用过这些PDF解析库:
PyPDF2—— 老牌工具,能用,但功能简陋。PyMuPDF4LLM—— 可将PDF直接转为Markdown格式。Docling—— IBM Deep Search出品,提取效果惊艳。Marker—— 另一个较新的工具,表现也不错。
2.1 各工具提取效果对比
- PyPDF2:纯文本提取,无任何结构。段落、标题、表格、列表,全部混在一起。
- PyMuPDF4LLM:能转换为Markdown,包含结构信息,得到LangChain等框架支持,但表格提取效果不佳。
- Docling:表现最强!能保留标题层级、表格结构,甚至为图片添加占位符。
- Marker:也不错,但整体信息保留度不如Docling。
3. Docling的优势与速度问题
我们进行了一项实验,从包含文字、表格、图片混合段落的年报中提取内容,放置在不同页数的PDF中,测试各工具的处理速度。结果如下:
- Docling:每页大约4秒
- Marker:每页大约8秒
- PyPDF2:极快,但结构信息很少
如果处理几十份报告(例如50份,每份300页),那么意味着:
300页×50份×4秒÷3600秒≈17小时
这还在可接受范围内。但如果扩展到标普500所有公司30年的年报——就需要处理上百万页。单机运行不现实,因此我们选择了云服务+并行处理方案。
