用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
文档预处理之文本化
近日,我们收到来自专业用户的使用心得,浅析结构化信息提取技术、技术选型及一些个人测试。
结构化信息提取的重要性
数据作为大模型时代的核心生产资料,其结构化处理能力直接影响AI系统的实用价值。尽管知识图谱、RAG等技术依赖海量文本资源,但现实中的历史档案、法律文书等重要数据多以扫描件、图像等非结构化形式存在,导致信息抽取、语义解析等环节面临显著技术障碍。
当前结构化信息提取技术虽呈现多样化发展,但对于开发者而言,结构化信息提取的“落地”与“可用性”才是真正的考验,研究论文中的指标和高精度模型在生产环境中可能面临性能瓶颈、成本过高、部署难度大等现实挑战。
本文将梳理主流技术方案,立足实际需求,结合一系列实测数据与实践经验,评估各方法在不同场景下的表现与优劣势。从技术指标到生产可行性,我们将为开发者提供一份实用的兼顾算法效能与部署成本的参考指南。
评价标准
作为测评,首先确定标准,目标输出格式设定为markdown。
Markdown 作为一种增强的文本格式,相较纯文本而言,为数据保有了其中固有的结构(表格、标题、列表等)。同时作为大模型原生支持的文本格式,使用markdown作为输入格式也能让输出效果更好。
对于测试结果要求,首先,最重要的标准是结果可用。我们定了3个正确性指标:其中,文本准确性是所有文本解析的基础,有研究[1]指出,解析正确性将显著影响RAG的效果;表格准确性则是一个难点,尤其是有多个单元格合并的情况下,很难识别准确;标题正确性主要考察标题层级是否正确。其次需要评估识别速度、成本等问题。考虑到有些组织内信息不能上传外网,添加了隐私性,即能否本地部署这一指标。最后考虑到有些方法路径尚不成熟,部署复杂度大,因此能否便捷使用也是需要考察的点。最终得到的评价表格如下:
评价表格:*
名称 | 访问地址 | 文本正确性 | 表格正确性 | 标题正确性 | 识别速度 | 成本 | 本地部署 | 便捷使用 |
-
由于参与后处理的是LLM,所以关于文本识别准确有一定容错,如果需要关于正确性的量化评价,可以采用Markdown Tester。
测评
使用的待测试pdf:随机选取的一份上交所上市公司的2023年年报,全文193页。
金融年报是电子文档中相对复杂的一类,文字密度大,表格复杂度高,标题层级多,对模型能力有较大考验。遂选取之作为测试素材。
基于大模型的识别方案举例
市面上流行的几个开源pdf转markdown方法,大体可以分为两种,一类走传统版面分析+公式表格识别+OCR方案,另一类则是走视觉大模型路线。
利用大模型执行pdf转markdown算是一种逻辑上比较容易的办法,借助大模型本身强大的视觉识别能力,进行力大砖飞的转换。
从原理上,这种方法可以自如地进行转换,同时可以在转换过程中保留尽可能多的视觉信息,基础的诸如标题层级,进阶的还可以对图片进行一定的语义解释。
视觉大模型的接口也容易获得,有条件的情况下可以本地部署。
本次实验采取识别能力靠前[2]且常用的gpt-4o模型配合 gptpdf 来进行实验:
测试
gptpdf的封装度较高,且依赖较少,一次pip即可安装。
如果是使用openai服务的话,只需填写上自己的key即可。如果自己有大模型部署的话,也可改成自己的代理地址,也可使用本地的视觉模型。
测试代码用的是单线程,由于速度较慢远低于预期,遂只拆出前30页进行测试。效果如下:
可以看到,问题还是比较多的,比如幻觉问题:
大模型幻觉出了一些奇怪的标题。
识别结构不稳定:
此处本应是一个表格。
我使用的是gptpdf默认的prompt,可能有优化空间。但是效果的确不尽如人意。
而且速度也是有够慢,仅仅三十页运行了477.34s,就算可以多线程,单页16s的开销也使其很难用于快速文档解析场景。
小结
名称 | 访问地址 | 文本正确性 | 表格正确性 | 标题正确性 | 识别速度 | 成本 | 本地部署 | 便捷使用 |
gptpdf | https://github.com/CosmosShadow/gptpdf | 偶有差错 | 语义正确 格式错误 | 基本无误 | 16s/页 | 本地算力/gpt4o 约0.112¥/页(含读取和输出) | 可行(基于视觉大模型,显存要求高) | 部署便捷 |
本次测试还有一些可以优化的点,例如使用经过调试的提示词,或者换用对中文视觉支持更好的大模型。但该方案整体上价格偏高,单管道处理速度也较慢,除非和一些基于大模型的预处理进行步骤合并,否则不推荐使用。
基于本地OCR的识别方案举例
相对视觉大模型方案,OCR方案则小巧且复杂,其使用较小的模型各司其职,并对结果进行拼接。其算力要求相对低的特点也使其适用于本地部署,一个广受好评的解决方案是MinerU,作为开源的数据提取工具,目前在github上已经有24.3k stars.
测试
minerU的安装相对复杂些,且如果要安装gpu版本需要额外的步骤。
该方案是完全开源的,好消息是有些组件可以根据需求定制化更改。坏消息是,可能有一些bug,需要查issues自行修复。
解析速度还算过关,在i7-2700+3090上运行,平均4.52s每页。在不同阶段使用的算力硬件也不同,多线程情况下速度或许会更快。
值得注意的是,由于markdown格式表格不易于显示复杂表,minerU的默认表格识别将会把表格转换为html格式,从纯文本打开的话会像是这样:
issues中有人给出了能转换为markdown格式的替代方案,但是这同样需要额外的配置,在此暂不讨论。
来看看效果:
标题只有一层,即是标题
/不是标题
。在表格识别能力上偏弱,偶尔会出现例如:
无限复读机;
换页时文本错误/表格结构错误。
小结
名称 | 访问地址 | 文本正确性 | 表格正确性 | 标题正确性 | 识别速度 | 成本 | 本地部署 | 便捷使用 |
MinerU | https://github.com/opendatalab/MinerU | 基本正确 | 较差 | 只能简单区分是否为标题,且识别准确性不高 | 正相关于硬件算力(i7-2700+3090上4.52s/页) | 本地部署(硬件折旧+电力损耗) | 可本地部署 | 不甚便捷 |
大概是开源领域最好的ocr方案了,如果有本地算力且文件保密要求高的话还是比较推荐的。默认的html格式个人认为有些鸡肋,不能保证准确性,同时也不利于大模型读取。先前提到的转换为markdown格式的替代方案我也尝试过,能一定程度减少识别错误,但会增加使用难度,且还是有较多错误。
基于云端OCR的识别方案举例
如果项目没有本地部署需求,那么云端OCR是个好方案,价格相对大模型方法低廉许多,且响应速度快。横评了一众中文OCR方案,Textin的数据是最好的。
测试
速度奇快,一份193页的pdf文件仅消耗了13s,几乎是其余方案的百倍。
几乎没有错误,只是偶有标题会被漏标:
只有极复杂的表格才能使其产生小错误:
原表格:
识别后:
小结
名称 | 访问地址 | 文本正确性 | 表格正确性 | 标题正确性 | 识别速度 | 成本 | 本地部署 | 便捷使用 |
TextIn | https://www.textin.com/document/pdf_to_markdown | 基本正确 | 基本正确 | 层级支持,偶有错误 | 极快,平均0.07s/页 | 0.05¥/页 | 可定制 | 非常便捷 |
综合下来是速度且效果最好的OCR方案了,适用大多数场景,非常推荐。
大结论
总表:
名称 | 访问地址 | 文本正确性 | 表格正确性 | 标题正确性 | 识别速度 | 成本 | 本地部署 | 便捷使用 |
gptpdf | https://github.com/CosmosShadow/gptpdf | 偶有差错 | 语义正确 格式错误 | 基本无误 | 16s/页 | 可行(基于视觉大模型,显存要求高) | 可行 | 部署便捷 |
MinerU | https://github.com/opendatalab/MinerU | 基本正确 | 较差 | 只能简单区分是否为标题,且识别准确性不高 | 正相关于硬件算力(i7-2700+3090上4.52s/页) | 本地部署(硬件折旧+电力损耗) | 可本地部署 | 不甚便捷 |
TextIn | https://www.textin.com/document/pdf_to_markdown | 基本正确 | 基本正确 | 层级支持,偶有错误 | 极快,平均0.07s/页 | 详见官网 | 可定制 | 非常便捷 |
从效果上,几种方法都在可接受的范围内。
视觉大模型方案成本高昂且可靠性较差,尽管近来有较多类似功能的开源仓库,但效果较差,价格高,速度慢,因此不建议使用此类方案。
从部署成本来说,如果有较强的本地算力,用量大且成本有限,建议使用本地OCR识别方案;如果对精确度要求高,资金充足,则建议使用云端OCR的识别方案;如果对精确度和数据安全都有较高的要求,可以选择TextIn本地部署。
最后附上测试代码和结果,也可以帮助你便捷完成批量转换。
mdfy_test:https://github.com/RwandanMtGorilla/mdfy_test
参考文献
[1] OCR Hinders RAG: Evaluating the Cascading Impact of OCR on Retrieval-Augmented Generation https://arxiv.org/abs/2412.02592v1
[2] llm的基础OCR识字能力 CC-OCR: A Comprehensive and Challenging OCR Benchmark for Evaluating Large Multimodal Models in Literacy https://arxiv.org/pdf/2412.02210
[3] Document Parsing Unveiled: Techniques, Challenges,and Prospects for Structured Information Extraction 文档解析综述 https://arxiv.org/pdf/2410.21169
[4] A Comparative Study of PDF Parsing Tools Across Diverse Document Categories https://arxiv.org/pdf/2410.09871
相关文章:

