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