feat(llm): 添加模型部署接口并优化模型状态更新逻辑
- 在 application-local.yaml 中添加模型部署接口地址 - 在 BaseModelServiceImpl 中实现模型部署功能 - 优化 BaseModelTaskService 中的模型状态更新逻辑 - 调整模型状态更新的定时任务执行频率
This commit is contained in:
parent
840f8003b7
commit
61917ce7d5
@ -114,6 +114,8 @@ public class LLMBackendProperties {
|
||||
|
||||
private String baseModelStatus;
|
||||
|
||||
private String deployModel;
|
||||
|
||||
/**
|
||||
* 知识库向量嵌入
|
||||
*/
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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。 ###################
|
||||
#### 大模型对话
|
||||
|
Loading…
x
Reference in New Issue
Block a user