用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
文档预处理之文本化 近日,我们收到来自专业用户的使用心得,浅析结构化信息提取技术、技术选型及一些个人测试。 结构化信息提取的重要性 数据作为大模型时代的核心生产资料,其结构化处理能力直接影响AI系统的实用价值。尽管知识图谱、RAG等…...

vite调试node_modules下面插件
在使用vite进行开发的时候,我们可能想要修改node_modules中插件的源码.特别是集成一个SDK,需要调试去判断问题时,或者研究第三方源码时后; vite默认是走缓存的,所以当修改后不会看到你打印的日志,这个时候有几种方法可以选择; 方式…...
ES12 weakRefs的用法和使用场景
ES12 (ECMAScript 2021) 特性总结:WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一个新特性,用于创建对对象的弱引用。弱引用不会阻止垃圾回收器回收对象,即使该对象仍然被弱引用持有。WeakRef 通常与 FinalizationRegistry 结合使…...

【Python】集合set详细讲解(语法、操作、集合运算、性能、使用场景)
文章目录 1. 语法1.1 使用 {} 定义1.2 使用 set() 定义 2. 特点3. 常用操作3.1 访问元素3.2 查找数据3.3 添加元素3.3.1 add() 方法3.3.2 update()方法 3.4 删除元素3.4.1 remove()方法3.4.2 discard()方法3.4.3 pop()方法3.4.4 clear()方法 3.5 集合运算3.5.1 并集:…...

