diff --git a/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java b/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java index fb622efdc..830b6bc0e 100644 --- a/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java +++ b/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java @@ -71,4 +71,6 @@ public interface ErrorCodeConstants { ErrorCode TRAINING_NOT_EXISTS = new ErrorCode(10029, "训练不存在"); + ErrorCode MODEL_COMPLETIONS_ERROR = new ErrorCode(10030, "模型推理失败"); + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/BaseModelController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/BaseModelController.java index b6ad1fc87..80bdc5e9a 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/BaseModelController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/BaseModelController.java @@ -42,7 +42,7 @@ public class BaseModelController { @PostMapping("/create") @Operation(summary = "创建基座模型") @PreAuthorize("@ss.hasPermission('llm:base-model:create')") - public CommonResult createBaseModel(@Valid @RequestBody BaseModelSaveReqVO createReqVO) { + public CommonResult 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 deleteBaseModel(@RequestParam("id") Integer id) { + public CommonResult 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 getBaseModel(@RequestParam("id") Integer id) { + public CommonResult 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 getParamModel(@RequestParam("id") Integer id) { + public CommonResult getParamModel(@RequestParam("id") Long id) { BaseModelDO baseModel = baseModelService.getBaseModel(id); //todo 获取参数模板api return success(new JSONObject()); diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelRespVO.java index 2548afe2f..bee7504be 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelRespVO.java @@ -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("基座模型名称") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelSaveReqVO.java index 1869d9fe5..b74ed30cb 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/basemodel/vo/BaseModelSaveReqVO.java @@ -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 = "基座模型名称不能为空") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/ConversationController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/ConversationController.java index 2096f9a2e..787c34b61 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/ConversationController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/ConversationController.java @@ -92,4 +92,9 @@ public class ConversationController { BeanUtils.toBean(list, ConversationRespVO.class)); } + @PostMapping("/chat") + @Operation(summary = "对话推理接口") + public CommonResult chat(@Valid @RequestBody ChatReqVO chatReqVO) { + return success(conversationService.chat(chatReqVO)); + } } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatReqVO.java new file mode 100644 index 000000000..bb578fb9d --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatReqVO.java @@ -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; +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatRespVO.java new file mode 100644 index 000000000..ec42463e8 --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/conversation/vo/ChatRespVO.java @@ -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; + +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/DataRefluxConfigController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/DataRefluxConfigController.java index 91fc353cf..6926d5e7e 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/DataRefluxConfigController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/DataRefluxConfigController.java @@ -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 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> getDataRefluxConfigPage(@Valid DataRefluxConfigPageReqVO pageReqVO) { PageResult pageResult = dataRefluxConfigService.getDataRefluxConfigPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DataRefluxConfigRespVO.class)); + if (pageResult==null){ + return success(PageResult.empty()); + } + PageResult 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 result = bean.setList(bean.getList()); + return success(bean); } @GetMapping("/export-excel") @@ -92,4 +117,4 @@ public class DataRefluxConfigController { BeanUtils.toBean(list, DataRefluxConfigRespVO.class)); } -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigPageReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigPageReqVO.java index 617a1462a..de6faffdc 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigPageReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigPageReqVO.java @@ -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; -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigRespVO.java index f08891ddd..954bc0905 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigRespVO.java @@ -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; -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigSaveReqVO.java index 875e07013..fba877293 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxconfig/vo/DataRefluxConfigSaveReqVO.java @@ -16,4 +16,7 @@ public class DataRefluxConfigSaveReqVO { @NotNull(message = "模型服务ID不能为空") private Long modelServiceId; -} \ No newline at end of file + @Schema(description = "是否预知模型(0普通 1官方)", example = "0") + private Long modelType; + +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxdata/vo/DataRefluxDataSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxdata/vo/DataRefluxDataSaveReqVO.java index 20ad5ac6d..2487aa32d 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxdata/vo/DataRefluxDataSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/datarefluxdata/vo/DataRefluxDataSaveReqVO.java @@ -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; -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/FineTuningTaskController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/FineTuningTaskController.java index 2493865d6..5ca6bcfa2 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/FineTuningTaskController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/FineTuningTaskController.java @@ -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 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 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 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> getFineTuningTaskPage(@Valid FineTuningTaskPageReqVO pageReqVO) { - PageResult pageResult = fineTuningTaskService.getFineTuningTaskPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class)); + PageResult pageResult = fineTuningTaskService.getFineTuningTaskPage1(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskPageReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskPageReqVO.java index 3b4825541..5ba229950 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskPageReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskPageReqVO.java @@ -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; + } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskRespVO.java index 79715a93c..8c1b0a17a 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskRespVO.java @@ -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; } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskSaveReqVO.java index 5d2351216..b1882c981 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/finetuningtask/vo/FineTuningTaskSaveReqVO.java @@ -83,4 +83,7 @@ public class FineTuningTaskSaveReqVO { @NotNull(message = "状态,使用字典(llm_fine_tuning_task_status)不能为空") private Integer status; + @Schema(description = "基础模型服务Id") + private Long baseModelId; + } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/knowledgebase/KnowledgeBaseController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/knowledgebase/KnowledgeBaseController.java index 670b99494..f899e3cdb 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/knowledgebase/KnowledgeBaseController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/knowledgebase/KnowledgeBaseController.java @@ -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> getKnowledgeBaseList() { + List list = knowledgeBaseService.getKnowledgeBaseList(); + return success(BeanUtils.toBean(list, KnowledgeBaseRespVO.class)); + } + @GetMapping("/export-excel") @Operation(summary = "导出知识库 Excel") @PreAuthorize("@ss.hasPermission('llm:knowledge-base:export')") diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/label/LabelController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/label/LabelController.java index 5514823eb..51a43e944 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/label/LabelController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/label/LabelController.java @@ -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> getLabelList() { + List 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 list = labelService.getLabelPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "标签管理.xls", "数据", LabelRespVO.class, - BeanUtils.toBean(list, LabelRespVO.class)); + BeanUtils.toBean(list, LabelRespVO.class)); } } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/basemodel/BaseModelDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/basemodel/BaseModelDO.java index 51173b741..e8e51db1e 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/basemodel/BaseModelDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/basemodel/BaseModelDO.java @@ -26,7 +26,7 @@ public class BaseModelDO extends BaseDO { * 基座模型唯一标识 */ @TableId - private Integer id; + private Long id; /** * 基座模型名称 */ diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxconfig/DataRefluxConfigDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxconfig/DataRefluxConfigDO.java index 19afb8860..6115dc382 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxconfig/DataRefluxConfigDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxconfig/DataRefluxConfigDO.java @@ -31,5 +31,9 @@ public class DataRefluxConfigDO extends BaseDO { * 模型服务ID */ private Long modelServiceId; + /** + * 是否预知模型(0普通 1官方) + */ + private Long modelType; -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxdata/DataRefluxDataDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxdata/DataRefluxDataDO.java index caf4a36bb..243bfe8b8 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxdata/DataRefluxDataDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/datarefluxdata/DataRefluxDataDO.java @@ -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; -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/finetuningtask/FineTuningTaskDO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/finetuningtask/FineTuningTaskDO.java index 285522672..a81012d64 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/finetuningtask/FineTuningTaskDO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/dataobject/finetuningtask/FineTuningTaskDO.java @@ -135,5 +135,9 @@ public class FineTuningTaskDO extends BaseDO { * 枚举 {@link TODO llm_fine_tuning_task_status 对应的类} */ private Integer status; + /** + * 基础服务模型Id + */ + private Long baseModelId; } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/mysql/finetuningtask/FineTuningTaskMapper.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/mysql/finetuningtask/FineTuningTaskMapper.java index a523745e2..9606cf6f6 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/mysql/finetuningtask/FineTuningTaskMapper.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/dal/mysql/finetuningtask/FineTuningTaskMapper.java @@ -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 { .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); } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelService.java index 8eec53a09..a80d41e83 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/basemodel/BaseModelService.java @@ -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); /** * 获得基座模型分页 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 a98823cc5..867c83795 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 @@ -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 getBaseModelList() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(BaseModelDO::getIsActive,0); + queryWrapper.eq(BaseModelDO::getIsActive,1); List baseModelDOS = baseModelMapper.selectList(queryWrapper); return baseModelDOS; } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationService.java index f1cdabc6b..2e3072cb8 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationService.java @@ -52,4 +52,5 @@ public interface ConversationService { */ PageResult getConversationPage(ConversationPageReqVO pageReqVO); + ChatRespVO chat(@Valid ChatReqVO chatReqVO); } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java index 294aa64f4..2ce9801be 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/conversation/ConversationServiceImpl.java @@ -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 messageHistoryList = stringRedisTemplate.opsForList().range(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, -1); + List 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; + } } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/datarefluxconfig/DataRefluxConfigServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/datarefluxconfig/DataRefluxConfigServiceImpl.java index 783f4e52e..efa80d1cc 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/datarefluxconfig/DataRefluxConfigServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/datarefluxconfig/DataRefluxConfigServiceImpl.java @@ -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 getDataRefluxConfigPage(DataRefluxConfigPageReqVO pageReqVO) { - return dataRefluxConfigMapper.selectPage(pageReqVO); + LambdaQueryWrapper like = new LambdaQueryWrapper().like(ModelServiceDO::getServiceName, pageReqVO.getModelServiceName()); + List modelServiceDOS = modelServiceMapper.selectList(like); + List collect = modelServiceDOS.stream().map(ModelServiceDO::getId).collect(Collectors.toList()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper().like(BaseModelDO::getModelName, pageReqVO.getModelServiceName()); + List baseModelDOS = baseModelMapper.selectList(wrapper); + List collect1 = baseModelDOS.stream().map(BaseModelDO::getId).collect(Collectors.toList()); + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX() + .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); } -} \ No newline at end of file +} diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskService.java index a22778013..87c3d2ee1 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/finetuningtask/FineTuningTaskService.java @@ -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 getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO); + /** + * 获得模型调优 —— 微调任务分页 + * + * @param pageReqVO 分页查询 + * @return 模型调优 —— 微调任务分页 + */ + PageResult getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO); + + /** + * 停止微调任务 + * @param id + */ + void stopFineTuningTask(Long id); + + /** + * 部署微调任务 + * @param id + */ + void startFineTuningTask(Long id); } \ No newline at end of file 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 8a6e09dbd..e4ffc1047 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,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 getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO) { + PageResult pageResult = fineTuningTaskMapper.selectPage(pageReqVO); + PageResult result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class); + 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){ + item.setBaseModelName(baseModelDO.getModelName()); + } + }); + List dataSetlIds = pageResult.getList().stream().map(FineTuningTaskDO::getDataset).collect(Collectors.toList()); + 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->{ + 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 getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO) { + PageResult pageResult = fineTuningTaskMapper.selectPage(pageReqVO); + PageResult result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class); + return fineTuningTaskMapper.selectPage(pageReqVO); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java index 7c58519c4..a34b67822 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/ModelService.java @@ -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; } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/ModelCompletionsReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/ModelCompletionsReqVO.java index f6699f867..74f813ceb 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/ModelCompletionsReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/http/vo/ModelCompletionsReqVO.java @@ -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; diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseService.java index 9ca89f434..fc42f4bd5 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseService.java @@ -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 getKnowledgeBasePage(KnowledgeBasePageReqVO pageReqVO); + List getKnowledgeBaseList(); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java index 2b630103e..c2d7e0a45 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/knowledgebase/KnowledgeBaseServiceImpl.java @@ -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 getKnowledgeBaseList() { + return knowledgeBaseMapper.selectList(); + } + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelService.java index d3b49d779..f599dae6d 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelService.java @@ -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 getLabelPage(LabelPageReqVO pageReqVO); + // 获取所有标签 + List getLabelList(); } \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelServiceImpl.java index 821e63023..825629fe6 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/label/LabelServiceImpl.java @@ -72,4 +72,9 @@ public class LabelServiceImpl implements LabelService { return labelMapper.selectPage(pageReqVO); } + @Override + public List getLabelList() { + return labelMapper.selectList(); + } + } \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java index bd8f24b05..807500c9a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java @@ -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("登录账号") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java index 4a3986fb1..7f3d2ef11 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java @@ -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("登录账号")