Commit 4c21ae32fede299aeeca1d4297924514261fb3ff

Authored by YunaiV
1 parent f3a6ba83

【代码评审】AI:写作部分的建议

yudao-module-ai/yudao-module-ai-api/src/main/java/cn/iocoder/yudao/module/ai/enums/write/AiWriteTypeEnum.java
... ... @@ -32,7 +32,7 @@ public enum AiWriteTypeEnum implements IntArrayValuable {
32 32 /**
33 33 * 模版
34 34 */
35   - private final String template;
  35 + private final String prompt;
36 36  
37 37 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AiWriteTypeEnum::getType).toArray();
38 38  
... ...
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
... ... @@ -63,26 +63,26 @@ public class AiWriteServiceImpl implements AiWriteService {
63 63 // 1.1 获取写作模型 尝试获取写作助手角色,如果没有则使用默认模型
64 64 AiChatRoleDO writeRole = selectOneWriteRole();
65 65 AiChatModelDO model;
  66 + // TODO @xin:writeRole.getModelId 可能为空。所以,最好是先通过 chatRole 拿。如果它没拿到,通过 getRequiredDefaultChatModel 再拿。
66 67 if (Objects.nonNull(writeRole)) {
67 68 model = chatModalService.getChatModel(writeRole.getModelId());
68 69 } else {
69 70 model = chatModalService.getRequiredDefaultChatModel();
70 71 }
71   -
  72 + // 1.2 校验平台
72 73 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
73   -
74 74 StreamingChatModel chatModel = apiKeyService.getChatModel(model.getKeyId());
75 75  
76   - // 1.2 插入写作信息
  76 + // 2. 插入写作信息
77 77 AiWriteDO writeDO = BeanUtils.toBean(generateReqVO, AiWriteDO.class, e -> e.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
78 78 writeMapper.insert(writeDO);
79 79  
80   - // 2.1 构建提示词
  80 + // 3.1 构建提示词
81 81 ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens());
82 82 Prompt prompt = new Prompt(buildWritingPrompt(generateReqVO), chatOptions);
83 83 Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
84 84  
85   - // 2.2 流式返回
  85 + // 3.2 流式返回
86 86 StringBuffer contentBuffer = new StringBuffer();
87 87 return streamResponse.map(chunk -> {
88 88 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
... ... @@ -102,10 +102,13 @@ public class AiWriteServiceImpl implements AiWriteService {
102 102 }).onErrorResume(error -> Flux.just(error(ErrorCodeConstants.WRITE_STREAM_ERROR)));
103 103 }
104 104  
  105 + // TODO @xin:chatRoleService 增加一个 getChatRoleListByName;
105 106 private AiChatRoleDO selectOneWriteRole() {
106 107 AiChatRoleDO chatRoleDO = null;
  108 + // TODO @xin:"写作助手" 枚举下。
107 109 PageResult<AiChatRoleDO> writeRolePage = chatRoleService.getChatRolePage(new AiChatRolePageReqVO().setName("写作助手"));
108 110 List<AiChatRoleDO> list = writeRolePage.getList();
  111 + // TODO @xin:CollUtil.getFirst 简化下
109 112 if (CollUtil.isNotEmpty(list)) {
110 113 chatRoleDO = list.get(0);
111 114 }
... ... @@ -113,19 +116,19 @@ public class AiWriteServiceImpl implements AiWriteService {
113 116 }
114 117  
115 118 private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) {
  119 + // 校验写作类型是否合法
116 120 Integer type = generateReqVO.getType();
  121 + // TODO @xin:这里可以搞到 validator 的校验。InEnum
  122 + AiWriteTypeEnum.validateType(type);
117 123 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat());
118 124 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone());
119 125 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage());
120 126 String length = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LENGTH, generateReqVO.getLength());
121 127 String prompt = generateReqVO.getPrompt();
122   - // 校验写作类型是否合法
123   - AiWriteTypeEnum.validateType(type);
124   -
125 128 if (Objects.equals(type, AiWriteTypeEnum.WRITING.getType())) {
126   - return StrUtil.format(AiWriteTypeEnum.WRITING.getTemplate(), prompt, format, tone, language, length);
  129 + return StrUtil.format(AiWriteTypeEnum.WRITING.getPrompt(), prompt, format, tone, language, length);
127 130 } else {
128   - return StrUtil.format(AiWriteTypeEnum.REPLY.getTemplate(), generateReqVO.getOriginalContent(), prompt, format, tone, language, length);
  131 + return StrUtil.format(AiWriteTypeEnum.REPLY.getPrompt(), generateReqVO.getOriginalContent(), prompt, format, tone, language, length);
129 132 }
130 133 }
131 134  
... ...
yudao-module-ai/yudao-spring-boot-starter-ai/src/test/java/cn/iocoder/yudao/framework/ai/image/TongYiImagesModelTests.java
... ... @@ -10,15 +10,16 @@ import org.junit.jupiter.api.Test;
10 10  
11 11 import java.util.Map;
12 12  
  13 +// TODO @fan:改成 TongYiImagesModel 哈
13 14 /**
14   - * 通义万象 - 测试
  15 + * 通义万象
15 16 */
16 17 public class TongYiImagesModelTests {
17 18  
18 19 @Test
19 20 public void imageCallTest() throws NoApiKeyException {
20 21 // 设置 api key
21   - Constants.apiKey="sk-Zsd81gZYg7";
  22 + Constants.apiKey = "sk-Zsd81gZYg7";
22 23 ImageSynthesisParam param =
23 24 ImageSynthesisParam.builder()
24 25 .model(ImageSynthesis.Models.WANX_V1)
... ...