笔者所在团队近期自研知识库底座的过程中,想对比参考下RAGFlow的一些切片方法,结果在RAGFlow产品界面中,就只有几句翻译过来的简单描述,和几个模糊不清不知所谓的英文案例截图,再搜索网上各种介绍文章,结果看完更心塞,都是照搬人家产品上的文字,类似这样:
看完这些说明产生很多疑惑:
假如对同样一篇文档分别用Manual、Book、Laws等方式切分,结果有多少差异?它们各自的切分依据都是什么?哪种切分粒度更细?
他们对文档章节目录名称如何处理?是单独分块,还是和对应的正文内容放一个分块?
文档正文里如果包含有图片,那它和正文内容会放到一个分块里?
Table方式和QA对方式都能针对表格按行切分,那能否用Table方式实现QA对切分的效果?
为了搞清楚这些问题,LiaoYan同学对RAGFlow的十来种切片方法做了实际测试和验证,针对这些测试结果,我们可以大致将这些切分方式做如下分类:
1)最通用的切分方法:General ,覆盖所有文件类型和格式,包括文档、表格、PPT、图片等,主要切分逻辑就是按长度+分隔符方式,这种方法用的最多,就不介绍了。
2)按文档章节目录结构切分方法:MANUAL、BOOK、LAWS,本文重点分析。
3)按表格结构切分方法:TABLE、QA,本文重点分析。
4)其他特殊切分方法:ONE、RESUME、PAPER、PRESENTATION等,比较少见和少用,只稍做描述。
按文档结构切分方法:Manual、Book、Laws
之所以把这三种切分方法放一起比较,主要是因为它们都是针对文档类型的文件,都是依据文档的目录结构进行切分。为了更加直观的理解这三种切分方法之间的差异,我们选择一个相同的文档来实测“中华人民共和国税收征收管理法.docx”,由于文档比较长,主要截取了其中前4个章节的内容来进行验证,原始文档内容结构如下:
- Manual手册切分方法(按“标题”样式)
Manual方法是依据“标题”样式进行切分,并且切分到最细粒度的“标题”样式,注意它强调是“标题”样式,也就是说“正文”样式的内容它是不做切分的,比如图中的“第十五条”、“第十六条”等内容,虽然看起来像目录标题,但实际只是字体加粗放大的正文而已,所以在文档左边的目录结构列表中看不到,所以不会单独分块。样例文章按Manual方法切分结果如下:
如图,最终有“标题”样式的目录结构如文档左侧列表,切分到最细粒度一共有6个分块,每个内容分块中都会带入其所有上级目录标题,包括最顶级的文档标题。其中文档标题“中华人民共和国税收征收管理法”下面有一些直属的正文内容,所以它也会被单独切分成一个块如下:
- Book书籍切分方法(按目录+段落)
Book书籍切分方法则主要是按“章节目录+段落”语义切分,先按章节分割,再对章节正文按语义切分(章节→子主题→段落),包括按段落切分,所以它比Maual和Laws切分粒度都更细。样例文章按Book方法切分结果如下:
如图,Book和前面Manula结果不同的是,“第十五条”下面的三段内容被切分成3个分块了,所以这篇文档最终切分出128个分块,它是粒度最细的一种方式。Book方式每个分块也会带入其上级目录标题,但和Manual不同之处在于,它不包括最顶级的文档标题。另外对于上级目录下如果有正文,它和Manual处理方式类似,也是会单独一个分块,如上图中红色线框所示。
- Laws法规切分方法(按“章节条款”标记)
Laws法规切分方法是按“章节条款”标记切分,如“第X章”、 “第 X 条”、“第 X 款”,它与目录层次和标题样式都没有关系。样例文章按Book方法切分结果如下:
如图,按Laws章节条件方式切分后有87条。它和Manual不同在于,“第十五条”、“第十六条”这些目录虽然没有“标题”样式,但因为符合“章节条款”的标记,所以会逐条切分出来。它和Book不同在于,“第十五条”下面的3个段落没有分成3个分块,而是切在一个分块中。另外它和Maual、Book方式有个很大不同,它的上级目录标题不带入到当前条款内容所在分块中,而是会逐层将条款名称做个汇总并单独一个分块,如上图中绿色线框所示。另外上层目录下的正文也会单独一个分块,但不含目录标题名称。
- 三种文档切分方法总结
依据以上测试验证结果,对这三种文档切分方法梳理汇总如下:注意针对Manual这种方式,RAGFlow产品界面中描述只支持PDF格式文件,通过实测发现DOC文件实际也是支持的,只是由于它是依赖“标题”样式作为切分依据的,所以确实不支持TXT文件。另外针对Manual这种切分方式,如果文档正文内容中包含有图片,它会将图片和正文内容切分到同一个分块中,具体效果如下:
按表格结构切分方法:Table、QA
以上是对Doc文档类文件的几种切片方法,包括PDF\TXT\DOCX等文件类型,它们本质内容都是文档模式才行,你要是硬把excel内容转成PDF,然后用以上几种切片方法会怎样?老实说我们没试过,读者有兴趣可以自行验证下。接下来我们针对表格类结构,再实际验证下RAGFlow提供的Table和QA两种分片方法。
- Table切分方法
按照老规矩,我们先准备了一个表格案例,是个常见的运维问题知识表格,包括问题所属产品、适用地区、业务域等信息,以及问题详细描述、产生原因描述、解决办法描述等。如图表格中第一行要专门设置列头标题信息,经过Table方式切分后,会将这些列标题带入每个分块中,同时除了标题行之外,下面的表格内容会被逐行切分,每行一个分块,最终切分结果如下:
- QA切分方法
继续用这个运维问题知识表格,不做任何修改直接验证QA切分方法的话,RAGFlow会直接将表格中“所属产品”、“适用地区”两列当做Question和Answer来进行切分,其他列都会被忽略,然后按行切分,并得到去重后的分块结果。我们再用符合QA结构的表格来正式验证一遍,表格只保留问题描述和解决方案两列内容:如图表格经过QA方式切分后,会每行一个分块,并且每个块中都自动补充Question和Answer的标题,最终切分结果如下:
- 两种表格切分方法总结
依据以上测试验证结果,对这两种表格切分方法梳理汇总如下:仔细对比以上两个实际案例,就会发现QA可以说是一种特殊简化的Table方法,不嫌麻烦的话,用Table也可以实现QA的切分效果,在对应表格中设置好两列,列头分别命名为Question和Answer,然后按Table切分方式,就自动把这个列头,带入到每行里面去,和QA切分结果会一模一样。针对以上运维问题表格案例,可根据业务需要来选择具体切分方法,如果表中问题描述、原因、解决方案、所属产品、适用地区等信息列,都有可能要按语义相似度方式去检索,则使用Table方式比较好。如果只想针对问题描述和解决方案进行语义相似度检索,则只保留这两列作为Question和Answer,对于适用产品、地区、业务域等信息,则可以把这些信息保存到分块的元数据中去,用元数据实现按结构化方式的筛选过滤。不过用RAGFlow验证了下,发现其分块没有元数据,只有Document层面(RAGFlow的数据集)才有元数据,而且仔细研究了下RAGFlow的API,貌似其retrieval 检索接口请求参数中并未包含meta_fields筛选条件,这也是我们要自研的一个小原因。
其他特殊切分方法:One、Resume、Paper、Presention
除了文档三剑客+表格两重奏之外,RAGFlow还提供了一些比较特殊的切片方法,简单提一下:One方法,不做切分,一份文档内容全在一个分块中,文档和表格都支持,所以可支持PDF\TXT\DOCX\XLSX等文件类型。Resume方法,针对简历文档格式,做结构化要素提取和拆分,一个要素一个分块,可支持PDF\TXT\DOCX等文档类文件(注,时间有限,没有实际验证)。Paper方法,针对论文,提取摘要和章节目录等,据产品介绍只支持PDF文件类型(注,时间有限,没有实际验证)。Presention方法,针对PPT讲稿的(也支持PPT转成的PDF文件格式),每一页PPT都拆分成一个分块,分块内包含当前PPT页面原始截图,以及从其中提取的文字内容,和前面Manual方法对文档内包含图片的内容切分结果有点类似,实际测试结果如下:
确实费了一番力气,才终于梳理好以上这些切片方法的关键点,自诩相比无论是RAGFlow产品本身的介绍,还是网上的搬运工,我们这篇文章是真的有点内容的,希望对正在研究使用RAGFlow的同学有所帮助,则力气就没有白费,真诚希望得到大家的反馈哈。
有同学好奇RAGFlow有这么丰富的切片方法,使用者也很多,为啥我们还要自研知识库底座呢?
因为除了以上这些切片方法外,还要能够方便的根据业务需要扩展自定义切片方法,比如对数据字典类知识的切分,对业务知识的切分等。
因为还要支持给知识记录元数据,以实现按元数据进行筛选过滤,以聚焦每次语义检索的范围,同时提高检索效率。
因为除了这些最基础的分片和向量化机制外,还有实现知识库的有效管理和运营,以确保知识的正确性,在新增或修改知识时,要做到既不影响线上应用的检索结果,又能进行检索测试和验证,验证通过才能正式生效。
因为还要进行知识的提炼和增强,要记录提炼增强后知识与原始知识之间的关系,修改原始知识时能判断影响范围等。
所以且待后续分解:RAG的工程化实践思考。
(注本文RAGFlow各种切片方法实测成果来自LiaoYan同学,特此感谢ing)
—End—