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