一款纯 js 实现的大模型应用服务 FastGPT 解读

背景介绍

最近被不同的人安利了 FastGPT 项目,实际上手体验了一下,使用流程类似之前调研过的 Dify, 包含的功能主要是:任务流的编排,知识库管理,另外还有一些外部工具的调用能力。使用页面如下所示:
请添加图片描述
实际去看了下项目的代码分布,结果发现如下所示:

请添加图片描述

难道后端 Python 只需要如此少的代码量就可以实现一个大模型应用了?深入了解了 FastGPT 的实现,发现其 Python 为测试代码,完整的项目实现都是基于前端语言 ts 和 js 实现。这篇文章就主要介绍下 FastGPT 知识库 RAG 设计的实现细节。

FastGPT 简介

FastGPT 被设计为基于 LLM 大语言模型的知识库问答系统,与常规的 RAG 相比增加了额外工作流编排的能力,这部分类似 Dify。但是相对 Dify 而言可调用的第三方应用更少一些。按照习惯先查看项目的架构图:

请添加图片描述
一般而言,从架构图中就可以看到项目的独特之处。之前 qanything 和 ragflow 同样从架构图看出 RAG 项目的设计差异。

对于常规的 RAG 架构图,这张图可以明显看到大模型模块被放大,而且文件入库的流程都会先调用大模型。从大模型的输出来看,存在 QA 拆分文本分段手动输入 三种情况:

  • 文本分段 是常规的 RAG 的处理方案
  • QA 拆分 看起来是基于原始文本生成问答对,这部分猜测应该是根据大模型生成问答对,之前 Dify 也有类似的功能,被称为 Q&A 模式
  • 手动输入 则是直接输入问答对,这部分应该是手工输入数据进行补充;

预计文件入库环节的大模型调用主要作用于 QA 拆分

技术选型

官方给出的技术栈为:NextJs + TS + ChakraUI + Mongo + Postgres (Vector 插件)

  • NextJs 用于构建前后端服务,可以在单个工程中同时构建前后端代码,熟悉 Flask 应该对这个玩法不陌生,只是 Flask 是后端想把前端的活干了,而 NextJs 则是前端把后端的活干了;
  • TS 用于编写具体的代码;
  • ChakraUI 是 UI 组件库;
  • MongoDB 是作为业务数据库使用,事实上 FastGPT 中的文件也是基于 MongoDB 的 GridFS 进行存储;
  • Postgres 用于存储向量数据;

核心模块解读

与常规的 Python 实现大模型应用不同,基于 TypeScript 没有类似 langchain 的框架,因此需要自行实现知识库构建的完整流程。

文件入库流程

实际文件的入库对应的接口为 api/core/dataset/collection/create/fileId, 因为是基于 NextJs 实现的,接口与文件的组织结构是一样的,对应的处理实现是在 projects/app/src/pages/api/core/dataset/collection/create/fileId.ts

文件入库会执行文件读取,切片,然后会依次写入知识库,实际会根据不同写入模式内容上有一些差异,具体的实现如下所示:

  // 1. 读取文件const { rawText, filename } = await readFileContentFromMongo({teamId,bucketName: BucketNameEnum.dataset,fileId});// 2. 切片,文本分段会保留 20% 的重叠,QA 拆分则没有重叠const chunks = rawText2Chunks({rawText,chunkLen: chunkSize,overlapRatio: trainingType === TrainingModeEnum.chunk ? 0.2 : 0,customReg: chunkSplitter ? [chunkSplitter] : []});// 3. 查询限制await checkDatasetLimit({teamId,insertLen: predictDataLimitLength(trainingType, chunks)});await mongoSessionRun(async (session) => {// 4. 构建知识库集合const { _id: collectionId } = await createOneCollection({...body,teamId,tmbId,type: DatasetCollectionTypeEnum.file,name: filename,fileId,metadata: {relatedImgId: fileId},// special metadatatrainingType,chunkSize,chunkSplitter,qaPrompt,hashRawText: hashStr(rawText),rawTextLength: rawText.length,session});// 5. 创建训练账单,确认消耗金额const { billId } = await createTrainingUsage({teamId,tmbId,appName: filename,billSource: UsageSourceEnum.training,vectorModel: getVectorModel(dataset.vectorModel)?.name,agentModel: getLLMModel(dataset.agentModel)?.name,session});// 6. 分片数据写入 MongoDB 数据库await pushDataListToTrainingQueue({teamId,tmbId,datasetId: dataset._id,collectionId,agentModel: dataset.agentModel,vectorModel: dataset.vectorModel,trainingMode: trainingType,prompt: qaPrompt,billId,data: chunks.map((item, index) => ({...item,chunkIndex: index})),session});

