Commit 6dfbfe51679b0e70a0142a177a943d7bbd329a08

Authored by xiaoxin
1 parent b80a76d1

【优化】AI 写作:格式、语气、语言等抽枚举

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiLanguageEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.enums.write;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +@AllArgsConstructor
  10 +@Getter
  11 +public enum AiLanguageEnum implements IntArrayValuable {
  12 +
  13 + AUTO(1, "自动"),
  14 + CHINESE(2, "中文"),
  15 + ENGLISH(3, "英文"),
  16 + KOREAN(4, "韩语"),
  17 + JAPANESE(5, "日语");
  18 +
  19 + /**
  20 + * Language code
  21 + */
  22 + private final Integer language;
  23 + /**
  24 + * Language name
  25 + */
  26 + private final String name;
  27 +
  28 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiLanguageEnum::getLanguage).toArray();
  29 +
  30 + @Override
  31 + public int[] array() {
  32 + return ARRAYS;
  33 + }
  34 +
  35 + public static AiLanguageEnum valueOfLanguage(Integer language) {
  36 + for (AiLanguageEnum languageEnum : AiLanguageEnum.values()) {
  37 + if (languageEnum.getLanguage().equals(language)) {
  38 + return languageEnum;
  39 + }
  40 + }
  41 + throw new IllegalArgumentException("未知语言: " + language);
  42 + }
  43 +
  44 +}
0 45 \ No newline at end of file
... ...
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteFormatEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.enums.write;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * AI 写作类型的枚举
  11 + *
  12 + * @author xiaoxin
  13 + */
  14 +@AllArgsConstructor
  15 +@Getter
  16 +public enum AiWriteFormatEnum implements IntArrayValuable {
  17 +
  18 + AUTO(1, "自动"),
  19 + EMAIL(2, "电子邮件"),
  20 + MESSAGE(3, "消息"),
  21 + COMMENT(4, "评论"),
  22 + PARAGRAPH(5, "段落"),
  23 + ARTICLE(6, "文章"),
  24 + BLOG_POST(7, "博客文章"),
  25 + IDEA(8, "想法"),
  26 + OUTLINE(9, "大纲");
  27 +
  28 + /**
  29 + * 格式
  30 + */
  31 + private final Integer format;
  32 + /**
  33 + * 格式名
  34 + */
  35 + private final String name;
  36 +
  37 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteFormatEnum::getFormat).toArray();
  38 +
  39 + @Override
  40 + public int[] array() {
  41 + return ARRAYS;
  42 + }
  43 +
  44 + public static AiWriteFormatEnum valueOfFormat(Integer format) {
  45 + for (AiWriteFormatEnum formatEnum : AiWriteFormatEnum.values()) {
  46 + if (formatEnum.getFormat().equals(format)) {
  47 + return formatEnum;
  48 + }
  49 + }
  50 + throw new IllegalArgumentException("未知格式: " + format);
  51 + }
  52 +
  53 +}
... ...
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteLengthEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.enums.write;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * AI 写作类型的枚举
  11 + *
  12 + * @author xiaoxin
  13 + */
  14 +@AllArgsConstructor
  15 +@Getter
  16 +public enum AiWriteLengthEnum implements IntArrayValuable {
  17 +
  18 + AUTO(1, "自动"),
  19 + SHORT(2, "短"),
  20 + MEDIUM(3, "中"),
  21 + LONG(4, "长");
  22 +
  23 + /**
  24 + * 长度
  25 + */
  26 + private final Integer length;
  27 + /**
  28 + * 长度名
  29 + */
  30 + private final String name;
  31 +
  32 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteLengthEnum::getLength).toArray();
  33 +
  34 + @Override
  35 + public int[] array() {
  36 + return ARRAYS;
  37 + }
  38 +
  39 + public static AiWriteLengthEnum valueOfLength(Integer length) {
  40 + for (AiWriteLengthEnum lengthEnum : AiWriteLengthEnum.values()) {
  41 + if (lengthEnum.getLength().equals(length)) {
  42 + return lengthEnum;
  43 + }
  44 + }
  45 + throw new IllegalArgumentException("未知长度: " + length);
  46 + }
  47 +}
