Browse Source

【功能新增】AI:聊天角色,新增 knowledge 的引用绑定

YunaiV 5 months ago
parent
commit
3bb57edc85
12 changed files with 59 additions and 55 deletions
  1. 12 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java
  2. 1 18
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java
  3. 2 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleRespVO.java
  4. 2 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleSaveMyReqVO.java
  5. 2 2
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleSaveReqVO.java
  6. 4 4
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java
  7. 6 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeMapper.java
  8. 0 8
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentService.java
  9. 0 6
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java
  10. 10 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeService.java
  11. 7 0
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeServiceImpl.java
  12. 13 13
      yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiChatRoleServiceImpl.java

+ 12 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
 
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -17,7 +18,10 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 
 // TODO @芋艿:增加权限标识
 @Tag(name = "管理后台 - AI 知识库")
@@ -62,4 +66,12 @@ public class AiKnowledgeController {
         return success(true);
     }
 
+    @GetMapping("/simple-list")
+    @Operation(summary = "获得知识库的精简列表")
+    public CommonResult<List<AiKnowledgeRespVO>> getKnowledgeSimpleList() {
+        List<AiKnowledgeDO> list = knowledgeService.getKnowledgeSimpleListByStatus(CommonStatusEnum.ENABLE.getStatus());
+        return success(convertList(list, knowledge -> new AiKnowledgeRespVO()
+                .setId(knowledge.getId()).setName(knowledge.getName())));
+    }
+
 }

+ 1 - 18
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java

@@ -1,20 +1,13 @@
 package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
 
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentCreateListReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateStatusReqVO;
+import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.*;
 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
-import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeDocumentMapper;
 import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
 import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
@@ -25,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 
 @Tag(name = "管理后台 - AI 知识库文档")
 @RestController
@@ -95,13 +87,4 @@ public class AiKnowledgeDocumentController {
         return success(true);
     }
 
-    @GetMapping("/simple-list")
-    @Operation(summary = "获得知识库文档的精简列表")
-    public CommonResult<List<AiKnowledgeDocumentRespVO>> getKnowledgeDocumentSimpleList() {
-        List<AiKnowledgeDocumentDO> list = documentService
-                .getKnowledgeDocumentListByStatus(CommonStatusEnum.ENABLE.getStatus());
-        return success(convertList(list, document -> new AiKnowledgeDocumentRespVO()
-                .setId(document.getId()).setName(document.getName())));
-    }
-
 }

+ 2 - 2
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleRespVO.java

@@ -46,8 +46,8 @@ public class AiChatRoleRespVO implements VO {
     @Schema(description = "角色设定", requiredMode = Schema.RequiredMode.REQUIRED)
     private String systemMessage;
 
-    @Schema(description = "知识库文档编号列表", example = "1,2,3")
-    private List<Long> documentIds;
+    @Schema(description = "引用的知识库编号列表", example = "1,2,3")
+    private List<Long> knowledgeIds;
 
     @Schema(description = "是否公开", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Boolean publicStatus;

+ 2 - 2
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleSaveMyReqVO.java

@@ -31,7 +31,7 @@ public class AiChatRoleSaveMyReqVO {
     @NotEmpty(message = "角色设定不能为空")
     private String systemMessage;
 
-    @Schema(description = "知识库文档编号列表", example = "1,2,3")
-    private List<Long> documentIds;
+    @Schema(description = "引用的知识库编号列表", example = "1,2,3")
+    private List<Long> knowledgeIds;
 
 }

+ 2 - 2
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/vo/chatRole/AiChatRoleSaveReqVO.java

@@ -44,8 +44,8 @@ public class AiChatRoleSaveReqVO {
     @NotEmpty(message = "角色设定不能为空")
     private String systemMessage;
 
-    @Schema(description = "知识库文档编号列表", example = "1,2,3")
-    private List<Long> documentIds;
+    @Schema(description = "引用的知识库编号列表", example = "1,2,3")
+    private List<Long> knowledgeIds;
 
     @Schema(description = "是否公开", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     @NotNull(message = "是否公开不能为空")

+ 4 - 4
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/model/AiChatRoleDO.java

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.ai.dal.dataobject.model;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
+import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -68,12 +68,12 @@ public class AiChatRoleDO extends BaseDO {
     private Long modelId;
 
     /**
-     * 知识库文档编号列表
+     * 引用的知识库编号列表
      *
-     * 关联 {@link AiKnowledgeDocumentDO#getId()} 字段
+     * 关联 {@link AiKnowledgeDO#getId()} 字段
      */
     @TableField(typeHandler = LongListTypeHandler.class)
-    private List<Long> documentIds;
+    private List<Long> knowledgeIds;
 
     /**
      * 是否公开

+ 6 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeMapper.java

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow
 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * AI 知识库 Mapper
  *
@@ -23,4 +25,8 @@ public interface AiKnowledgeMapper extends BaseMapperX<AiKnowledgeDO> {
                 .orderByDesc(AiKnowledgeDO::getId));
     }
 
+    default List<AiKnowledgeDO> selectListByStatus(Integer status) {
+        return selectList(AiKnowledgeDO::getStatus, status);
+    }
+
 }

+ 0 - 8
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentService.java

@@ -115,12 +115,4 @@ public interface AiKnowledgeDocumentService {
         return convertMap(getKnowledgeDocumentList(ids), AiKnowledgeDocumentDO::getId);
     }
 
-    /**
-     * 获取指定状态的文档列表
-     *
-     * @param status 状态
-     * @return 文档列表
-     */
-    List<AiKnowledgeDocumentDO> getKnowledgeDocumentListByStatus(Integer status);
-
 }

+ 0 - 6
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java

@@ -7,7 +7,6 @@ import cn.hutool.http.HttpUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentCreateListReqVO;
 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO;
 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO;
@@ -211,9 +210,4 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
         return knowledgeDocumentMapper.selectByIds(ids);
     }
 
-    @Override
-    public List<AiKnowledgeDocumentDO> getKnowledgeDocumentListByStatus(Integer status) {
-        return knowledgeDocumentMapper.selectListByStatus(status);
-    }
-
 }

+ 10 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeService.java

@@ -5,6 +5,8 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow
 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeSaveReqVO;
 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
 
+import java.util.List;
+
 /**
  * AI 知识库-基础信息 Service 接口
  *
@@ -50,4 +52,12 @@ public interface AiKnowledgeService {
      */
     PageResult<AiKnowledgeDO> getKnowledgePage(AiKnowledgePageReqVO pageReqVO);
 
+    /**
+     * 获得指定状态的知识库列表
+     *
+     * @param status 状态
+     * @return 知识库列表
+     */
+    List<AiKnowledgeDO> getKnowledgeSimpleListByStatus(Integer status);
+
 }

+ 7 - 0
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeServiceImpl.java

@@ -12,6 +12,8 @@ import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.KNOWLEDGE_NOT_EXISTS;
 
@@ -76,4 +78,9 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
         return knowledgeMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<AiKnowledgeDO> getKnowledgeSimpleListByStatus(Integer status) {
+        return knowledgeMapper.selectListByStatus(status);
+    }
+
 }

