办学质量监测教学评价系统
ageer
2025-04-10 adb4538317c6d4980d65efca54643113d8d13711
fix: 修复使用本地向量模型只能检索到一条知识内容
已修改4个文件
75 ■■■■■ 文件已修改
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/chat/impl/SseServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/BgeLargeVectorization.java 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorizer/OpenAiVectorization.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/vectorstore/MilvusVectorStore.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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)){
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===");
    }
}
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;
    }
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++) {