Commit 7d53a6dd527d0bc381f12abe51977679320d99c3

Authored by xiaoxin
1 parent abf5a22c

【优化】AI 知识库: 向量存储补充 knowledgeId

yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java
@@ -15,6 +15,8 @@ import lombok.Data; @@ -15,6 +15,8 @@ import lombok.Data;
15 @Data 15 @Data
16 public class AiKnowledgeSegmentDO extends BaseDO { 16 public class AiKnowledgeSegmentDO extends BaseDO {
17 17
  18 + public static final String FIELD_KNOWLEDGE_ID = "knowledgeId";
  19 +
18 /** 20 /**
19 * 编号 21 * 编号
20 */ 22 */
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java
@@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service;
27 import org.springframework.transaction.annotation.Transactional; 27 import org.springframework.transaction.annotation.Transactional;
28 28
29 import java.util.List; 29 import java.util.List;
  30 +import java.util.Map;
30 31
31 /** 32 /**
32 * AI 知识库-文档 Service 实现类 33 * AI 知识库-文档 Service 实现类
@@ -83,16 +84,22 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic @@ -83,16 +84,22 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
83 List<Document> segments = tokenTextSplitter.apply(documents); 84 List<Document> segments = tokenTextSplitter.apply(documents);
84 // 2.2 分段内容入库 85 // 2.2 分段内容入库
85 List<AiKnowledgeSegmentDO> segmentDOList = CollectionUtils.convertList(segments, 86 List<AiKnowledgeSegmentDO> segmentDOList = CollectionUtils.convertList(segments,
86 - segment -> new AiKnowledgeSegmentDO().setContent(segment.getContent()).setDocumentId(documentId).setKnowledgeId(createReqVO.getKnowledgeId()) 87 + segment -> new AiKnowledgeSegmentDO().setContent(segment.getContent()).setDocumentId(documentId).setKnowledgeId(createReqVO.getKnowledgeId()).setVectorId(segment.getId())
87 .setTokens(tokenCountEstimator.estimate(segment.getContent())).setWordCount(segment.getContent().length()) 88 .setTokens(tokenCountEstimator.estimate(segment.getContent())).setWordCount(segment.getContent().length())
88 .setStatus(CommonStatusEnum.ENABLE.getStatus())); 89 .setStatus(CommonStatusEnum.ENABLE.getStatus()));
89 segmentMapper.insertBatch(segmentDOList); 90 segmentMapper.insertBatch(segmentDOList);
90 91
  92 + // 3.1 document 补充源数据
  93 + segments.forEach(segment -> {
  94 + Map<String, Object> metadata = segment.getMetadata();
  95 + metadata.put(AiKnowledgeSegmentDO.FIELD_KNOWLEDGE_ID, createReqVO.getKnowledgeId());
  96 + });
  97 +
91 AiKnowledgeDO knowledge = knowledgeService.validateKnowledgeExists(createReqVO.getKnowledgeId()); 98 AiKnowledgeDO knowledge = knowledgeService.validateKnowledgeExists(createReqVO.getKnowledgeId());
92 AiChatModelDO model = chatModelService.validateChatModel(knowledge.getModelId()); 99 AiChatModelDO model = chatModelService.validateChatModel(knowledge.getModelId());
93 - // 3.1 获取向量存储实例 100 + // 3.2 获取向量存储实例
94 VectorStore vectorStore = apiKeyService.getOrCreateVectorStore(model.getKeyId()); 101 VectorStore vectorStore = apiKeyService.getOrCreateVectorStore(model.getKeyId());
95 - // 3.2 向量化并存储 102 + // 3.3 向量化并存储
96 vectorStore.add(segments); 103 vectorStore.add(segments);
97 return documentId; 104 return documentId;
98 } 105 }