+ 13 - 13
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/model/AiChatRoleServiceImpl.java

@@ -5,14 +5,13 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO;
 import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
 import cn.iocoder.yudao.module.ai.dal.mysql.model.AiChatRoleMapper;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
+import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -23,7 +22,8 @@ import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.CHAT_ROLE_DISABLE;
+import static cn.iocoder.yudao.module.ai.enums.ErrorCodeConstants.CHAT_ROLE_NOT_EXISTS;
 
 /**
  * AI 聊天角色 Service 实现类
@@ -38,12 +38,12 @@ public class AiChatRoleServiceImpl implements AiChatRoleService {
     private AiChatRoleMapper chatRoleMapper;
 
     @Resource
-    private AiKnowledgeDocumentService knowledgeDocumentService;
+    private AiKnowledgeService knowledgeService;
 
     @Override
     public Long createChatRole(AiChatRoleSaveReqVO createReqVO) {
         // 校验文档
-        validateDocuments(createReqVO.getDocumentIds());
+        validateDocuments(createReqVO.getKnowledgeIds());
 
         // 保存角色
         AiChatRoleDO chatRole = BeanUtils.toBean(createReqVO, AiChatRoleDO.class);
@@ -54,7 +54,7 @@ public class AiChatRoleServiceImpl implements AiChatRoleService {
     @Override
     public Long createChatRoleMy(AiChatRoleSaveMyReqVO createReqVO, Long userId) {
         // 校验文档
-        validateDocuments(createReqVO.getDocumentIds());
+        validateDocuments(createReqVO.getKnowledgeIds());
 
         // 保存角色
         AiChatRoleDO chatRole = BeanUtils.toBean(createReqVO, AiChatRoleDO.class).setUserId(userId)
@@ -68,7 +68,7 @@ public class AiChatRoleServiceImpl implements AiChatRoleService {
         // 校验存在
         validateChatRoleExists(updateReqVO.getId());
         // 校验文档
-        validateDocuments(updateReqVO.getDocumentIds());
+        validateDocuments(updateReqVO.getKnowledgeIds());
 
         // 更新角色
         AiChatRoleDO updateObj = BeanUtils.toBean(updateReqVO, AiChatRoleDO.class);
@@ -83,7 +83,7 @@ public class AiChatRoleServiceImpl implements AiChatRoleService {
             throw exception(CHAT_ROLE_NOT_EXISTS);
         }
         // 校验文档
-        validateDocuments(updateReqVO.getDocumentIds());
+        validateDocuments(updateReqVO.getKnowledgeIds());
 
         // 更新
         AiChatRoleDO updateObj = BeanUtils.toBean(updateReqVO, AiChatRoleDO.class);
@@ -91,16 +91,16 @@ public class AiChatRoleServiceImpl implements AiChatRoleService {
     }
 
     /**
-     * 校验文档是否存在
+     * 校验知识库是否存在
      *
-     * @param documentIds 文档编号列表
+     * @param knowledgeIds 知识库编号列表
      */
-    private void validateDocuments(List<Long> documentIds) {
-        if (CollUtil.isEmpty(documentIds)) {
+    private void validateDocuments(List<Long> knowledgeIds) {
+        if (CollUtil.isEmpty(knowledgeIds)) {
             return;
         }
         // 校验文档是否存在
-        documentIds.forEach(knowledgeDocumentService::validateKnowledgeDocumentExists);
+        knowledgeIds.forEach(knowledgeService::validateKnowledgeExists);
     }
 
     @Override