网络安全大数据架构 网络安全之数据安全
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网络安全和数据安全 从狭义来说,网络安全指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或恶意的原因遭到破坏、更改、泄露&…...

(前端基础)CSS(一)
了解 Cascading Style Sheet:层叠级联样式表 CSS:表现层(美化网页)如:字体、颜色、边框、高度、宽度、背景图片、网页定位、网页浮动 css优势: 内容和表现分离网页结构表现统一,可以实现复用…...
Redis数据类型全景解析:从底层编码到应用反模式
一、核心数据类型矩阵 1.1 基础类型对比表 类型底层结构最大容量时间复杂度典型场景StringSDS/Embstr/Raw512MBO(1)读写缓存/计数器ListQuickList(ziplist)2^32-1元素头尾操作O(1)消息队列Hashziplist/hashtable2^32-1键值对O(1)平均对象存储Setintset/hashtable2^32-1成员O(…...

(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...
TypeScript跟js,es6这些的区别
TypeScript 一、TypeScript 是什么 想象 JavaScript 是一个自由奔放的艺术家,它在创作(编写代码)时不受太多约束,非常灵活,但有时也容易犯错且难以调试。而 TypeScript 就像是给这位艺术家配备了一套精确的工具和规范…...

flink-cdc同步数据到doris中
1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题,因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…...

Kubernetes:EKS 中 Istio Ingress Gateway 负载均衡器配置及常见问题解析
引言 在云原生时代,Kubernetes 已经成为容器编排的事实标准。AWS EKS (Elastic Kubernetes Service) 作为一项完全托管的 Kubernetes 服务,简化了在 AWS 上运行 Kubernetes 的复杂性。Istio 作为服务网格领域的佼佼者,为微服务提供了流量管理…...
Golang教程
1. go 环境与命令 1.1 go 环境搭建 SDK 安装 Go 官网:golang.orgGo 中文社区:https://studygolang.com/dlGo API文档:https/golang.org 或 https://studygolang.com/pkgdoc 目录 api :api 存放bin:go命令src&#…...
AI 百炼成神:线性回归,预测房价
我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...

企业软件合规性管理:构建高效、安全的软件资产生态
引言 在数字化转型的浪潮下,企业的软件使用方式日益多元化,涉及云端、订阅制、永久授权及浮动许可等多种模式。然而,随着软件资产的增多,企业面临着合规性管理的严峻挑战:非法软件使用、许可证管理不当、软件资产闲置…...

每日一题——编辑距离
编辑距离 参考资料题目描述示例 解题思路动态规划(DP)方法 代码实现复杂度分析示例详解示例1:"nowcoder" → "new"示例2:"intention" → "execution" 总结与心得 参考资料 建议先参考下…...
TensorFlow项目GPU运行 安装步骤
以下是在 Linux 系统 下搭建完整 GPU 加速环境的详细流程(适配 CUDA 11.2 和 Python 3.9): 1. 前置检查 1.1 验证 NVIDIA 驱动 # 检查驱动版本(需 ≥ 450.80.02) nvidia-smi 输出示例: CUDA Version: 11.2…...

c++进阶———继承
1.引言 在一些大的项目中,我们可能要重复定义一些类,但是很麻烦,应该怎么办呢?举个简单的例子,我要做一个全校师生统计表,统计学号,教师编号,姓名,年龄,电话…...
FreeSwitch的mod_translate模块详细,附带场景案例及代码示例
mod_translate 模块详细介绍 mod_translate 是 FreeSWITCH 中的一个拨号计划应用程序模块,用于对电话号码或字符串进行格式转换和翻译。它可以根据预定义的规则对输入的内容进行匹配和转换,常用于号码格式化、路由选择、号码屏蔽等场景。 主要功能 号码…...
前端504错误分析
前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...

在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证
文章目录 一、引言二、什么是 JSON Web 令牌?三、什么是 JSON Web 令牌结构?四、设置 JWT 令牌身份验证4.1 创建新的 .NET 8 Web API 项目4.2 安装所需的 NuGet 软件包4.3 创建 JWT 配置模型4.4 将 JWT 配置添加到您的 appsettings.json 中4.5 为 Config…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...