在目前的流程中只是写入业务数据库 MongoDB,之后再根据 MongoDB 数据库中内容进行向量化。

对于 QA 模式,可以查看对应的 prompt 设计:

标记中是一段文本,学习和分析它,并整理学习成果:\n
- 提出问题并给出每个问题的答案。\n
- 答案需详细完整,尽可能保留原文描述。\n
- 答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 Markdown 元素。\n
- 最多提出 30 个问题。\n

可以看到就是基于大模型直接生成不超过 30 个问答对。

知识库检索

FastGPT 的知识检索目前支持多种检索模式,主要关注下最复杂的混合检索。

FastGPT 实现的是基于向量检索 + 文本检索实现的混合检索,并基于 RRF 实现多种检索结果的融合。对应的实现在 packages/service/core/dataset/search/controller.ts ,具体的简化后如下所示:

  // 向量检索 + 文本检索召回const { embeddingRecallResults, fullTextRecallResults, tokens } = awaitmultiQueryRecall({embeddingLimit,fullTextLimit});// 重排序的支持const reRankResults = await (async () => {if (!usingReRank) return [];set = new Set<string>(embeddingRecallResults.map((item) => item.id));const concatRecallResults = embeddingRecallResults.concat(fullTextRecallResults.filter((item) => !set.has(item.id)));// remove same q and a dataset = new Set<string>();const filterSameDataResults = concatRecallResults.filter((item) => {// 删除所有的标点符号与空格等,只对文本进行比较const str = hashStr(`${item.q}${item.a}`.replace(/[^\p{L}\p{N}]/gu, ''));if (set.has(str)) return false;set.add(str);return true;});return reRankSearchResult({query: reRankQuery,data: filterSameDataResults});})();// 使用 rrf 合并向量检索和文本检索的结果const rrfConcatResults = datasetSearchResultConcat([{ k: 60, list: embeddingRecallResults },{ k: 60, list: fullTextRecallResults },{ k: 58, list: reRankResults }]);

可以看到基本上是目前比较中规中矩的混合检索方案,只是转换为 TypeScript 进行了实现。

总结

本文是对 FastGPT 现有知识库流程的解读,整体看起来 FastGPT 的处理流程中规中矩。

通过前后端使用相同的开发语言,可以解决前后端代码复用的问题,借助 NextJs 也可以简化框架设计与部署,同时对团队的技术栈要求也更低了。但是因为没有使用 Python 实现后端服务,导致无法使用大量现有的大模型应用框架,为未来的拓展能力带来了一些限制,有得有失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1472380.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用&#xff08;Undefined Reference&#xff09;是 C 编程中常见的错误之一&#xff0c;通常在链接阶段出现。当编译器无法找到函数或变量的定义时&#xff0c;就会引发未定义引用错误。这种错误会阻止生成可执行文件&#xff0c;影响程序的正常构建。本…

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…

ETCD 基本介绍与常见命令的使用

转载请标明出处&#xff1a;https://blog.csdn.net/donkor_/article/details/140171610 文章目录 一、基本介绍1.1 参考1.2 什么是ETCD1.3 ETCD的特点1.4 ETCD的主要功能1.5 ETCD的整体架构1.6 什么时候用ETCD&#xff0c;什么时候用redis 二、安装三、使用3.1 etcdctl3.2 常用…

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…

KEYSIGHT N1092系列,DCA-M系列采样示波器连接与自检?

KEYSIGHT N1092系列 采样示波器&#xff0c;虽然省去了屏幕和操作系统&#xff0c;但根据不同的型号&#xff0c;可以配备不同数量的光口和电口&#xff0c;满足各种测试需求。本次介绍的具体型号为N1092D&#xff0c;它拥有4个光口&#xff0c;能够进行多种测试。 测试步骤详解…

开源大模型和闭源大模型,打法有何区别?

现阶段&#xff0c;各个公司都有自己的大模型产品&#xff0c;有的甚至不止一个。除了小部分开源外&#xff0c;大部分都选择了闭源。那么&#xff0c;头部开源模型厂商选择开源是出于怎样的初衷和考虑&#xff1f;未来大模型将如何发展&#xff1f;我们来看看本文的分享。 在对…

揭秘:华火电焰灶可不可信,安不安全?

随着科技的不断进步&#xff0c;传统厨房灶具也在经历着前所未有的变革。在这个追求环保、节能和智能化的时代&#xff0c;最近发布的一款名为华火电燃喷焰式组合灶厨吸引了众多消费者的目光。今天&#xff0c;我们就来对这款华火HH-SZQP60电燃喷焰式组合灶进行一次深入评测&am…

