From 44b12bca3ac16853bd122cb2dc8f5a8e8163252c Mon Sep 17 00:00:00 2001
From: Y.Payne <yupeng@anxinlirong>
Date: 星期日, 23 三月 2025 11:39:40 +0800
Subject: [PATCH] feat:更新bge-large-zh-v1.5向量模型

---
 ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java  |    8 +++-
 ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java |   63 +++++++++++++++++++++++++++++++
 ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java  |   28 ++++++++++++-
 3 files changed, 94 insertions(+), 5 deletions(-)

diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java
new file mode 100644
index 0000000..840b62f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/BgeLargeVectorization.java
@@ -0,0 +1,63 @@
+package org.ruoyi.knowledge.chain.vectorizer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.gson.Gson;
+import io.github.ollama4j.OllamaAPI;
+import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
+import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.knowledge.service.IKnowledgeInfoService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BgeLargeVectorization implements Vectorization {
+
+    String host = "http://localhost:11434/";
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    @Override
+    public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
+        OllamaAPI ollamaAPI = new OllamaAPI(host);
+        KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+        List<Double> doubleVector;
+        try {
+            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), new Gson().toJson(chunkList)));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        List<List<Double>> vectorList = new ArrayList<>();
+        vectorList.add(doubleVector);
+        return vectorList;
+    }
+
+    @Override
+    public List<Double> singleVectorization(String chunk, String kid) {
+        List<String> chunkList = new ArrayList<>();
+        chunkList.add(chunk);
+        List<List<Double>> vectorList = batchVectorization(chunkList, kid);
+        return vectorList.get(0);
+    }
+
+    public static void main(String[] args) {
+        OllamaAPI ollamaAPI = new OllamaAPI("http://localhost:11434/");
+        List<String> chunkList = Arrays.asList("澶╁緢钃�", "娴峰緢娣�");
+        List<Double> doubleVector;
+        try {
+            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel("quentinz/bge-large-zh-v1.5", new Gson().toJson(chunkList)));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        System.out.println("=== " + doubleVector + " 1===");
+    }
+}
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java
index 05993ac..87a09b7 100644
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java
+++ b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationFactory.java
@@ -1,6 +1,11 @@
 package org.ruoyi.knowledge.chain.vectorizer;
 
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.knowledge.service.IKnowledgeInfoService;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 /**
@@ -13,11 +18,28 @@
 
     private final OpenAiVectorization openAiVectorization;
 
-    public VectorizationFactory(OpenAiVectorization openAiVectorization) {
+    private final BgeLargeVectorization bgeLargeVectorization;
+
+    @Lazy
+    @Resource
+    private IKnowledgeInfoService knowledgeInfoService;
+
+    public VectorizationFactory(OpenAiVectorization openAiVectorization,BgeLargeVectorization bgeLargeVectorization) {
         this.openAiVectorization = openAiVectorization;
+        this.bgeLargeVectorization = bgeLargeVectorization;
     }
 
-    public Vectorization getEmbedding(){
-        return openAiVectorization;
+    public Vectorization getEmbedding(String kid){
+        String vectorModel = "text-embedding-3-small";
+        if (StrUtil.isNotEmpty(kid)) {
+            KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+            if (knowledgeInfoVo != null && StrUtil.isNotEmpty(knowledgeInfoVo.getVectorModel())) {
+                vectorModel = knowledgeInfoVo.getVectorModel();
+            }
+        }
+        return switch (vectorModel) {
+            case "quentinz/bge-large-zh-v1.5" -> bgeLargeVectorization;
+            default -> openAiVectorization;
+        };
     }
 }
diff --git a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java
index e41797f..e25d331 100644
--- a/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java
+++ b/ruoyi-modules/ruoyi-knowledge/src/main/java/org/ruoyi/knowledge/chain/vectorizer/VectorizationWrapper.java
@@ -1,7 +1,11 @@
 package org.ruoyi.knowledge.chain.vectorizer;
 
+import jakarta.annotation.Resource;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.knowledge.service.IKnowledgeInfoService;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Component;
 
@@ -16,13 +20,13 @@
     private final VectorizationFactory vectorizationFactory;
     @Override
     public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        Vectorization embedding = vectorizationFactory.getEmbedding();
+        Vectorization embedding = vectorizationFactory.getEmbedding(kid);
         return embedding.batchVectorization(chunkList, kid);
     }
 
     @Override
     public List<Double> singleVectorization(String chunk, String kid) {
-        Vectorization embedding = vectorizationFactory.getEmbedding();
+        Vectorization embedding = vectorizationFactory.getEmbedding(kid);
         return embedding.singleVectorization(chunk, kid);
     }
 }

--
Gitblit v1.9.3