Commit 4c21ae32fede299aeeca1d4297924514261fb3ff
1 parent
f3a6ba83
【代码评审】AI:写作部分的建议
Showing
3 changed files
with
17 additions
and
13 deletions
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) | ... | ... |