Commit 04b8aa04222d6fbe516c657221b3532c4146c480

Authored by YunaiV
1 parent 3e8596ee

reactor:【AI 大模型】优化消息发送后,读取文档的逻辑,避免 N 次读取

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeSegmentMapper.java
@@ -30,9 +30,9 @@ public interface AiKnowledgeSegmentMapper extends BaseMapperX<AiKnowledgeSegment @@ -30,9 +30,9 @@ public interface AiKnowledgeSegmentMapper extends BaseMapperX<AiKnowledgeSegment
30 .orderByDesc(AiKnowledgeSegmentDO::getId)); 30 .orderByDesc(AiKnowledgeSegmentDO::getId));
31 } 31 }
32 32
33 - default List<AiKnowledgeSegmentDO> selectListByVectorIds(List<String> vectorIdList) { 33 + default List<AiKnowledgeSegmentDO> selectListByVectorIds(List<String> vectorIds) {
34 return selectList(new LambdaQueryWrapperX<AiKnowledgeSegmentDO>() 34 return selectList(new LambdaQueryWrapperX<AiKnowledgeSegmentDO>()
35 - .in(AiKnowledgeSegmentDO::getVectorId, vectorIdList) 35 + .in(AiKnowledgeSegmentDO::getVectorId, vectorIds)
36 .orderByDesc(AiKnowledgeSegmentDO::getId)); 36 .orderByDesc(AiKnowledgeSegmentDO::getId));
37 } 37 }
38 38
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/chat/AiChatMessageServiceImpl.java
@@ -121,11 +121,11 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -121,11 +121,11 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
121 String newContent = chatResponse.getResult().getOutput().getText(); 121 String newContent = chatResponse.getResult().getOutput().getText();
122 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(newContent)); 122 chatMessageMapper.updateById(new AiChatMessageDO().setId(assistantMessage.getId()).setContent(newContent));
123 // 3.4 响应结果 123 // 3.4 响应结果
  124 + Map<Long, AiKnowledgeDocumentDO> documentMap = knowledgeDocumentService.getKnowledgeDocumentMap(
  125 + convertSet(knowledgeSegments, AiKnowledgeSegmentSearchRespBO::getDocumentId));
124 List<AiChatMessageRespVO.KnowledgeSegment> segments = BeanUtils.toBean(knowledgeSegments, 126 List<AiChatMessageRespVO.KnowledgeSegment> segments = BeanUtils.toBean(knowledgeSegments,
125 - AiChatMessageRespVO.KnowledgeSegment.class,  
126 - segment -> {  
127 - AiKnowledgeDocumentDO document = knowledgeDocumentService  
128 - .getKnowledgeDocument(segment.getDocumentId()); 127 + AiChatMessageRespVO.KnowledgeSegment.class, segment -> {
  128 + AiKnowledgeDocumentDO document = documentMap.get(segment.getDocumentId());
129 segment.setDocumentName(document != null ? document.getName() : null); 129 segment.setDocumentName(document != null ? document.getName() : null);
130 }); 130 });
131 return new AiChatMessageSendRespVO() 131 return new AiChatMessageSendRespVO()
@@ -172,12 +172,13 @@ public class AiChatMessageServiceImpl implements AiChatMessageService { @@ -172,12 +172,13 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
172 // 处理知识库的返回,只有首次才有 172 // 处理知识库的返回,只有首次才有
173 List<AiChatMessageRespVO.KnowledgeSegment> segments = null; 173 List<AiChatMessageRespVO.KnowledgeSegment> segments = null;
174 if (StrUtil.isEmpty(contentBuffer)) { 174 if (StrUtil.isEmpty(contentBuffer)) {
175 - segments = BeanUtils.toBean(knowledgeSegments, AiChatMessageRespVO.KnowledgeSegment.class,  
176 - segment -> TenantUtils.executeIgnore(() -> {  
177 - AiKnowledgeDocumentDO document = knowledgeDocumentService  
178 - .getKnowledgeDocument(segment.getDocumentId());  
179 - segment.setDocumentName(document != null ? document.getName() : null);  
180 - })); 175 + Map<Long, AiKnowledgeDocumentDO> documentMap = TenantUtils.executeIgnore(() ->
  176 + knowledgeDocumentService.getKnowledgeDocumentMap(
  177 + convertSet(knowledgeSegments, AiKnowledgeSegmentSearchRespBO::getDocumentId)));
  178 + segments = BeanUtils.toBean(knowledgeSegments, AiChatMessageRespVO.KnowledgeSegment.class, segment -> {
  179 + AiKnowledgeDocumentDO document = documentMap.get(segment.getDocumentId());
  180 + segment.setDocumentName(document != null ? document.getName() : null);
  181 + });
181 } 182 }
182 // 响应结果 183 // 响应结果
183 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getText() : null; 184 String newContent = chunk.getResult() != null ? chunk.getResult().getOutput().getText() : null;
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentService.java
@@ -68,13 +68,6 @@ public interface AiKnowledgeDocumentService { @@ -68,13 +68,6 @@ public interface AiKnowledgeDocumentService {
68 void updateKnowledgeDocumentStatus(AiKnowledgeDocumentUpdateStatusReqVO reqVO); 68 void updateKnowledgeDocumentStatus(AiKnowledgeDocumentUpdateStatusReqVO reqVO);
69 69
70 /** 70 /**
71 - * 更新文档检索次数(增加 +1)  
72 - *  
73 - * @param ids 文档编号列表  
74 - */  
75 - void updateKnowledgeDocumentRetrievalCountIncr(Collection<Long> ids);  
76 -  
77 - /**  
78 * 删除文档 71 * 删除文档
79 * 72 *
80 * @param id 文档编号 73 * @param id 文档编号
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java
@@ -162,14 +162,6 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic @@ -162,14 +162,6 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
162 } 162 }
163 163
164 @Override 164 @Override
165 - public void updateKnowledgeDocumentRetrievalCountIncr(Collection<Long> ids) {  
166 - if (CollUtil.isEmpty(ids)) {  
167 - return;  
168 - }  
169 - knowledgeDocumentMapper.updateRetrievalCountIncr(ids);  
170 - }  
171 -  
172 - @Override  
173 public AiKnowledgeDocumentDO validateKnowledgeDocumentExists(Long id) { 165 public AiKnowledgeDocumentDO validateKnowledgeDocumentExists(Long id) {
174 AiKnowledgeDocumentDO knowledgeDocument = knowledgeDocumentMapper.selectById(id); 166 AiKnowledgeDocumentDO knowledgeDocument = knowledgeDocumentMapper.selectById(id);
175 if (knowledgeDocument == null) { 167 if (knowledgeDocument == null) {