浏览代码

ai 知识库修改

yangshun 3 周之前
父节点
当前提交
d673bad5b7

+ 32 - 26
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/controller/admin/chatknowledgedataset/ChatKnowledgeDatasetController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.cy.guoyan.admin.module.ai.controller.admin.chatknowledgedataset.vo.ChatKnowledgeDatasetPageReqVO;
 import com.cy.guoyan.admin.module.ai.controller.admin.chatknowledgedataset.vo.ChatKnowledgeDatasetRespVO;
 import com.cy.guoyan.admin.module.ai.controller.admin.chatknowledgedataset.vo.ChatKnowledgeDatasetSaveReqVO;
+import com.cy.guoyan.admin.module.ai.service.aiservice.AiSelectionService;
 import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
@@ -26,7 +27,7 @@ import static com.cy.guoyan.admin.framework.apilog.core.enums.OperateTypeEnum.*;
 import com.cy.guoyan.admin.module.ai.dal.dataobject.chatknowledgedataset.ChatKnowledgeDatasetDO;
 import com.cy.guoyan.admin.module.ai.service.chatknowledgedataset.ChatKnowledgeDatasetService;
 
-@Tag(name = "管理后台 - AI 知识库")
+@Tag(name = "管理后台 - 知识库")
 @RestController
 @RequestMapping("/chatAi/chat-knowledge-dataset")
 @Validated
