军哥fastgpt教程-6-fastgpt源码解读之知识库构建

大家好,这里是五彩石编程,我是军哥。上一篇文章中我们讲过了fastgpt源码的目录结构,这一篇文章,我们继续深入源码,开始对知识库相关的源码进行解读,一起来学习吧!

一、概述

对于一个完整的知识库来说,其功能主要分为以下3个方面:

  1. 知识库的管理
  2. 知识库的构建,也即文档等知识的输入
  3. 知识库的检索

管理功能包含知识库本身的增删改查、知识库中内容的增删改查、知识库中层级结构的管理等基本功能,这部分的源码,都在 projects/app/src/pages/api/core/dataset/ 目录及其子目录下,基本上都是常规的数据库操作,每个模块的功能都比较单一,这里就不多说了。剩下的重点就是知识库的构建和检索了,这两部分我们一个一个来深入了解一下。

二、知识库的构建

1、整体流程

我们从最典型的本地文件上传入手,在 projects/app/src/pages/api/core/dataset/collection/create/localFile.ts文件中,我们可以看到本地文件上传的处理流程,

  1. readRawTextByLocalFile(),从本地文件中提取文本内容
  2. uploadFile(),把文件写入到mongodb的gridfs中
  3. removeFilesByPaths(),删除临时文件
  4. splitText2Chunks(),把文本内容进行分段(分块)
  5. checkDatasetLimit(),检查是否受限
  6. createOneCollection()/createTrainingUsage(),在mongodb中创建collection,并创建文本训练账单
  7. pushDataListToTrainingQueue(),把分段后的文本,放入训练队列中
  8. 更新图片的过期时间

这一步只是完成了把本地文件内容保存进数据库,然后进行文本拆分,并生成了文本训练的任务,生成任务后,还需要完成训练,把文本进行向量化,并保存到向量数据库中,才算构建流程的真正完成,而训练的过程,又分为了两步:

  1. 生成qa对
  2. 把qa向量化,保存进向量数据库中

生成qa对对应的代码在:projects/app/src/service/events/generateQA.ts中,
qa对向量化的代码在:projects/app/src/service/events/generateVector.ts中。

上面是整个的流程,下面把里面比较重要的方法拿出来详细说明一下。

2、从本地文件中提取文本内容

这部分的源码都在 packages/service/common/file/read/utils.ts文件中的readRawTextByLocalFile()方法中,从这个方法中,我们可以看到根据不同的文件类型,使用了不同的方法,提取出了其中包含的文本内容,这部分的代码,比之前版本的的代码做了比较大的改变,没有之前版本的实现更直观一些,但代码看起来更简洁了些,让主逻辑更突出了,这点确实不错。

3、文本分段(分块)

文本分段的代码都在:packages/global/common/string/textSplitter.ts文件中的splitText2Chunks()方法内,该方法里面调用了commonSplit(),commonSplit()中是核心的分段方法,主要是使用一堆的正则表达式,按步进行拆分,用户自定义的分类方法会放到这一堆正则的最前面,优先使用,这里面有一个递归拆分的方法:splitTextRecursively(),会对超出指定长度的文本块进行递归的拆分,以满足长度的要求。

4、分段后的文本放入训练队列

这部分的代码在:packages/service/core/dataset/training/controller.ts中的pushDataListToTrainingQueue()中,这部分的代码比较多,但核心逻辑就一行,就是把格式化后的任务保存进数据库中,训练队列保存任务就是基于数据库来实现的,所以要保存进数据库中。进了数据库,就相当于进了队列,然后就可以被训练文本的任务来执行了

5、训练任务的启动

我们在很多地方都能看到调用connectToDatabase()方法,该方法对应的源码在:packages/service/common/mongo/init.ts中,它会返回一个mongodb连接,并且在调用后的钩子方法里面,会调用:startTrainingQueue(true),而这个方法,就是启动生成qa对和对qa对进行向量化并保存进数据库的入口。

6、生成qa对

这里的代码是:projects/app/src/service/events/generateQA.ts中的generateQA()方法,该方法中的逻辑非常多,但核心逻辑只有两个:

  1. 从数据库中获取需要生成qa对的任务,其实就是之前分段后的文本
  2. 使用大模型对文本进行qa对生成,然后保存现保存进训练队列中,并保存为向量化任务

7、qa向量化并保存进向量数据库

这里的代码是:projects/app/src/service/events/generateVector.ts中的generateVector()方法。该方法中的逻辑依然非常多,但核心逻辑也只有两个:

  1. 从数据库中找到需要向量化的任务,就是上一步的qa对
  2. 调用大模型进行向量化,然后保存进向量数据库中

至此,知识库的构建中的核心流程就都讲完了,按照面分析的步骤,就可以把支持的文件、文本或url地址等全部以向量的格式保存进向量数据库了

三、知识库的检索

有了向量化的数据,那么检索起来就非常方便了,所以检索的流程相对来说就会比较简单一点。由于知识库搜索在fastgpt中是一个插件,所以其源码肯定在插件相关处理目录中,即:packages/service/core/workflow/dispatch/dataset/search.ts

这个文件中的代码不多,但实际上逻辑也比较多,它对先对用户的问题进行指代消歧,也即:datasetSearchQueryExtension()方法。

消歧后的问题就可以进行搜索了,而搜索这里也分3种模式:

  1. 向量搜索
  2. 全文本搜索
  3. 以上两种模式的混合搜索

如果指定了使用rerank,则此时会对召回数据进行rerank,然后使用rrf算法对结果进行合并,然后按得分进行过滤,过滤出来的结果就是最终知识库检索出来的内容。

知识库检索部分的代码相对来说比较简单,基本上都是直来直去的代码,在这里就不再细说了。

四、结语

至此,知识库相关的源码就讲完了,有了对知识库源码整体上以及关键代码入口的了解,再去看代码时,其结构和流程就非常清晰明了了。

下一篇文章将是本系列的最终篇章:fastgpt流程编排的源码解读,流程编排是fastgpt的除知识库之外的另一个重要的核心,甚至可以说是最重要的核心,fastgpt中agent的自由度就是由它决定的,感兴趣的小伙伴们,可以关注军哥,并和军哥一起深入探索下去。


想了解更多fastgpt的知识,请微信搜索并关注“五彩石编程”公众号,军哥的文章将会持续同步更新。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值