From 57b2f833f8c4cc8d6ad7dc80778c970744964f2c Mon Sep 17 00:00:00 2001
From: ageer <ageerle@163.com>
Date: 星期四, 08 五月 2025 23:56:40 +0800
Subject: [PATCH] feat: 修复向量库初始化失败导致程序启动失败

---
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java |   37 +++++++++++++++++++++----------------
 1 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
index 301095f..294342a 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
@@ -14,7 +14,6 @@
 import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStore;
 import dev.langchain4j.store.embedding.qdrant.QdrantEmbeddingStore;
 import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
-import jakarta.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.ruoyi.common.core.service.ConfigService;
@@ -29,8 +28,6 @@
 import java.util.List;
 import java.util.Map;
 
-
-
 /**
  * 鍚戦噺搴撶鐞�
  * @author ageer
@@ -40,18 +37,19 @@
 @RequiredArgsConstructor
 public class VectorStoreServiceImpl implements VectorStoreService {
 
-    private EmbeddingStore<TextSegment> embeddingStore;
-
     private final ConfigService configService;
+
+    Map<String,EmbeddingStore<TextSegment>> storeMap;
 
     @Override
     public void createSchema(String kid,String modelName) {
+        EmbeddingStore<TextSegment> embeddingStore = WeaviateEmbeddingStore.builder().build();
         switch (modelName) {
             case "weaviate" -> {
                 String protocol = configService.getConfigValue("weaviate", "protocol");
                 String host = configService.getConfigValue("weaviate", "host");
                 String className = configService.getConfigValue("weaviate", "classname");
-                this.embeddingStore = WeaviateEmbeddingStore.builder()
+                embeddingStore = WeaviateEmbeddingStore.builder()
                         .scheme(protocol)
                         .host(host)
                         .objectClass(className + kid)
@@ -64,7 +62,7 @@
                 String uri = configService.getConfigValue("milvus", "host");
                 String collection = configService.getConfigValue("milvus", "collection");
                 String dimension = configService.getConfigValue("milvus", "dimension");
-                this.embeddingStore = MilvusEmbeddingStore.builder()
+                embeddingStore = MilvusEmbeddingStore.builder()
                         .uri(uri)
                         .collectionName(collection + kid)
                         .dimension(Integer.parseInt(dimension))
@@ -74,17 +72,19 @@
                 String host = configService.getConfigValue("qdrant", "host");
                 String port = configService.getConfigValue("qdrant", "port");
                 String collectionName = configService.getConfigValue("qdrant", "collectionName");
-                this.embeddingStore = QdrantEmbeddingStore.builder()
+                embeddingStore = QdrantEmbeddingStore.builder()
                         .host(host)
                         .port(Integer.parseInt(port))
                         .collectionName(collectionName)
                         .build();
             }
         }
+        storeMap.put(kid,embeddingStore);
     }
 
     @Override
     public void storeEmbeddings(StoreEmbeddingBo storeEmbeddingBo) {
+        EmbeddingStore<TextSegment> store = storeMap.get(storeEmbeddingBo.getKid());
         EmbeddingModel embeddingModel = getEmbeddingModel(storeEmbeddingBo.getModelName(),
                 storeEmbeddingBo.getApiKey(), storeEmbeddingBo.getBaseUrl());
         for (int i = 0; i < storeEmbeddingBo.getChunkList().size(); i++) {
@@ -96,12 +96,15 @@
             Embedding embedding = response.content();
             TextSegment segment = TextSegment.from(storeEmbeddingBo.getChunkList().get(i));
             segment.metadata().putAll(dataSchema);
-            embeddingStore.add(embedding,segment);
+
+            store.add(embedding,segment);
         }
     }
 
     @Override
     public List<String> getQueryVector(QueryVectorBo queryVectorBo) {
+        EmbeddingStore<TextSegment> store = storeMap.get(queryVectorBo.getKid());
+
         EmbeddingModel embeddingModel = getEmbeddingModel(queryVectorBo.getModelName(),
                 queryVectorBo.getApiKey(), queryVectorBo.getBaseUrl());
         Filter simpleFilter = new IsEqualTo("kid", queryVectorBo.getKid());
@@ -112,38 +115,40 @@
                 // 娣诲姞杩囨护鏉′欢
                 .filter(simpleFilter)
                 .build();
-        List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches();
+        List<EmbeddingMatch<TextSegment>> matches = store.search(embeddingSearchRequest).matches();
 
         List<String> results = new ArrayList<>();
 
-        matches.forEach(embeddingMatch -> {
-            results.add(embeddingMatch.embedded().text());
-        });
+        matches.forEach(embeddingMatch -> results.add(embeddingMatch.embedded().text()));
         return results;
     }
 
 
     @Override
     public void removeByKid(String kid) {
+        EmbeddingStore<TextSegment> store = storeMap.get(kid);
+
         // 鏍规嵁鏉′欢鍒犻櫎鍚戦噺鏁版嵁
         Filter simpleFilter = new IsEqualTo("kid", kid);
-        embeddingStore.removeAll(simpleFilter);
+        store.removeAll(simpleFilter);
     }
 
     @Override
     public void removeByDocId(String kid, String docId) {
+        EmbeddingStore<TextSegment> store = storeMap.get(kid);
         // 鏍规嵁鏉′欢鍒犻櫎鍚戦噺鏁版嵁
         Filter simpleFilterByDocId = new IsEqualTo("docId", docId);
-        embeddingStore.removeAll(simpleFilterByDocId);
+        store.removeAll(simpleFilterByDocId);
     }
 
     @Override
     public void removeByKidAndFid(String kid, String fid) {
+        EmbeddingStore<TextSegment> store = storeMap.get(kid);
         // 鏍规嵁鏉′欢鍒犻櫎鍚戦噺鏁版嵁
         Filter simpleFilterByKid = new IsEqualTo("kid", kid);
         Filter simpleFilterFid = new IsEqualTo("fid", fid);
         Filter simpleFilterByAnd = Filter.and(simpleFilterFid, simpleFilterByKid);
-        embeddingStore.removeAll(simpleFilterByAnd);
+        store.removeAll(simpleFilterByAnd);
     }
 
     /**

--
Gitblit v1.9.3