返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

FastGPT原理分析-数据集创建第一步

[复制链接]
链载Ai 显示全部楼层 发表于 昨天 12:56 |阅读模式 打印 上一主题 下一主题
概述

FastGPT的文件上传过程分为两个阶段:第一个阶段:是文件上传。第二个阶段:是对文件进行向量化处理和QA化处理。本文介绍文件上传的总体流程,并对创建数据集的第一步的详细实现逻辑进行分析。

数据集创建总体流程

数据集创建分为两个步骤:

  1. 第一步:文件上传和预处理,插入记录到mongodb的训练队列dataset_trainings表中。

  2. 第二步:监控mongodb的插入操作,并启动数据处理:(1)嵌入向量的计算或(2)QA文本拆分。

// 第一步:创建数据集并插入mongodb的数据表中
createCollectionAndInsertData
-> pushDataListToTrainingQueue // 将数据集数据推送到训练队列

// 第二步:注册处理函数,并自动处理数据
startMongoWatch
-> createDatasetTrainingMongoWatch // 监控mongodb的插入操作,触发文本处理任务
-> generateQA(); # QA问答对的处理
-> generateVector(); # 嵌入向量处理

数据集创建第一步的实现

数据集创建的第一步就是上传文件并对数据进行预处理,然后获取相关数据处理的参数,并把参数保存到mongodb的训练队列中。后续的处理任务,会根据数据集的处理配置来调用相应的模型或服务进行处理。数据集处理第一步的主要逻辑如下:

实现逻辑说明

创建数据集是在createCollectionAndInsertData函数中进行处理的,该函数又主要调用了pushDataListToTrainingQueue,该函数的实现逻辑如下:

  1. 模型验证与配置

  • 验证参数中的推理大模型和嵌入向量大模型是否有效。

  • 根据训练模式(chunk/qa/auto)设置最大token数和权重

  • 如果模型无效或训练模式无效,会抛出错误

  1. 数据预处理

  • 使用simpleText函数清理问题和答案中的空白字符

  • 处理索引数据,同样进行文本清理

  • 过滤掉空问题、重复内容和超过最大token限制的数据

  • 将数据分类为成功、过长、重复和错误四类

  1. 数据插入

  • 使用批量插入的方式将数据插入到MongoDB中,每批200条

  • 如果批量插入失败,会记录失败的文档并尝试单独插入

  • 支持在传入的session中执行,如果没有传入session则创建新的事务

这个函数主要用于将数据集数据预处理后插入到训练队列中,确保数据的有效性和完整性,同时支持事务处理以保证数据一致性。

主要实现源码分析

export async function pushDataListToTrainingQueue({

// 验证模型配置:检查agentModel和vectorModel的有效性,设置最大token数和权重。
const { model, maxToken, weight } = await (async () => {
const agentModelData = getLLMModel(agentModel);
if (!agentModelData) {
return Promise.reject(`File model ${agentModel} is inValid`);
}
const vectorModelData = getVectorModel(vectorModel);
if (!vectorModelData) {
return Promise.reject(`Vector model ${vectorModel} is inValid`);
}


  • 设置最大token数和权重

 if(trainingMode===TrainingModeEnum.chunk) {
return{
maxToken:vectorModelData.maxToken*1.5,
model:vectorModelData.model,
weight:vectorModelData.weight
};
}

if(trainingMode===TrainingModeEnum.qa||trainingMode===TrainingModeEnum.auto) {
return{
maxToken:agentModelData.maxContext*0.8,
model:agentModelData.model,
weight:0
};
}


  • 过滤过长或重复的内容

// 过滤重复和过长的内容
// filter repeat or equal content
constset=newSet();
constfilterResult:Record<string,PushDatasetDataChunkProps[]>={
success: [],
overToken: [],
repeat: [],
error: []
};


  • 处理QA问答对的,并去掉空的字符

// format q and a, remove empty char
data.forEach((item)=>{
item.q=simpleText(item.q);
item.a=simpleText(item.a);


  • 批量插入mongodb的dataset_trainings表中

// 使用 insertMany 批量插入
// 数据插入:批量插入数据(每批200条)
constbatchSize=200;
constinsertData=async(startIndex:number,session:ClientSession)=>{
constlist=filterResult.success.slice(startIndex,startIndex+batchSize);

if(list.length===0)return;

try{
awaitMongoDatasetTraining.insertMany(
list.map((item)=>({


总结

本文介绍了FastGpt创建数据集的总体流程,并详细分析了第一步的实现步骤和实现原理。可以看到,这一步只是把数据放到了Mongodb的训练队列的表中,那么,当数据插入到Mongodb后,该如何处理这些数据?而处理这些数据的任务又是如何触发的呢?这些实现的原理和逻辑,在下一篇文章中进行分析。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