在RAG智能客服中,比较常见的问题就是如果文档中包含了表格、或者图片,如何在分段的时候避免同一个图片、或者表格被切分到不同的分块中。 一旦表格被切分到不同分块,那么后面的分段就会丢失表头的信息,不仅会影响检索的效果,还会影响输出的结果,因为表格是不全的,但是用户期望肯定是一个完整的表格。 图片也类似的同理。
PDF&Word解决
在PDF&Word的文件处理中,我们的通用解决方案是,把他们转成Markdown,然后针对Markdown做分段。 详见:
✅MinerU文档处理功能实现
前面我们介绍了如何使用MinerU的网页端进行文件的处理。但是我们总不能每次文档都去网页上处理吧,所以我们需要有工程化的手段来实现。介绍两种方案: 使用API服务 这种方式适合小团队,要处理的pdf不多,对处理速度要求不高的情况。个人实验也 LLMentor
✅文档索引构建流程——文档切分
前面我们通过文档的上传,以及文档的转换处理,已经可以拿到一份markdown文档了,接着,我们就要针对这份文档做切分了,切片成多个chunk,用于embedding。 markdown标题切分 我们这里选择的切块方式,针对markdown的 LLMentor 转成Markdown之后,就是Markdown的图片和表格处理了。
Markdown解决
为了解决markdown中的图片、表格被切分到不同的分段,我们采用的是组合方案: 标题分段+父子分段 - 标题分段:我们会基于Markdown的标题做分段,同一个标题下的内容会在同一个分段下(没有超过chunksize的情况下),因为,图片和表格,是不可能跨标题的,所以通过标题分段,我们能保障图片和表格在正常情况下不会被分到不同的分段中。 - 父子分段:但是如果遇到同一个标题下的内容太长,超过了chunkSize,需要二次切分的话,那么我们就采用父子分段的方案,即父分段中保留完整的内容,子分段中保留切分后的部分内容。在向量检索的时候使用子分段检索,检索到子分段之后,在调用LLM之前,我们找到对应的父分段,把父分段(包含完整图片、表格)的内容给到LLM即可。