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

server/2024/12/23 3:31:50/

前言

文档分割是一项具有挑战性的任务,它是任何知识库问答系统的基础。高质量的文档分割结果对于显著提升问答效果至关重要,但是目前大多数开源库的处理能力有限。
这些开源的库或者方法缺点大致可以罗列如下:

  • 只能处理文本,无法提取表格中的内容
  • 缺乏有效的分割策略,要么是一整个文档全部提取,要么是词粒度的获取

对于第一点,一般是把表格中的内容识别成文本,这样喂给大模型的时候就会出现一连串数字或者字母,这无疑会增大模型的理解难度;对于第二点,则是需要按照指定的长度对文档进行切分,或者把词按照一定的规则拼接到一块,这同样会损失到文本自身的上下文信息。

而本文接下来介绍的Open-parse这个库可以直接从文本中提取出多个节点,每个节点就是一个chunk,已经分好了,因此无需再按照长度进行split,这样同时也比单独提取一个词再进行合并又简化了不少操作;同时还支持同时提取表格和文字,无需分开提取。

快速开始

安装

pip install openparse

使用pip进行安装,同时这个库依赖Pymupdfpdfminer等其他库,也会同时安装。

识别文字

pdf = "c:\\人口.pdf"
parser = openparse.DocumentParser()
parsed_basic_doc = parser.parse(pdf)
for node in parsed_basic_doc.nodes:nodeprint('\n--------------------\n')

在这里插入图片描述
可以看到每一页的pdf被分成多个chunk,且还能保留原始文本中的加粗斜体等信息。

print(parsed_basic_doc.nodes[0])

elements=(TextElement(text='Aging Research老龄化研究**, 2022, 9(3), 26-34**\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 ', lines=(LineElement(bbox=(56.64, 739.57, 232.44, 750.01), spans=(TextSpan(text='Aging Research ‘, is_bold=True, is_italic=False, size=9.0), TextSpan(text=‘老龄化研究’, is_bold=False, is_italic=False, size=9.0), TextSpan(text=’, 2022, 9(3), 26-34 ', is_bold=True, is_italic=False, size=9.0)), style=None, text=‘Aging Research老龄化研究**, 2022, 9(3), 26-34**’), LineElement(bbox=(56.65, 728.28, 348.95, 737.28), spans=(TextSpan(text='Published Online September 2022 in Hans. http://www.hanspub.org/journal/ar ', is_bold=False, is_italic=False, size=9.0),), style=None, text='Published Online September 2022 in Hans. http://www.hanspub.org/journal/ar '), LineElement(bbox=(56.64, 717.36, 225.23, 726.36), spans=(TextSpan(text='https://doi.org/10.12677/ar.2022.93004 ', is_bold=False, is_italic=False, size=9.0),), style=None, text='https://doi.org/10.12677/ar.2022.93004 ')), bbox=Bbox(page=0, page_height=807.96, page_width=595.32, x0=56.64, y0=717.36, x1=348.95, y1=750.01), variant=<NodeVariant.TEXT: ‘text’>, embed_text='Aging Research老龄化研究**, 2022, 9(3), 26-34**\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 '),) variant={‘text’} tokens=66 bbox=[Bbox(page=0, page_height=807.96, page_width=595.32, x0=56.64, y0=717.36, x1=348.95, y1=750.01)] text='Aging Research老龄化研究**, 2022, 9(3), 26-34**\nPublished Online September 2022 in Hans. http://www.hanspub.org/journal/ar \nhttps://doi.org/10.12677/ar.2022.93004 ’

通过打印出node,可以看出这种结构包含了原始文本中的元信息,包含文本的坐标、大小、是否加粗、是否斜体等。

识别表格内容

  • Pymupdf
  • Unitable
  • Table Transformer

openparse提供了三个方法来识别和提取表格中的内容,方法1是直接使用Pymupdf这个库的表格识别模块,因此准确率最差,但对硬件要求不高;其他的2个都是100mb左右的模型,如果用cpu来推理会比较耗时。