@@ -34,14 +35,36 @@ public class ChatKnowledgeDatasetController {
 
     @Resource
     private ChatKnowledgeDatasetService chatKnowledgeDatasetService;
+    @Resource
+    private AiSelectionService aiSelectionService;
 
     @PostMapping("/create")
-    @Operation(summary = "创建AI 知识库")
+    @Operation(summary = "创建知识库")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:create')")
-    public CommonResult<Long> createChatKnowledgeDataset(@Valid @RequestBody ChatKnowledgeDatasetSaveReqVO createReqVO)throws IOException {
-        return success(chatKnowledgeDatasetService.createChatKnowledgeDataset(createReqVO));
+    public CommonResult<Boolean> createChatKnowledgeDataset(@Valid @RequestBody ChatKnowledgeDatasetSaveReqVO createReqVO)throws IOException {
+        aiSelectionService.createDataset(createReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新知识库")
+    @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:update')")
+    public CommonResult<Boolean> updateChatKnowledgeDataset(@Valid @RequestBody ChatKnowledgeDatasetSaveReqVO updateReqVO) throws IOException {
+        aiSelectionService.updateDataset(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除知识库")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:delete')")
+    public CommonResult<Boolean> deleteChatKnowledgeDataset(@RequestParam("id") Long id) throws IOException {
+//        chatKnowledgeDatasetService.deleteChatKnowledgeDataset(id);
+        aiSelectionService.deleteDataset(String.valueOf(id));
+        return success(true);
     }
 
+
     @PostMapping("/retrieveFromDataset")
     @Operation(summary = "检索知识库内容")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:create')")
@@ -59,25 +82,8 @@ public class ChatKnowledgeDatasetController {
     }
 
 
-    @PutMapping("/update")
-    @Operation(summary = "更新AI 知识库")
-    @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:update')")
-    public CommonResult<Boolean> updateChatKnowledgeDataset(@Valid @RequestBody ChatKnowledgeDatasetSaveReqVO updateReqVO) {
-        chatKnowledgeDatasetService.updateChatKnowledgeDataset(updateReqVO);
-        return success(true);
-    }
-
-    @DeleteMapping("/delete")
-    @Operation(summary = "删除AI 知识库")
-    @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:delete')")
-    public CommonResult<Boolean> deleteChatKnowledgeDataset(@RequestParam("id") Long id) throws IOException {
-        chatKnowledgeDatasetService.deleteChatKnowledgeDataset(id);
-        return success(true);
-    }
-
     @GetMapping("/get")
-    @Operation(summary = "获得AI 知识库")
+    @Operation(summary = "获得知识库")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:query')")
     public CommonResult<ChatKnowledgeDatasetRespVO> getChatKnowledgeDataset(@RequestParam("id") Long id) {
@@ -86,7 +92,7 @@ public class ChatKnowledgeDatasetController {
     }
 
     @GetMapping("/page")
-    @Operation(summary = "获得AI 知识库分页")
+    @Operation(summary = "获得知识库分页")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:query')")
     public CommonResult<PageResult<ChatKnowledgeDatasetRespVO>> getChatKnowledgeDatasetPage(@Valid ChatKnowledgeDatasetPageReqVO pageReqVO) {
         PageResult<ChatKnowledgeDatasetDO> pageResult = chatKnowledgeDatasetService.getChatKnowledgeDatasetPage(pageReqVO);
@@ -94,7 +100,7 @@ public class ChatKnowledgeDatasetController {
     }
 
     @GetMapping("/list")
-    @Operation(summary = "获得AI 知识库列表")
+    @Operation(summary = "获得知识库列表")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:query')")
     public CommonResult<List<ChatKnowledgeDatasetRespVO>> getChatKnowledgeDatasetList( ChatKnowledgeDatasetPageReqVO pageReqVO) {
         List<ChatKnowledgeDatasetDO> pageResult = chatKnowledgeDatasetService.getChatKnowledgeDatasetList(pageReqVO);
@@ -102,7 +108,7 @@ public class ChatKnowledgeDatasetController {
     }
 
     @GetMapping("/export-excel")
-    @Operation(summary = "导出AI 知识库 Excel")
+    @Operation(summary = "导出知识库 Excel")
     @PreAuthorize("@ss.hasPermission('chatAi:chat-knowledge-dataset:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportChatKnowledgeDatasetExcel(@Valid ChatKnowledgeDatasetPageReqVO pageReqVO,
@@ -110,7 +116,7 @@ public class ChatKnowledgeDatasetController {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<ChatKnowledgeDatasetDO> list = chatKnowledgeDatasetService.getChatKnowledgeDatasetPage(pageReqVO).getList();
         // 导出 Excel
-        ExcelUtils.write(response, "AI 知识库.xls", "数据", ChatKnowledgeDatasetRespVO.class,
+        ExcelUtils.write(response, "知识库.xls", "数据", ChatKnowledgeDatasetRespVO.class,
                         BeanUtils.toBean(list, ChatKnowledgeDatasetRespVO.class));
     }
 

+ 6 - 16
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/controller/admin/chatknowledgedataset/vo/ChatKnowledgeDatasetPageReqVO.java

@@ -27,15 +27,17 @@ public class ChatKnowledgeDatasetPageReqVO extends PageParam {
     @Schema(description = "知识库描述(可选填)", example = "随便")
     private String description;
 
+    @Schema(description = "ragflow知识库")
+    private String ragflowDatasetId;
+
     @Schema(description = "索引策略,如“high_quality” 或“fast”")
     private String indexingTechnique;
 
     @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
-    private String embeddingModel;
+    private String difyEmbeddingModel;
 
-    @Schema(description = "新增文档后,是否自动触发重新索引")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private Boolean[] autoUpdate;
+    @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
+    private String ragflowEmbeddingModel;
 
     @Schema(description = "是否启用该知识库(查询时可过滤)")
     private Boolean enabled;
@@ -43,16 +45,4 @@ public class ChatKnowledgeDatasetPageReqVO extends PageParam {
     @Schema(description = "默认访问权限:read / write / private")
     private String defaultPermission;
 
-    @Schema(description = "已挂载在多少个应用上", example = "2893")
-    private Integer appCount;
-
-    @Schema(description = "Dify 服务端创建时间")
-    private LocalDateTime difyCreatedAt;
-
-    @Schema(description = "Dify 服务端最后更新时间")
-    private LocalDateTime difyUpdatedAt;
-
-    @Schema(description = "Dify 返回的完整元数据 JSON(便于调试和扩展)")
-    private String metadataJson;
-
 }

+ 12 - 2
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/controller/admin/chatknowledgedataset/vo/ChatKnowledgeDatasetRespVO.java

@@ -31,13 +31,20 @@ public class ChatKnowledgeDatasetRespVO {
     @ExcelProperty("知识库描述(可选填)")
     private String description;
 
+    @Schema(description = "ragflow知识库")
+    private String ragflowDatasetId;
+
     @Schema(description = "索引策略,如“high_quality” 或“fast”")
     @ExcelProperty("索引策略,如“high_quality” 或“fast”")
     private String indexingTechnique;
 
     @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
     @ExcelProperty("用于向量化的模型名称,如“openai-embedding-ada-002”")
-    private String embeddingModel;
+    private String difyEmbeddingModel;
+
+    @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
+    @ExcelProperty("用于向量化的模型名称,如“openai-embedding-ada-002”")
+    private String ragflowEmbeddingModel;
 
     @Schema(description = "新增文档后,是否自动触发重新索引", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("新增文档后,是否自动触发重新索引")
@@ -68,6 +75,9 @@ public class ChatKnowledgeDatasetRespVO {
 
     @Schema(description = "Dify 返回的完整元数据 JSON(便于调试和扩展)")
     @ExcelProperty("Dify 返回的完整元数据 JSON(便于调试和扩展)")
-    private String metadataJson;
+    private String difyMetadataJson;
+
+    @Schema(description = "RagFlow 返回的完整元数据 JSON(便于调试和扩展)")
+    private String ragflowMetadataJson;
 
 }

+ 11 - 2
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/controller/admin/chatknowledgedataset/vo/ChatKnowledgeDatasetSaveReqVO.java

@@ -1,5 +1,6 @@
 package com.cy.guoyan.admin.module.ai.controller.admin.chatknowledgedataset.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -22,11 +23,17 @@ public class ChatKnowledgeDatasetSaveReqVO {
     @Schema(description = "知识库描述(可选填)", example = "随便")
     private String description;
 
+    @Schema(description = "ragflow知识库")
+    private String ragflowDatasetId;
+
     @Schema(description = "索引策略,如“high_quality” 或“fast”")
     private String indexingTechnique;
 
     @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
-    private String embeddingModel;
+    private String difyEmbeddingModel;
+
+    @Schema(description = "用于向量化的模型名称,如“openai-embedding-ada-002”")
+    private String ragflowEmbeddingModel;
 
     @Schema(description = "新增文档后,是否自动触发重新索引", requiredMode = Schema.RequiredMode.REQUIRED)
 //    @NotNull(message = "新增文档后,是否自动触发重新索引不能为空")
@@ -53,6 +60,8 @@ public class ChatKnowledgeDatasetSaveReqVO {
     private LocalDateTime difyUpdatedAt;
 
     @Schema(description = "Dify 返回的完整元数据 JSON(便于调试和扩展)")
-    private String metadataJson;
+    private String difyMetadataJson;
 
+    @Schema(description = "RagFlow 返回的完整元数据 JSON(便于调试和扩展)")
+    private String ragflowMetadataJson;
 }

+ 14 - 4
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/dal/dataobject/chatknowledgedataset/ChatKnowledgeDatasetDO.java

@@ -11,8 +11,8 @@ import com.cy.guoyan.admin.framework.mybatis.core.dataobject.BaseDO;
  *
  * @author 管理员
  */
-@TableName("ai_chat_knowledge_dataset")
-@KeySequence("ai_chat_knowledge_dataset_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@TableName("ai_knowledge_dataset")
+@KeySequence("ai_knowledge_dataset_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
@@ -30,6 +30,10 @@ public class ChatKnowledgeDatasetDO extends BaseDO {
      * Dify 平台返回的 Dataset ID,UUID 格式
      */
     private String difyDatasetId;
+    /**
+     * ragflow 平台返回的 Dataset ID,UUID 格式
+     */
+    private String ragflowDatasetId;
     /**
      * 知识库名称(由用户或 Dify 自动生成)
      */
@@ -45,7 +49,9 @@ public class ChatKnowledgeDatasetDO extends BaseDO {
     /**
      * 用于向量化的模型名称,如“openai-embedding-ada-002”
      */
-    private String embeddingModel;
+    private String difyEmbeddingModel;
+
+    private String ragflowEmbeddingModel;
     /**
      * 新增文档后,是否自动触发重新索引
      */
@@ -73,6 +79,10 @@ public class ChatKnowledgeDatasetDO extends BaseDO {
     /**
      * Dify 返回的完整元数据 JSON(便于调试和扩展)
      */
-    private String metadataJson;
+    private String difyMetadataJson;
+    /**
+     * ragflow 返回的完整元数据 JSON(便于调试和扩展)
+     */
+    private String ragflowMetadataJson;
 
 }

+ 2 - 6
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/dal/mysql/chatknowledgedataset/ChatKnowledgeDatasetMapper.java

@@ -22,14 +22,10 @@ public interface ChatKnowledgeDatasetMapper extends BaseMapperX<ChatKnowledgeDat
                 .likeIfPresent(ChatKnowledgeDatasetDO::getName, reqVO.getName())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getDescription, reqVO.getDescription())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getIndexingTechnique, reqVO.getIndexingTechnique())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getEmbeddingModel, reqVO.getEmbeddingModel())
-                .betweenIfPresent(ChatKnowledgeDatasetDO::getAutoUpdate, reqVO.getAutoUpdate())
+                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyEmbeddingModel, reqVO.getDifyEmbeddingModel())
+                .eqIfPresent(ChatKnowledgeDatasetDO::getRagflowEmbeddingModel, reqVO.getRagflowEmbeddingModel())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getEnabled, reqVO.getEnabled())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getDefaultPermission, reqVO.getDefaultPermission())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getAppCount, reqVO.getAppCount())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyCreatedAt, reqVO.getDifyCreatedAt())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyUpdatedAt, reqVO.getDifyUpdatedAt())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getMetadataJson, reqVO.getMetadataJson())
                 .orderByDesc(ChatKnowledgeDatasetDO::getId));
     }
 

+ 11 - 14
guoyan-ai/src/main/java/com/cy/guoyan/admin/module/ai/service/chatknowledgedataset/ChatKnowledgeDatasetServiceImpl.java

@@ -100,7 +100,7 @@ public class ChatKnowledgeDatasetServiceImpl implements ChatKnowledgeDatasetServ
         body.put("name", vo.getName());
         body.put("description", vo.getDescription());
         body.put("indexing_technique", "high_quality");
-        body.put("embedding_model", vo.getEmbeddingModel());
+//        body.put("embedding_model", vo.getEmbeddingModel());
         body.put("auto_update", vo.getAutoUpdate());
         body.put("provider", "vendor");
         body.put("permission", "all_team_members");
@@ -119,14 +119,14 @@ public class ChatKnowledgeDatasetServiceImpl implements ChatKnowledgeDatasetServ
                 .name(j.getString("name"))
                 .description(j.getString("description"))
                 .indexingTechnique(j.getString("indexing_technique"))
-                .embeddingModel(j.getString("embedding_model"))
+//                .embeddingModel(j.getString("embedding_model"))
                 .autoUpdate(j.getBoolean("auto_update"))
                 .enabled(j.getBoolean("enabled"))
                 .defaultPermission(j.getString("default_permission"))
                 .appCount(j.getIntValue("app_count"))
                 .difyCreatedAt(epoch2Local(j.getLong("created_at")))
                 .difyUpdatedAt(epoch2Local(j.getLong("updated_at")))
-                .metadataJson(j.toJSONString())
+                .difyMetadataJson(j.toJSONString())
                 .build();
         chatKnowledgeDatasetMapper.insert(db);
         return db.getId();
@@ -215,7 +215,7 @@ public class ChatKnowledgeDatasetServiceImpl implements ChatKnowledgeDatasetServ
             db.setName(j.getString("name"));
             db.setDescription(j.getString("description"));
             db.setIndexingTechnique(j.getString("indexing_technique"));
-            db.setEmbeddingModel(j.getString("embedding_model"));
+//            db.setEmbeddingModel(j.getString("embedding_model"));
             db.setAutoUpdate(j.getBoolean("auto_update"));
             db.setEnabled(j.getBoolean("enabled"));
             db.setDefaultPermission(j.getString("default_permission"));
@@ -233,7 +233,7 @@ public class ChatKnowledgeDatasetServiceImpl implements ChatKnowledgeDatasetServ
                         Instant.ofEpochSecond(updatedAt), ZoneId.systemDefault()));
             }
 
-            db.setMetadataJson(j.toJSONString());
+            db.setDifyMetadataJson(j.toJSONString());
 
             // 4. 本地 upsert
             ChatKnowledgeDatasetDO exist = chatKnowledgeDatasetMapper.selectOne(
@@ -261,21 +261,18 @@ public class ChatKnowledgeDatasetServiceImpl implements ChatKnowledgeDatasetServ
                 .likeIfPresent(ChatKnowledgeDatasetDO::getName, reqVO.getName())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getDescription, reqVO.getDescription())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getIndexingTechnique, reqVO.getIndexingTechnique())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getEmbeddingModel, reqVO.getEmbeddingModel())
-                .betweenIfPresent(ChatKnowledgeDatasetDO::getAutoUpdate, reqVO.getAutoUpdate())
+                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyEmbeddingModel, reqVO.getDifyEmbeddingModel())
+                .eqIfPresent(ChatKnowledgeDatasetDO::getRagflowEmbeddingModel, reqVO.getRagflowEmbeddingModel())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getEnabled, reqVO.getEnabled())
                 .eqIfPresent(ChatKnowledgeDatasetDO::getDefaultPermission, reqVO.getDefaultPermission())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getAppCount, reqVO.getAppCount())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyCreatedAt, reqVO.getDifyCreatedAt())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getDifyUpdatedAt, reqVO.getDifyUpdatedAt())
-                .eqIfPresent(ChatKnowledgeDatasetDO::getMetadataJson, reqVO.getMetadataJson())
                 .orderByAsc(ChatKnowledgeDatasetDO::getId));
 
-        List<String> list = datasetDOS.stream().map(ChatKnowledgeDatasetDO::getDifyDatasetId).collect(Collectors.toList());
-        if (list.size() > 0) {
+
+        Set<Long> list = datasetDOS.stream().map(ChatKnowledgeDatasetDO::getId).collect(Collectors.toSet());
+        if (!list.isEmpty()) {
             List<ChatDocumentDO> chatDocumentDOS = chatDocumentMapper.selectList(new LambdaQueryWrapperX<ChatDocumentDO>().in(ChatDocumentDO::getDatasetId, list));
             datasetDOS.forEach(f->{
-                f.setAppCount(chatDocumentDOS.stream().filter(d->d.getDatasetId().equals(f.getDifyDatasetId())).collect(Collectors.toList()).size());
+                f.setAppCount(chatDocumentDOS.stream().filter(d->d.getDatasetId().equals(String.valueOf(f.getId()))).collect(Collectors.toList()).size());
             });
         }