diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java index 28884a60c..7faf9ce02 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/framework/backend/config/LLMBackendProperties.java @@ -114,6 +114,8 @@ public class LLMBackendProperties { private String baseModelStatus; + private String deployModel; + /** * 知识库向量嵌入 */ diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelServiceImpl.java index 81fdb50f9..9a5dd479e 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelServiceImpl.java @@ -2,18 +2,22 @@ package cn.iocoder.yudao.module.llm.service.basemodel; import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.llm.controller.admin.basemodel.vo.BaseModelPageReqVO; import cn.iocoder.yudao.module.llm.controller.admin.basemodel.vo.BaseModelSaveReqVO; import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO; import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper; +import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties; import cn.iocoder.yudao.module.llm.service.application.ApplicationService; import cn.iocoder.yudao.module.llm.service.finetuningtask.FineTuningTaskService; import cn.iocoder.yudao.module.llm.service.modelassesstaskauto.ModelAssessTaskAutoService; import cn.iocoder.yudao.module.llm.service.modelassesstaskmanual.ModelAssessTaskManualService; import cn.iocoder.yudao.module.llm.service.modelassesstaskmanualbackup.ModelAssessTaskManualBackupService; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -32,6 +36,7 @@ import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*; */ @Service @Validated +@Slf4j public class BaseModelServiceImpl implements BaseModelService { @Resource @@ -53,6 +58,9 @@ public class BaseModelServiceImpl implements BaseModelService { @Resource private ModelAssessTaskManualBackupService modelAssessTaskManualBackupService; + @Resource + private LLMBackendProperties llmBackendProperties; + @Override public Long createBaseModel (BaseModelSaveReqVO createReqVO) { validateBaseModelNameExists(createReqVO); @@ -85,10 +93,16 @@ public class BaseModelServiceImpl implements BaseModelService { public void updateBaseModel (BaseModelSaveReqVO updateReqVO) { validateBaseModelNameExists(updateReqVO); // 校验存在 - validateBaseModelExists(updateReqVO.getId()); - // 更新 - BaseModelDO updateObj = BeanUtils.toBean(updateReqVO, BaseModelDO.class); - baseModelMapper.updateById(updateObj); + String moder = updateReqVO.getModelName(); + try { + String resStr = HttpUtils.post(llmBackendProperties.getDeployModel(), null, JSON.toJSONString(moder)); + validateBaseModelExists(updateReqVO.getId()); + // 更新 + BaseModelDO updateObj = BeanUtils.toBean(updateReqVO, BaseModelDO.class); + baseModelMapper.updateById(updateObj); + }catch (Exception e){ + log.error("启动基础模型状态时发生异常: {}", e.getMessage(), e); + } } @Override diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelTaskService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelTaskService.java index 87333dd87..972838dcb 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelTaskService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelTaskService.java @@ -31,6 +31,7 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; @@ -191,7 +192,7 @@ public class BaseModelTaskService { } } - @Scheduled(cron = "0 0/5 * * * ?") + @Scheduled(cron = "0 0/1 * * * ?") public void updateTheBaseModelState() { try { // 获取所有基础模型列表 @@ -207,6 +208,8 @@ public class BaseModelTaskService { List modelListRes = JSONObject.parseArray(s, PedestalModelVo.class); List remoteModelNames = modelListRes.stream() .map(PedestalModelVo::getDeploymentName) + .collect(Collectors.toCollection(HashSet::new)) + .stream() .collect(Collectors.toList()); List differentModels = baseModelList.stream() .filter(baseModel -> !remoteModelNames.contains(baseModel.getModelName())&& baseModel.getIsActive()==1) @@ -214,42 +217,58 @@ public class BaseModelTaskService { for (BaseModelDO baseModel : differentModels){ baseModel.setIsActive(2); } - baseModelService.updetatebyIds(differentModels); - for (PedestalModelVo pedestalModelVo : modelListRes) { + if (differentModels.size()>0) { + baseModelService.updetatebyIds(differentModels); + } + for (String name : remoteModelNames) { // JSONObject jsonObject = (JSONObject) object; // String string = JSON.toJSONString(jsonObject); // PedestalModelVo pedestalModelVo = JSON.parseObject(string, PedestalModelVo.class); + List collect = modelListRes.stream().filter(pedestalModelVo -> pedestalModelVo.getDeploymentName().equals(name) && "running".equals(pedestalModelVo.getStatus())).collect(Collectors.toList()); + if (collect.size() > 0) { + PedestalModelVo pedestalModelVo = collect.get(0); + // 查找本地模型 + List localModels = baseModelList.stream() + .filter(baseModel -> pedestalModelVo.getDeploymentName().equals(baseModel.getModelName())) + .collect(Collectors.toList()); - // 查找本地模型 - List localModels = baseModelList.stream() - .filter(baseModel -> pedestalModelVo.getDeploymentName().equals(baseModel.getModelName())) - .collect(Collectors.toList()); - - if (localModels != null && localModels.size() > 0) { - BaseModelDO localModel = localModels.get(0); - // 如果状态不是 "running",更新本地状态 - if (!"running".equals(pedestalModelVo.getStatus())) { - log.info("更新模型状态,模型名称: {}, 状态: {}", pedestalModelVo.getDeploymentName(), pedestalModelVo.getStatus()); + if (localModels != null && localModels.size() > 0) { + BaseModelDO localModel = localModels.get(0); + // 如果状态不是 "running",更新本地状态 + if (!"running".equals(pedestalModelVo.getStatus())) { + log.info("更新模型状态,模型名称: {}, 状态: {}", pedestalModelVo.getDeploymentName(), pedestalModelVo.getStatus()); + localModel.setIsActive(2); + baseModelService.updetatebyId(localModel); + } else { + String string1 = pedestalModelVo.getHost() + "/v1/chat/completions"; + if (!string1.equals(localModel.getChatUrl())) { + localModel.setIsActive(1); + localModel.setChatUrl(string1); + baseModelService.updetatebyId(localModel); + } + log.debug("模型 {} 状态为 running,无需更新", pedestalModelVo.getDeploymentName()); + } + } +// else { +// //新增基座模型 +// if ("running".equals(pedestalModelVo.getStatus())){ +// BaseModelSaveReqVO baseModelSaveReqVO = new BaseModelSaveReqVO(); +// baseModelSaveReqVO.setModelName(pedestalModelVo.getDeploymentName()); +// baseModelSaveReqVO.setIsActive(1); +// baseModelSaveReqVO.setAigcModelName(pedestalModelVo.getDeploymentName()); +// baseModelSaveReqVO.setChatUrl(pedestalModelVo.getHost() + "/v1/chat/completions"); +// baseModelService.createBaseModel(baseModelSaveReqVO); +// } +// } + } else { + List localModels = baseModelList.stream() + .filter(baseModel -> name.equals(baseModel.getModelName())) + .collect(Collectors.toList()); + if (localModels != null && localModels.size() > 0) { + BaseModelDO localModel = localModels.get(0); + // 如果状态不是 "running",更新本地状态 localModel.setIsActive(2); baseModelService.updetatebyId(localModel); - } else { - String string1 = pedestalModelVo.getHost() + "/v1/chat/completions"; - if (!string1.equals(localModel.getChatUrl())) { - localModel.setIsActive(1); - localModel.setChatUrl(string1); - baseModelService.updetatebyId(localModel); - } - log.debug("模型 {} 状态为 running,无需更新", pedestalModelVo.getDeploymentName()); - } - } else { - //新增基座模型 - if ("running".equals(pedestalModelVo.getStatus())){ - BaseModelSaveReqVO baseModelSaveReqVO = new BaseModelSaveReqVO(); - baseModelSaveReqVO.setModelName(pedestalModelVo.getDeploymentName()); - baseModelSaveReqVO.setIsActive(1); - baseModelSaveReqVO.setAigcModelName(pedestalModelVo.getDeploymentName()); - baseModelSaveReqVO.setChatUrl(pedestalModelVo.getHost() + "/v1/chat/completions"); - baseModelService.createBaseModel(baseModelSaveReqVO); } } } diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml index 7ad2fd2b5..87acd576c 100644 --- a/yudao-server/src/main/resources/application-local.yaml +++ b/yudao-server/src/main/resources/application-local.yaml @@ -330,6 +330,8 @@ llm: stop_finetuning: /llm/finetuning/stop # 基座模型状态 POST base_model_status: http://36.103.199.248:5123/llm/deploy/list + # 模型部署 POST + deploy_model: http://36.103.199.248:5123/llm/deploy #################### 30000: 大模型对话相关API。 ################### #### 大模型对话