Dify的v0.15.0版本里,新添了一个分段模式,叫父子模式。官方说用这个模式,能在一定程度上让知识库的检索和理解能力变强,这样AI给出的回答,质量和准确度都会大大提高。咱今天就好好唠唠这个父子模式。

一、为啥要有父子模式?解决啥问题?

在知识库检索的时候,经常会碰到两种情况,特别影响AI给出准确回答。
一种情况是,检索结果虽然还算准确,可这些结果是从不同分段里找到的,太分散了。这就好比拼图,每块都对,但没拼在一起,AI没办法得到完整的上下文信息,回答起来就差点意思。
另一种情况正相反,检索结果不太精准,太宽泛了。虽然上下文信息可能够多,但关键内容不突出,精准度严重不足。
那怎么解决这些问题呢?关键就两点:一是把内容分块分得合适;二是在精准度和上下文效果之间找到平衡。这就是父子检索模式诞生的原因,它就是来解决RAG里这些麻烦事儿的。

二、父子模式咋工作的?

简单来讲,父子模式的运行原理就是“先整体后细化”。
先让子模块去匹配查询内容。这一步会把内容拆得特别细,有时候一句话就是一个块。就好比在一堆书里找某个人物,子模式能精准定位到具体某一页甚至某一行提到这个人的地方。
子模块匹配完后,父模块就上场了。它会根据子模块找到的内容,去找到对应的父级信息,给匹配到的内容补充更多信息,让内容更丰富。打个比方,咱们要找小明,子模式能找到小明在哪个班级,或者直接找到关于小明的那句话;父模式呢,就会补充小明所在的年级、学校,还有他在学校的排名、表现这些信息,让我们对小明了解得更全面。

三、实际测试:父子模式表现咋样?

光说不练假把式,咱实际测试一下,看看父子模式在检索方面到底行不行。为了对比得更清楚,除了分段模式不一样,其他条件都保持一致,像上传的文件、用的嵌入模型和Rerank模型都相同。
这次测试用的嵌入模型是BAAI/bge-m3,Rerank模型是BAAI/bge-reranker-v2-m3,测试文件是《JavaScript高级程序设计第四版》。

(一)通用模式测试情况

在召回测试环节,通用模式找到了3个召回段落:

  • 召回段落1(Chunk-1212 398字符):混合检索。Q和Bluebird等第三方JavaScript期约库也越来越得到社区认可,虽然这些库的实现多少都有些不同。为弥合现有实现之间的差异,2012年Promises/A+组织… #Promise #Bluebird #ECMASc #规范 #APl #Promises #JavaScri #实现#期约库#浏览器 JavaScript高级程序设计(第4版).pdf
  • 召回段落2(Chunk-1211 442字符):但直到十几年以后,Barbara Liskov和Liuba Shrira在1988年发表了论文”Promises: Linguistic Support for…” #概念 #机制 #Liuba #程序执行 #指代 #Shrira #规范 #Promise: #Liskov #Barbara JavaScript高级程序设计(第4版).pdf
  • 召回段落3(Chunk-1226 566字符):下面的两个期约实例实际上是一样的:… #期约 #log #reject #Promise #rejected #let #resolve #setTimet #传给#console JavaScript高级程序设计(第4版).pdf

把这些内容集成到Agent中进行对话测试,得到的召回率是两个0.63。

(二)父子模式测试情况

再看看父子模式,召回测试找到了6个召回段落:

  • Parent-Chunk-2757 275字符:混合检索。在JavaScript中,”加载”的概念可以有多种实现方式因为模块是作为包含将立即执行的JavaScript JavaScript高级程序设计(第4版).pdf
  • Parent-Chunk-736 264字符:7.1理解迭代 在JavaScript中,计数循环就是一种最简单的迭代:… C-2在JavaScript中,计数循环就是一种最简单的迭代: JavaScript高级程序设计(第4版).pdf
  • Parent-Chunk-1462 431字符:在JavaScript和CSS中,一般被认为是匹配一切的字符来看下面的例子:… 在JavaScript和CSS中,* AJavaScript高级程序设计(第4版).pdf
  • Parent-Chunk-257 495字符:48第3章 语言基础 5. Symbol.asynclterator… 打开SCORE 0.73 召回测试 根据给定的查询文本测试知识的召回效果。源文本 在JavaScript中Promise有什么作用?有哪些API?

同样集成到Agent中进行回答测试,召回率达到了0.74和0.72 。

从测试结果能明显看出来,父子模式的检索召回能力确实更强。不过,这也带来了新问题,就是分段时间变长了。同样的文件,父子模式花了将近20分钟,而通用模式只需要5分钟。

总的来说,Dify的父子模式虽然在检索召回能力上有优势,但在时间成本上也有所增加。各位小伙伴在实际使用的时候,还得根据自己的需求来选择合适的模式。要是对召回率要求高,不在乎多花点时间,那父子模式是个不错的选择;要是更看重效率,通用模式也能满足不少场景的需求。