# defining the parser (table_args is a dict)
parser = openparse.DocumentParser(table_args={"parsing_algorithm": "table-transformers", # 或者其他两个方法"table_output_format": "html" # 以html格式返回表格内容,也可以选择md}
)

与前面直接识别文本类似,只需要加入table_args参数即可。
在这里插入图片描述
可以看到表格中的内容被很好的还原了

使用表格提取除了返回表格内容外,还会把正常的文本返回,这与Pymupdf等库只能选择返回文本还是只返回已有的表格不同。因此在不确定文本中含有什么内容时用这个方法会更加保险一点,对硬件的计算要求也不高。

语义相似

from openparse import processing, DocumentParsersemantic_pipeline = processing.SemanticIngestionPipeline(openai_api_key=OPEN_AI_KEY,model="text-embedding-3-large",min_tokens=64,max_tokens=1024,
)parser = DocumentParser(processing_pipeline=semantic_pipeline,
)

openparse还支持端到端的方式对node数据进行向量化并聚类,只需要指定processing_pipeline为相应的embedding模型即可。但是目前仅支持OpenAI的模型,需要OPEN_AI_KEY才可以使用。虽然后续会更新其他模型,但目前想用的话需要自己修改这段代码的实现。

combine_parser = DocumentParser(processing_pipeline=semantic_pipeline,table_args={"parsing_algorithm": "table-transformers","table_output_format": "html"})

同时,还能把语义相似和表格内容提取组合到一起使用,实现对表格内容提取的同时还能融合相似的片段。

总结

openparse这个库算是目前开源社区中比较优秀的文档分割处理库了,功能虽然全面,还是还有不少可以优化的地方,后续也会支持其他向量化模型,并且可以跟LlamaindexLangchain等框架无缝衔接,应该值得持续关注。


http://www.ppmy.cn/server/1487.html

相关文章

【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…

(六)PostgreSQL的组织结构(2)-默认数据库

PostgreSQL的组织结构(2)-默认数据库 安装完postgresql后&#xff0c;我们发现它自带了3个数据库。postgres、template0、template1 postgres# \lList of databasesName | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules |…

计算机网络——40各个层次的安全性

各个层次的安全性 安全电子邮件 Alice需要发送机密的报文m给Bob Alice 产生随机的对称秘钥&#xff0c; K s K_s Ks​使用 K s K_s Ks​对报文进行加密&#xff08;为了效率&#xff09;对 K s K_s Ks​使用Bob的公钥进行加密发送 K s ( m ) K_s(m) Ks​(m)和 K B ( K S ) K…

达梦数据库一体机树立金融解决方案标杆

达梦数据库一体机自问世以来&#xff0c;获得众多行业用户的高度关注&#xff0c;并率先在金融行业吹响冲锋号角&#xff0c;实现多个重大项目的落地应用。近日&#xff0c;珠海华润银行股份有限公司基于达梦数据库一体机 I 系列的《数据库一体机银行多业务系统集中部署解决方案…

如何查看docker配置的镜像仓库

在Docker中&#xff0c;想要查看配置的镜像仓库&#xff08;注册表&#xff09;地址&#xff0c;可以通过查询Docker守护进程的配置来实现。在Linux系统中&#xff0c;Docker守护进程的配置文件通常位于 /etc/docker/daemon.json。该文件中可能会包含registry-mirrors配置项&am…

代理模式:控制对象访问的智能方式

在面向对象的软件开发中&#xff0c;代理模式是一种结构型设计模式&#xff0c;它为其他对象提供一个代理或占位符以控制对这个对象的访问。代理模式在实现权限控制、延迟初始化和远程对象访问等方面非常有用。本文将详细介绍代理模式的定义、实现、应用场景以及优缺点&#xf…

java的深入探究JVM之类加载与双亲委派机制

前言 前面学习了虚拟机的内存结构、对象的分配和创建&#xff0c;但对象所对应的类是怎么加载到虚拟机中来的呢&#xff1f;加载过程中需要做些什么&#xff1f;什么是双亲委派机制以及为什么要打破双亲委派机制&#xff1f; 类的生命周期 类的生命周期包含了如上的7个阶段&a…

安全开发之碰撞检测与伤害计算逻辑

一、什么是碰撞检测逻辑&#xff1f; 用通俗移动的话来说&#xff0c;碰撞检测就是一门检测两部分运动轨迹是否碰到一起的逻辑&#xff0c;在游戏中一般至少包含2方面的碰撞检测逻辑&#xff1a;一、核心玩法的碰撞检测逻辑&#xff1b;二、运动碰撞检测逻辑。 关于核心玩法的…