|
|
@@ -3,10 +3,13 @@ package org.ruoyi.service.impl;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.google.protobuf.ServiceException;
|
|
|
+import dev.langchain4j.data.embedding.Embedding;
|
|
|
import dev.langchain4j.data.segment.TextSegment;
|
|
|
import dev.langchain4j.model.embedding.EmbeddingModel;
|
|
|
import dev.langchain4j.model.ollama.OllamaEmbeddingModel;
|
|
|
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
|
|
|
+import dev.langchain4j.store.embedding.EmbeddingMatch;
|
|
|
+import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
|
|
|
import dev.langchain4j.store.embedding.EmbeddingStore;
|
|
|
import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
|
|
|
import io.weaviate.client.Config;
|
|
|
@@ -22,6 +25,7 @@ import io.weaviate.client.v1.schema.model.WeaviateClass;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.SneakyThrows;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.rocketmq.client.QueryResult;
|
|
|
import org.ruoyi.chain.xinference.XinferenceClient;
|
|
|
import org.ruoyi.common.core.service.ConfigService;
|
|
|
import org.ruoyi.domain.bo.KnowledgeAttachBo;
|
|
|
@@ -31,6 +35,7 @@ import org.ruoyi.domain.vo.KnowledgeAttachVo;
|
|
|
import org.ruoyi.service.IKnowledgeAttachService;
|
|
|
import org.ruoyi.service.VectorStoreService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
@@ -54,6 +59,10 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
|
|
|
@Autowired
|
|
|
private IKnowledgeAttachService knowledgeAttachService;
|
|
|
+ @Value("${file.base-url}")
|
|
|
+ private String baseUrl;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@@ -132,7 +141,6 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
.consistencyLevel("ALL")
|
|
|
.build();
|
|
|
}
|
|
|
-
|
|
|
@Override
|
|
|
public void storeEmbeddings(StoreEmbeddingBo storeEmbeddingBo) {
|
|
|
String protocol = configService.getConfigValue("weaviate", "protocol");
|
|
|
@@ -178,12 +186,12 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
properties.put("docId", docId);
|
|
|
properties.put("filename", storeEmbeddingBo.getFileName());
|
|
|
HashMap<String, Object> hashMap = new HashMap<>();
|
|
|
- hashMap.put("docId", docId);
|
|
|
- hashMap.put("filename", storeEmbeddingBo.getFileName());
|
|
|
+ hashMap.put("docId",docId);
|
|
|
+ hashMap.put("filename",storeEmbeddingBo.getFileName());
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
try {
|
|
|
String jsonString = mapper.writeValueAsString(hashMap);
|
|
|
- properties.put("metadata", jsonString);
|
|
|
+ properties.put("metadata",jsonString);
|
|
|
} catch (JsonProcessingException e) {
|
|
|
throw new RuntimeException(e);
|
|
|
}
|
|
|
@@ -234,7 +242,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
// }
|
|
|
|
|
|
@Override
|
|
|
- public List<Map<String, Object>> getQueryVector(QueryVectorBo queryVectorBo) {
|
|
|
+ public List<Map<String,Object>> getQueryVector(QueryVectorBo queryVectorBo) {
|
|
|
createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
|
|
|
String protocol = configService.getConfigValue("weaviate", "protocol");
|
|
|
String host = configService.getConfigValue("weaviate", "host");
|
|
|
@@ -244,10 +252,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
// 初始化 Weaviate 客户端
|
|
|
WeaviateClient client = new WeaviateClient(new Config(protocol, host));
|
|
|
XinferenceClient xinferenceClient = new XinferenceClient(queryVectorBo.getBaseUrl());
|
|
|
- String embeddingModelName = queryVectorBo.getEmbeddingModelName();
|
|
|
- //对齐模型,在数据库中存储为:quentinz/bge-large-zh-v1.5
|
|
|
- String[] split = embeddingModelName.split("/");
|
|
|
- String modelUid = split[split.length - 1];
|
|
|
+ String modelUid = "bge-large-zh-v1.5";
|
|
|
List<Double> queryVector;
|
|
|
try {
|
|
|
queryVector = xinferenceClient.getEmbedding(modelUid, queryVectorBo.getQuery());
|
|
|
@@ -280,7 +285,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
Result<GraphQLResponse> result = raw.run();
|
|
|
// 获取 Get 下的值
|
|
|
Object data = result.getResult().getData();
|
|
|
- List<Map<String, Object>> results = new ArrayList<>();
|
|
|
+ List<Map<String,Object>> results = new ArrayList<>();
|
|
|
if (data instanceof Map) {
|
|
|
Map<String, Object> dataMap = (Map<String, Object>) data;
|
|
|
Map<String, Object> getMap = (Map<String, Object>) dataMap.get("Get");
|
|
|
@@ -292,8 +297,10 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
String text = (String) item.get("text");
|
|
|
String docId = (String) item.get("docId");
|
|
|
String filename = (String) item.get("filename");
|
|
|
- hashMap.put("filename", filename);
|
|
|
- hashMap.put("text", text);
|
|
|
+ String downloadUrl = baseUrl + "/api/file/view?docId=" + docId;
|
|
|
+ hashMap.put("filename",filename);
|
|
|
+ hashMap.put("text",text);
|
|
|
+ hashMap.put("downloadUrl",downloadUrl);
|
|
|
results.add(hashMap);
|
|
|
}
|
|
|
}
|
|
|
@@ -304,9 +311,8 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
return results;
|
|
|
|
|
|
}
|
|
|
-
|
|
|
@Override
|
|
|
- public List<Map<String, Object>> getQueryVector(QueryVectorBo queryVectorBo, double score) {
|
|
|
+ public List<Map<String,Object>> getQueryVector(QueryVectorBo queryVectorBo,double score) {
|
|
|
createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
|
|
|
String protocol = configService.getConfigValue("weaviate", "protocol");
|
|
|
String host = configService.getConfigValue("weaviate", "host");
|
|
|
@@ -316,10 +322,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
// 初始化 Weaviate 客户端
|
|
|
WeaviateClient client = new WeaviateClient(new Config(protocol, host));
|
|
|
XinferenceClient xinferenceClient = new XinferenceClient(queryVectorBo.getBaseUrl());
|
|
|
- String embeddingModelName = queryVectorBo.getEmbeddingModelName();
|
|
|
- //对齐模型,在数据库中存储为:quentinz/bge-large-zh-v1.5
|
|
|
- String[] split = embeddingModelName.split("/");
|
|
|
- String modelUid = split[split.length - 1];
|
|
|
+ String modelUid = "bge-large-zh-v1.5";
|
|
|
List<Double> queryVector;
|
|
|
try {
|
|
|
queryVector = xinferenceClient.getEmbedding(modelUid, queryVectorBo.getQuery());
|
|
|
@@ -335,7 +338,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
String graphqlQuery = String.format(
|
|
|
"{" +
|
|
|
" Get {%n" +
|
|
|
- " %s(nearVector: {vector: [%s], certainty:" + score + "}, limit: %d) {%n" +
|
|
|
+ " %s(nearVector: {vector: [%s], certainty:"+score+"}, limit: %d) {%n" +
|
|
|
" text%n" +
|
|
|
" docId%n" +
|
|
|
" filename%n" +
|
|
|
@@ -352,7 +355,7 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
Result<GraphQLResponse> result = raw.run();
|
|
|
// 获取 Get 下的值
|
|
|
Object data = result.getResult().getData();
|
|
|
- List<Map<String, Object>> results = new ArrayList<>();
|
|
|
+ List<Map<String,Object>> results = new ArrayList<>();
|
|
|
if (data instanceof Map) {
|
|
|
Map<String, Object> dataMap = (Map<String, Object>) data;
|
|
|
Map<String, Object> getMap = (Map<String, Object>) dataMap.get("Get");
|
|
|
@@ -364,12 +367,17 @@ public class VectorStoreServiceImpl implements VectorStoreService {
|
|
|
String text = (String) item.get("text");
|
|
|
String docId = (String) item.get("docId");
|
|
|
String filename = (String) item.get("filename");
|
|
|
- hashMap.put("filename", filename);
|
|
|
- hashMap.put("text", text);
|
|
|
+ String downloadUrl = baseUrl + "/api/file/view?docId=" + docId;
|
|
|
+ hashMap.put("filename",filename);
|
|
|
+ hashMap.put("text",text);
|
|
|
+ hashMap.put("downloadUrl",downloadUrl);
|
|
|
+ hashMap.put("docId",docId);
|
|
|
results.add(hashMap);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ } else {
|
|
|
+ System.err.println("Data is not a Map: " + data);
|
|
|
}
|
|
|
return results;
|
|
|
|