办学质量监测教学评价系统
ageerle
2025-05-26 70ae7ea8f1fe6e01839558f2bae60d2e80e517d9
feat: 向量库查询删除逻辑调整
已修改3个文件
73 ■■■■ 文件已修改
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java
@@ -17,10 +17,7 @@
    void createSchema(String kid,String modelName);
    void removeByKid(String kid,String modelName);
    void removeById(String id,String modelName);
    void removeByDocId(String kid,String docId,String modelName);
    void removeByKidAndFid(String kid, String fid,String modelName);
}
ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java
@@ -9,8 +9,6 @@
import dev.langchain4j.store.embedding.EmbeddingMatch;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.filter.Filter;
import dev.langchain4j.store.embedding.filter.comparison.IsEqualTo;
import dev.langchain4j.store.embedding.weaviate.WeaviateEmbeddingStore;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
@@ -22,9 +20,7 @@
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 向量库管理
@@ -40,6 +36,7 @@
    private EmbeddingStore<TextSegment> embeddingStore;
    @Override
    public void createSchema(String kid, String modelName) {
        String protocol = configService.getConfigValue("weaviate", "protocol");
@@ -48,7 +45,7 @@
        embeddingStore = WeaviateEmbeddingStore.builder()
                .scheme(protocol)
                .host(host)
                .objectClass(className + kid)
                .objectClass(className+kid)
                .scheme(protocol)
                .avoidDups(true)
                .consistencyLevel("ALL")
@@ -61,14 +58,9 @@
        EmbeddingModel embeddingModel = getEmbeddingModel(storeEmbeddingBo.getEmbeddingModelName(),
                storeEmbeddingBo.getApiKey(), storeEmbeddingBo.getBaseUrl());
        List<String> chunkList = storeEmbeddingBo.getChunkList();
        for (int i = 0; i < chunkList.size(); i++) {
            Map<String, Object> dataSchema = new HashMap<>();
            dataSchema.put("kid", storeEmbeddingBo.getKid());
            dataSchema.put("docId", storeEmbeddingBo.getDocId());
            dataSchema.put("fid", storeEmbeddingBo.getFids().get(i));
            Embedding embedding = embeddingModel.embed(chunkList.get(i)).content();
            TextSegment segment = TextSegment.from(chunkList.get(i));
            segment.metadata().putAll(dataSchema);
        for (String s : chunkList) {
            Embedding embedding = embeddingModel.embed(s).content();
            TextSegment segment = TextSegment.from(s);
            embeddingStore.add(embedding, segment);
        }
    }
@@ -78,13 +70,10 @@
        createSchema(queryVectorBo.getKid(), queryVectorBo.getVectorModelName());
        EmbeddingModel embeddingModel = getEmbeddingModel(queryVectorBo.getEmbeddingModelName(),
                queryVectorBo.getApiKey(), queryVectorBo.getBaseUrl());
        // Filter simpleFilter = new IsEqualTo("kid", queryVectorBo.getKid());
        Embedding queryEmbedding = embeddingModel.embed(queryVectorBo.getQuery()).content();
        EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder()
                .queryEmbedding(queryEmbedding)
                .maxResults(queryVectorBo.getMaxResults())
                // 添加过滤条件
                //       .filter(simpleFilter)
                .build();
        List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches();
        List<String> results = new ArrayList<>();
@@ -94,29 +83,10 @@
    @Override
    public void removeByKid(String kid, String modelName) {
        createSchema(kid, modelName);
    public void removeById(String id, String modelName) {
        createSchema(id, modelName);
        // 根据条件删除向量数据
        Filter simpleFilter = new IsEqualTo("kid", kid);
        embeddingStore.removeAll(simpleFilter);
    }
    @Override
    public void removeByDocId(String kid, String docId, String modelName) {
        createSchema(kid, modelName);
        // 根据条件删除向量数据
        Filter simpleFilterByDocId = new IsEqualTo("docId", docId);
        embeddingStore.removeAll(simpleFilterByDocId);
    }
    @Override
    public void removeByKidAndFid(String kid, String fid, String modelName) {
        createSchema(kid, modelName);
        // 根据条件删除向量数据
        Filter simpleFilterByKid = new IsEqualTo("kid", kid);
        Filter simpleFilterFid = new IsEqualTo("fid", fid);
        Filter simpleFilterByAnd = Filter.and(simpleFilterFid, simpleFilterByKid);
        embeddingStore.removeAll(simpleFilterByAnd);
        embeddingStore.remove(id);
    }
    /**
ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java
@@ -177,13 +177,11 @@
  @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);
    // 删除向量库信息
//    knowledgeInfoList.forEach(knowledgeInfoVo -> {
//      vectorStoreService.removeByKid(String.valueOf(knowledgeInfoVo.getId()),knowledgeInfoVo.getVectorModelName());
//    });
    KnowledgeInfo knowledgeInfo = baseMapper.selectById(id);
    check(knowledgeInfo);
    map.put("kid",knowledgeInfo.getKid());
    // 删除向量数据
    vectorStoreService.removeById(String.valueOf(knowledgeInfo.getId()),knowledgeInfo.getVectorModelName());
    // 删除附件和知识片段
    fragmentMapper.deleteByMap(map);
    attachMapper.deleteByMap(map);
@@ -256,14 +254,12 @@
  /**
   * 检查用户是否有删除知识库权限
   *
   * @param knowledgeInfoList 知识库列表
   * @param knowledgeInfo 知识库
   */
  public void check(List<KnowledgeInfoVo> knowledgeInfoList) {
  public void check( KnowledgeInfo knowledgeInfo) {
    LoginUser loginUser = LoginHelper.getLoginUser();
    for (KnowledgeInfoVo knowledgeInfoVo : knowledgeInfoList) {
      if (!knowledgeInfoVo.getUid().equals(loginUser.getUserId())) {
        throw new SecurityException("权限不足");
      }
    if (!knowledgeInfo.getUid().equals(loginUser.getUserId())) {
      throw new SecurityException("权限不足");
    }
  }