在基于大模型的知识库问答应用中,提升效果的点主要有:
1. 优化文档预处理;
2. 大模型的预训练及微调等;
3. 大模型的提示词优化;
4. 使用专有数据训练embedding模型;
向量检索算法通常没什么可优化的,因为向量数据库里通常都已经实现了。
本文重点要讲的是怎么优化文档预处理。
普通段落文本的问题
这个主要是长文本怎么切分的问题。
以前做nlp对长文本切分也略有些经验,通常就是先按段落进行切分,对于过长的段落文本,通常就是按模型(这里通常是embedding模型)能接受的输入长度,按句子的标点符号(如句号,感叹号,问号等)进行切分,切分后的片段要尽可能的长,但是不能超过模型的输入限制。另外,一些可以操作的技巧是,段落内的片段可以做一些重复,例如,段落内的多个片段,前一个片段的最后一句可以和后一个片段的第一句重复。
在实际项目中,可能还会有一些特殊的情况,例如按上面的规则,段落内切分成片段后,一个片段的最小单位是一个句子,但是实际上有些句子可能都会超过长度,这里还需要做些处理,例如按分号等再分一下,还不行则按逗号等再进行切分。很长的句子通常出现在列表中,因为列表中的每一项最后通常不是句号,而是分号,当然,也有可以是ocr识别时,漏掉了某些标点符号。
按照上面的分式将切好的片段转成向量时,可能会存在一个比较严重的问题,单个片段中可能已经没有了主体的信息,因为主体信息可能在前面的片段中,甚至在前面的标题中。这该怎么处理呢?
这应该有两种处理方式: 一是把该片段所在段落的各级标题拼接到文本的前面;二是用大模型将该片段前面的文本(同段落的)生成一个简短的摘要信息,拼在文本前面。
不过,如果这么看的话,直接将标题文本、摘要文本和片段文本直接拼接是否是最好的方式呢?
感觉这并不是最优的方式,或许更好的方式应该是新增字段存储片段文本对应的标题文本和摘要文本拼接后的文本,以及这段文本对应的向量。这样,就会有两个向量,在检索的时候,就需要设计一个方式将这两个向量与用户的检索向量的相似度整合在一起。
不过,这样做的效果是要验证的,不过估计是会比直接拼在一起会好一些,不过实现也复杂了。
表格数据的问题
普通段落通常还是比较好处理的,但是对于表格就非常复杂,而表格在文档中也可能有很多复杂的情况,例如合并单元格甚至嵌套表格、表格跨页等。另外影响效果的是,表格在识别时准确率没有那么高,特别对于复杂的表格。另外还有一点,单元格之间的逻辑关系并不是那么好识别的。
表格的主体通常出现在表格外面,如前面一行或者后面一行的文本。
前面说的基本都是难点,那么在处理时该怎么处理呢?
1. 我想最好的办法是利用大模型的多态能力,直接表格进行结构化或者文本化。结构化就是变成有层级关系的json数据,文本化就是让大模型用文本来描述表格的内容,而这个文本化我觉得可能是更好的方式。不过我估计,这得几年后才比较可行。
2. 现在也有模型可以对表格进行结构化的,应该可以解决部分问题,这个方向发展的进一步,我觉得肯定是大模型。
3. 在目前技术限制下,可能最现实的做表格识别,然后按单元格排序组成文本,再转化为向量。
4. 至于跟表格关联的表格外的文本,这个只要识别出来了,就比较好办。还有表格所在的各级标题文本等,这个处理方式和前面片段问题的情况类似。
表格处理,我觉得可能是文档识别里最复杂的。
图像问题
文档中除了有表格这种复杂的结构,还可能会有图像。
我们写文档时,插入图像的情况也很多,有些时候可能是截图放进去,有些情况可能是将其他地方的文本直接截图放进去,也可能直接将一个表格截图放进去,还有将公式等截图放进去。
这可能就涉及到表格识别、ocr识别、图像外对应文本(这个跟表格外对应问题类似)等,也并不好处理,如果是扫描件文档,可能就得放弃这个了,不然还得训练一个目标检测模型来检测图像的坐标。
文档识别
前面所说的,都要依赖于文档识别的效果。这一块的内容非常丰富,涉及到各类格式文件的适配,即使Word文档都要分成doc和docx两种来处理,PDF文档也要分成电子档和扫描件来处理,涉及的技术也非常多,如去噪、去水印印章、角度纠正、水印印章检测、表格识别、文字识别、文档结构识别(如页眉页脚、标题、段落、列表等)等,这里不一一细说了。