From adb4538317c6d4980d65efca54643113d8d13711 Mon Sep 17 00:00:00 2001 From: ageer <ageerle@163.com> Date: 星期四, 10 四月 2025 21:39:31 +0800 Subject: [PATCH] fix: 修复使用本地向量模型只能检索到一条知识内容 --- ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java | 48 ++++++++++++----------- ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java | 16 +++---- ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java | 1 ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java | 10 ----- 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java index df499ee..80c2d8e 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java @@ -348,6 +348,7 @@ return chatCompletionResponse.getChoices().get(0).getMessage().getContent().toString(); } + @Override public String webSearch (String prompt) { String zhipuValue = configService.getConfigValue("zhipu", "key"); if(StringUtils.isEmpty(zhipuValue)){ diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java index 66a6577..b7b349b 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java +++ b/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; -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.common.core.exception.ServiceException; +import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.domain.vo.KnowledgeInfoVo; +import org.ruoyi.service.IChatModelService; import org.ruoyi.service.IKnowledgeInfoService; import org.ruoyi.service.VectorizationService; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; - import java.util.ArrayList; -import java.util.Arrays; + import java.util.List; +/** + * @author ageer + */ @Component @Slf4j @RequiredArgsConstructor public class BgeLargeVectorization implements VectorizationService { - String host = "http://localhost:11434/"; - @Lazy @Resource private IKnowledgeInfoService knowledgeInfoService; + @Lazy + @Resource + private final IChatModelService chatModelService; + @Override public List<List<Double>> batchVectorization(List<String> chunkList, String kid) { - OllamaAPI ollamaAPI = new OllamaAPI(host); + KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoService.queryById(Long.valueOf(kid)); + + ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel()); + + OllamaAPI api = new OllamaAPI(chatModelVo.getApiHost()); + 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); + try { + for (String chunk : chunkList) { + doubleVector = api.generateEmbeddings(new OllamaEmbeddingsRequestModel(knowledgeInfoVo.getVectorModel(), chunk)); + vectorList.add(doubleVector); + } + } catch (Exception e) { + throw new ServiceException("鏂囨湰鍚戦噺鍖栧紓甯革細"+e.getMessage()); + } return vectorList; } @@ -50,15 +63,4 @@ 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-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java index f276e51..766eb48 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java @@ -4,14 +4,15 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; 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.EmbeddingResponse; import org.ruoyi.common.chat.openai.OpenAiStreamClient; +import org.ruoyi.domain.vo.ChatModelVo; import org.ruoyi.domain.vo.KnowledgeInfoVo; +import org.ruoyi.service.IChatModelService; import org.ruoyi.service.IKnowledgeInfoService; 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.stereotype.Component; @@ -31,7 +32,7 @@ @Lazy @Resource - private ISysModelService sysModelService; + private IChatModelService chatModelService; @Getter private OpenAiStreamClient openAiStreamClient; @@ -49,17 +50,14 @@ vectorList.add(new ArrayList<>()); 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); - Embedding embedding = buildEmbedding(chunkList, knowledgeInfoVo); EmbeddingResponse embeddings = openAiStreamClient.embeddings(embedding); - // 澶勭悊 OpenAI 杩斿洖鐨勫祵鍏ユ暟鎹� vectorList = processOpenAiEmbeddings(embeddings); - return vectorList; } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java index 8a271aa..8d138dc 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java +++ b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java @@ -328,16 +328,6 @@ 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<Float> fv = new ArrayList<>(); for (int i = 0; i < queryVector.size(); i++) { -- Gitblit v1.9.3