文字识别技术升级:Airtest与PaddleOCR模型的协作小技巧

一、前言 在进行自动化测试的过程中&#xff0c;ocr文字识别一直是大家最想要实现以及最需要的能力&#xff0c;今天就来介绍一个由百度飞浆提供的一个免费的ocr识别库——PaddleOCR&#xff0c;以及探讨一下&#xff0c;PaddleOCR与Airtest协作能擦出怎么样的火花~ 二、Padd…

智慧交通运行监测与应急指挥中心方案

建设目标 建立感知层数据的实时采集以及数据处理&#xff0c;实现监测预警自动化和智能化&#xff1b;推动交通运输数据资源开放共享&#xff0c;打破数据资源壁垒&#xff0c;与城市各部门数据建立共享交换机制&#xff0c;实现应急指挥的协同化&#xff1b;充分运用大数据、互…

《简历宝典》01 - 一文带你学会如何写一份糟糕透顶的简历

我们每个人几乎都会面对找工作这件事&#xff0c;而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比&#xff0c;糟糕透顶的求职简历&#xff0c;说实话&#xff0c;其实几年前&#xff0c;我就是这么写的。 目录 1. 文件名 2. 基本信…

大模型备案关注点最详细说明【附流程+附件】

国家网信办已经公布的通过大模型备案的有117家&#xff0c;部分已面向全社会开放服务。加上业内一些渠道透漏的消息&#xff0c;目前已有超过140个大模型获得备案。相对于算法备案&#xff0c;大模型备案名额显然更难拿到&#xff0c;很多企业在申请大模型备案的时候是一头雾水…

24西安电子科技大学数学与统计学院—考研录取情况

24西安电子科技大学—数学与统计学院—考研录取统计 01、数学与统计学院各个方向 02、24数学与统计学院近三年复试分数线对比 数统院24年院线相对于23年院线增加高达30分&#xff0c;确实增长浮动比较高&#xff0c;接近30分的水平&#xff0c;因此大家更需要好好去努力&#x…

快手矩阵管理系统:开启短视频营销的智能时代

在短视频内容营销的浪潮中&#xff0c;快手矩阵管理系统以其独特的优势和功能&#xff0c;成为品牌和个人创作者不可或缺的工具。本文将详细解析快手矩阵管理系统的核心功能&#xff0c;探讨它如何帮助用户高效管理多平台、多账号的内容发布和互动。 快手矩阵管理系统概述 快…

手动访问mongo和ES插入和查询

1、手动访问mongo 1.1、mongo连接数据库 1.2、mongo插入和查询 db.hmf_test.insert( { "aoeId": "1", "aoeAes": "吴秀梅", "aoeSm4": "北京xx网络技术有限公司.", "aoeSm4_a": "…

3D鸡哥又上开源项目!单图即可生成,在线可玩

大家好&#xff0c;今天和大家分享几篇最新的工作 1、Unique3D Unique3D从单视图图像高效生成高质量3D网格&#xff0c;具有SOTA水平的保真度和强大的通用性。 如下图所示 Unique3D 在 30 秒内从单视图野生图像生成高保真且多样化的纹理网格。 例如属于一张鸡哥的打球写真照 等…

【C++ 】解决 C++ 语言报错:Null Pointer Dereferenc

文章目录 引言 在 C 编程中&#xff0c;空指针解引用&#xff08;Null Pointer Dereference&#xff09;是一种常见且危险的错误。当程序试图通过空指针访问内存时&#xff0c;会导致程序崩溃或产生不可预期的行为。本文将详细探讨空指针解引用的成因、检测方法及其预防和解决…

Java后端每日面试题(day1)

目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别&#xff1f;Spring Boot的优点Spring IoC是什么&#xff1f;说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值&#xff1f;如何理解Spring的SPI机制&#xff1f;Spr…

蚁群优化算法(ACO)的原理Matlab旅行商TSP问题算例

一、优化问题 在满足一定条件下&#xff0c;在众多方案或参数中寻找最优方案或参数值&#xff0c;以使得某个或多个功能指标达到最优&#xff0c;或使系统的某些性能指标达到最大值或最小值。 但是当系统复杂或非线性时&#xff0c;要遍历所有参数组合寻找最优会变得很困难—…

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC&#xff0c;滤波器组多载波)&#xff0c;是一种类似于OFDM的调制方式&#xff0c;用滤波器抑制子载波的旁瓣大小&#xff0c;使用FFT/IFFT或多相滤波器实现&#xff0c;其应用于5G的主要优势&#xff1a; 子载波信号带限&#xff0c;带外泄漏小…