宝藏级-LLM-文档级别向量化问答技术总结

本文详细介绍了文档级别的问答技术,涵盖了从加载文档、文本分割、向量化存储到向量数据库,再到问句向量化和相似度检索的全过程。重点讨论了文本分割方法,包括解析工具和深度学习方法,以及Milvus在向量检索中的应用。最终,匹配的文本作为上下文提交给LLM生成回答。
摘要由CSDN通过智能技术生成

1.简单阶段描述

第一个阶段称为召回阶段,系统会根据用户的提问从文本库或知识库中检索相关的文本片段或知识点,利用传统的检索技术去召回可能的文档候选。
召回阶段的问答优化方案为:
1.优化 text_split 算法,使匹配出的结果作为上下文时能够提供更合理的推理/回答依据;
2.优化 embedding 模型,提升语义向量化的效果,使得语义匹配过程中能够匹配出最满足要求的文本段落作为上下文。
第二个阶段称之为阅读理解阶段,会利用大模型的阅读理解能力,从对应的候选文档里将答案抽取出来。

2.阶段展开描述

如下图所示,
在这里插入图片描述

2.1.第一阶段技术:加载文档-读取文档-文本分割(Text splitter)

2.1.1.加载读取文档:读取加载的文档内容,通常是将其转化为文本格式

2.1.1.1.基于文档解析工具的方法
2.1.1.1.1.pdf解析工具

可采用以下工具读取pdf文件数据,拟采用pdfplumber,可解析更全面pdf文件。
在这里插入图片描述

2.1.1.1.2.doc、docx解析工具

Python-dox:优点:能够解析docx格式文档;缺点:doc格式文档无法直接解析,需要进行转换为docx格式间接解析。

tika:Python Tika是一个基于Apache Tika的python库,可以解析各种格式的文档,如PDF、Microsoft Office、OpenOffice、XML、HTML、TXT等等。它提供了一种非常方便的方法来获取文档内容,包括元数据、正文、各种格式、图片、表格等等。(注意:需要依赖java环境)

2.1.1.1.3.图片型文档解析工具

Paddleocr,代码示例如下:

from paddleocr import PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang=“ch”)
img_path = ‘example.jpg’
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)

2.1.1.2.基于深度学习的文档解析方法
2.1.1.2.1.版面分析:

基于开源项目的版面分析:ppstructure:项目地址:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/docs/quickstart.md
基于自有场景的版面分析:常见的思路主要为,训练版面分析模型用于识别文档中各个信息区块,然后通过ocr工具解析特定区块中的文字信息。如果涉及复杂版面(如:双栏等),则需要根据启发式规则(根据bbox排序)进行信息区块的排序。常见的如:XY-CUT算法
常见的单模态(目标检测)深度学习模型方法:Yolo系列、mask-RCNN、faster-CNN等
常见的多模态深度学习模型方法:layoutlmv3等

2.1.2.文档文本处理及单双栏区分

2.1.2.1.文本分割(Text split 算法)

文档切割最简单的做法就是根据句子的长度来将进行切割,一般是根据embedding模型的max_seq_len来进行设定的,即chunk_size=max_seq_len, 这样做的好处就是处理简单,文档内容没有重复,但是容易将答案切分到两端passages。所以比较好的做法就是用滑动窗口的方式处理,即暂定一个滑动窗口的大小,移动窗口收集窗口内所有文本,直到处理完整个文本。
下图为医疗科普知识阅读理解数据集上实验结果。

在这里插入图片描述
在经过以上的解析工具解析文本时,都会丢失文本原始的信息,包括:段落语义信息、字体、字号等文本特征信息。如何恢复原始的文本段落显得尤其重要,这关系到后续对文档的进一步的处理和分析。

2.1.2.2.基于文本分割模型的文档文本处理

一般的,通过启发式规则根据坐标信息排列和聚合出段落,如:字坐标、行坐标等。但过程往往非常复杂且效果一般。因此,基于文本分割模型的版面分析算法显得尤为重要。最初的想法来源于序列标注模型,那么是否能应用序列标注的方法,来预测文本行之间的跳转概率?答案是肯定的,以pdf为例,具体实施步骤如下:
从上述解析中得到文本行及其坐标;
使用神经网络对第i行的文本进行编码,得到文本嵌入向量text_emb(i);
提取对应行的图像,得到图像嵌入向量img_emb(i);
提取字号、文字长度特征,并进行归一化得到特征向量;
聚合步骤2、3、4得到的向量,得到行嵌入line_emb(i);
使用神经网络对行向量序列[line_emb(i)]进行序列标注。

