大模型时代的PDF解析工具
去年(2023年)是大模型爆发元年。但是大模型具有两个缺点:缺失私有领域知识和幻觉。缺失私有领域知识是指大模型训练时并没有企业私有数据/知识,所以无法正确回答相关问题。并且在这种情况下,大模型会一本正经地胡说八道(即幻觉),给出错误的回答。
那么如何解决这两个缺点?目前主要有两种方法,微调和RAG。微调是指使用企业私有数据/知识基于现有大模型训练出一个新的模型,然后我们使用这个新的模型来回答用户问题。RAG是检索增强生成(Retrieval-Augmented Generation)的缩写,是指在用户提问时系统后台根据用户问题检索相关数据/知识,然后将所检索到的相关数据/知识加上用户问题一起交给大模型处理。
我们可以看到,无论是哪种方法,将企业私有数据/知识传给大模型都是位于整个流程的上游,这个阶段的任何失误都会直接影响到整个流程的下游,最终影响整个问答的准确率。
为了让读者更形象地了解这个环节,本文将以一份上市公司年报PDF为例进行讲解。
本文选择了恒生电子(600570)2022年的年度报告(修订版)做为示例,大家可以在巨潮资讯搜索下载这份PDF文件。
使用传统PDF解析工具解析PDF
首先我们使用传统的PDF解析工具解析PDF。
传统的PDF解析库相当地多,我们就不一一罗列和分析了。这里我们仅以目前最流行的大模型框架LangChain所支持的其中一个解析库PyPDF为例。
我们使用LangChain并选择PyPDFLoader来读取文件“恒生电子:恒生电子股份有限公司2022年年度报告(修订版).PDF”
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("example_data/恒生电子:恒生电子股份有限公司2022年年度报告(修订版).PDF")
pages = loader.load_and_split()
存在的问题
我们发现通过PyPDFLoader读取的结果存在很多问题,这里仅以PDF第6页和第7页的“七、近三年主要会计数据和财务指标”为例:

