RAG工程实践拦路虎之一:PDF格式解析杂谈

rag,pdf · 浏览次数 : 55

小编点评

背景PDF(Portable Document Format)是一种广泛应用于文档交换的文件格式,具有跨平台性、固定布局和易于打印等特点。然而,由于PDF文件的复杂性和多样性,提取其中的文本、图片和表格等内容具有挑战性。为了解决这一问题,目前存在多种技术方案,包括LLM/视觉大模型解析、OCR模型、传统规则提取等。此外,还有一些开源技术方案可供参考,如Java生态中的Apache PDFBOX和Python生态中的PyMuPDF等。 在解析PDF文件时,主要面临以下技术难点: 1. 布局解析困难:PDF文件的布局可能因不同作者、工具或用途而有所不同,解析其布局具有挑战性。 2. 格式错综复杂:PDF文件中可能包含各种格式的内容,如文字、图像、表格等,解析其内容需要考虑这种多样性和复杂性。 3. 复合表格:纵向/横向合并的复杂表格在PDF中进行抽象还原是最难处理的问题之一。 4. 文本、图片、表格顺序提取:提取PDF文件中的文本、图片和表格,并确保它们的顺序正确性,是一个重要问题。 5. 文档结构还原:还原PDF文件的文档结构,包括标题、目录等信息,是实现自动化文档处理和理解的关键步骤之一。 6. 元数据提取:在PDF中隐藏的元数据信息是RAG产品的关键数据,如链接、目录、字体等。 7. 扫描件处理:对于扫描件PDF,OCR模型可能无法有效提取,需要考虑清晰度、模型稳定性等问题。 8. Latex公式提取:在一些特殊领域,PDF文本中包含了Latex等数学公式。 为实现高效的PDF解析,可以考虑结合开源技术方案,如Apache PDFBOX、PyMuPDF等,并关注OCR/LLM模型等技术的发展。同时,需要关注图形类API、PDF标准、边/线/矩阵算法等技术难点,并根据实际业务需求进行技术选型和优化。

正文

背景

PDF(Portable Document Format)是一种广泛用于文档交换的文件格式,由Adobe Systems开发。它具有跨平台性、固定布局和易于打印等特点,因此在商业、学术和个人领域广泛应用。然而,PDF文件的解析一直是一个具有挑战性的问题,因为其内部结构的复杂性和多样性,使得提取其中的文本、图片和表格等内容并不是一件容易的事情。

技术方案

在目前的PDF文件解析领域中,我们可以将其大致分为以下几类技术方案:

  • LLM/视觉大模型解析:LLM(Large Language Model)大型语言模型在近年来的发展中,展现出了强大的语言理解和生成能力。通过训练大规模的神经网络,可以实现对PDF文件中文字内容的理解和提取,这种方法尤其适用于那些布局复杂、内容丰富的PDF文件。
  • OCR模型:光学字符识别(OCR)模型专门设计用于将PDF文件中的图像转换为可编辑的文本。这种技术在处理扫描版或图像化的PDF文档时尤其有用。
  • 传统规则提取:传统的PDF解析方式可能包括基于规则的文本提取、图像处理和表格识别等方法。虽然这些方法可能不如深度学习模型那样灵活,但在某些情况下仍然是有效的选择。

各个解决方案目前可能需要配合使用,因为PDF格式本身的复杂程度,一项技术方案可能是无法100%满足业务需求的,这里面需要考虑的是:

  • 文档提取还原度:通过技术手段,能够完整的提取PDF中的各项元素,包括文本、表格、图片、链接、图形、目录等等信息
  • 高效/💰成本:在RAG知识库问答的产品中,考虑到文本还需要Embedding的过程,因此在提取过程中如何更高效,成本更低也是需要着重考虑到事项。
  • 稳定/幂等:我们知道大模型可能是出现幻觉的,如果用大模型来提取PDF中的内容,是否能足够保证稳定性。