2.1.2.3.版面区分

无论是文档parser还是版面分析的方法,解析后的信息区块都不是按照顺序进行返回的。因此需要重新组织“阅读顺序”。对于单栏文档,按照y坐标升降序就能完成顺序的组织,但是对于双栏文档,就需要进一步的分析处理。
在一些学术文档中,比较好办,一般找到文档的所有信息块的中心店坐标即可,用这一组横坐标的极差来判断即可,双栏论文的极差远远大于单栏论文,因此可以设定一个极差阈值。那么区别“阅读顺序”先找到中线,中线横坐标由求极差的横坐标(x1+x2)/2得到,然后将左右栏的区块分开,按照纵坐标排序即可。

对于更复杂的布局文档解析,这一块是一个难点,有相关资料是寻找信息区块的视觉间隙,从而切开重排信息区块

2.2.第二阶段技术:文本向量化(embedding)-存储到向量数据库

文本向量化(embedding):这通常涉及到NLP的特征抽取,可以通过诸如TF-IDF、word2vec、BERT等方法将分割好的文本转化为数值向量,当前选择Sentence Bert-DPR,其他向量化模型见榜单:MTEB Leaderboard - a Hugging Face Space by mteb。Sentence Bert-DPR训练两个encoder分别对句子和文档进行embedding可以更好进行向量表征。因为一般情况下问句和文章的长度差距很大,如果使用同一个encoder来进行表征的话,很难将相似的句子映射到向量空间的相近位置。下图为向量化表征结果。

存储到向量数据库:文本向量化之后存储到数据库Milvus中。

2.3.第三阶段技术:问句向量化

这是将用户的查询或问题转化为向量,使用与文本向量化相同的方法sentence-bert-bpr,以便在相同的空间中进行比较。

2.4.第四阶段技术:在文本向量中匹配出与问句向量最相似的top k个文本

这一步是信息检索的核心,通过计算余弦相似度、欧氏距离等方式,找出与问句向量最接近的文本向量。经调研可用Milvus进行向量相似度计算。
Milvus的全称是针对大规模相似度检索问题开发的一个工具,使用C++编写,有python接口,对10亿量级的索引可以做到毫秒级检索的性能
简单来说,Milvus的工作,就是把我们自己的候选向量集封装成一个index数据库,它可以加速我们检索相似向量TopK的过程,其中有些索引还支持GPU构建。

2.4.1. Milvus检索相似向量TopK的基本流程

Milvus检索相似向量TopK的工程基本能分为三步:
1.得到向量库
2.用Milvus构建index,并将向量添加到index中。其中构建索引选用暴力检索方法FlatL2,即采用欧式距离计算。其中Flat :暴力检索,优点:该方法是Milvus所有index中最准确的,召回率最高的方法,没有之一;缺点:速度慢,占内存大。使用情况:向量候选集很少,在50万以内,并且内存不紧张。
3.用Milvus的index检索,检索出TopK的相似query
此外,现在Milvus官方支持八种度量方式,分别是:
METRIC_INNER_PRODUCT(内积)
METRIC_L1(曼哈顿距离)
METRIC_L2(欧氏距离)
METRIC_Linf(无穷范数)
METRIC_Lp(p范数)
METRIC_BrayCurtis(BC相异度)
METRIC_Canberra(兰氏距离/堪培拉距离)
METRIC_JensenShannon(JS散度)

2.5.第五阶段技术:匹配出的文本作为上下文和问题一起添加到prompt中

这是利用匹配出的文本来形成与问题相关的上下文,用于输入给语言模型。

2.6.第六阶段技术:提交给LLM生成回答

最后,将这个问题和上下文一起提交给语言模型(例如GPT系列),让它生成回答
比如知识查询

3.相关链接:

GitHub - facebookresearch/theseus: A library for differentiable nonlinear optimization

https://mp.weixin.qq.com/s/zgVFJiTObtQ6sFChzfi6uw

斯坦福 | 提出PDFTriage,解决结构化文档的问题,提升「文档问答」准确: https://mp.weixin.qq.com/s/no2C_vjXD7T_QwsfOKz3HA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河南-殷志强

希望我的文章能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值