Commit 68ed8cd6f839be4448b7d3044e9d8f2a1d95f9b3

Authored by YunaiV
1 parent ecb50c65

【代码优化】AI:思维导入、写作的生成

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,7 +111,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
111 AiChatMessageDO assistantMessage = createChatMessage(conversation.getId(), userMessage.getId(), model, 111 AiChatMessageDO assistantMessage = createChatMessage(conversation.getId(), userMessage.getId(), model,
112 userId, conversation.getRoleId(), MessageType.ASSISTANT, "", sendReqVO.getUseContext()); 112 userId, conversation.getRoleId(), MessageType.ASSISTANT, "", sendReqVO.getUseContext());
113 113
114 - // 3.2 创建 chat 需要的 Prompt 114 + // 3.2 构建 Prompt,并进行调用
115 Prompt prompt = buildPrompt(conversation, historyMessages, model, sendReqVO); 115 Prompt prompt = buildPrompt(conversation, historyMessages, model, sendReqVO);
116 Flux<ChatResponse> streamResponse = chatModel.stream(prompt); 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,13 +32,12 @@ import reactor.core.publisher.Flux;
32 32
33 import java.util.ArrayList; 33 import java.util.ArrayList;
34 import java.util.List; 34 import java.util.List;
35 -import java.util.Objects;  
36 35
37 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; 36 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
38 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 37 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
39 38
40 /** 39 /**
41 - * AI 写作 Service 实现类 40 + * AI 思维导图 Service 实现类
42 * 41 *
43 * @author xiaoxin 42 * @author xiaoxin
44 */ 43 */
@@ -58,30 +57,28 @@ public class AiMindMapServiceImpl implements AiMindMapService { @@ -58,30 +57,28 @@ public class AiMindMapServiceImpl implements AiMindMapService {
58 57
59 @Override 58 @Override
60 public Flux<CommonResult<String>> generateMindMap(AiMindMapGenerateReqVO generateReqVO, Long userId) { 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 // 1.1 获取脑图执行模型 63 // 1.1 获取脑图执行模型
64 - AiChatModelDO model = getModel(mindMapRole); 64 + AiChatModelDO model = getModel(role);
65 // 1.2 获取角色设定消息 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 // 1.3 校验平台 68 // 1.3 校验平台
69 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform()); 69 AiPlatformEnum platform = AiPlatformEnum.validatePlatform(model.getPlatform());
70 ChatModel chatModel = apiKeyService.getChatModel(model.getKeyId()); 70 ChatModel chatModel = apiKeyService.getChatModel(model.getKeyId());
71 71
72 - // 2 插入思维导图信息 72 + // 2. 插入思维导图信息
73 AiMindMapDO mindMapDO = BeanUtils.toBean(generateReqVO, AiMindMapDO.class, 73 AiMindMapDO mindMapDO = BeanUtils.toBean(generateReqVO, AiMindMapDO.class,
74 mindMap -> mindMap.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform())); 74 mindMap -> mindMap.setUserId(userId).setModel(model.getModel()).setPlatform(platform.getPlatform()));
75 mindMapMapper.insert(mindMapDO); 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 Flux<ChatResponse> streamResponse = chatModel.stream(prompt); 79 Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
84 - // 3.4 流式返回 80 +
  81 + // 3.2 流式返回
85 StringBuffer contentBuffer = new StringBuffer(); 82 StringBuffer contentBuffer = new StringBuffer();
86 return streamResponse.map(chunk -> { 83 return streamResponse.map(chunk -> {
87 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; 84 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
@@ -102,24 +99,32 @@ public class AiMindMapServiceImpl implements AiMindMapService { @@ -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 private static List<Message> buildMessages(AiMindMapGenerateReqVO generateReqVO, String systemMessage) { 111 private static List<Message> buildMessages(AiMindMapGenerateReqVO generateReqVO, String systemMessage) {
106 List<Message> chatMessages = new ArrayList<>(); 112 List<Message> chatMessages = new ArrayList<>();
  113 + // 1. 角色设定
107 if (StrUtil.isNotBlank(systemMessage)) { 114 if (StrUtil.isNotBlank(systemMessage)) {
108 - // 1.1 角色设定  
109 chatMessages.add(new SystemMessage(systemMessage)); 115 chatMessages.add(new SystemMessage(systemMessage));
110 } 116 }
111 - // 1.2 用户输入 117 + // 2. 用户输入
112 chatMessages.add(new UserMessage(generateReqVO.getPrompt())); 118 chatMessages.add(new UserMessage(generateReqVO.getPrompt()));
113 return chatMessages; 119 return chatMessages;
114 } 120 }
115 121
116 - // TODO 芋艿:这里脑图、写作都用到了,是不是可以抽哪里去  
117 - private AiChatModelDO getModel(AiChatRoleDO chatRoleDO) { 122 + private AiChatModelDO getModel(AiChatRoleDO role) {
118 AiChatModelDO model = null; 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 model = chatModalService.getRequiredDefaultChatModel(); 128 model = chatModalService.getRequiredDefaultChatModel();
124 } 129 }
125 Assert.notNull(model, "[AI] 获取不到模型"); 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,8 +68,9 @@ public class AiWriteServiceImpl implements AiWriteService {
68 68
69 @Override 69 @Override
70 public Flux<CommonResult<String>> generateWriteContent(AiWriteGenerateReqVO generateReqVO, Long userId) { 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 // 1.1 获取写作执行模型 74 // 1.1 获取写作执行模型
74 AiChatModelDO model = getModel(writeRole); 75 AiChatModelDO model = getModel(writeRole);
75 // 1.2 获取角色设定消息 76 // 1.2 获取角色设定消息
@@ -84,16 +85,11 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -84,16 +85,11 @@ public class AiWriteServiceImpl implements AiWriteService {
84 write -> write.setUserId(userId).setPlatform(platform.getPlatform()).setModel(model.getModel())); 85 write -> write.setUserId(userId).setPlatform(platform.getPlatform()).setModel(model.getModel()));
85 writeMapper.insert(writeDO); 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 Flux<ChatResponse> streamResponse = chatModel.stream(prompt); 90 Flux<ChatResponse> streamResponse = chatModel.stream(prompt);
95 91
96 - // 4. 流式返回 92 + // 3.2 流式返回
97 StringBuffer contentBuffer = new StringBuffer(); 93 StringBuffer contentBuffer = new StringBuffer();
98 return streamResponse.map(chunk -> { 94 return streamResponse.map(chunk -> {
99 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null; 95 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getContent() : null;
@@ -125,6 +121,15 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -125,6 +121,15 @@ public class AiWriteServiceImpl implements AiWriteService {
125 return model; 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 private List<Message> buildMessages(AiWriteGenerateReqVO generateReqVO, String systemMessage) { 133 private List<Message> buildMessages(AiWriteGenerateReqVO generateReqVO, String systemMessage) {
129 List<Message> chatMessages = new ArrayList<>(); 134 List<Message> chatMessages = new ArrayList<>();
130 if (StrUtil.isNotBlank(systemMessage)) { 135 if (StrUtil.isNotBlank(systemMessage)) {
@@ -132,11 +137,11 @@ public class AiWriteServiceImpl implements AiWriteService { @@ -132,11 +137,11 @@ public class AiWriteServiceImpl implements AiWriteService {
132 chatMessages.add(new SystemMessage(systemMessage)); 137 chatMessages.add(new SystemMessage(systemMessage));
133 } 138 }
134 // 1.2 用户输入 139 // 1.2 用户输入
135 - chatMessages.add(new UserMessage(buildWritingPrompt(generateReqVO))); 140 + chatMessages.add(new UserMessage(buildUserMessage(generateReqVO)));
136 return chatMessages; 141 return chatMessages;
137 } 142 }
138 143
139 - private String buildWritingPrompt(AiWriteGenerateReqVO generateReqVO) { 144 + private String buildUserMessage(AiWriteGenerateReqVO generateReqVO) {
140 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat()); 145 String format = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_FORMAT, generateReqVO.getFormat());
141 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone()); 146 String tone = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_TONE, generateReqVO.getTone());
142 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage()); 147 String language = dictDataApi.getDictDataLabel(DictTypeConstants.AI_WRITE_LANGUAGE, generateReqVO.getLanguage());