LLM文档对话——pdf解析关键问题来自:AiGC面试宝典宁静致远2023年09月29日13:15一、为什么需要进行pdf解析?最近在探索ChatPDF和ChatDoc等方案的思路,也就是用LLM实现文档助手。在此记录一些难题和解决方案,首先讲解主要思想,其次以问题+回答的形式展开。二、为什么需要对pdf进行解析?当利用LLMs实现用户与文档对话时,首要工作就是对文档中内容进行解析。由于pdf是最通用,也是最复杂的文档形式,所以对pdf进行解析变成利用LLM实现用户与文档对话的重中之重工作。如何精确地回答用户关于文档的问题,不重也不漏?笔者认为非常重要的一点是文档内容解析。如果内容都不能很好地组织起来,LLM只能瞎编。三、pdf解析有哪些方法,对应的区别是什么?pdf的解析大体上有两条路,一条是基于规则,一条是基于AI。四、pdf解析存在哪些问题?pdf转text这块存在一定的偏差,尤其是paper中包含了大量的figure和table,以及一些特殊的字符,直接调用langchain官方给的pdf解析工具,有一些信息甚至是错误的。这里,一方面可以用arxiv的tex源码直接抽取内容,另一方面,可以尝试用各种ocr工具来提升表现。五、如何长文档(书籍)中关键信息?对于长文档(书籍),如何获取其中关键信息,并构建索引:•方法一:基于规则:•介绍:根据文档的组织特点去“算”每部分的样式和内容•存在问题:不通用,因为pdf的类型、排版实在太多了,没办法穷举•方法二:基于AI:•介绍:该方法为目标检测和OCR文字识别pipeline方法•方法一:分块索引法•介绍:直接对长文档(书籍)进行分块,然后构建索引入库。后期问答,只需要从库中召回和用户query相关的内容块进行拼接成文章,输入到LLMs生成回复;•存在问题:1.将文章分块,会破坏文章语义信息;2.对于长文章,会被分割成很多块,并构建很多索引,这严重影响知识库存储空间;扫码加查看更多六、为什么要提取标题甚至是多级标题?没有处理过LLM文档对话的朋友可能不明白为什么要提取标题甚至是多级标题,因此我先来阐述提取标题对于LLM阅读理解的重要性有多大。举个栗子:假如用户就想知道3.2节是从哪些方面讨论的(标准答案就是3个方面),如果我们没有将标题信息告诉LLM,而是把所有信息全部扔给LLM,那它大概率不会知道是3个方面(要么会少,要么会多。做过的朋友秒懂)七、如何提取文章标题?3.如果内容都不能很好地组织起来,LLM只能瞎编;•方法二:文本摘要法•介绍:直接利用文本摘要模型对每一篇长文档(书籍)做文本摘要,然后对文本摘要内容构建索引入库。后期问答,只需要从库中召回和用户query相关的摘要内容,输入到LLMs生成回复;•存在问题:1.由于每篇长文档(书籍)内容比较多,直接利用文本摘要模型对其做文本摘要,需要比较大算力成本和时间成本;2.生成的文本摘要存在部分内容丢失问题,不能很好的概括整篇文章;•方法三:多级标题构建文本摘要法:•介绍:把多级标题提取出来,然后适当做语义扩充,或者去向量库检索相关片段,最后用LLM整合即可。1.如Q1阐述的那样,标题是快速做摘要最核心的文本;2.对于有些问题high-level的问题,没有标题很难得到用户满意的结果。•第一步:pdf转图片。用一些工具将pdf转换为图片,这里有很多开源工具可以选,笔者采用fitz,一个python库。速度很快,时间在毫秒之间;•第二步:图片中元素(标题、文本、表格、图片、列表等元素)识别。采用目标检测模型识别元素。•工具介绍:•Layout-parser:•优点:最大的模型(约800MB)精度非常高•缺点:速度慢一点•PaddlePaddle-ppstructure:•优点:模型比较小,效果也还行•unstructured:•缺点:fast模式效果很差,基本不能用,会将很多公式也识别为标题。其他模式或许可行,笔者没有尝试注:https://github.com/Layout-Parser/layout-parser利用上述工具,可以得到了一个list,存储所有检测出来的标题我们来看看提取效果,按照标题级别输出:论文https://arxiv.org/pdf/2307.14893.pdf八、如何区分单栏还是双栏pdf?如何重新排序?•第三步:标题级别判断。利用标题区块的高度(也就是字号)来判断哪些是一级标题,哪些是二级、三级、……...
发表评论取消回复