... ...
yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteToneEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.ai.enums.write;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +@AllArgsConstructor
  10 +@Getter
  11 +public enum AiWriteToneEnum implements IntArrayValuable {
  12 +
  13 + AUTO(1, "自动"),
  14 + FRIENDLY(2, "友善"),
  15 + CASUAL(3, "随意"),
  16 + KIND(4, "友好"),
  17 + PROFESSIONAL(5, "专业"),
  18 + HUMOROUS(6, "谈谐"),
  19 + INTERESTING(7, "有趣"),
  20 + FORMAL(8, "正式");
  21 +
  22 + /**
  23 + * 语气
  24 + */
  25 + private final Integer tone;
  26 + /**
  27 + * 语气名
  28 + */
  29 + private final String name;
  30 +
  31 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteToneEnum::getTone).toArray();
  32 +
  33 + @Override
  34 + public int[] array() {
  35 + return ARRAYS;
  36 + }
  37 +
  38 + public static AiWriteToneEnum valueOfTone(Integer tone) {
  39 + for (AiWriteToneEnum toneEnum : AiWriteToneEnum.values()) {
  40 + if (toneEnum.getTone().equals(tone)) {
  41 + return toneEnum;
  42 + }
  43 + }
  44 + throw new IllegalArgumentException("未知语气: " + tone);
  45 + }
  46 +}