当我们处理解析PDF时,我们需要可以讲每一项的难点都进行拆分,从需求出发,逐一进行攻破,找到解决方案。

其实我觉得技术人员如果能通过技术手段确定PDF中的Block(块)以及阅读顺序,按Block(块)进行输出转换(Markdown/Html等),这里面包括的Block块元素:文本、图片、表格等等。那么这个提取的效果就会达到我们的最优

而这个目标是我们接下来要重点讨论的。

技术难点

在考虑解析PDF文件时,我们需要根据当前的技术栈发展情况,并结合实际的业务诉求,综合考量这其中的技术难点,因为每一项技术难点所涉及的技术方案都会需要一个算法/或者技术手段去突破。

而开发者从解析的效果去考虑,可以从简单的做起,逐步突破难点,这对于开发人员自身的自信心提升也是一种正向的导向。在整个PDF解析过程中,我觉得以下几项是比较难处理的:

  • 布局解析困难:PDF文件的布局可能会因为不同的作者、工具或用途而有所不同,因此解析其布局是一个具有挑战性的任务。
  • 格式错综复杂:PDF文件中可能包含各种格式的内容,包括文字图像表格等,因此解析其内容需要考虑到这种多样性和复杂性。
  • 复合表格:纵向/横向合并的复杂表格,在PDF中进行抽象还原是最难处理的问题之一
  • 文本、图片、表格顺序提取:提取PDF文件中的文本、图片和表格,并确保它们的顺序正确性,是一个需要解决的重要问题。
  • 文档结构还原:还原PDF文件的文档结构,包括标题、目录等信息,是实现自动化文档处理和理解的关键步骤之一。
  • 元素重叠:从PDF100%效果还原的角度考虑,图片/文本之间的重叠,图片合并,合并后不失真等,也是需要考虑的事项之一
  • 元数据提取:在PDF中隐藏的元数据信息是RAG产品的关键数据,比如链接、目录、字体等等
  • 扫描件:PDF中如果是扫描件,依靠OCR模型可能是无法有效的提取,这里面包含了清晰度、模型的稳定性等等问题
  • Latex公式提取:在一些特殊领域,PDF文本中包含了Latex等数学公式。通过完整的提取和转换是对RAG问答的有效补充

技术可行性

我们从解析PDF的技术可行性角度,考虑哪些方面值得我们重点关注和突破:

  • 文字提取能力,逐行提取:确保能够准确地提取PDF文件中的文字内容,并按照正确的顺序进行排列和输出,避免文字乱码(字体)。
  • 简单/复杂表格完整提取:对PDF文件中的表格进行完整提取,包括表格内的内容和格式。
  • 图片提取/合并:提取PDF文件中的图片,并保留其原始质量和格式。
  • 文档布局(Block块的标识)识别:识别PDF文件的布局,包括页面的排列方式、文本和图片的位置等信息。
  • 文档结构识别(标题、目录),内容顺序输出:识别PDF文件的结构,包括标题、目录等信息,并确保输出内容的顺序正确。
  • 转换为Markdown格式:将解析后的PDF文件内容转换为Markdown格式,以便于后续的处理和分享。

开源技术方案

结合上面的技术难点/方案及可行性上去分析,我们可以看看目前开源的技术组件中,有哪些是我们可以考虑进行结合的。

因为目前TorchV系统主要以Java+Python双语作为底层的应用开发语言,接下来我们可以看看在这两个编程语言中,有哪些开源的方案可以使用。

Java生态

在Java生态中,对于PDF组件处理的开源方案不多见,Apache PDFBOX是当前最强的,也是最好的

名称 地址 说明
Apache PDFBox https://github.com/apache/pdfbox 提供开箱即用的文本、图片内容提取方式,并且可以基于Stream接口重写各项元素的解析实现,并能输出元素的坐标信息。开发者可以根据元素的坐标信息结合算法进行内容的高度还原。唯一的缺点是没有表格组件提取的API供开发人员使用。
tabula-java https://github.com/tabulapdf/tabula-java 基于Apache PDFBOx组件的表格提取实现

