From 70ae7ea8f1fe6e01839558f2bae60d2e80e517d9 Mon Sep 17 00:00:00 2001 From: ageerle <ageerle@163.com> Date: 星期一, 26 五月 2025 22:40:01 +0800 Subject: [PATCH] feat: 向量库查询删除逻辑调整 --- ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java | 5 -- ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java | 22 ++++------ ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java | 46 ++++------------------- 3 files changed, 18 insertions(+), 55 deletions(-) diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java index be445b9..8d23272 100644 --- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/VectorStoreService.java +++ b/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); } diff --git a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java b/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java index e115542..282c2b6 100644 --- a/ruoyi-modules-api/ruoyi-knowledge-api/src/main/java/org/ruoyi/service/impl/VectorStoreServiceImpl.java +++ b/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); } /** diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java b/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java index 08d2ed4..4a04827 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/chat/service/knowledge/KnowledgeInfoServiceImpl.java +++ b/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("鏉冮檺涓嶈冻"); } } -- Gitblit v1.9.3