From 980df20752f031460301cc1697a22757239a1ac9 Mon Sep 17 00:00:00 2001
From: ageerle <ageerle@163.com>
Date: 星期四, 08 五月 2025 16:09:02 +0800
Subject: [PATCH] feat: 支持milvus、qdrant向量库

---
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java          |    2 
 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java  |    4 +
 ruoyi-modules-api/ruoyi-knowledge-api/pom.xml                                                          |   37 +++++++++++-------
 ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java |   50 ++++++++++++++++++-------
 4 files changed, 63 insertions(+), 30 deletions(-)

diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml b/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
index 8d7d396..f6412e1 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/pom.xml
@@ -47,20 +47,6 @@
             <version>1.0.79</version>
         </dependency>
 
-        <!-- milvus java sdk -->
-<!--        <dependency>-->
-<!--            <groupId>io.milvus</groupId>-->
-<!--            <artifactId>milvus-sdk-java</artifactId>-->
-<!--            <version>2.3.2</version>-->
-<!--        </dependency>-->
-
-<!--        <dependency>-->
-<!--            <groupId>io.weaviate</groupId>-->
-<!--            <artifactId>client</artifactId>-->
-<!--            <version>4.0.0</version>-->
-<!--        </dependency>-->
-
-
         <dependency>
             <groupId>dev.langchain4j</groupId>
             <artifactId>langchain4j</artifactId>
@@ -94,6 +80,29 @@
             <artifactId>langchain4j-ollama</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-milvus</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>milvus</artifactId>
+            <version>1.19.6</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>dev.langchain4j</groupId>
+            <artifactId>langchain4j-qdrant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>qdrant</artifactId>
+            <version>1.19.6</version>
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
index 277d0b1..e27c94c 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
@@ -19,7 +19,7 @@
 
     List<String> getQueryVector(QueryVectorBo queryVectorBo);
 
-    void createSchema(String kid);
+    void createSchema(String kid,String modelName);
 
     void removeByKidAndFid(String kid, String fid);
 
diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/WeaviateVectorStoreImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
similarity index 71%
rename from ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/WeaviateVectorStoreImpl.java
rename to ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
index 680a1bb..584b273 100644
--- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/WeaviateVectorStoreImpl.java
+++ b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
@@ -11,6 +11,8 @@
 import dev.langchain4j.store.embedding.EmbeddingStore;
 import dev.langchain4j.store.embedding.filter.Filter;
 import dev.langchain4j.store.embedding.filter.comparison.IsEqualTo;
+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;
@@ -30,13 +32,13 @@
 
 
 /**
- * Weaviate鍚戦噺搴撶鐞�
+ * 鍚戦噺搴撶鐞�
  * @author ageer
  */
 @Service
 @Slf4j
 @RequiredArgsConstructor
-public class WeaviateVectorStoreImpl implements VectorStoreService {
+public class VectorStoreServiceImpl implements VectorStoreService {
 
     private EmbeddingStore<TextSegment> embeddingStore;
 
@@ -44,18 +46,38 @@
 
     @Override
     @PostConstruct
-    public void createSchema(String kid) {
-        String protocol = configService.getConfigValue("weaviate", "protocol");
-        String host = configService.getConfigValue("weaviate", "host");
-        String className = configService.getConfigValue("weaviate", "classname");
-        this.embeddingStore = WeaviateEmbeddingStore.builder()
-                .scheme(protocol)
-                .host(host)
-                .objectClass(className+kid)
-                .scheme(protocol)
-                .avoidDups(true)
-                .consistencyLevel("ALL")
-                .build();
+    public void createSchema(String kid,String modelName) {
+        if(modelName.equals("weaviate")){
+            String protocol = configService.getConfigValue("weaviate", "protocol");
+            String host = configService.getConfigValue("weaviate", "host");
+            String className = configService.getConfigValue("weaviate", "classname");
+            this.embeddingStore = WeaviateEmbeddingStore.builder()
+                    .scheme(protocol)
+                    .host(host)
+                    .objectClass(className+kid)
+                    .scheme(protocol)
+                    .avoidDups(true)
+                    .consistencyLevel("ALL")
+                    .build();
+        }else if(modelName.equals("milvus")){
+            String uri = configService.getConfigValue("milvus", "host");
+            String collection = configService.getConfigValue("milvus", "collection");
+            String dimension = configService.getConfigValue("milvus", "dimension");
+            this.embeddingStore =  MilvusEmbeddingStore.builder()
+                    .uri(uri)
+                    .collectionName(collection+kid)
+                    .dimension(Integer.parseInt(dimension))
+                    .build();
+        }else if(modelName.equals("qdrant")){
+            String host = configService.getConfigValue("qdrant", "host");
+            String port = configService.getConfigValue("qdrant", "port");
+            String collectionName = configService.getConfigValue("qdrant", "collectionName");
+            this.embeddingStore = QdrantEmbeddingStore.builder()
+                            .host(host)
+                            .port(Integer.parseInt(port))
+                            .collectionName(collectionName)
+                            .build();
+        }
     }
 
     @Override
diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
index 6cf6251..00153c3 100644
--- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
+++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
@@ -160,7 +160,9 @@
                 knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId());
             }
             baseMapper.insert(knowledgeInfo);
-            vectorStoreService.createSchema(String.valueOf(knowledgeInfo.getId()));
+            if (knowledgeInfo != null) {
+                vectorStoreService.createSchema(String.valueOf(knowledgeInfo.getId()),bo.getVector());
+            }
         }else {
             baseMapper.updateById(knowledgeInfo);
         }

--
Gitblit v1.9.3