Python生态

Python生态的PDF提取组件还是蛮多的,不过也是有不同的侧重,比如pdfplumber、camelot等都专注在表格的提取上,提供了开箱即用的方案。

名称 地址 说明
pypdf https://github.com/py-pdf/pypdf 一个纯Python PDF库,能够分割、合并、裁剪和转换PDF文件的页面
PyMuPDF(AGPL) https://github.com/pymupdf/PyMuPDF 高性能 Python 库,用于 PDF(和其他)文档的数据提取、分析、转换和操作。
pdfplumber(MIT) https://github.com/jsvine/pdfplumber 查看 PDF 以获取有关每个字符、矩形、线条等的详细信息,并轻松提取文本和表格。
camelot(MIT) https://github.com/camelot-dev/camelot 专注于PDF中表格的提取,包括复杂的表格

OCR生态/大模型

在上面Python和Java生态库的开源组件,基本都是针对文字的PDF处理为主,当我们的PDF是扫描件时,那上面的组件统统失效,都提取不出来文本信息。

此时就需要用到OCR的模型进行提取。

考虑到如果是OCR提取,那么最终的目的是将PDF文件Page页码内容提取出完成的图片Image,所以本质上是对图片内容的理解

可以考虑的开源组件如下:

名称 地址 说明
marker(GPL) https://github.com/VikParuchuri/marker 基于模型将PDF文件内容提取为Markdown格式
surya(GPL) https://github.com/VikParuchuri/surya OCR、布局分析、阅读顺序、线条检测(支持90 多种语言)
tesseract(Apache 2) https://github.com/tesseract-ocr/tesseract 老牌OCR组件,支持100多种语言
RapidOCR(Apache) https://github.com/RapidAI/RapidOCR 基于 ONNXRuntime、OpenVION 和 PaddlePaddle 的出色 OCR 多种编程语言工具包。
PaddleOCR(Apache) https://github.com/PaddlePaddle/PaddleOCR 基于飞桨的出色多语言OCR工具包(实用的超轻量级OCR系统,支持80+语言识别)
EasyOCR(Apache ) https://github.com/JaidedAI/EasyOCR Python\C++开发,支持80多种语言OCR识别

技术准备/细节

在解析PDF时,我们也会有一些其他方面的知识储备,以便我们快速应对不同的业务需求及应用产品形态。

1、图形类API:不管是Java还是Python里面,对于处理PDF中间件的部分,都需要对图形类的API/算法熟悉和掌握,这里面包含图形的转换、缩放、矩阵坐标、截取等等,都会在PDF提取的过程中使用到。

2、PDF标准:在处理PDF中,结合开源的技术中间件,对于PDF的ISO标准,我们也是需要了解的,这样更加有利于开发人员理解中间件的代码写法及含义。

3、边/线/矩阵算法等:对于文本/边框的聚类算法等,在根据元素坐标高效还原时,利用高效的算法可以提高解析速度以及内容还原度

4、OCR/LLM模型等:了解学习在用OCR/LLM模型分析布局、边界检测等等技术上的一些算法及数据工程上的实践

5、PDF页面旋转:有时候原PDF可能会有旋转(0、90、180、270度),需先校正后,再次提取内容

6、字体/乱码:系统/服务器中缺失PDF中的字体,导致文本提取乱码

最后

本文从大的方面简单概括了在PDF解析处理过程中的技术方案/难点/开源技术方案等内容,后面我会从一些细节方面来逐一分享我们在构建TorchV产品时,解析PDF文件过程中的一些问题及技术实践,包括对表格的提取,感兴趣的可以关注我们😁。

另外,我们团队提供了一个PDF解析的Demo地址,针对文本类的PDF(暂时不支持扫描件),可以进行试用体验。

地址:http://tabletest.torchv.com:8010/

与RAG工程实践拦路虎之一:PDF格式解析杂谈相似的内容:

RAG工程实践拦路虎之一:PDF格式解析杂谈

