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

This commit is contained in:
ageer
2025-04-10 21:39:31 +08:00
parent 2509099146
commit adb4538317
4 changed files with 33 additions and 42 deletions

View File

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

View File

@@ -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 @@ public class BgeLargeVectorization implements VectorizationService {
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===");
}
}

View File

@@ -4,14 +4,15 @@ import jakarta.annotation.Resource;
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 @@ public class OpenAiVectorization implements VectorizationService {
@Lazy
@Resource
private ISysModelService sysModelService;
private IChatModelService chatModelService;
@Getter
private OpenAiStreamClient openAiStreamClient;
@@ -49,17 +50,14 @@ public class OpenAiVectorization implements VectorizationService {
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;
}

View File

@@ -328,16 +328,6 @@ public class MilvusVectorStore implements VectorStoreService {
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++) {