Browse Source

fix: 修复使用本地向量模型只能检索到一条知识内容

ageer 1 month ago
parent
commit
adb4538317

+ 1 - 0
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java

@@ -348,6 +348,7 @@ public class SseServiceImpl implements ISseService {
         return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();
         return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString();
     }
     }
 
 
+    @Override
     public String webSearch (String prompt) {
     public String webSearch (String prompt) {
         String zhipuValue = configService.getConfigValue("zhipu", "key");
         String zhipuValue = configService.getConfigValue("zhipu", "key");
         if(StringUtils.isEmpty(zhipuValue)){
         if(StringUtils.isEmpty(zhipuValue)){

+ 23 - 21
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java

@@ -1,44 +1,57 @@
 package org.ruoyi.chat.service.knowledge.vectorizer;
 package org.ruoyi.chat.service.knowledge.vectorizer;
 
 
-import com.google.gson.Gson;
 import io.github.ollama4j.OllamaAPI;
 import io.github.ollama4j.OllamaAPI;
 import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
 import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.common.core.exception.ServiceException;
+import org.ruoyi.domain.vo.ChatModelVo;
 import org.ruoyi.domain.vo.KnowledgeInfoVo;
 import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IChatModelService;
 import org.ruoyi.service.IKnowledgeInfoService;
 import org.ruoyi.service.IKnowledgeInfoService;
 import org.ruoyi.service.VectorizationService;
 import org.ruoyi.service.VectorizationService;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
-
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Arrays;
+
 import java.util.List;
 import java.util.List;
 
 
+/**
+ * @author ageer
+ */
 @Component
 @Component
 @Slf4j
 @Slf4j
 @RequiredArgsConstructor
 @RequiredArgsConstructor
 public class BgeLargeVectorization implements VectorizationService {
 public class BgeLargeVectorization implements VectorizationService {
 
 
-    String host = "http://localhost:11434/";
-
     @Lazy
     @Lazy
     @Resource
     @Resource
     private IKnowledgeInfoService knowledgeInfoService;
     private IKnowledgeInfoService knowledgeInfoService;
 
 
+    @Lazy
+    @Resource
+    private final IChatModelService chatModelService;
+
     @Override
     @Override
     public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
     public List<List<Double>> batchVectorization(List<String> chunkList, String kid) {
-        OllamaAPI ollamaAPI = new OllamaAPI(host);
+
         KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
         KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid));
+
+        ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
+
+        OllamaAPI api = new OllamaAPI(chatModelVo.getApiHost());
+
         List<Double> doubleVector;
         List<Double> doubleVector;
+        List<List<Double>> vectorList = new ArrayList<>();
         try {
         try {
-            doubleVector = ollamaAPI.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), new Gson().toJson(chunkList)));
+            for (String chunk : chunkList) {
+                doubleVector = api.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), chunk));
+                vectorList.add(doubleVector);
+            }
         } catch (Exception e) {
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            throw new ServiceException("文本向量化异常:"+e.getMessage());
         }
         }
-        List<List<Double>> vectorList = new ArrayList<>();
-        vectorList.add(doubleVector);
         return vectorList;
         return vectorList;
     }
     }
 
 
@@ -50,15 +63,4 @@ public class BgeLargeVectorization implements VectorizationService {
         return vectorList.get(0);
         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===");
-    }
 }
 }

+ 7 - 9
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java

@@ -4,14 +4,15 @@ import jakarta.annotation.Resource;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.ruoyi.chat.config.ChatConfig;
 import org.ruoyi.common.chat.entity.embeddings.Embedding;
 import org.ruoyi.common.chat.entity.embeddings.Embedding;
 import org.ruoyi.common.chat.entity.embeddings.EmbeddingResponse;
 import org.ruoyi.common.chat.entity.embeddings.EmbeddingResponse;
 import org.ruoyi.common.chat.openai.OpenAiStreamClient;
 import org.ruoyi.common.chat.openai.OpenAiStreamClient;
+import org.ruoyi.domain.vo.ChatModelVo;
 import org.ruoyi.domain.vo.KnowledgeInfoVo;
 import org.ruoyi.domain.vo.KnowledgeInfoVo;
+import org.ruoyi.service.IChatModelService;
 import org.ruoyi.service.IKnowledgeInfoService;
 import org.ruoyi.service.IKnowledgeInfoService;
 import org.ruoyi.service.VectorizationService;
 import org.ruoyi.service.VectorizationService;
-import org.ruoyi.system.domain.SysModel;
-import org.ruoyi.system.service.ISysModelService;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
@@ -31,7 +32,7 @@ public class OpenAiVectorization implements VectorizationService {
 
 
     @Lazy
     @Lazy
     @Resource
     @Resource
-    private ISysModelService sysModelService;
+    private IChatModelService chatModelService;
 
 
     @Getter
     @Getter
     private OpenAiStreamClient openAiStreamClient;
     private OpenAiStreamClient openAiStreamClient;
@@ -49,17 +50,14 @@ public class OpenAiVectorization implements VectorizationService {
             vectorList.add(new ArrayList<>());
             vectorList.add(new ArrayList<>());
             return vectorList;
             return vectorList;
         }
         }
-        SysModel sysModel = sysModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
-        String apiHost= sysModel.getApiHost();
-        String apiKey= sysModel.getApiKey();
+        ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
+        String apiHost= chatModelVo.getApiHost();
+        String apiKey= chatModelVo.getApiKey();
         openAiStreamClient = chatConfig.createOpenAiStreamClient(apiHost,apiKey);
         openAiStreamClient = chatConfig.createOpenAiStreamClient(apiHost,apiKey);
-
         Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo);
         Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo);
         EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding);
         EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding);
-
         // 处理 OpenAI 返回的嵌入数据
         // 处理 OpenAI 返回的嵌入数据
         vectorList = processOpenAiEmbeddings(embeddings);
         vectorList = processOpenAiEmbeddings(embeddings);
-
         return vectorList;
         return vectorList;
     }
     }
 
 

+ 0 - 10
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java

@@ -328,16 +328,6 @@ public class MilvusVectorStore implements VectorStoreService {
             System.err.println("获取索引失败: " + describeIndexResponseR.getMessage());
             System.err.println("获取索引失败: " + describeIndexResponseR.getMessage());
         }
         }
 
 
-//        // 加载集合到内存
-//        LoadCollectionParam loadCollectionParam = LoadCollectionParam.newBuilder()
-//                .withCollectionName(fullCollectionName)
-//                .build();
-//        R<RpcStatus> loadResponse = milvusServiceClient.loadCollection(loadCollectionParam);
-//        if (loadResponse.getStatus() != R.Status.Success.getCode()) {
-//            System.err.println("加载集合 " + fullCollectionName + " 到内存时出错:" + loadResponse.getMessage());
-//            return new ArrayList<>();
-//        }
-
         List<String> search_output_fields = Arrays.asList("content", "fv");
         List<String> search_output_fields = Arrays.asList("content", "fv");
         List<Float> fv = new ArrayList<>();
         List<Float> fv = new ArrayList<>();
         for (int i = 0; i < queryVector.size(); i++) {
         for (int i = 0; i < queryVector.size(); i++) {