ソースを参照

fix: delete docs & slice when del knowledge

tycoding 10 ヶ月 前
コミット
2e72f0c69a

+ 4 - 0
langchat-biz/src/main/java/cn/tycoding/langchat/biz/service/AigcKnowledgeService.java

@@ -39,6 +39,10 @@ public interface AigcKnowledgeService extends IService<AigcKnowledge> {
 
     List<String> listSliceVectorIdsOfDoc(String docsId);
 
+    List<AigcDocs> getDocsByKb(String knowledgeId);
+
+    void removeKnowledge(String knowledgeId);
+
     void removeSlicesOfDoc(String docsId);
 }
 

+ 15 - 0
langchat-biz/src/main/java/cn/tycoding/langchat/biz/service/impl/AigcKnowledgeServiceImpl.java

@@ -88,6 +88,21 @@ public class AigcKnowledgeServiceImpl extends ServiceImpl<AigcKnowledgeMapper, A
         return vectorIds;
     }
 
+    @Override
+    public List<AigcDocs> getDocsByKb(String knowledgeId) {
+        return aigcDocsMapper.selectList(Wrappers.<AigcDocs>lambdaQuery()
+                .eq(AigcDocs::getKnowledgeId, knowledgeId));
+    }
+
+    @Override
+    @Transactional
+    public void removeKnowledge(String knowledgeId) {
+        baseMapper.deleteById(knowledgeId);
+        // del docs & docsSlice
+        List<String> docsIds = getDocsByKb(knowledgeId).stream().map(AigcDocs::getId).toList();
+        docsIds.forEach(this::removeSlicesOfDoc);
+    }
+
     @Override
     @Transactional
     public void removeSlicesOfDoc(String docsId) {

+ 1 - 1
langchat-server/src/main/java/cn/tycoding/langchat/server/controller/AigcKnowledgeController.java

@@ -115,7 +115,7 @@ public class AigcKnowledgeController {
     @ApiLog("删除知识库")
     @SaCheckPermission("aigc:knowledge:delete")
     public R delete(@PathVariable String id) {
-        kbService.removeById(id);
+        kbService.removeKnowledge(id);
         return R.ok();
     }
 }

+ 21 - 14
langchat-server/src/main/java/cn/tycoding/langchat/server/endpoint/EmbeddingEndpoint.java

@@ -62,26 +62,33 @@ public class EmbeddingEndpoint {
         if (StrUtil.isBlankIfStr(data.getContent())) {
             throw new ServiceException("文档内容不能为空");
         }
-        data.setType(EmbedConst.ORIGIN_TYPE_INPUT).setSliceStatus(false);
         if (StrUtil.isBlank(data.getId())) {
             aigcKnowledgeService.addDocs(data);
         }
+        data.setType(EmbedConst.ORIGIN_TYPE_INPUT).setSliceStatus(false);
 
-        EmbeddingR embeddingR = langEmbeddingService.embeddingText(
-                new ChatReq().setMessage(data.getContent())
-                        .setDocsName(data.getType())
-                        .setDocsId(data.getId())
-                        .setKnowledgeId(data.getKnowledgeId()));
+        try {
+            EmbeddingR embeddingR = langEmbeddingService.embeddingText(
+                    new ChatReq().setMessage(data.getContent())
+                            .setDocsName(data.getType())
+                            .setDocsId(data.getId())
+                            .setKnowledgeId(data.getKnowledgeId()));
 
-        aigcKnowledgeService.addDocsSlice(new AigcDocsSlice()
-                .setKnowledgeId(data.getKnowledgeId())
-                .setDocsId(data.getId())
-                .setVectorId(embeddingR.getVectorId())
-                .setName(data.getName())
-                .setContent(embeddingR.getText())
-        );
+            aigcKnowledgeService.addDocsSlice(new AigcDocsSlice()
+                    .setKnowledgeId(data.getKnowledgeId())
+                    .setDocsId(data.getId())
+                    .setVectorId(embeddingR.getVectorId())
+                    .setName(data.getName())
+                    .setContent(embeddingR.getText())
+            );
 
-        aigcKnowledgeService.updateDocs(new AigcDocs().setId(data.getId()).setSliceStatus(true).setSliceNum(1));
+            aigcKnowledgeService.updateDocs(new AigcDocs().setId(data.getId()).setSliceStatus(true).setSliceNum(1));
+        } catch (Exception e) {
+            e.printStackTrace();
+
+            // del data
+            aigcKnowledgeService.removeSlicesOfDoc(data.getId());
+        }
         return R.ok();
     }