diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelservice/ModelServiceController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelservice/ModelServiceController.java index 9fd31ea94..2fadff433 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelservice/ModelServiceController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/modelservice/ModelServiceController.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.FineTuning import cn.iocoder.yudao.module.llm.dal.dataobject.application.ApplicationDO; import cn.iocoder.yudao.module.llm.service.conversation.ConversationService; import cn.iocoder.yudao.module.llm.service.finetuningtask.FineTuningTaskService; +import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -43,10 +44,14 @@ import cn.iocoder.yudao.module.llm.service.modelservice.ModelServiceService; @Validated public class ModelServiceController { + @Lazy @Resource private ModelServiceService modelServiceService; + + @Lazy @Resource private FineTuningTaskService fineTuningTaskService; + @Resource private ConversationService conversationService; diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java index e27e009e6..b221cdcf8 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.llm.service.finetuningtask; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.FineTuningTaskPageReqVO; @@ -15,7 +16,7 @@ import cn.iocoder.yudao.module.llm.enums.FinetuningTaskStatusEnum; import cn.iocoder.yudao.module.llm.service.async.AsyncFineTuningTaskService; import cn.iocoder.yudao.module.llm.service.http.TrainHttpService; import cn.iocoder.yudao.module.llm.service.http.vo.AigcFineTuningDetailRespVO; -import com.alibaba.fastjson.JSON; +import cn.iocoder.yudao.module.llm.service.modelservice.ModelServiceService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -34,7 +35,8 @@ import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.FINE_TUNING_TASK_NAME_NOT_EXISTS; +import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.FINE_TUNING_TASK_NOT_EXISTS; /** @@ -58,8 +60,11 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { @Resource TrainHttpService trainHttpService; + @Resource + private ModelServiceService modelServiceService; + @Override - public Long createFineTuningTask(FineTuningTaskSaveReqVO createReqVO) { + public Long createFineTuningTask (FineTuningTaskSaveReqVO createReqVO) { // 插入 validateFineTuningNameTaskExists(createReqVO); FineTuningTaskDO fineTuningTask = BeanUtils.toBean(createReqVO, FineTuningTaskDO.class); @@ -72,7 +77,7 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { } @Override - public void updateFineTuningTask(FineTuningTaskSaveReqVO updateReqVO) { + public void updateFineTuningTask (FineTuningTaskSaveReqVO updateReqVO) { // 校验存在 validateFineTuningTaskExists(updateReqVO.getId()); validateFineTuningNameTaskExists(updateReqVO); @@ -82,77 +87,111 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { } @Override - public void deleteFineTuningTask(Long id) { + public void deleteFineTuningTask (Long id) { // 校验存在 validateFineTuningTaskExists(id); + // 校验使用 + validateFineTuningTaskUse(id); FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(id); // 删除 LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(FineTuningTaskDO::getId, id) - .set(FineTuningTaskDO::getDeleted,true); - fineTuningTaskMapper.update(null,wrapper); + .set(FineTuningTaskDO::getDeleted, true); + fineTuningTaskMapper.update(null, wrapper); asyncFineTuningTaskService.stopFineTuningTask(fineTuningTaskDO); -// fineTuningTaskMapper.deleteById(id); + // fineTuningTaskMapper.deleteById(id); } - private FineTuningTaskDO validateFineTuningTaskExists(Long id) { + /** + * 校验使用 + *

+ * 删除调优任务时,需要判断是否正在使用,如果正在使用,则不允许删除 + *

+ * + * @param id 任务id + */ + private void validateFineTuningTaskUse (Long id) { + FineTuningTaskDO fineTuningTask = fineTuningTaskMapper.selectById(id); + String taskName = fineTuningTask.getTaskName(); + + // 校验 微调任务 是否在 模型服务管理 有使用 + validateTaskUsesInModelService(id, taskName); + } + + /** + * 校验微调任务是否在模型服务管理中使用 + * + * @param id 任务id + * @param taskName 任务名称 + */ + private void validateTaskUsesInModelService (Long id, String taskName) { + Map modelService = modelServiceService.getModelServiceByTaskId(id); + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(modelService)) { + String msg = String.format("微调任务【%s】在模型服务管理 %s 有使用,请先取消使用", taskName, modelService.values()); + throw exception(new ErrorCode(10005_001, msg)); + } + } + + private FineTuningTaskDO validateFineTuningTaskExists (Long id) { FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(id); if (fineTuningTaskDO == null) { throw exception(FINE_TUNING_TASK_NOT_EXISTS); } return fineTuningTaskDO; } - private void validateFineTuningNameTaskExists(FineTuningTaskSaveReqVO reqVO) { + + private void validateFineTuningNameTaskExists (FineTuningTaskSaveReqVO reqVO) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(FineTuningTaskDO::getTaskName, reqVO.getTaskName()); - if (reqVO.getId() != null){ + if (reqVO.getId() != null) { wrapper.ne(FineTuningTaskDO::getId, reqVO.getId()); } List dineTuningTaskDos = fineTuningTaskMapper.selectList(wrapper); - if (CollectionUtils.isNotEmpty(dineTuningTaskDos)){ + if (CollectionUtils.isNotEmpty(dineTuningTaskDos)) { throw exception(FINE_TUNING_TASK_NAME_NOT_EXISTS); } } @Override - public FineTuningTaskRespVO getFineTuningTask(Long id) { + public FineTuningTaskRespVO getFineTuningTask (Long id) { validateFineTuningTaskExists(id); FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(id); FineTuningTaskRespVO result = BeanUtils.toBean(fineTuningTaskDO, FineTuningTaskRespVO.class); Long dataset = fineTuningTaskDO.getDataset(); if (dataset != null) { DatasetDO datasetDO = datasetMapper.selectById(dataset); - if (datasetDO != null){ + if (datasetDO != null) { result.setDatasetName(datasetDO.getDatasetName()); } } Long baseModelId = fineTuningTaskDO.getBaseModelId(); if (baseModelId != null) { BaseModelDO baseModelDO = baseModelMapper.selectById(baseModelId); - if (baseModelDO != null){ + if (baseModelDO != null) { result.setBaseModelName(baseModelDO.getModelName()); } } - if (StringUtil.isNotEmpty(fineTuningTaskDO.getJobId())){ + if (StringUtil.isNotEmpty(fineTuningTaskDO.getJobId())) { AigcFineTuningDetailRespVO aigcFineTuningDetailRespVO = trainHttpService.finetuningDetail(new HashMap<>(), fineTuningTaskDO.getJobId()); result.setDetailRespVO(aigcFineTuningDetailRespVO); } return result; } + @Override - public PageResult getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO) { + public PageResult getFineTuningTaskPage1 (FineTuningTaskPageReqVO pageReqVO) { PageResult pageResult = fineTuningTaskMapper.selectPage(pageReqVO); PageResult result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class); - if (CollectionUtils.isNotEmpty(pageResult.getList())){ + if (CollectionUtils.isNotEmpty(pageResult.getList())) { List modelIds = pageResult.getList().stream().map(FineTuningTaskDO::getBaseModelId).collect(Collectors.toList()); List baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper() .in(BaseModelDO::getId, modelIds)); Map longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection. CollectionUtils.convertMap(baseModelDOS, BaseModelDO::getId); - result.getList().forEach(item->{ - BaseModelDO baseModelDO = longModelServiceDOMap.get(item.getBaseModelId()); - if(baseModelDO != null){ + result.getList().forEach(item -> { + BaseModelDO baseModelDO = longModelServiceDOMap.get(item.getBaseModelId()); + if (baseModelDO != null) { item.setBaseModelName(baseModelDO.getModelName()); } }); @@ -160,9 +199,9 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { List datasetDOS = datasetMapper.selectList(new LambdaQueryWrapper().in(DatasetDO::getId, dataSetlIds)); Map datasetDOMap = cn.iocoder.yudao.framework.common.util.collection. CollectionUtils.convertMap(datasetDOS, DatasetDO::getId); - result.getList().forEach(item->{ + result.getList().forEach(item -> { DatasetDO datasetDO = datasetDOMap.get(item.getDataset()); - if(datasetDO != null){ + if (datasetDO != null) { item.setDatasetName(datasetDO.getDatasetName()); } }); @@ -173,7 +212,7 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { @Override - public void startFineTuningTask(Long id) { + public void startFineTuningTask (Long id) { FineTuningTaskDO fineTuningTaskDO = validateFineTuningTaskExists(id); fineTuningTaskMapper.stopStartTask(id, FinetuningTaskStatusEnum.WAITING.getStatus()); //调用模型服务,开启调优任务 @@ -181,7 +220,7 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { } @Override - public List selectAll() { + public List selectAll () { List fineTuningTaskDOS = fineTuningTaskMapper.selectList(); return BeanUtils.toBean(fineTuningTaskDOS, FineTuningTaskRespVO.class); } @@ -195,7 +234,7 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { public List selectEnable () { List fineTuningTaskDOS = fineTuningTaskMapper.selectList(); fineTuningTaskDOS = fineTuningTaskDOS.stream() - .filter(item->item.getStatus().equals(FinetuningTaskStatusEnum.FINISHED.getStatus())) + .filter(item -> item.getStatus().equals(FinetuningTaskStatusEnum.FINISHED.getStatus())) .collect(Collectors.toList()); return BeanUtils.toBean(fineTuningTaskDOS, FineTuningTaskRespVO.class); } @@ -209,15 +248,15 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { @Override public Map getModelTuningByModelId (Long baseModelId) { - if (baseModelId == null){ + if (baseModelId == null) { return Collections.emptyMap(); } List fineTuningTaskDOS = fineTuningTaskMapper.selectList(new LambdaQueryWrapper() .eq(FineTuningTaskDO::getBaseModelId, baseModelId) - .in(FineTuningTaskDO::getStatus, FinetuningTaskStatusEnum.WAITING.getStatus(),FinetuningTaskStatusEnum.TRAINING.getStatus())); + .in(FineTuningTaskDO::getStatus, FinetuningTaskStatusEnum.WAITING.getStatus(), FinetuningTaskStatusEnum.TRAINING.getStatus())); - if (CollectionUtils.isNotEmpty(fineTuningTaskDOS)){ + if (CollectionUtils.isNotEmpty(fineTuningTaskDOS)) { return fineTuningTaskDOS.stream().collect(Collectors.toMap(FineTuningTaskDO::getId, FineTuningTaskDO::getTaskName)); } @@ -232,15 +271,15 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { */ @Override public Map getModelTuningByDatasetId (Long datasetId) { - if (datasetId == null){ + if (datasetId == null) { return Collections.emptyMap(); } List fineTuningTaskDOS = fineTuningTaskMapper.selectList(new LambdaQueryWrapper() .eq(FineTuningTaskDO::getDataset, datasetId) - .in(FineTuningTaskDO::getStatus, FinetuningTaskStatusEnum.WAITING.getStatus(),FinetuningTaskStatusEnum.TRAINING.getStatus())); + .in(FineTuningTaskDO::getStatus, FinetuningTaskStatusEnum.WAITING.getStatus(), FinetuningTaskStatusEnum.TRAINING.getStatus())); - if (CollectionUtils.isNotEmpty(fineTuningTaskDOS)){ + if (CollectionUtils.isNotEmpty(fineTuningTaskDOS)) { return fineTuningTaskDOS.stream().collect(Collectors.toMap(FineTuningTaskDO::getId, FineTuningTaskDO::getTaskName)); } @@ -248,18 +287,18 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { } @Override - public String getFineTuningLog(Long id) { + public String getFineTuningLog (Long id) { FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(id); - if (fineTuningTaskDO != null && StringUtils.isNotBlank(fineTuningTaskDO.getTrainLog())){ - Map map = new HashMap<>(); - map.put("log_path",fineTuningTaskDO.getTrainDuration()); + if (fineTuningTaskDO != null && StringUtils.isNotBlank(fineTuningTaskDO.getTrainLog())) { + Map map = new HashMap<>(); + map.put("log_path", fineTuningTaskDO.getTrainDuration()); return trainHttpService.getTrainLog(map); } return null; } @Override - public void stopFineTuningTask(Long id) { + public void stopFineTuningTask (Long id) { FineTuningTaskDO fineTuningTaskDO = validateFineTuningTaskExists(id); fineTuningTaskMapper.stopStartTask(id, FinetuningTaskStatusEnum.WAITING.getStatus()); //todo 调用模型服务,停止调优任务 @@ -269,7 +308,7 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService { @Override - public PageResult getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO) { + public PageResult getFineTuningTaskPage (FineTuningTaskPageReqVO pageReqVO) { return fineTuningTaskMapper.selectPage(pageReqVO); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceService.java index 6b6d9d733..cf2371640 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceService.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO; import javax.validation.Valid; import java.util.List; +import java.util.Map; /** * 模型服务 Service 接口 @@ -77,4 +78,13 @@ public interface ModelServiceService { * @return 模型服务管理数量 */ Long getCount (); + + + /** + * 根据 微调任务 id 获取 模型服务 + * + * @param taskId 知识库 id + * @return 模型服务的 Map 集合 + */ + Map getModelServiceByTaskId (Long taskId); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceServiceImpl.java index 0af4768cf..a229c0a7f 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/modelservice/ModelServiceServiceImpl.java @@ -26,10 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Random; +import java.util.*; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -89,9 +86,12 @@ public class ModelServiceServiceImpl implements ModelServiceService { FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(createReqVO.getFineTuningTask()); - //aigc模型列表中的id 以及 对话用的modelName - modelService.setJobId(fineTuningTaskDO.getJobModelListId()); - modelService.setBaseModelName(fineTuningTaskDO.getJobModelName()); + if (fineTuningTaskDO != null){ + //aigc模型列表中的id 以及 对话用的modelName + modelService.setJobId(fineTuningTaskDO.getJobModelListId()); + modelService.setBaseModelName(fineTuningTaskDO.getJobModelName()); + + } // 插入 String apikey = getApikey(); @@ -326,4 +326,22 @@ public class ModelServiceServiceImpl implements ModelServiceService { return modelServiceMapper.selectCount(null); } + /** + * 根据 微调任务 id 获取 模型服务 + * + * @param taskId 知识库 id + * @return 模型服务的 Map 集合 + */ + @Override + public Map getModelServiceByTaskId (Long taskId) { + if (taskId != null) { + List modelServiceDOS = modelServiceMapper.selectList(new LambdaQueryWrapper() + .eq(ModelServiceDO::getFineTuningTask, taskId)); + if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(modelServiceDOS)) { + return modelServiceDOS.stream().collect(Collectors.toMap(ModelServiceDO::getId, ModelServiceDO::getServiceName)); + } + } + return Collections.emptyMap(); + } + }