0 47 \ No newline at end of file
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/AiWriteController.java
... ... @@ -28,7 +28,7 @@ public class AiWriteController {
28 28 @PostMapping(value = "/generate-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
29 29 @PermitAll
30 30 @Operation(summary = "写作生成(流式)", description = "流式返回,响应较快")
31   - public Flux<CommonResult<String>> generateComposition(@RequestBody @Valid AiWriteGenerateReqVO generateReqVO) {
  31 + public Flux<CommonResult<String>> generateWriteContent(@RequestBody @Valid AiWriteGenerateReqVO generateReqVO) {
32 32 return writeService.generateWriteContent(generateReqVO, getLoginUserId());
33 33 }
34 34 }
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/write/vo/AiWriteGenerateReqVO.java
1 1 package cn.iocoder.yudao.module.ai.controller.admin.write.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4   -import jakarta.validation.constraints.NotBlank;
  4 +import jakarta.validation.constraints.NotNull;
5 5 import lombok.Data;
6 6  
7 7 @Schema(description = "管理后台 - AI 写作生成 Request VO")
8 8 @Data
9 9 public class AiWriteGenerateReqVO {
10 10  
11   - @Schema(description = "写作内容提示", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "田忌赛马")
12   - private String contentPrompt;
  11 + @Schema(description = "写作内容提示", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1.撰写:田忌赛马;2.回复:不批")
  12 + private String prompt;
13 13  
14 14 @Schema(description = "原文", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "领导我要辞职")
15 15 private String originalContent;
16 16  
17   - @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "中等")
18   - @NotBlank(message = "长度不能为空")
19   - private String length;
  17 + @Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  18 + @NotNull(message = "长度不能为空")
  19 + private Integer length;
20 20  
21   - @Schema(description = "格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "文章")
22   - @NotBlank(message = "格式不能为空")
23   - private String format;
  21 + @Schema(description = "格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + @NotNull(message = "格式不能为空")
  23 + private Integer format;
24 24  
25   - @Schema(description = "语气", requiredMode = Schema.RequiredMode.REQUIRED, example = "随意")
26   - @NotBlank(message = "语气不能为空")
27   - private String tone;
  25 + @Schema(description = "语气", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  26 + @NotNull(message = "语气不能为空")
  27 + private Integer tone;
28 28  
29   - @Schema(description = "语言", requiredMode = Schema.RequiredMode.REQUIRED, example = "中文")
30   - @NotBlank(message = "语言不能为空")
31   - private String language;
  29 + @Schema(description = "语言", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  30 + @NotNull(message = "语言不能为空")
  31 + private Integer language;
32 32  
33 33  
34 34 @Schema(description = "写作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
35   - private Integer writeType; //参见 AiWriteTypeEnum 枚举
  35 + private Integer type; //参见 AiWriteTypeEnum 枚举
36 36 }
37 37 \ No newline at end of file
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/write/AiWriteDO.java
... ... @@ -32,12 +32,12 @@ public class AiWriteDO extends BaseDO {
32 32 * <p>
33 33 * 枚举 {@link AiWriteTypeEnum}
34 34 */
35   - private Integer writeType;
  35 + private Integer type;
36 36  
37 37 /**
38 38 * 生成内容提示
39 39 */
40   - private String contentPrompt;
  40 + private String prompt;
41 41  
42 42 /**
43 43 * 生成的内容
... ... @@ -52,22 +52,22 @@ public class AiWriteDO extends BaseDO {
52 52 /**
53 53 * 长度提示词
54 54 */
55   - private String length;
  55 + private Integer length;
56 56  
57 57 /**
58 58 * 格式提示词
59 59 */
60   - private String format;
  60 + private Integer format;
61 61  
62 62 /**
63 63 * 语气提示词
64 64 */
65   - private String tone;
  65 + private Integer tone;
66 66  
67 67 /**
68 68 * 语言提示词
69 69 */
70   - private String language;
  70 + private Integer language;
71 71  
72 72 /**
73 73 * 模型
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
... ... @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
11 11 import cn.iocoder.yudao.module.ai.dal.dataobject.write.AiWriteDO;
12 12 import cn.iocoder.yudao.module.ai.dal.mysql.write.AiWriteMapper;
13 13 import cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants;
14   -import cn.iocoder.yudao.module.ai.enums.write.AiWriteTypeEnum;
  14 +import cn.iocoder.yudao.module.ai.enums.write.*;
15 15 import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;
16 16 import cn.iocoder.yudao.module.ai.service.model.AiChatModelService;
17 17 import com.alibaba.cloud.ai.tongyi.chat.TongYiChatOptions;
... ... @@ -84,17 +84,17 @@ public class AiWriteServiceImpl implements AiWriteService {
84 84  
85 85 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
86 86 String template;
87   - Integer writeType = generateReqVO.getWriteType();
88   - String format = generateReqVO.getFormat();
89   - String tone = generateReqVO.getTone();
90   - String language = generateReqVO.getLanguage();
91   - String length = generateReqVO.getLength();
  87 + Integer writeType = generateReqVO.getType();
  88 + String format = AiWriteFormatEnum.valueOfFormat(generateReqVO.getFormat()).getName();
  89 + String tone = AiWriteToneEnum.valueOfTone(generateReqVO.getTone()).getName();
  90 + String language = AiLanguageEnum.valueOfLanguage(generateReqVO.getLanguage()).getName();
  91 + String length = AiWriteLengthEnum.valueOfLength(generateReqVO.getLength()).getName();
92 92 if (Objects.equals(writeType, AiWriteTypeEnum.WRITING.getType())) {
93 93 template = "请撰写一篇关于 [{}] 的文章。文章的内容格式为:[{}],语气为:[{}],语言为:[{}],长度为:[{}]。请确保涵盖主要内容,不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。";
94   - return StrUtil.format(template, generateReqVO.getContentPrompt(), format, tone, language, length);
  94 + return StrUtil.format(template, generateReqVO.getPrompt(), format, tone, language, length);
95 95 } else if (Objects.equals(writeType, AiWriteTypeEnum.REPLY.getType())) {
96 96 template = "请针对如下内容:[{}] 做个回复。回复内容参考:[{}], 回复的内容格式为:[{}],语气为:[{}],语言为:[{}],长度为:[{}]。不需要除了正文内容外的其他回复,如标题、额外的解释或道歉。";
97   - return StrUtil.format(template, generateReqVO.getOriginalContent(), generateReqVO.getContentPrompt(), format, tone, language, length);
  97 + return StrUtil.format(template, generateReqVO.getOriginalContent(), generateReqVO.getPrompt(), format, tone, language, length);
98 98 } else {
99 99 throw new IllegalArgumentException(StrUtil.format("未知写作类型({})", writeType));
100 100 }
... ...