Commit 68ed8cd6f839be4448b7d3044e9d8f2a1d95f9b3
1 parent
ecb50c65
【代码优化】AI:思维导入、写作的生成
Showing
3 changed files
with
45 additions
and
35 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
| ... | ... | @@ -111,7 +111,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { |
| 111 | 111 | AiChatMessageDO assistantMessage = createChatMessage(conversation.getId(), userMessage.getId(), model, |
| 112 | 112 | userId, conversation.getRoleId(), MessageType.ASSISTANT, "", sendReqVO.getUseContext()); |
| 113 | 113 | |
| 114 | - // 3.2 创建 chat 需要的 Prompt | |
| 114 | + // 3.2 构建 Prompt,并进行调用 | |
| 115 | 115 | Prompt prompt = buildPrompt(conversation, historyMessages, model, sendReqVO); |
| 116 | 116 | Flux<ChatResponse> streamResponse = chatModel.stream(prompt); |
| 117 | 117 | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/mindmap/AiMindMapServiceImpl.java
| ... | ... | @@ -32,13 +32,12 @@ import reactor.core.publisher.Flux; |
| 32 | 32 | |
| 33 | 33 | import java.util.ArrayList; |
| 34 | 34 | import java.util.List; |
| 35 | -import java.util.Objects; | |
| 36 | 35 | |
| 37 | 36 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; |
| 38 | 37 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 39 | 38 | |
| 40 | 39 | /** |
| 41 | - * AI 写作 Service 实现类 | |
| 40 | + * AI 思维导图 Service 实现类 | |
| 42 | 41 | * |
| 43 | 42 | * @author xiaoxin |
| 44 | 43 | */ |
| ... | ... | @@ -58,30 +57,28 @@ public class AiMindMapServiceImpl implements AiMindMapService { |
| 58 | 57 | |
| 59 | 58 | @Override |
| 60 | 59 | public Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId) { |
| 61 | - // 1 获取脑图模型 尝试获取思维导图助手角色,如果没有则使用默认模型 | |
| 62 | - AiChatRoleDO mindMapRole = CollUtil.getFirst(chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_MIND_MAP_ROLE.getName())); | |
| 60 | + // 1. 获取脑图模型。尝试获取思维导图助手角色,如果没有则使用默认模型 | |
| 61 | + AiChatRoleDO role = CollUtil.getFirst( | |
| 62 | + chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_MIND_MAP_ROLE.getName())); | |
| 63 | 63 | // 1.1 获取脑图执行模型 |
| 64 | - AiChatModelDO model = getModel(mindMapRole); | |
| 64 | + AiChatModelDO model = getModel(role); | |
| 65 | 65 | // 1.2 获取角色设定消息 |
| 66 | - String systemMessage = Objects.nonNull(mindMapRole) && StrUtil.isNotBlank(mindMapRole.getSystemMessage()) | |
| 67 | - ? mindMapRole.getSystemMessage() : AiChatRoleEnum.AI_MIND_MAP_ROLE.getSystemMessage(); | |
| 66 | + String systemMessage = role != null && StrUtil.isNotBlank(role.getSystemMessage()) | |
| 67 | + ? role.getSystemMessage() : AiChatRoleEnum.AI_MIND_MAP_ROLE.getSystemMessage(); | |
| 68 | 68 | // 1.3 校验平台 |
| 69 | 69 | AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform()); |
| 70 | 70 | ChatModel chatModel = apiKeyService.getChatModel(model.getKeyId()); |
| 71 | 71 | |
| 72 | - // 2 插入思维导图信息 | |
| 72 | + // 2. 插入思维导图信息 | |
| 73 | 73 | AiMindMapDO mindMapDO = BeanUtils.toBean(generateReqVO, AiMindMapDO.class, |
| 74 | 74 | mindMap -> mindMap.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform())); |
| 75 | 75 | mindMapMapper.insert(mindMapDO); |
| 76 | 76 | |
| 77 | - ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens()); | |
| 78 | - // 3.1 角色设定 | |
| 79 | - List<Message> chatMessages = buildMessages(generateReqVO, systemMessage); | |
| 80 | - // 3.3 构建提示词 | |
| 81 | - Prompt prompt = new Prompt(chatMessages, chatOptions); | |
| 82 | - | |
| 77 | + // 3.1 构建 Prompt,并进行调用 | |
| 78 | + Prompt prompt = buildPrompt(generateReqVO, model, systemMessage); | |
| 83 | 79 | Flux<ChatResponse> streamResponse = chatModel.stream(prompt); |
| 84 | - // 3.4 流式返回 | |
| 80 | + | |
| 81 | + // 3.2 流式返回 | |
| 85 | 82 | StringBuffer contentBuffer = new StringBuffer(); |
| 86 | 83 | return streamResponse.map(chunk -> { |
| 87 | 84 | String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; |
| ... | ... | @@ -102,24 +99,32 @@ public class AiMindMapServiceImpl implements AiMindMapService { |
| 102 | 99 | |
| 103 | 100 | } |
| 104 | 101 | |
| 102 | + private Prompt buildPrompt(AiMindMapGenerateReqVO generateReqVO, AiChatModelDO model, String systemMessage) { | |
| 103 | + // 1. 构建 message 列表 | |
| 104 | + List<Message> chatMessages = buildMessages(generateReqVO, systemMessage); | |
| 105 | + // 2. 构建 options 对象 | |
| 106 | + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform()); | |
| 107 | + ChatOptions options = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens()); | |
| 108 | + return new Prompt(chatMessages, options); | |
| 109 | + } | |
| 110 | + | |
| 105 | 111 | private static List<Message> buildMessages(AiMindMapGenerateReqVO generateReqVO, String systemMessage) { |
| 106 | 112 | List<Message> chatMessages = new ArrayList<>(); |
| 113 | + // 1. 角色设定 | |
| 107 | 114 | if (StrUtil.isNotBlank(systemMessage)) { |
| 108 | - // 1.1 角色设定 | |
| 109 | 115 | chatMessages.add(new SystemMessage(systemMessage)); |
| 110 | 116 | } |
| 111 | - // 1.2 用户输入 | |
| 117 | + // 2. 用户输入 | |
| 112 | 118 | chatMessages.add(new UserMessage(generateReqVO.getPrompt())); |
| 113 | 119 | return chatMessages; |
| 114 | 120 | } |
| 115 | 121 | |
| 116 | - // TODO 芋艿:这里脑图、写作都用到了,是不是可以抽哪里去 | |
| 117 | - private AiChatModelDO getModel(AiChatRoleDO chatRoleDO) { | |
| 122 | + private AiChatModelDO getModel(AiChatRoleDO role) { | |
| 118 | 123 | AiChatModelDO model = null; |
| 119 | - if (Objects.nonNull(chatRoleDO) && Objects.nonNull(chatRoleDO.getModelId())) { | |
| 120 | - model = chatModalService.getChatModel(chatRoleDO.getModelId()); | |
| 124 | + if (role != null && role.getModelId() != null) { | |
| 125 | + model = chatModalService.getChatModel(role.getModelId()); | |
| 121 | 126 | } |
| 122 | - if (Objects.isNull(model)) { | |
| 127 | + if (model != null) { | |
| 123 | 128 | model = chatModalService.getRequiredDefaultChatModel(); |
| 124 | 129 | } |
| 125 | 130 | Assert.notNull(model, "[AI] 获取不到模型"); | ... | ... |
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/write/AiWriteServiceImpl.java
| ... | ... | @@ -68,8 +68,9 @@ public class AiWriteServiceImpl implements AiWriteService { |
| 68 | 68 | |
| 69 | 69 | @Override |
| 70 | 70 | public Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId) { |
| 71 | - // 1 获取写作模型 尝试获取写作助手角色,没有则使用默认模型 | |
| 72 | - AiChatRoleDO writeRole = CollUtil.getFirst(chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_WRITE_ROLE.getName())); | |
| 71 | + // 1 获取写作模型。尝试获取写作助手角色,没有则使用默认模型 | |
| 72 | + AiChatRoleDO writeRole = CollUtil.getFirst( | |
| 73 | + chatRoleService.getChatRoleListByName(AiChatRoleEnum.AI_WRITE_ROLE.getName())); | |
| 73 | 74 | // 1.1 获取写作执行模型 |
| 74 | 75 | AiChatModelDO model = getModel(writeRole); |
| 75 | 76 | // 1.2 获取角色设定消息 |
| ... | ... | @@ -84,16 +85,11 @@ public class AiWriteServiceImpl implements AiWriteService { |
| 84 | 85 | write -> write.setUserId(userId).setPlatform(platform.getPlatform()).setModel(model.getModel())); |
| 85 | 86 | writeMapper.insert(writeDO); |
| 86 | 87 | |
| 87 | - // 3. 调用大模型,写作生成 | |
| 88 | - ChatOptions chatOptions = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens()); | |
| 89 | - // 3.1 构建消息列表 | |
| 90 | - List<Message> chatMessages = buildMessages(generateReqVO, systemMessage); | |
| 91 | - // 3.2 构建提示词 | |
| 92 | - Prompt prompt = new Prompt(chatMessages, chatOptions); | |
| 93 | - // 3.3 流式调用 | |
| 88 | + // 3.1 构建 Prompt,并进行调用 | |
| 89 | + Prompt prompt = buildPrompt(generateReqVO, model, systemMessage); | |
| 94 | 90 | Flux<ChatResponse> streamResponse = chatModel.stream(prompt); |
| 95 | 91 | |
| 96 | - // 4. 流式返回 | |
| 92 | + // 3.2 流式返回 | |
| 97 | 93 | StringBuffer contentBuffer = new StringBuffer(); |
| 98 | 94 | return streamResponse.map(chunk -> { |
| 99 | 95 | String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; |
| ... | ... | @@ -125,6 +121,15 @@ public class AiWriteServiceImpl implements AiWriteService { |
| 125 | 121 | return model; |
| 126 | 122 | } |
| 127 | 123 | |
| 124 | + private Prompt buildPrompt(AiWriteGenerateReqVO generateReqVO, AiChatModelDO model, String systemMessage) { | |
| 125 | + // 1. 构建 message 列表 | |
| 126 | + List<Message> chatMessages = buildMessages(generateReqVO, systemMessage); | |
| 127 | + // 2. 构建 options 对象 | |
| 128 | + AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform()); | |
| 129 | + ChatOptions options = AiUtils.buildChatOptions(platform, model.getModel(), model.getTemperature(), model.getMaxTokens()); | |
| 130 | + return new Prompt(chatMessages, options); | |
| 131 | + } | |
| 132 | + | |
| 128 | 133 | private List<Message> buildMessages(AiWriteGenerateReqVO generateReqVO, String systemMessage) { |
| 129 | 134 | List<Message> chatMessages = new ArrayList<>(); |
| 130 | 135 | if (StrUtil.isNotBlank(systemMessage)) { |
| ... | ... | @@ -132,11 +137,11 @@ public class AiWriteServiceImpl implements AiWriteService { |
| 132 | 137 | chatMessages.add(new SystemMessage(systemMessage)); |
| 133 | 138 | } |
| 134 | 139 | // 1.2 用户输入 |
| 135 | - chatMessages.add(new UserMessage(buildWritingPrompt(generateReqVO))); | |
| 140 | + chatMessages.add(new UserMessage(buildUserMessage(generateReqVO))); | |
| 136 | 141 | return chatMessages; |
| 137 | 142 | } |
| 138 | 143 | |
| 139 | - private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) { | |
| 144 | + private String buildUserMessage(AiWriteGenerateReqVO generateReqVO) { | |
| 140 | 145 | String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat()); |
| 141 | 146 | String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone()); |
| 142 | 147 | String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage()); | ... | ... |