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

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

时间:2024-04-18 21:45:46浏览次数:29  
标签:RAG False 表格 text 知识库 文档 2022 org 文本

前言

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

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

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

而本文接下来介绍的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:
    node
    print('\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, DocumentParser

semantic_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等框架无缝衔接,应该值得持续关注。

标签:RAG,False,表格,text,知识库,文档,2022,org,文本
From: https://www.cnblogs.com/deeplearningmachine/p/18144458

相关文章

  • 异常处理、接口文档、 jwt介绍、
    【异常处理详见excel的异常处理的源码总结】#APIView--->dispatch--->三大认证,视图类的方法,如果出了异常,#会被异常捕获,捕获后统一处理#关键就是dispatch里面的response=self.handle_exception(exc)这行代码#drf内置了一个函数,只要上面过程出了异常,就会执行这个函......
  • 一款还不错的文档系统
    一款还不错的文档系统功能不复杂,如果不会就去看看官方的说明吧地址:https://mindoc.com.cn/docs/mindochelp参考文档mindoc-org/mindoc:Golang实现的基于beego框架的接口在线文档管理系统地址:https://github.com/mindoc-org/mindocMinDoc文档管理系统-PoweredbyMinDoc......
  • VuePress搭建文档网站
    VuePress官方文档:https://v2.vuepress.vuejs.org/zh/guide/getting-started.html以下是官方文档复制过来的步骤,加上了我的一些经验注释。1、依赖环境Node.jsv18.16.0+(我试了v14是运行不了的,必须这个版本及以上,建议安装nvm,方便切换node版本)包管理器,如pnpm、yarn、npm等(我安......
  • 自动生成接口文档coreapi
    drf-yasg只能用于drf去看官方文档2coreapipipinstallcoreapi2.1配置路由fromrest_framework.documentationimportinclude_docs_urlsurlpatterns=[...path('docs/',include_docs_urls(title='站点页面标题'))]2.2drf配置#AttributeError:'......
  • 构建RAG应用-day01: 词向量和向量数据库 文档预处理
    词向量和向量数据库词向量(Embeddings)是一种将非结构化数据,如单词、句子或者整个文档,转化为实数向量的技术。词向量搜索和关键词搜索的比较优势1:词向量可以语义搜索比如百度搜索,使用的是关键词搜索。而词向量搜索,是对句子的语义进行搜索,他会找到意思相近的前k个句子。优势2:词......
  • CF81C Average Score 题解
    题目简述给定一个长度为$n$的序列,在其中取出$x$个数,构成一个数列$a$,剩下的$y$个数构成数列$b$。若第$i$个数在数列$a$中,$ans_i$等于$1$,否则等于$2$,请你给出一种方案使得两数列的平均数之和最大且$ans$的字典序最小.题目分析我们先考虑$x=y$的情况,在这种情......
  • Pygame - Special Flags 文档翻译
    PygameSpecialFlags官方文档链接什么是SpecialFlags?​ SpecialFlags是一种控制如何将一个Surface绘制到另一个Surface的方法。它们可以用来创造视觉效果,如发光粒子,或执行表面掩蔽或操作。它们的使用方法如下:pygame.Surface.blit()pygame.Surface.blits()pygame......
  • Java API之查询文档
    1、查询指定id文档importorg.elasticsearch.action.get.GetRequest;importorg.elasticsearch.action.get.GetResponse;importorg.elasticsearch.client.RequestOptions;importorg.util.ConnectElasticsearch;publicclassGetDoc{publicstaticvoidmain(Strin......
  • web server apache tomcat11-01-官方文档入门介绍
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目同时也为从零手写实现tomcat提供一些基础和特性的思路。minicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserve......
  • 认识什么是LLM、RAG、LangChain以及开发LLM应用的整体流程?
    认识大语言模型LLM时间:2024-04-15,星期一一、大型语言模型(LLM)理论简介大语言模型(LLM)的概念⼤语⾔模型(LLM,LargeLanguageModel),也称⼤型语⾔模型,是⼀种旨在理解和⽣成⼈类语⾔的⼈⼯智能模型。LLM的发展历程20世纪90年代,统计学习⽅法来预测词汇2003年深度学习先驱B......