Merge remote-tracking branch 'origin/master' into master-wangwei

This commit is contained in:
Edward_89 2024-12-31 13:17:46 +08:00
commit 903216e1e5
38 changed files with 438 additions and 41 deletions

View File

@ -71,4 +71,6 @@ public interface ErrorCodeConstants {
ErrorCode TRAINING_NOT_EXISTS = new ErrorCode(10029, "训练不存在");
ErrorCode MODEL_COMPLETIONS_ERROR = new ErrorCode(10030, "模型推理失败");
}

View File

@ -42,7 +42,7 @@ public class BaseModelController {
@PostMapping("/create")
@Operation(summary = "创建基座模型")
@PreAuthorize("@ss.hasPermission('llm:base-model:create')")
public CommonResult<Integer> createBaseModel(@Valid @RequestBody BaseModelSaveReqVO createReqVO) {
public CommonResult<Long> createBaseModel(@Valid @RequestBody BaseModelSaveReqVO createReqVO) {
return success(baseModelService.createBaseModel(createReqVO));
}
@ -76,7 +76,7 @@ public class BaseModelController {
@Operation(summary = "删除基座模型")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('llm:base-model:delete')")
public CommonResult<Boolean> deleteBaseModel(@RequestParam("id") Integer id) {
public CommonResult<Boolean> deleteBaseModel(@RequestParam("id") Long id) {
baseModelService.deleteBaseModel(id);
return success(true);
}
@ -85,7 +85,7 @@ public class BaseModelController {
@Operation(summary = "获得基座模型")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('llm:base-model:query')")
public CommonResult<BaseModelRespVO> getBaseModel(@RequestParam("id") Integer id) {
public CommonResult<BaseModelRespVO> getBaseModel(@RequestParam("id") Long id) {
BaseModelDO baseModel = baseModelService.getBaseModel(id);
return success(BeanUtils.toBean(baseModel, BaseModelRespVO.class));
}
@ -94,7 +94,7 @@ public class BaseModelController {
@Operation(summary = "获取参数模板")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('llm:base-model:query')")
public CommonResult<JSONObject> getParamModel(@RequestParam("id") Integer id) {
public CommonResult<JSONObject> getParamModel(@RequestParam("id") Long id) {
BaseModelDO baseModel = baseModelService.getBaseModel(id);
//todo 获取参数模板api
return success(new JSONObject());

View File

@ -14,7 +14,7 @@ public class BaseModelRespVO {
@Schema(description = "基座模型唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2828")
@ExcelProperty("基座模型唯一标识")
private Integer id;
private Long id;
@Schema(description = "基座模型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@ExcelProperty("基座模型名称")

View File

@ -10,7 +10,7 @@ import javax.validation.constraints.*;
public class BaseModelSaveReqVO {
@Schema(description = "基座模型唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2828")
private Integer id;
private Long id;
@Schema(description = "基座模型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@NotEmpty(message = "基座模型名称不能为空")

View File

@ -92,4 +92,9 @@ public class ConversationController {
BeanUtils.toBean(list, ConversationRespVO.class));
}
@PostMapping("/chat")
@Operation(summary = "对话推理接口")
public CommonResult<ChatRespVO> chat(@Valid @RequestBody ChatReqVO chatReqVO) {
return success(conversationService.chat(chatReqVO));
}
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.llm.controller.admin.conversation.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 大模型对话推理聊天 Request VO")
@Data
public class ChatReqVO {
@Schema(description = "模型类型", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "模型类型不能为空")
private Integer modelType;
@Schema(description = "模型ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "模型ID不能为空")
private Long modelId;
@Schema(description = "应用ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "应用ID不能为空")
private Long applicationId;
@Schema(description = "对话的内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "对话的内容不能为空")
private String prompt;
@Schema(description = "对话ID", requiredMode = Schema.RequiredMode.REQUIRED)
private String uuid;
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.llm.controller.admin.conversation.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Schema(description = "管理后台 - 大模型对话推理聊天 Response VO")
@Data
public class ChatRespVO {
@Schema(description = "对话ID", requiredMode = Schema.RequiredMode.REQUIRED)
private String uuid;
@Schema(description = "模型类型", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "模型类型不能为空")
private Integer modelType;
@Schema(description = "模型ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "模型ID不能为空")
private Long modelId;
@Schema(description = "应用ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "应用ID不能为空")
private Long applicationId;
@Schema(description = "对话的内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "对话的内容不能为空")
private String prompt;
@Schema(description = "回答的内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "回答的内容不能为空")
private String response;
}

View File

@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.llm.controller.admin.datarefluxconfig;
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
import cn.iocoder.yudao.module.llm.service.basemodel.BaseModelService;
import cn.iocoder.yudao.module.llm.service.modelservice.ModelServiceService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -37,6 +40,10 @@ public class DataRefluxConfigController {
@Resource
private DataRefluxConfigService dataRefluxConfigService;
@Resource
private ModelServiceService modelServiceService;
@Resource
private BaseModelService baseModelService;
@PostMapping("/create")
@Operation(summary = "创建数据回流配置")
@ -68,7 +75,13 @@ public class DataRefluxConfigController {
@PreAuthorize("@ss.hasPermission('llm:data-reflux-config:query')")
public CommonResult<DataRefluxConfigRespVO> getDataRefluxConfig(@RequestParam("id") Long id) {
DataRefluxConfigDO dataRefluxConfig = dataRefluxConfigService.getDataRefluxConfig(id);
return success(BeanUtils.toBean(dataRefluxConfig, DataRefluxConfigRespVO.class));
DataRefluxConfigRespVO bean = BeanUtils.toBean(dataRefluxConfig, DataRefluxConfigRespVO.class);
if (bean.getModelType()==0){
bean.setModelServiceName(modelServiceService.getModelService(bean.getModelServiceId()).getServiceName());
}else if (bean.getModelType()==1){
bean.setModelServiceName(baseModelService.getBaseModel(bean.getModelServiceId()).getModelName());
}
return success(bean);
}
@GetMapping("/page")
@ -76,7 +89,19 @@ public class DataRefluxConfigController {
@PreAuthorize("@ss.hasPermission('llm:data-reflux-config:query')")
public CommonResult<PageResult<DataRefluxConfigRespVO>> getDataRefluxConfigPage(@Valid DataRefluxConfigPageReqVO pageReqVO) {
PageResult<DataRefluxConfigDO> pageResult = dataRefluxConfigService.getDataRefluxConfigPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, DataRefluxConfigRespVO.class));
if (pageResult==null){
return success(PageResult.empty());
}
PageResult<DataRefluxConfigRespVO> bean = BeanUtils.toBean(pageResult, DataRefluxConfigRespVO.class);
for (DataRefluxConfigRespVO dataRefluxConfigRespVO : bean.getList()){
if (dataRefluxConfigRespVO.getModelType()==0){
dataRefluxConfigRespVO.setModelServiceName(modelServiceService.getModelService(dataRefluxConfigRespVO.getModelServiceId()).getServiceName());
}else if (dataRefluxConfigRespVO.getModelType()==1){
dataRefluxConfigRespVO.setModelServiceName(baseModelService.getBaseModel(dataRefluxConfigRespVO.getModelServiceId()).getModelName());
}
}
// PageResult<DataRefluxConfigRespVO> result = bean.setList(bean.getList());
return success(bean);
}
@GetMapping("/export-excel")
@ -92,4 +117,4 @@ public class DataRefluxConfigController {
BeanUtils.toBean(list, DataRefluxConfigRespVO.class));
}
}
}

View File

@ -18,8 +18,11 @@ public class DataRefluxConfigPageReqVO extends PageParam {
@Schema(description = "模型服务ID", example = "2475")
private Long modelServiceId;
@Schema(description = "模型服务", example = "0")
private String modelServiceName;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
}

View File

@ -20,8 +20,14 @@ public class DataRefluxConfigRespVO {
@ExcelProperty("模型服务ID")
private Long modelServiceId;
@Schema(description = "模型服务", example = "0")
private String modelServiceName;
@Schema(description = "是否预知模型0普通 1官方", example = "0")
private Long modelType;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
}

View File

@ -16,4 +16,7 @@ public class DataRefluxConfigSaveReqVO {
@NotNull(message = "模型服务ID不能为空")
private Long modelServiceId;
}
@Schema(description = "是否预知模型0普通 1官方", example = "0")
private Long modelType;
}

View File

@ -16,6 +16,13 @@ public class DataRefluxDataSaveReqVO {
@NotNull(message = "模型服务ID不能为空")
private Long modelServiceId;
@Schema(description = "数据回流ID", example = "31011")
private Long configId;
@Schema(description = "是否预知模型0普通 1官方", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@NotNull(message = "是否预知模型0普通 1官方不能为空")
private Long modelType;
@Schema(description = "system")
private String system;
@ -25,4 +32,4 @@ public class DataRefluxDataSaveReqVO {
@Schema(description = "Response")
private String response;
}
}

View File

@ -67,16 +67,31 @@ public class FineTuningTaskController {
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:query')")
public CommonResult<FineTuningTaskRespVO> getFineTuningTask(@RequestParam("id") Long id) {
FineTuningTaskDO fineTuningTask = fineTuningTaskService.getFineTuningTask(id);
return success(BeanUtils.toBean(fineTuningTask, FineTuningTaskRespVO.class));
return success(fineTuningTaskService.getFineTuningTask(id));
}
@PutMapping("/stop")
@Operation(summary = "停止模型调优 —— 微调任务")
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:update')")
public CommonResult<Boolean> stopFineTuningTask(@RequestParam("id") Long id) {
fineTuningTaskService.stopFineTuningTask(id);
return success(true);
}
@PutMapping("start")
@Operation(summary = "部署模型调优 —— 微调任务")
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:update')")
public CommonResult<Boolean> startFineTuningTask(@RequestParam("id") Long id) {
fineTuningTaskService.startFineTuningTask(id);
return success(true);
}
@GetMapping("/page")
@Operation(summary = "获得模型调优 —— 微调任务分页")
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:query')")
public CommonResult<PageResult<FineTuningTaskRespVO>> getFineTuningTaskPage(@Valid FineTuningTaskPageReqVO pageReqVO) {
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskService.getFineTuningTaskPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class));
PageResult<FineTuningTaskRespVO> pageResult = fineTuningTaskService.getFineTuningTaskPage1(pageReqVO);
return success(pageResult);
}
@GetMapping("/export-excel")

View File

@ -88,4 +88,7 @@ public class FineTuningTaskPageReqVO extends PageParam {
@Schema(description = "状态使用字典llm_fine_tuning_task_status", example = "1")
private Integer status;
@Schema(description ="基础模型服务Id")
private Long baseModelId;
}

View File

@ -125,5 +125,13 @@ public class FineTuningTaskRespVO {
@ExcelProperty(value = "状态使用字典llm_fine_tuning_task_status", converter = DictConvert.class)
@DictFormat("llm_fine_tuning_task_status") // TODO 代码优化建议设置到对应的 DictTypeConstants 枚举类中
private Integer status;
@Schema(description ="基础模型服务Id")
private Long baseModelId;
@Schema(description = "基础模型服务名称")
private String baseModelName;
@Schema(description = "数据集名称")
private String datasetName;
}

View File

@ -83,4 +83,7 @@ public class FineTuningTaskSaveReqVO {
@NotNull(message = "状态使用字典llm_fine_tuning_task_status不能为空")
private Integer status;
@Schema(description = "基础模型服务Id")
private Long baseModelId;
}

View File

@ -77,6 +77,14 @@ public class KnowledgeBaseController {
return success(BeanUtils.toBean(pageResult, KnowledgeBaseRespVO.class));
}
@GetMapping("/list")
@Operation(summary = "获得知识库分页")
@PreAuthorize("@ss.hasPermission('llm:knowledge-base:query')")
public CommonResult<List<KnowledgeBaseRespVO>> getKnowledgeBaseList() {
List<KnowledgeBaseDO> list = knowledgeBaseService.getKnowledgeBaseList();
return success(BeanUtils.toBean(list, KnowledgeBaseRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出知识库 Excel")
@PreAuthorize("@ss.hasPermission('llm:knowledge-base:export')")

View File

@ -79,17 +79,26 @@ public class LabelController {
return success(BeanUtils.toBean(pageResult, LabelRespVO.class));
}
@GetMapping("/all")
@Operation(summary = "获得标签管理列表所有")
@PreAuthorize("@ss.hasPermission('llm:label:query')")
public CommonResult<List<LabelRespVO>> getLabelList() {
List<LabelDO> list = labelService.getLabelList();
return success(BeanUtils.toBean(list, LabelRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出标签管理 Excel")
@PreAuthorize("@ss.hasPermission('llm:label:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportLabelExcel(@Valid LabelPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<LabelDO> list = labelService.getLabelPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "标签管理.xls", "数据", LabelRespVO.class,
BeanUtils.toBean(list, LabelRespVO.class));
BeanUtils.toBean(list, LabelRespVO.class));
}
}

View File

@ -26,7 +26,7 @@ public class BaseModelDO extends BaseDO {
* 基座模型唯一标识
*/
@TableId
private Integer id;
private Long id;
/**
* 基座模型名称
*/

View File

@ -31,5 +31,9 @@ public class DataRefluxConfigDO extends BaseDO {
* 模型服务ID
*/
private Long modelServiceId;
/**
* 是否预知模型0普通 1官方
*/
private Long modelType;
}
}

View File

@ -31,6 +31,14 @@ public class DataRefluxDataDO extends BaseDO {
* 模型服务ID
*/
private Long modelServiceId;
/**
* 数据回流ID
*/
private Long configId;
/**
* 是否预知模型0普通 1官方
*/
private Long modelType;
/**
* system
*/
@ -44,4 +52,4 @@ public class DataRefluxDataDO extends BaseDO {
*/
private String response;
}
}

View File

@ -135,5 +135,9 @@ public class FineTuningTaskDO extends BaseDO {
* 枚举 {@link TODO llm_fine_tuning_task_status 对应的类}
*/
private Integer status;
/**
* 基础服务模型Id
*/
private Long baseModelId;
}

View File

@ -1,13 +1,13 @@
package cn.iocoder.yudao.module.llm.dal.mysql.finetuningtask;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
/**
* 模型调优 微调任务 Mapper
@ -47,4 +47,6 @@ public interface FineTuningTaskMapper extends BaseMapperX<FineTuningTaskDO> {
.orderByDesc(FineTuningTaskDO::getId));
}
@Update("update llm_fine_tuning_task set status = #{status} where id = #{id}")
void stopStartTask(@Param("id") Long id,@Param("status") int status);
}

View File

@ -20,7 +20,7 @@ public interface BaseModelService {
* @param createReqVO 创建信息
* @return 编号
*/
Integer createBaseModel(@Valid BaseModelSaveReqVO createReqVO);
Long createBaseModel(@Valid BaseModelSaveReqVO createReqVO);
/**
* 更新基座模型
@ -34,7 +34,7 @@ public interface BaseModelService {
*
* @param id 编号
*/
void deleteBaseModel(Integer id);
void deleteBaseModel(Long id);
/**
* 获得基座模型
@ -42,7 +42,7 @@ public interface BaseModelService {
* @param id 编号
* @return 基座模型
*/
BaseModelDO getBaseModel(Integer id);
BaseModelDO getBaseModel(Long id);
/**
* 获得基座模型分页

View File

@ -31,7 +31,7 @@ public class BaseModelServiceImpl implements BaseModelService {
private BaseModelMapper baseModelMapper;
@Override
public Integer createBaseModel(BaseModelSaveReqVO createReqVO) {
public Long createBaseModel(BaseModelSaveReqVO createReqVO) {
// 插入
BaseModelDO baseModel = BeanUtils.toBean(createReqVO, BaseModelDO.class);
baseModelMapper.insert(baseModel);
@ -49,21 +49,22 @@ public class BaseModelServiceImpl implements BaseModelService {
}
@Override
public void deleteBaseModel(Integer id) {
public void deleteBaseModel(Long id) {
// 校验存在
validateBaseModelExists(id);
// 删除
baseModelMapper.deleteById(id);
}
private void validateBaseModelExists(Integer id) {
private void validateBaseModelExists(Long id) {
if (baseModelMapper.selectById(id) == null) {
throw exception(BASE_MODEL_NOT_EXISTS);
}
}
@Override
public BaseModelDO getBaseModel(Integer id) {
public BaseModelDO getBaseModel(Long id) {
return baseModelMapper.selectById(id);
}
@ -75,7 +76,7 @@ public class BaseModelServiceImpl implements BaseModelService {
@Override
public List<BaseModelDO> getBaseModelList() {
LambdaQueryWrapper<BaseModelDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseModelDO::getIsActive,0);
queryWrapper.eq(BaseModelDO::getIsActive,1);
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(queryWrapper);
return baseModelDOS;
}

View File

@ -52,4 +52,5 @@ public interface ConversationService {
*/
PageResult<ConversationDO> getConversationPage(ConversationPageReqVO pageReqVO);
ChatRespVO chat(@Valid ChatReqVO chatReqVO);
}

View File

@ -1,11 +1,21 @@
package cn.iocoder.yudao.module.llm.service.conversation;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
import cn.iocoder.yudao.module.llm.service.basemodel.BaseModelService;
import cn.iocoder.yudao.module.llm.service.http.ModelService;
import cn.iocoder.yudao.module.llm.service.http.vo.ModelCompletionsReqVO;
import cn.iocoder.yudao.module.llm.service.http.vo.ModelCompletionsRespVO;
import com.alibaba.excel.util.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.TimeUnit;
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.conversation.ConversationDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -28,6 +38,17 @@ public class ConversationServiceImpl implements ConversationService {
@Resource
private ConversationMapper conversationMapper;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private ModelService modelService;
@Resource
private BaseModelService baseModelService;
// 聊天会话历史记录缓存Key
private final static String CHAT_HIStORY_REDIS_KEY = "llm:chat:history";
// 聊天会话历史记录缓存时间
private final static Long CHAT_HISTORY_REDIS_EXPIRE_SECONDS = 60 * 60 * 24L;
@Override
public Integer createConversation(ConversationSaveReqVO createReqVO) {
@ -71,4 +92,44 @@ public class ConversationServiceImpl implements ConversationService {
return conversationMapper.selectPage(pageReqVO);
}
@Override
public ChatRespVO chat(ChatReqVO chatReqVO) {
if (StringUtils.isBlank(chatReqVO.getUuid())) {
// 如果没有uuid就生成一个
chatReqVO.setUuid(UUID.randomUUID().toString());
}
String model = null;
if (Objects.equals(1, chatReqVO.getModelType())) {
// 预制模型
BaseModelDO baseModelDO = baseModelService.getBaseModel(chatReqVO.getModelId());
if (baseModelDO == null) {
throw exception(BASE_MODEL_NOT_EXISTS);
}
model = baseModelDO.getModelName();
}
ModelCompletionsReqVO.ModelCompletionsMessage message = new ModelCompletionsReqVO.ModelCompletionsMessage();
message.setRole("user");
message.setContent(chatReqVO.getPrompt());
// TODO: 聊天推理
List<String> messageHistoryList = stringRedisTemplate.opsForList().range(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, -1);
List<ModelCompletionsReqVO.ModelCompletionsMessage> messages = new ArrayList<>();
if (messageHistoryList != null && !messageHistoryList.isEmpty()) {
for (String messageHistory : messageHistoryList) {
messages.add(JsonUtils.parseObject(messageHistory, ModelCompletionsReqVO.ModelCompletionsMessage.class));
}
}
messages.add(message);
ModelCompletionsReqVO modelCompletionsReqVO = new ModelCompletionsReqVO();
modelCompletionsReqVO.setMessages(messages);
modelCompletionsReqVO.setModel(model);
ModelCompletionsRespVO modelCompletionsRespVO = modelService.modelCompletions(modelCompletionsReqVO);
if (modelCompletionsRespVO == null) {
throw exception(MODEL_COMPLETIONS_ERROR);
}
ChatRespVO chatRespVO = BeanUtils.toBean(chatReqVO, ChatRespVO.class);
chatRespVO.setResponse(modelCompletionsRespVO.getAnswer());
// 将聊天记录放入缓存
stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(message));
return chatRespVO;
}
}

View File

@ -1,11 +1,20 @@
package cn.iocoder.yudao.module.llm.service.datarefluxconfig;
import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.llm.controller.admin.datarefluxconfig.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.datarefluxconfig.DataRefluxConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -28,6 +37,10 @@ public class DataRefluxConfigServiceImpl implements DataRefluxConfigService {
@Resource
private DataRefluxConfigMapper dataRefluxConfigMapper;
@Resource
private ModelServiceMapper modelServiceMapper;
@Resource
private BaseModelMapper baseModelMapper;
@Override
public Long createDataRefluxConfig(DataRefluxConfigSaveReqVO createReqVO) {
@ -68,7 +81,30 @@ public class DataRefluxConfigServiceImpl implements DataRefluxConfigService {
@Override
public PageResult<DataRefluxConfigDO> getDataRefluxConfigPage(DataRefluxConfigPageReqVO pageReqVO) {
return dataRefluxConfigMapper.selectPage(pageReqVO);
LambdaQueryWrapper<ModelServiceDO> like = new LambdaQueryWrapper<ModelServiceDO>().like(ModelServiceDO::getServiceName, pageReqVO.getModelServiceName());
List<ModelServiceDO> modelServiceDOS = modelServiceMapper.selectList(like);
List<Long> collect = modelServiceDOS.stream().map(ModelServiceDO::getId).collect(Collectors.toList());
LambdaQueryWrapper<BaseModelDO> wrapper = new LambdaQueryWrapper<BaseModelDO>().like(BaseModelDO::getModelName, pageReqVO.getModelServiceName());
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(wrapper);
List<Long> collect1 = baseModelDOS.stream().map(BaseModelDO::getId).collect(Collectors.toList());
LambdaQueryWrapperX<DataRefluxConfigDO> wrapperX = new LambdaQueryWrapperX<DataRefluxConfigDO>()
.eqIfPresent(DataRefluxConfigDO::getModelServiceId, pageReqVO.getModelServiceId())
.betweenIfPresent(DataRefluxConfigDO::getCreateTime, pageReqVO.getCreateTime())
.orderByDesc(DataRefluxConfigDO::getId);
if (collect.size()==0&&collect1.size()==0&&pageReqVO.getModelServiceName()!=null){
return null;
}
if (ObjectUtil.isNotEmpty(collect) || ObjectUtil.isNotEmpty(collect1)) {
wrapperX.and(w -> {
if (ObjectUtil.isNotEmpty(collect)) {
w.or().in(DataRefluxConfigDO::getModelServiceId, collect).eq(DataRefluxConfigDO::getModelType, 0);
}
if (ObjectUtil.isNotEmpty(collect1)) {
w.or().in(DataRefluxConfigDO::getModelServiceId, collect1).eq(DataRefluxConfigDO::getModelType, 1);
}
});
}
return dataRefluxConfigMapper.selectPage(pageReqVO,wrapperX);
}
}
}

View File

@ -42,7 +42,7 @@ public interface FineTuningTaskService {
* @param id 编号
* @return 模型调优 微调任务
*/
FineTuningTaskDO getFineTuningTask(Long id);
FineTuningTaskRespVO getFineTuningTask(Long id);
/**
* 获得模型调优 微调任务分页
@ -52,4 +52,23 @@ public interface FineTuningTaskService {
*/
PageResult<FineTuningTaskDO> getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO);
/**
* 获得模型调优 微调任务分页
*
* @param pageReqVO 分页查询
* @return 模型调优 微调任务分页
*/
PageResult<FineTuningTaskRespVO> getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO);
/**
* 停止微调任务
* @param id
*/
void stopFineTuningTask(Long id);
/**
* 部署微调任务
* @param id
*/
void startFineTuningTask(Long id);
}

View File

@ -1,12 +1,21 @@
package cn.iocoder.yudao.module.llm.service.finetuningtask;
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -30,6 +39,10 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService {
@Resource
private FineTuningTaskMapper fineTuningTaskMapper;
@Resource
private BaseModelMapper baseModelMapper;
@Resource
private DatasetMapper datasetMapper;
@Override
public Long createFineTuningTask(FineTuningTaskSaveReqVO createReqVO) {
@ -68,12 +81,71 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService {
}
@Override
public FineTuningTaskDO getFineTuningTask(Long id) {
return fineTuningTaskMapper.selectById(id);
public FineTuningTaskRespVO getFineTuningTask(Long 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);
result.setDatasetName(datasetDO.getDatasetName());
}
Long baseModelId = fineTuningTaskDO.getBaseModelId();
if (baseModelId != null) {
BaseModelDO baseModelDO = baseModelMapper.selectById(baseModelId);
result.setBaseModelName(baseModelDO.getModelName());
}
return result;
}
@Override
public PageResult<FineTuningTaskRespVO> getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO) {
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskMapper.selectPage(pageReqVO);
PageResult<FineTuningTaskRespVO> result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class);
if (CollectionUtils.isNotEmpty(pageResult.getList())){
List<Long> modelIds = pageResult.getList().stream().map(FineTuningTaskDO::getBaseModelId).collect(Collectors.toList());
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper<BaseModelDO>()
.in(BaseModelDO::getId, modelIds));
Map<Long, BaseModelDO> 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){
item.setBaseModelName(baseModelDO.getModelName());
}
});
List<Long> dataSetlIds = pageResult.getList().stream().map(FineTuningTaskDO::getDataset).collect(Collectors.toList());
List<DatasetDO> datasetDOS = datasetMapper.selectList(new LambdaQueryWrapper<DatasetDO>().in(DatasetDO::getId, dataSetlIds));
Map<Long, DatasetDO> datasetDOMap = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(datasetDOS, DatasetDO::getId);
result.getList().forEach(item->{
DatasetDO datasetDO = datasetDOMap.get(item.getDataset());
if(datasetDO != null){
item.setDatasetName(datasetDO.getDatasetName());
}
});
}
return result;
}
/**
* 停止服务
* @param id
*/
@Override
public void stopFineTuningTask(Long id) {
fineTuningTaskMapper.stopStartTask(id,0);
}
@Override
public void startFineTuningTask(Long id) {
fineTuningTaskMapper.stopStartTask(id,1);
}
@Override
public PageResult<FineTuningTaskDO> getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO) {
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskMapper.selectPage(pageReqVO);
PageResult<FineTuningTaskRespVO> result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class);
return fineTuningTaskMapper.selectPage(pageReqVO);
}

View File

@ -5,11 +5,13 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties;
import cn.iocoder.yudao.module.llm.service.http.vo.*;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Slf4j
@Service
public class ModelService {
@ -44,7 +46,10 @@ public class ModelService {
if (StringUtils.isBlank(req.getModel())) {
req.setModel(DEFAULT_MODEL_ID);
}
log.info("url: {}", llmBackendProperties.getModelCompletions());
log.info("request: {}", req);
String result = HttpUtils.post(llmBackendProperties.getModelCompletions(), null, JSON.toJSONString(req));
log.info("response: {}", result);
if (StringUtils.isBlank(result)) {
return null;
}

View File

@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.llm.service.http.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class ModelCompletionsReqVO {
private String model;

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.llm.controller.admin.knowledgebase.vo.KnowledgeBa
import cn.iocoder.yudao.module.llm.dal.dataobject.knowledgebase.KnowledgeBaseDO;
import javax.validation.Valid;
import java.util.List;
/**
* 知识库 Service 接口
@ -52,4 +53,5 @@ public interface KnowledgeBaseService {
*/
PageResult<KnowledgeBaseDO> getKnowledgeBasePage(KnowledgeBasePageReqVO pageReqVO);
List<KnowledgeBaseDO> getKnowledgeBaseList();
}

View File

@ -13,6 +13,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.KNOWLEDGE_BASE_NOT_EXISTS;
import javax.annotation.Resource;
import java.util.List;
/**
* 知识库 Service 实现类
@ -68,4 +69,9 @@ public class KnowledgeBaseServiceImpl implements KnowledgeBaseService {
return knowledgeBaseMapper.selectPage(pageReqVO);
}
@Override
public List<KnowledgeBaseDO> getKnowledgeBaseList() {
return knowledgeBaseMapper.selectList();
}
}

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import javax.validation.Valid;
import java.util.List;
/**
* 标签管理 Service 接口
@ -52,5 +53,7 @@ public interface LabelService {
* @return 标签管理分页
*/
PageResult<LabelDO> getLabelPage(LabelPageReqVO pageReqVO);
// 获取所有标签
List<LabelDO> getLabelList();
}

View File

@ -72,4 +72,9 @@ public class LabelServiceImpl implements LabelService {
return labelMapper.selectPage(pageReqVO);
}
@Override
public List<LabelDO> getLabelList() {
return labelMapper.selectList();
}
}

View File

@ -1,11 +1,17 @@
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@ExcelIgnoreUnannotated
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class UserStudentExcelVO {
@ExcelProperty("登录账号")

View File

@ -1,11 +1,17 @@
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@ExcelIgnoreUnannotated
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class UserTeacherExcelVO {
@ExcelProperty("登录账号")