mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-03-28 03:53:49 +08:00
feat: 支持插件功能
This commit is contained in:
@@ -41,13 +41,13 @@ public class MilvusVectorStore implements VectorStore{
|
||||
@Resource
|
||||
private ConfigService configService;
|
||||
|
||||
// @PostConstruct
|
||||
@PostConstruct
|
||||
public void loadConfig() {
|
||||
this.dimension = Integer.parseInt(configService.getConfigValue("milvus", "dimension"));
|
||||
this.collectionName = configService.getConfigValue("milvus", "collection");
|
||||
}
|
||||
|
||||
//@PostConstruct
|
||||
@PostConstruct
|
||||
public void init(){
|
||||
String milvusHost = configService.getConfigValue("milvus", "host");
|
||||
String milvausPort = configService.getConfigValue("milvus", "port");
|
||||
|
||||
@@ -6,11 +6,16 @@ import java.util.List;
|
||||
* 向量存储
|
||||
*/
|
||||
public interface VectorStore {
|
||||
void storeEmbeddings(List<String> chunkList,List<List<Double>> vectorList, String kid, String docId,List<String> fidList);
|
||||
void removeByDocId(String kid,String docId);
|
||||
|
||||
void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList);
|
||||
|
||||
void removeByDocId(String kid, String docId);
|
||||
|
||||
void removeByKid(String kid);
|
||||
List<String> nearest(List<Double> queryVector,String kid);
|
||||
List<String> nearest(String query,String kid);
|
||||
|
||||
List<String> nearest(List<Double> queryVector, String kid);
|
||||
|
||||
List<String> nearest(String query, String kid);
|
||||
|
||||
void newSchema(String kid);
|
||||
|
||||
|
||||
@@ -1,32 +1,35 @@
|
||||
package org.ruoyi.knowledge.chain.vectorstore;
|
||||
|
||||
import jakarta.annotation.Resource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
|
||||
import org.ruoyi.knowledge.mapper.KnowledgeInfoMapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class VectorStoreFactory {
|
||||
|
||||
private final String type = "weaviate";
|
||||
|
||||
private final WeaviateVectorStore weaviateVectorStore;
|
||||
|
||||
private final MilvusVectorStore milvusVectorStore;
|
||||
|
||||
@Resource
|
||||
private KnowledgeInfoMapper knowledgeInfoMapper;
|
||||
|
||||
public VectorStoreFactory(WeaviateVectorStore weaviateVectorStore, MilvusVectorStore milvusVectorStore) {
|
||||
this.weaviateVectorStore = weaviateVectorStore;
|
||||
this.milvusVectorStore = milvusVectorStore;
|
||||
}
|
||||
|
||||
public VectorStore getVectorStore(String kid){
|
||||
// if ("weaviate".equals(type)){
|
||||
// return weaviateVectorStore;
|
||||
// }else if ("milvus".equals(type)){
|
||||
// return milvusVectorStore;
|
||||
// }
|
||||
//
|
||||
// return null;
|
||||
return weaviateVectorStore;
|
||||
KnowledgeInfoVo knowledgeInfoVo = knowledgeInfoMapper.selectVoById(Long.valueOf(kid));
|
||||
String vectorModel = knowledgeInfoVo.getVector();
|
||||
if ("weaviate".equals(vectorModel)){
|
||||
return weaviateVectorStore;
|
||||
}else if ("milvus".equals(vectorModel)){
|
||||
return milvusVectorStore;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,19 +11,20 @@ import java.util.List;
|
||||
@Slf4j
|
||||
@Primary
|
||||
@AllArgsConstructor
|
||||
public class VectorStoreWrapper implements VectorStore{
|
||||
public class VectorStoreWrapper implements VectorStore {
|
||||
|
||||
private final VectorStoreFactory vectorStoreFactory;
|
||||
|
||||
@Override
|
||||
public void storeEmbeddings(List<String> chunkList, List<List<Double>> vectorList, String kid, String docId, List<String> fidList) {
|
||||
VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
|
||||
vectorStore.storeEmbeddings(chunkList, vectorList, kid, docId, fidList);
|
||||
vectorStore.storeEmbeddings(chunkList, vectorList, kid, docId, fidList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeByDocId(String kid, String docId) {
|
||||
VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
|
||||
vectorStore.removeByDocId(kid,docId);
|
||||
vectorStore.removeByDocId(kid, docId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -35,7 +36,7 @@ public class VectorStoreWrapper implements VectorStore{
|
||||
@Override
|
||||
public List<String> nearest(List<Double> queryVector, String kid) {
|
||||
VectorStore vectorStore = vectorStoreFactory.getVectorStore(kid);
|
||||
return vectorStore.nearest(queryVector,kid);
|
||||
return vectorStore.nearest(queryVector, kid);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -45,7 +45,7 @@ public class KnowledgeInfo implements Serializable {
|
||||
private String kname;
|
||||
|
||||
/**
|
||||
* 知识库名称
|
||||
* 是否公开知识库(0 否 1是)
|
||||
*/
|
||||
private String share;
|
||||
|
||||
|
||||
@@ -49,8 +49,6 @@ public interface IKnowledgeAttachService {
|
||||
|
||||
/**
|
||||
* 删除知识附件
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
void removeKnowledgeAttach(String kid);
|
||||
void removeKnowledgeAttach(String docId);
|
||||
}
|
||||
|
||||
@@ -2,13 +2,10 @@ package org.ruoyi.knowledge.service;
|
||||
|
||||
import org.ruoyi.common.mybatis.core.page.PageQuery;
|
||||
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
|
||||
import org.ruoyi.knowledge.domain.KnowledgeAttach;
|
||||
import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
|
||||
import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
|
||||
import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
|
||||
import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -40,7 +37,6 @@ public interface IKnowledgeInfoService {
|
||||
*/
|
||||
Boolean updateByBo(KnowledgeInfoBo bo);
|
||||
|
||||
|
||||
/**
|
||||
* 新增知识库
|
||||
*/
|
||||
|
||||
@@ -40,8 +40,7 @@ public class EmbeddingServiceImpl implements EmbeddingService {
|
||||
|
||||
@Override
|
||||
public List<Double> getQueryVector(String query, String kid) {
|
||||
List<Double> queryVector = vectorization.singleVectorization(query,kid);
|
||||
return queryVector;
|
||||
return vectorization.singleVectorization(query,kid);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -126,13 +126,9 @@ public class KnowledgeAttachServiceImpl implements IKnowledgeAttachService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeKnowledgeAttach(String kid) {
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
public void removeKnowledgeAttach(String docId) {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
map.put("kid",kid);
|
||||
List<KnowledgeInfoVo> knowledgeInfoList = knowledgeInfoMapper.selectVoByMap(map);
|
||||
knowledgeInfoService.check(knowledgeInfoList);
|
||||
|
||||
map.put("doc_id",docId);
|
||||
baseMapper.deleteByMap(map);
|
||||
fragmentMapper.deleteByMap(map);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
package org.ruoyi.knowledge.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
|
||||
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
|
||||
import io.github.ollama4j.models.chat.OllamaChatRequestModel;
|
||||
import io.github.ollama4j.models.chat.OllamaChatResult;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.ruoyi.common.core.domain.model.LoginUser;
|
||||
import org.ruoyi.common.core.utils.MapstructUtils;
|
||||
@@ -30,6 +26,7 @@ import org.ruoyi.knowledge.mapper.KnowledgeInfoMapper;
|
||||
import org.ruoyi.knowledge.service.EmbeddingService;
|
||||
import org.ruoyi.knowledge.service.IKnowledgeInfoService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -41,8 +38,8 @@ import java.util.*;
|
||||
* @author Lion Li
|
||||
* @date 2024-10-21
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
||||
|
||||
private final KnowledgeInfoMapper baseMapper;
|
||||
@@ -110,9 +107,8 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveOne(KnowledgeInfoBo bo) {
|
||||
KnowledgeInfo knowledgeInfo = MapstructUtils.convert(bo, KnowledgeInfo.class);
|
||||
if (StringUtils.isBlank(bo.getKid())){
|
||||
@@ -122,7 +118,7 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
||||
knowledgeInfo.setUid(LoginHelper.getLoginUser().getUserId());
|
||||
}
|
||||
baseMapper.insert(knowledgeInfo);
|
||||
embeddingService.createSchema(kid);
|
||||
embeddingService.createSchema(String.valueOf(knowledgeInfo.getId()));
|
||||
}else {
|
||||
baseMapper.updateById(knowledgeInfo);
|
||||
}
|
||||
@@ -148,19 +144,23 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
||||
try {
|
||||
content = resourceLoader.getContent(file.getInputStream());
|
||||
chunkList = resourceLoader.getChunkList(content, kid);
|
||||
for (int i = 0; i < chunkList.size(); i++) {
|
||||
String fid = RandomUtil.randomString(16);
|
||||
fids.add(fid);
|
||||
KnowledgeFragment knowledgeFragment = new KnowledgeFragment();
|
||||
knowledgeFragment.setKid(kid);
|
||||
knowledgeFragment.setDocId(docId);
|
||||
knowledgeFragment.setFid(fid);
|
||||
knowledgeFragment.setIdx(i);
|
||||
// String text = convertTextBlockToPretrainData(chunkList.get(i));
|
||||
knowledgeFragment.setContent(chunkList.get(i));
|
||||
knowledgeFragment.setCreateTime(new Date());
|
||||
fragmentMapper.insert(knowledgeFragment);
|
||||
List<KnowledgeFragment> knowledgeFragmentList = new ArrayList<>();
|
||||
if (CollUtil.isNotEmpty(chunkList)) {
|
||||
for (int i = 0; i < chunkList.size(); i++) {
|
||||
String fid = RandomUtil.randomString(16);
|
||||
fids.add(fid);
|
||||
KnowledgeFragment knowledgeFragment = new KnowledgeFragment();
|
||||
knowledgeFragment.setKid(kid);
|
||||
knowledgeFragment.setDocId(docId);
|
||||
knowledgeFragment.setFid(fid);
|
||||
knowledgeFragment.setIdx(i);
|
||||
// String text = convertTextBlockToPretrainData(chunkList.get(i));
|
||||
knowledgeFragment.setContent(chunkList.get(i));
|
||||
knowledgeFragment.setCreateTime(new Date());
|
||||
knowledgeFragmentList.add(knowledgeFragment);
|
||||
}
|
||||
}
|
||||
fragmentMapper.insertBatch(knowledgeFragmentList);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -171,19 +171,21 @@ public class KnowledgeInfoServiceImpl implements IKnowledgeInfoService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void removeKnowledge(String id) {
|
||||
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
map.put("kid",id);
|
||||
List<KnowledgeInfoVo> knowledgeInfoList = baseMapper.selectVoByMap(map);
|
||||
check(knowledgeInfoList);
|
||||
// 删除知识库
|
||||
baseMapper.deleteByMap(map);
|
||||
// 删除向量库信息
|
||||
knowledgeInfoList.forEach(knowledgeInfoVo -> {
|
||||
embeddingService.removeByKid(String.valueOf(knowledgeInfoVo.getId()));
|
||||
});
|
||||
// 删除附件和知识片段
|
||||
fragmentMapper.deleteByMap(map);
|
||||
attachMapper.deleteByMap(map);
|
||||
// 删除向量库信息
|
||||
embeddingService.removeByKid(id);
|
||||
// 删除知识库
|
||||
baseMapper.deleteByMap(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user