通过PyPDFLoader读取的结果为(为节省篇幅,这里去除了所有空白换行符):
七、 近三年主要会计数据和财务指标
(一) 主要会计数据
单位:元 币种:人民币
主要会计数据 2022年 2021年
本期比上年 同期增减
(%)
2020年
营业收入 6,502,387,143.49 5,496,578,624.88 18.30 4,172,645,156.56
归属于上市公司股东的 净利润 1,091,088,379.58 1,463,538,930.14 -25.45 1,321,735,522.48
归属于上市公司股东的 扣除非经常性损益的净 利润
1,144,419,161.05 946,569,672.55 20.90 733,590,924.61
经营活动产生的现金流 1,138,192,779.96 956,789,306.14 18.96 1,397,902,270.41
2022 年年度报告
**7** /
**211** 量净额
2022年末 2021年末
本期末比上 年同期末增
减(%)
2020年末
归属于上市公司股东的 净资产 6,811,761,050.50 5,695,031,051.05 19.61 4,554,029,323.59
总资产 13,004,578,298.67 12,079,908,312.76 7.65 9,971,144,688.34
我们可以发现以下问题:
- PDF换页导致表格行头被断开:第四行的行头“经营活动产生的现金流量净额”被断成两截,生生加入了“1,138,192,779.96 956,789,306.14 18.96 1,397,902,270.41 2022 年年度报告 **7** /**211** ”一长串内容。我们可以看到,这一段内容中,干扰信息比正常信息还要多一两倍。遇到这种问题,再强大的大模型都无法正确处理!
- 丢失表格列头信息:表格最后几行数据完全无法与表格列头建立关系。从而导致大模型无法识别这些数据所代表的意义。
除了PyPDFLoader之外,其它传统的PDF解析工具的处理结果也差不多。
计算机科学与信息通信技术领域有一句习语:垃圾进,垃圾出 ( Garbage in, garbage out ,缩写GIGO )。我们可以看到,在这个示例中,因为传统PDF解析工具的局限性,生生地把精华处理成垃圾喂给了大模型,大模型自然而然地只能给出垃圾给用户了。那么,我们如何解决这些问题呢?
使用大模型时代的PDF解析工具
既然传统的PDF解析工具跟不上时代的发展,那么我们就使用大模型时代的PDF解析工具。
截至目前为止,大模型时代的PDF解析工具有两类:
- 原生支持英文,对中文支持尚待改进的:Marker、nougat(Facebook)、Layoutlmv3(Microsoft)、DocLayNet(IBM)、ByT5(Google)
- 原生支持中文,并以中文大模型为试验对象的:Vary、PDF4AI.cn
这里以Marker(https://github.com/VikParuchuri/marker)为代表简单描述一下第一类工具。Marker的原理是将PDF解析成Markdown喂给大模型。因为Markdown可以保留表格的结构信息,所以能够解决前面示例中的问题。
然而很遗憾的是,Marker目前尚未支持中文,所以无法用于本文中的示例。不过大模型时代技术发展迅速(LangChain几乎每天更新一个版本),Marker才诞生三个月就已经更新多个版本,相信很快就会支持中文了。
至于nougat、Layoutlmv3、DocLayNet、ByT5都是类似于Marker的工具,因为篇幅原因,这里就不过多描述了。
这些工具有些明确表示目前不支持中文,有些虽然支持中文,但是实际效果可能不能满足读者们的预期。
既然以上工具对中文支持不友好,那么有没有支持中文的类似工具呢?旷视推出了Vary。
Vary是以中文大模型(阿里巴巴的通义千问Qwen)为试验对象的,并且优先和原生支持中文,从Vary的官网可以看到,Vary的Demo都是先展示中文再展示英文的。
Vary的官网是https://varybase.github.io/ , 比较奇怪的是,虽然各大自媒体号说这是旷视推出的模型,然而这个官网并没有表现出这一点。同时Vary推出没多久,目前改进空间还很大,笔者将持续关注。
另一个工具是PDF4AI.cn(https://www.pdf4ai.cn)。PDF4AI.cn的原理与Marker、Vary是一样的,都是将PDF解析成Markdown喂给大模型。
PDF4AI.cn分为免费版和专业版。截止目前为止,PDF4AI.cn的免费版未能解决以上示例中的问题。
PDF4AI.cn专业版可以解决以上示例中的问题。以下是PDF4AI.cn专业版的处理结果(为节省篇幅,这里去除了所有空白换行符):
七、 近三年主要会计数据和财务指标
(一) 主要会计数据
单位:元 币种:人民币
| 主要会计数据 | 2022年 | 2021年 | 本期比上年同期增减 (%) | 2020年 |
| ------ | ----- | ----- | -------------- | ----- |
| 营业收入 | 6,502,387,143.49 | 5,496,578,624.88 | 18.30 | 4,172,645,156.56 |
| 归属于上市公司股东的净利润 | 1,091,088,379.58 | 1,463,538,930.14 | -25.45 | 1,321,735,522.48 |
| 归属于上市公司股东的扣除非经常性损益的净利润 | 1,144,419,161.05 | 946,569,672.55 | 20.90 | 733,590,924.61 |
| 经营活动产生的现金流量净额 | 1,138,192,779.96 | 956,789,306.14 | 18.96 | 1,397,902,270.41 |
| 归属于上市公司股东的净资产 | 6,811,761,050.50 | 5,695,031,051.05 | 19.61 | 4,554,029,323.59 |
| 总资产 | 13,004,578,298.67 | 12,079,908,312.76 | 7.65 | 9,971,144,688.34 |
熟悉Markdown的朋友们可以看出,以上处理结果将PDF里面的表格转换为Markdown里面的表格。
为了让不熟悉Markdown的朋友们有一个直观的认识,笔者使用Markdown编辑工具将以上结果可视化一下:

现在我们可以清晰地看到,表格信息被完整保留,从而解决了以上示例中的问题。
总结
与传统的PDF解析工具相比,大模型时代的PDF解析工具将PDF解析成Markdown,从而保留一些结构化的信息(例如表格和图片),再喂给大模型,从而避免把精华处理成垃圾,避免垃圾进,垃圾出。
去年(2023年)大模型才爆发,因此这些大模型时代的PDF解析工具都是新生产物,有很多地方尚待改进,不过它们也更新迅速,感兴趣的读者可以持续关注。
大模型时代的PDF解析工具的更多相关文章
- 年度钜献,108个大数据文档PDF开放下载
1.大数据的开放式创新——吴甘沙 相关阅读:[PPT]吴甘沙:让不同领域的数据真正流动.融合起来,才能释放大数据的价值 下载:大数据的开放式创新——吴甘沙.pdf 2.微软严治庆——让大数据为每个人服 ...
- 大数据时代的技术hive:hive介绍
我最近研究了hive的相关技术,有点心得,这里和大家分享下. 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将 ...
- 大数据时代快速SQL引擎-Impala
背景 随着大数据时代的到来,Hadoop在过去几年以接近统治性的方式包揽的ETL和数据分析查询的工作,大家也无意间的想往大数据方向靠拢,即使每天数据也就几十.几百M也要放到Hadoop上作分析,只会适 ...
- 转:大数据时代快速SQL引擎-Impala
本文来自:http://blog.csdn.net/yu616568/article/details/52431835 如有侵权 可立即删除 背景 随着大数据时代的到来,Hadoop在过去几年以接近统 ...
- (原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 决策树分析算法)
随着大数据时代的到来,数据挖掘的重要性就变得显而易见,几种作为最低层的简单的数据挖掘算法,现在利用微软数据案例库做一个简要总结. 应用场景介绍 其实数据挖掘应用的场景无处不在,很多的环境都会应用到数据 ...
- 大数据时代的数据存储,非关系型数据库MongoDB
在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...
- LinkedIn高级分析师王益:大数据时代的理想主义和现实主义(图灵访谈)
转自:http://www.ituring.com.cn/article/75445 王益,LinkedIn高级分析师.他曾在腾讯担任广告算法和策略的技术总监,在此期间他发明了并行机器学习系统“孔雀” ...
- 移动大数据时代最IN编程语言必读书单
移动大数据时代最IN编程语言必读书单 这是一个快速更迭,快鱼吃慢鱼的时代.从IT 时代演变成 DT 时代,再到现在的智能时代.急速革新的各种新技术.新工具.新平台,需要程序员掌握良好的编程思想和学习方 ...
- 大数据时代的数据存储,非关系型数据库MongoDB(一)
原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...
- 从Facebook数据泄露事件看大数据时代的个人信息安全问题
进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...
随机推荐
- 教你用Rust实现Smpp协议
本文分享自华为云社区<华为云短信服务教你用Rust实现Smpp协议>,作者: 张俭. 协议概述 SMPP(Short Message Peer-to-Peer)协议起源于90年代,最初由A ...
- Vdbench 参数详解
Vdbench 参数详解 HD:主机定义 如果您希望展示当前主机,则设置 hd= localhost.如果希望指定一个远程主机,hd= label. system= IP 地址或网络名称. clien ...
- Java使用ConcurrentHashMap实现简单的内存式缓存
需求说明: 实际项目中我打算把用户和组织信息放到缓存中,基于此提出以下几点需求: 1.数据存储在内存中: 2.允许以键值对的方式存储对象类数据并带有过期策略: 3.不限制内存使用,但cache也不能给 ...
- nginx添加站点
1.修改配置文件 vim /usr/local/nginx/conf/nginx.conf 添加一个server节点: server { listen 81; ...
- C++ 多线程的错误和如何避免(4)
对共享的资源或者数据做加锁处理 在多线程的环境下,有时需要多个线程对同一个资源或者数据进行操作,如果没有加锁,容易出现未定义的行为. 比如: #include <iostream> #in ...
- pikachu sql inject header 注入
使用admin登录 显示以下内容 朋友,你好,你的信息已经被记录了:点击退出 你的ip地址:172.17.0.1 你的user agent:Mozilla/5.0 (X11; Ubuntu; Linu ...
- 硬件开发笔记(八): 硬件开发基本流程,制作一个USB转RS232的模块(七):创建基础DIP元器件(晶振)封装并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了创建晶振封装(DIP),将原理图的 ...
- SDL开发笔记(一):SDL介绍、编译使用以及工程模板
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- linux下virtualenvwrapper安装
安装 pip3 install virtualenvwrapper -i https://pypi.douban.com/simple 设置linux的用户配置文件配置virtualenvwrappe ...
- Isito 入门(二):Istio 的部署
本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 2,部署 Istio 安装 Helm 部署 istio-base 部署 istiod 部署 istio-ingr ...