mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-04-16 05:13:41 +00:00
fix: 修复使用本地向量模型只能检索到一条知识内容
This commit is contained in:
@@ -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)){
|
||||||
|
|||||||
@@ -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;
|
||||||
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<>();
|
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;
|
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===");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
ChatModelVo chatModelVo = chatModelService.selectModelByName(knowledgeInfoVo.getVectorModel());
|
||||||
String apiHost= sysModel.getApiHost();
|
String apiHost= chatModelVo.getApiHost();
|
||||||
String apiKey= sysModel.getApiKey();
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user