背景 PDF(Portable Document Format)是一种广泛用于文档交换的文件格式,由Adobe Systems开发。它具有跨平台性、固定布局和易于打印等特点,因此在商业、学术和个人领域广泛应用。然而,PDF文件的解析一直是一个具有挑战性的问题,因为其内部结构的复杂性和多样性,使得提取

实战0-1,Java开发者也能看懂的大模型应用开发实践!!!

前言 在前几天的文章《续写AI技术新篇,融汇工程化实践》中,我分享说在RAG领域,很多都是工程上的实践,做AI大模型应用的开发其实Java也能写,那么本文就一个Java开发者的立场,构建实现一个最基础的大模型应用系统。 而大模型应用系统其实在目前阶段,可能应用最广的还是RAG领域,因此,本文也是通过

用 Sentence Transformers v3 训练和微调嵌入模型

Sentence Transformers 是一个 Python 库,用于使用和训练各种应用的嵌入模型,例如检索增强生成 (RAG)、语义搜索、语义文本相似度、释义挖掘 (paraphrase mining) 等等。其 3.0 版本的更新是该工程自创建以来最大的一次,引入了一种新的训练方法。在这篇博

开源一个RAG大模型本地知识库问答机器人

弹指间,2009年大学毕业到现在2024年,已经15年过去了。 前2天,看到自己14年在博客园写的一个博客,哪个时候是工作之余创业 感兴趣的朋友可以看看我10年前发的一篇博客 https://www.cnblogs.com/likwo/p/3832795.html 目前全职创业中,用过不少开源软件,

我对《RAG/大模型/非结构化数据知识库类产品》技术架构的思考、杂谈

1、前言 在6.28/29的稀土掘金开发者大会RAG专场上,我们公司CEO员外代表TorchV分享了我们在《RAG在企业应用中落地的难点与创新》 其中最后分享了两个观点: AI在应用场景落地时有三个特点:功能小、质量高、价值大 如果说做产品是把一横做好的话,那么去做企业落地服务就是一竖,从需求和方案

检索增强生成(RAG)实践:基于LlamaIndex和Qwen1.5搭建智能问答系统

检索增强生成(RAG)实践:基于LlamaIndex和Qwen1.5搭建智能问答系统 什么是 RAG LLM 会产生误导性的 “幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。 正是在这样的背景下,检索增强生成技术(Retrieval-Augm

构建RAG应用-day05: 如何评估 LLM 应用 评估并优化生成部分 评估并优化检索部分

评估 LLM 应用 1.一般评估思路 首先,你会在一到三个样本的小样本中调整 Prompt ,尝试使其在这些样本上起效。 随后,当你对系统进行进一步测试时,可能会遇到一些棘手的例子,这些例子无法通过 Prompt 或者算法解决。 最终,你会将足够多的这些例子添加到你逐步扩大的开发集中,以至于手动运行

rerank来提升RAG的准确度的策略

RAG(Retrieval-Augmented Generation)是一种结合检索和生成两种技术的模型,旨在通过检索大规模知识库来增强文本生成任务的准确性。 要通过reranking(重排序)来提升RAG的准确度,可以采取以下策略: 1. 使用更精细的评分函数 RAG通常会在检索阶段根据输入问题或

【高级RAG技巧】在大模型知识库问答中增强文档分割与表格提取

前言 文档分割是一项具有挑战性的任务,它是任何知识库问答系统的基础。高质量的文档分割结果对于显著提升问答效果至关重要,但是目前大多数开源库的处理能力有限。 这些开源的库或者方法缺点大致可以罗列如下: 只能处理文本,无法提取表格中的内容 缺乏有效的分割策略,要么是一整个文档全部提取,要么是词粒度的获取

Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读

引入知识图谱技术后,传统RAG链路到Graph RAG链路会有什么样的变化,如何兼容RAG中的向量数据库(Vector Database)和图数据库(Graph Database)基座,以及蚂蚁的Graph RAG开源技术方案和未来优化方向。