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 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());
... ...