|
FastGPT的文件上传过程分为两个阶段:第一个阶段:是文件上传。第二个阶段:是对文件进行向量化处理和QA化处理。本文介绍文件上传的总体流程,并对创建数据集的第一步的详细实现逻辑进行分析。 数据集创建总体流程数据集创建分为两个步骤: 第一步:文件上传和预处理,插入记录到mongodb的训练队列dataset_trainings表中。 第二步:监控mongodb的插入操作,并启动数据处理:(1)嵌入向量的计算或(2)QA文本拆分。
// 第一步:创建数据集并插入mongodb的数据表中 createCollectionAndInsertData -> pushDataListToTrainingQueue // 将数据集数据推送到训练队列
// 第二步:注册处理函数,并自动处理数据 startMongoWatch -> createDatasetTrainingMongoWatch // 监控mongodb的插入操作,触发文本处理任务 -> generateQA(); # QA问答对的处理 -> generateVector(); # 嵌入向量处理 数据集创建第一步的实现数据集创建的第一步就是上传文件并对数据进行预处理,然后获取相关数据处理的参数,并把参数保存到mongodb的训练队列中。后续的处理任务,会根据数据集的处理配置来调用相应的模型或服务进行处理。数据集处理第一步的主要逻辑如下: 实现逻辑说明创建数据集是在createCollectionAndInsertData函数中进行处理的,该函数又主要调用了pushDataListToTrainingQueue,该函数的实现逻辑如下: 模型验证与配置:
数据预处理:
数据插入
这个函数主要用于将数据集数据预处理后插入到训练队列中,确保数据的有效性和完整性,同时支持事务处理以保证数据一致性。 主要实现源码分析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`); }
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: [] };
// format q and a, remove empty char data.forEach((item)=>{ item.q=simpleText(item.q); item.a=simpleText(item.a);
// 使用 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后,该如何处理这些数据?而处理这些数据的任务又是如何触发的呢?这些实现的原理和逻辑,在下一篇文章中进行分析。 |