feat(llm): 添加模型部署接口并优化模型状态更新逻辑

- 在 application-local.yaml 中添加模型部署接口地址
- 在 BaseModelServiceImpl 中实现模型部署功能
- 优化 BaseModelTaskService 中的模型状态更新逻辑
- 调整模型状态更新的定时任务执行频率
This commit is contained in:
sunxiqing 2025-03-05 18:14:41 +08:00
parent 840f8003b7
commit 61917ce7d5
4 changed files with 72 additions and 35 deletions

View File

@ -114,6 +114,8 @@ public class LLMBackendProperties {
private String baseModelStatus;
private String deployModel;
/**
* 知识库向量嵌入
*/

View File

@ -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

View File

@ -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<PedestalModelVo> modelListRes = JSONObject.parseArray(s, PedestalModelVo.class);
List<String> remoteModelNames = modelListRes.stream()
.map(PedestalModelVo::getDeploymentName)
.collect(Collectors.toCollection(HashSet::new))
.stream()
.collect(Collectors.toList());
List<BaseModelDO> 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<PedestalModelVo> 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<BaseModelDO> localModels = baseModelList.stream()
.filter(baseModel -> pedestalModelVo.getDeploymentName().equals(baseModel.getModelName()))
.collect(Collectors.toList());
// 查找本地模型
List<BaseModelDO> 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<BaseModelDO> 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);
}
}
}

View File

@ -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。 ###################
#### 大模型对话