等特殊标记,用于将文本组织成段落、单元格和表格。
另一种是无标记文档,例如PDF文件,它存储了关于每个文档页面上字符、线条和其他内容元素位置的说明,其重点是"绘制"这些基本内容元素,使文档对人类读者具有可读性,不存储文档的任何结构信息,如表格或段落。因此,无标记文档只能供人类电子阅读,机器无法阅读。
当试图将PDF中的表格复制到Word中时,表格的原始结构往往会完全丢失,这一点非常明显。
image
然而,大语言模型(LLM)在处理序列化文本方面表现出了一定的能力。因此,要使LLM能够有效管理无标记文档,就需要一个能将分散的字符组织成具有其结构的连贯文本的解析器。理想情况下,PDF解析器应具备以下主要功能:
一个是文档结构识别:将页面划分为不同类型的内容块,如段落、表格和图表,以确保划分的文本块是完整而独立的语义单元。
另一个是复杂文档布局的鲁棒性:即使是布局复杂的文档页面,如多栏页面、无边框表格,甚至是合并单元格的表格,它也能很好地运行。
1、一般处理PDF会有什么方案
目前,PDF解析主要有两种方法:基于规则的方法和基于深度学习的方法。
首先基于规则的PyPDF的方案。
这个我们之前也讨论过,例如在文章https://mp.weixin.qq.com/s/9L_LwJvwn_F9C89J-yYezA所做的总结。
其中,PyPDF是一种广泛使用的基于规则的解析器,是LangChain中用于PDF解析的标准方法
例如,PyPDF2提取txt:
-
import PyPDF2
def extract_text_from_pdf(pdf_path):
with open(pdf_path, ‘rb’) as file:
pdf_reader = PyPDF2.PdfFileReader(file)
num_pages = pdf_reader.numPages
text = ""
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
text += page.extractText()
return text
pdf_path = ’example.pdf’
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text)
import PyPDF2
def extract_text_from_pdf(pdf_path):
with open(pdf_path, ‘rb’) as file:
pdf_reader = PyPDF2.PdfFileReader(file)
num_pages = pdf_reader.numPages
text = ""
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
text += page.extractText()
return text
pdf_path = ’example.pdf’
extracted_text = extract_text_from_pdf(pdf_path)
print(extracted_text)
基于PyPDF的解析和分块工作流程比较简单:
首先,PyPDF将PDF中的字符序列化为不含文档结构信息的长序列。然后,利用一些分割规则(如LangChain中的"RecursiveCharacterTextSplitter"函数)将该序列分割成离散的块,该函数根据预定义的分隔符列表(如换行符"\n")来分割文档。初始分割后,只有当合并后的文本块长度不大于预定的N个字符限制时,才会合并相邻的文本块。
来看一个PyPDF的解析和分块结果的一个例子-图4。
图中的案例1是文档中的一页,其中有表格和双栏文本,它们的边界很难区分。
表格中间的行没有水平线,因此很难识别表格中的行。段落既有单栏布局(用于表格下方的注释),也有双栏布局(用于页面下部的段落)。
在3中,可以看到PyPDF正确识别了页面的单栏和双栏布局部分。
但PyPDF也有三个不足之处:
1)无法识别段落和表格的边界
它错误地将表格分成两部分,并将第二部分与随后的段落合并为一大块。
在"2分块结果"部分,可以看到页面中的每一行可视文本在结果中都被解析为以"\n"结尾的一行,而在段落的末尾并没有特殊的格式。
由于使用了特殊的分隔符".\n",将以句号结尾的行视为段落的结尾,因此它能正确地对段落进行分块。不过,这种启发式方法在很多情况下可能并不适用。
2)无法识别表格内的结构
在"2分块结果"部分,在分块1中,表格的上半部分表示为一连串的短句,其中一个单元格可能被分割为4行(如"中国商务(1)“单元格),而一些相邻的单元格则可能排列在一行(如第二行的第三至第五单元格,“服务(1)财付通云”),表格的结构就完全被破坏。
如果检索RAG,LLM无法从中感知任何有意义的信息,大块2也是类似情况,表头只存在于Chunk1中,因此Chunk2中表的下半部分变得毫无意义。
3)无法识别内容的阅读顺序
大块5的最后一行"管理层讨论与分析"实际上位于页面顶部,但却被解析为结果中的最后一句话。
这是因为PyPDF是按照字符的存储顺序而不是阅读顺序来解析文档的,当面对复杂的布局时,这可能会导致混乱的结果。
其实是基于深度学习的方案,继续深度学习的方案一般通过版面分析以及OCR等集成方案,关于这一点,我们也讲过,例如在文章(https://mp.weixin.qq.com/s/9w3uF-6bGoH8R3nW9pW4vA)中所提到的,ppstructure:项目地址:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/docs/quickstart.md
PP-StructureV2支持对图片/pdf形式的文档进行版面分析,可以划分文字、标题、表格、图片、公式等区域;支持通用的中英文表格检测任务;支持表格区域进行结构化识别,最终结果输出Excel文件;
又如在文章(https://mp.weixin.qq.com/s/LeZ2aAhWfzlPKWNYcg9rcQ)中所总结的多模态文档模型。
ChatDOCPDF解析器(https://pdfparser.io/)就是属于上面这一类,采用了一系列复杂的步骤,包括:
第一步:文本定位和识别(OCR),使用(OCR)技术来定位和识别PDF文档中的文本。
第二步:文档对象检测,识别文档中的各种对象,如段落、表格、图表等。
第三步:跨列和跨页修剪,处理文档中的多列布局和跨页内容,以此确保内容的完整性。
第四步:确定阅读顺序,确定文档内容的正确阅读顺序,以理解文档结构。
第五步:表格结构识别,识别并保持表格的内部结构,包括合并的单元格和表格标题。
第六步:文档逻辑结构识别,理解文档的层次结构,如标题、子标题等。
解析完成后,将段落和表格作为基本块,并合并相邻的块,直到达到标记限制,形成一个块。
ChatDOCPDF解析器的设计目的是以JSON或HTML格式保存解析结果。
而针对表格数据,markdown格式解释文本(如"检索到的文本块"部分所示),这使得语言模型更容易理解,以保留表格的内部结构。
由于标记符格式无法表示合并单元格,因此将合并单元格中的全部文本放入标记符格式的每个原始单元格中。例如,文本"截至2021年3月31日的年度"重复出现9次,这代表合并单元格与原始的9个单元格。
此外,“管理层讨论与分析"和"112阿里巴巴集团控股有限公司"被识别为页眉和页脚,并被置于解析结果的顶部和底部,这与阅读顺序一致。
一些有趣的case,chatdoc与pypdf+langchain的方案的对比,主要开始突出在表格处理上的优势。
虽然ChatDOC总体表现良好,但在某些情况下,其检索质量不如基于传统PDF解析的方案,例如
其一,如果ChatDOC先检索一个大而不相关的表,就会占用上下文窗口,导致无法访问相关信息。 这主要是因为嵌入模型没有将相关的数据块排在最前面。要解决这个问题,可以采用更好的嵌入模型,或者采用更复杂的方法来处理大型表格/段落,比如只保留表格的相关部分用于LLM。
其二,分割过于精细。 图14显示了一个需要检索整个表格及其标题的案例。
ChatDOC错误地将标题识别为普通段落,标题和表格被存储在不同的块中,这导致只能检索到所需信息的一部分,即表格的标题和脚注,而不能检索到表格中的关键内容,这个时候需要改进表格标题识别。
二、再看大模型评估的几个综述
之前已经有若干个大模型评估的综述了:
1、《A Survey on Evaluation of Large Language Models》(https://arxiv.org/abs/2307.03109)
2、《Evaluating Large Language Models: A Comprehensive Survey》(https://arxiv.org/pdf/2310.19736.pdf)3、《Leveraging Large Language Models for NLG Evaluation: A Survey》(https://arxiv.org/pdf/2401.07103.pdf)
基于大模型进行生成式任务评估的一般形式,基本盘就是遵循prompt的QA形式。
评估方式的两种分类,一种是细粒度的评测,另一个是评测组合。
基于生成式和匹配方式的打分方式:
不同评估方式的Prompt设计:
大模型生成式评估的分类:这个是一个总览index,可以作为索引查看。
总结
本文主要介绍了大模型RAG问答中针对PDF类型文档的处理方案,重点的以chatdoc为例。此外,大模型评估也是一个很重要的话题,本文也再次介绍了一个综述。
RAG的相关文章越来越多,同质化的论述也越来越多,搬运国外博客的成本也越来越低,尽可能要写一些更有意义的。
参考文献
1、https://arxiv.org/pdf/2401.07103.pdf
2、https://mp.weixin.qq.com/s/9w3uF-6bGoH8R3nW9pW4vA
3、https://mp.weixin.qq.com/s/LeZ2aAhWfzlPKWNYcg9rcQ
4、https://arxiv.org/pdf/2401.12599.pdf
关于我们
老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。
老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
对于想加入更优质的知识图谱、事件图谱、大模型AIGC实践、相关分享的,可关注公众号,在后台菜单栏中点击会员社区->会员入群加入。
更多AI工具,参考Github-AiBard123,国内AiBard123
可关注我们的公众号:每天AI新工具