From 7a66a435f936c4c6e2cfc5cd78b94ea0361ee110 Mon Sep 17 00:00:00 2001 From: xiaoxin <718949661@qq.com> Date: Fri, 28 Jun 2024 09:51:56 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=A2=9E=E5=8A=A0=E3=80=91AI=EF=BC=9A?= =?UTF-8?q?=E5=86=99=E4=BD=9C=E6=A8=A1=E7=89=88=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/write/AiWriteController.java | 9 +++-- .../admin/write/vo/AiWriteGenerateReqVO.java | 39 +++++++++++++++++++ .../ai/service/write/AiWriteService.java | 3 +- .../ai/service/write/AiWriteServiceImpl.java | 17 +++++++- 4 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java index e090aaf2d..d229ba267 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java @@ -1,13 +1,16 @@ package cn.iocoder.yudao.module.ai.controller.admin.write; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; import cn.iocoder.yudao.module.ai.service.write.AiWriteService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; +import jakarta.validation.Valid; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @@ -22,8 +25,8 @@ public class AiWriteController { @PostMapping(value = "/generate-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) @PermitAll - @Operation(summary = "作文生产(流式)", description = "流式返回,响应较快") - public Flux> generateComposition() { - return writeService.generateComposition(); + @Operation(summary = "写作生成(流式)", description = "流式返回,响应较快") + public Flux> generateComposition(@RequestBody @Valid AiWriteGenerateReqVO generateReqVO) { + return writeService.generateComposition(generateReqVO); } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java new file mode 100644 index 000000000..396c0b8ca --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.ai.controller.admin.write.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Schema(description = "管理后台 - AI 写作生成 Request VO") +@Data +public class AiWriteGenerateReqVO { + + @Schema(description = "写作内容", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "田忌赛马") + private String content; + + @Schema(description = "原文", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "领导我要辞职") + private String originalContent; + + @Schema(description = "回复内容", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "准了") + private String replyContent; + + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "中等") + @NotBlank(message = "长度不能为空") + private String length; + + @Schema(description = "格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "文章") + @NotBlank(message = "格式不能为空") + private String format; + + @Schema(description = "语气", requiredMode = Schema.RequiredMode.REQUIRED, example = "随意") + @NotBlank(message = "语气不能为空") + private String tone; + + @Schema(description = "语言", requiredMode = Schema.RequiredMode.REQUIRED, example = "中文") + @NotBlank(message = "语言不能为空") + private String language; + + + @Schema(description = "写作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer writeType; +} \ No newline at end of file diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteService.java index 94a92dbb8..f8fb0634c 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteService.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.ai.service.write; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; import reactor.core.publisher.Flux; /** @@ -11,7 +12,7 @@ import reactor.core.publisher.Flux; public interface AiWriteService { - Flux> generateComposition(); + Flux> generateComposition(AiWriteGenerateReqVO generateReqVO); } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java index 241c177c2..63d2d6192 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoChatModel; import cn.iocoder.yudao.framework.ai.core.model.xinghuo.XingHuoOptions; import cn.iocoder.yudao.framework.ai.core.model.yiyan.YiYanChatOptions; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.ai.controller.admin.write.vo.AiWriteGenerateReqVO; import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService; import jakarta.annotation.Resource; @@ -37,11 +38,11 @@ public class AiWriteServiceImpl implements AiWriteService { @Override - public Flux> generateComposition() { + public Flux> generateComposition(AiWriteGenerateReqVO generateReqVO) { StreamingChatClient chatClient = apiKeyService.getStreamingChatClient(6L); AiPlatformEnum platform = AiPlatformEnum.validatePlatform("QianWen"); ChatOptions chatOptions = buildChatOptions(platform, "qwen-72b-chat", 1.0, 1000); - Prompt prompt = new Prompt("请直接写一篇关于 气候变化 的文章,格式为自动,语气为自动,语言为自动,长度为自动。请确保涵盖主要观点,不需要标题,不需要任何额外的解释或道歉。", chatOptions); + Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions); Flux streamResponse = chatClient.stream(prompt); // 3.3 流式返回 StringBuffer contentBuffer = new StringBuffer(); @@ -54,11 +55,23 @@ public class AiWriteServiceImpl implements AiWriteService { }).doOnComplete(() -> { log.info("generateComposition complete, content: {}", contentBuffer); }).onErrorResume(error -> { + log.error("[AI 写作] 发生异常", error); return Flux.just(error(ErrorCodeConstants.AI_CHAT_STREAM_ERROR)); }); } + private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) { + String template = "请直接写一篇关于 [{}] 的文章,格式为:{},语气为:{},语言为:{},长度为:{}。请确保涵盖主要内容,不需要任何额外的解释或道歉。"; + String content = generateReqVO.getContent(); + String format = generateReqVO.getFormat(); + String tone = generateReqVO.getTone(); + String language = generateReqVO.getLanguage(); + String length = generateReqVO.getLength(); + return StrUtil.format(template, content, format, tone, language, length); + } + + // TODO 芋艿:复用 private static ChatOptions buildChatOptions(AiPlatformEnum platform, String model, Double temperature, Integer maxTokens) { Float temperatureF = temperature != null ? temperature.floatValue() : null; //noinspection EnhancedSwitchMigration