Commit e5cc9d2ad857939a42a8ddabd37c9c445981d734

Authored by YunaiV
1 parent 7918ba7d

【代码优化】AI:知识库的索引过程

Showing 19 changed files with 149 additions and 47 deletions
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java
@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow
9 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; 9 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
10 import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService; 10 import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService;
11 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
12 import io.swagger.v3.oas.annotations.tags.Tag; 13 import io.swagger.v3.oas.annotations.tags.Tag;
13 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
14 import jakarta.validation.Valid; 15 import jakarta.validation.Valid;
@@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.*; @@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
17 18
18 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
19 20
  21 +// TODO @芋艿:增加权限标识
20 @Tag(name = "管理后台 - AI 知识库") 22 @Tag(name = "管理后台 - AI 知识库")
21 @RestController 23 @RestController
22 @RequestMapping("/ai/knowledge") 24 @RequestMapping("/ai/knowledge")
@@ -29,11 +31,19 @@ public class AiKnowledgeController { @@ -29,11 +31,19 @@ public class AiKnowledgeController {
29 @GetMapping("/page") 31 @GetMapping("/page")
30 @Operation(summary = "获取知识库分页") 32 @Operation(summary = "获取知识库分页")
31 public CommonResult<PageResult<AiKnowledgeRespVO>> getKnowledgePage(@Valid AiKnowledgePageReqVO pageReqVO) { 33 public CommonResult<PageResult<AiKnowledgeRespVO>> getKnowledgePage(@Valid AiKnowledgePageReqVO pageReqVO) {
32 - 34 +
33 PageResult<AiKnowledgeDO> pageResult = knowledgeService.getKnowledgePage(pageReqVO); 35 PageResult<AiKnowledgeDO> pageResult = knowledgeService.getKnowledgePage(pageReqVO);
34 return success(BeanUtils.toBean(pageResult, AiKnowledgeRespVO.class)); 36 return success(BeanUtils.toBean(pageResult, AiKnowledgeRespVO.class));
35 } 37 }
36 38
  39 + @GetMapping("/get")
  40 + @Operation(summary = "获得知识库")
  41 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  42 + public CommonResult<AiKnowledgeRespVO> getKnowledge(@RequestParam("id") Long id) {
  43 + AiKnowledgeDO knowledge = knowledgeService.getKnowledge(id);
  44 + return success(BeanUtils.toBean(knowledge, AiKnowledgeRespVO.class));
  45 + }
  46 +
37 @PostMapping("/create") 47 @PostMapping("/create")
38 @Operation(summary = "创建知识库") 48 @Operation(summary = "创建知识库")
39 public CommonResult<Long> createKnowledge(@RequestBody @Valid AiKnowledgeSaveReqVO createReqVO) { 49 public CommonResult<Long> createKnowledge(@RequestBody @Valid AiKnowledgeSaveReqVO createReqVO) {
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; 6 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO;
7 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentRespVO; 7 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentRespVO;
8 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; 8 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO;
9 -import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateListReqVO; 9 +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentCreateListReqVO;
10 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; 10 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
11 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; 11 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
12 import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService; 12 import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
@@ -21,6 +21,7 @@ import java.util.List; @@ -21,6 +21,7 @@ import java.util.List;
21 21
22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
23 23
  24 +// TODO @芋艿:增加权限标识
24 @Tag(name = "管理后台 - AI 知识库文档") 25 @Tag(name = "管理后台 - AI 知识库文档")
25 @RestController 26 @RestController
26 @RequestMapping("/ai/knowledge/document") 27 @RequestMapping("/ai/knowledge/document")
@@ -38,6 +39,13 @@ public class AiKnowledgeDocumentController { @@ -38,6 +39,13 @@ public class AiKnowledgeDocumentController {
38 return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class)); 39 return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class));
39 } 40 }
40 41
  42 + @GetMapping("/get")
  43 + @Operation(summary = "获取文档详情")
  44 + public CommonResult<AiKnowledgeDocumentRespVO> getKnowledgeDocument(@RequestParam("id") Long id) {
  45 + AiKnowledgeDocumentDO document = documentService.getKnowledgeDocument(id);
  46 + return success(BeanUtils.toBean(document, AiKnowledgeDocumentRespVO.class));
  47 + }
  48 +
41 @PostMapping("/create") 49 @PostMapping("/create")
42 @Operation(summary = "新建文档") 50 @Operation(summary = "新建文档")
43 public CommonResult<Long> createKnowledgeDocument(@RequestBody @Valid AiKnowledgeDocumentCreateReqVO reqVO) { 51 public CommonResult<Long> createKnowledgeDocument(@RequestBody @Valid AiKnowledgeDocumentCreateReqVO reqVO) {
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.java
@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*; @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
18 18
19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
20 20
  21 +// TODO @芋艿:增加权限标识
21 @Tag(name = "管理后台 - AI 知识库段落") 22 @Tag(name = "管理后台 - AI 知识库段落")
22 @RestController 23 @RestController
23 @RequestMapping("/ai/knowledge/segment") 24 @RequestMapping("/ai/knowledge/segment")
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeDocumentCreateListReqVO.java renamed to yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentCreateListReqVO.java
1 -package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; 1 +package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotBlank; 4 import jakarta.validation.constraints.NotBlank;
@@ -17,6 +17,10 @@ public class AiKnowledgeDocumentCreateListReqVO { @@ -17,6 +17,10 @@ public class AiKnowledgeDocumentCreateListReqVO {
17 @NotNull(message = "知识库编号不能为空") 17 @NotNull(message = "知识库编号不能为空")
18 private Long knowledgeId; 18 private Long knowledgeId;
19 19
  20 + @Schema(description = "分段的最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "800")
  21 + @NotNull(message = "分段的最大 Token 数不能为空")
  22 + private Integer segmentMaxTokens;
  23 +
20 @Schema(description = "文档列表", requiredMode = Schema.RequiredMode.REQUIRED) 24 @Schema(description = "文档列表", requiredMode = Schema.RequiredMode.REQUIRED)
21 @NotEmpty(message = "文档列表不能为空") 25 @NotEmpty(message = "文档列表不能为空")
22 private List<Document> list; 26 private List<Document> list;
@@ -33,10 +37,6 @@ public class AiKnowledgeDocumentCreateListReqVO { @@ -33,10 +37,6 @@ public class AiKnowledgeDocumentCreateListReqVO {
33 @URL(message = "文档 URL 格式不正确") 37 @URL(message = "文档 URL 格式不正确")
34 private String url; 38 private String url;
35 39
36 - @Schema(description = "分段的最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "800")  
37 - @NotNull(message = "分段的最大 Token 数不能为空")  
38 - private Integer segmentMaxTokens;  
39 -  
40 } 40 }
41 41
42 } 42 }
43 \ No newline at end of file 43 \ No newline at end of file
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentPageReqVO.java
@@ -8,6 +8,9 @@ import lombok.Data; @@ -8,6 +8,9 @@ import lombok.Data;
8 @Data 8 @Data
9 public class AiKnowledgeDocumentPageReqVO extends PageParam { 9 public class AiKnowledgeDocumentPageReqVO extends PageParam {
10 10
  11 + @Schema(description = "知识库编号", example = "1")
  12 + private Long knowledgeId;
  13 +
11 @Schema(description = "文档名称", example = "Java 开发手册") 14 @Schema(description = "文档名称", example = "Java 开发手册")
12 private String name; 15 private String name;
13 16
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentRespVO.java
1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document; 1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
2 2
3 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
4 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 4 import lombok.Data;
6 5
7 -@Schema(description = "管理后台 - AI 知识库-文档 Response VO") 6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - AI 知识库文档 Response VO")
8 @Data 9 @Data
9 -public class AiKnowledgeDocumentRespVO extends PageParam { 10 +public class AiKnowledgeDocumentRespVO {
10 11
11 - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") 12 + @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
12 private Long id; 13 private Long id;
13 14
14 @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790") 15 @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
15 private Long knowledgeId; 16 private Long knowledgeId;
16 17
17 - @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册") 18 + @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
18 private String name; 19 private String name;
19 20
20 - @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 是一门面向对象的语言.....") 21 + @Schema(description = "文档 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn")
  22 + private String url;
  23 +
  24 + @Schema(description = "文档内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 是一门面向对象的语言.....")
21 private String content; 25 private String content;
22 26
23 - @Schema(description = "文档 url", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn")  
24 - private String url; 27 + @Schema(description = "文档内容长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
  28 + private Integer contentLength;
25 29
26 - @Schema(description = "token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 30 + @Schema(description = "文档 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
27 private Integer tokens; 31 private Integer tokens;
28 32
29 - @Schema(description = "字符数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1008")  
30 - private Integer wordCount; 33 + @Schema(description = "分片最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "512")
  34 + private Integer segmentMaxTokens;
31 35
32 - @Schema(description = "切片状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
33 - private Integer sliceStatus; 36 + @Schema(description = "召回次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
  37 + private Integer retrievalCount;
34 38
35 - @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 39 + @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
36 private Integer status; 40 private Integer status;
37 41
  42 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  43 + private LocalDateTime createTime;
  44 +
38 } 45 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateReqVO.java
@@ -6,8 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema; @@ -6,8 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
6 import jakarta.validation.constraints.NotNull; 6 import jakarta.validation.constraints.NotNull;
7 import lombok.Data; 7 import lombok.Data;
8 8
9 -  
10 -@Schema(description = "管理后台 - AI 更新 知识库-文档 Request VO") 9 +// TODO @芋艿:稍后优化
  10 +@Schema(description = "管理后台 - AI 知识库文档更新 Request VO")
11 @Data 11 @Data
12 public class AiKnowledgeDocumentUpdateReqVO { 12 public class AiKnowledgeDocumentUpdateReqVO {
13 13
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgePageReqVO.java
1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; 1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 4 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
6 13
7 @Schema(description = "管理后台 - AI 知识库的分页 Request VO") 14 @Schema(description = "管理后台 - AI 知识库的分页 Request VO")
8 @Data 15 @Data
9 public class AiKnowledgePageReqVO extends PageParam { 16 public class AiKnowledgePageReqVO extends PageParam {
10 17
11 - @Schema(description = "知识库名称", example = "Java 开发手册") 18 + @Schema(description = "知识库名称", example = "芋艿")
12 private String name; 19 private String name;
13 20
  21 + @Schema(description = "是否启用", example = "1")
  22 + @InEnum(CommonStatusEnum.class)
  23 + private Integer status;
  24 +
  25 + @Schema(description = "创建时间")
  26 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  27 + private LocalDateTime[] createTime;
  28 +
14 } 29 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeRespVO.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
  6 +import java.time.LocalDateTime;
6 7
7 @Schema(description = "管理后台 - AI 知识库 Response VO") 8 @Schema(description = "管理后台 - AI 知识库 Response VO")
8 @Data 9 @Data
@@ -17,10 +18,22 @@ public class AiKnowledgeRespVO { @@ -17,10 +18,22 @@ public class AiKnowledgeRespVO {
17 @Schema(description = "知识库描述", example = "帮助你快速构建系统") 18 @Schema(description = "知识库描述", example = "帮助你快速构建系统")
18 private String description; 19 private String description;
19 20
20 - @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "14")  
21 - private Long modelId; 21 + @Schema(description = "向量模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "14")
  22 + private Long embeddingModelId;
22 23
23 - @Schema(description = "模型标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "qwen-72b-chat")  
24 - private String model; 24 + @Schema(description = "向量模型标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "qwen-72b-chat")
  25 + private String embeddingModel;
  26 +
  27 + @Schema(description = "topK", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
  28 + private Integer topK;
  29 +
  30 + @Schema(description = "相似度阈值", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.7")
  31 + private Double similarityThreshold;
  32 +
  33 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  34 + private Integer status;
  35 +
  36 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  37 + private LocalDateTime createTime;
25 38
26 } 39 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeSaveReqVO.java
1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge; 1 package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotBlank; 6 import jakarta.validation.constraints.NotBlank;
5 import jakarta.validation.constraints.NotNull; 7 import jakarta.validation.constraints.NotNull;
@@ -31,6 +33,9 @@ public class AiKnowledgeSaveReqVO { @@ -31,6 +33,9 @@ public class AiKnowledgeSaveReqVO {
31 @NotNull(message = "相似性阈值不能为空") 33 @NotNull(message = "相似性阈值不能为空")
32 private Double similarityThreshold; 34 private Double similarityThreshold;
33 35
34 - // TODO @芋艿:status 36 + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  37 + @NotNull(message = "是否启用不能为空")
  38 + @InEnum(CommonStatusEnum.class)
  39 + private Integer status;
35 40
36 } 41 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeDocumentDO.java
@@ -29,7 +29,7 @@ public class AiKnowledgeDocumentDO extends BaseDO { @@ -29,7 +29,7 @@ public class AiKnowledgeDocumentDO extends BaseDO {
29 */ 29 */
30 private Long knowledgeId; 30 private Long knowledgeId;
31 /** 31 /**
32 - * 文件名称 32 + * 文档名称
33 */ 33 */
34 private String name; 34 private String name;
35 /** 35 /**
@@ -50,11 +50,16 @@ public class AiKnowledgeDocumentDO extends BaseDO { @@ -50,11 +50,16 @@ public class AiKnowledgeDocumentDO extends BaseDO {
50 */ 50 */
51 private Integer tokens; 51 private Integer tokens;
52 /** 52 /**
53 - * 每个文本块的目标 token 数 53 + * 分片最大 Token 数
54 */ 54 */
55 private Integer segmentMaxTokens; 55 private Integer segmentMaxTokens;
56 56
57 /** 57 /**
  58 + * 召回次数
  59 + */
  60 + private Integer retrievalCount;
  61 +
  62 + /**
58 * 状态 63 * 状态
59 * <p> 64 * <p>
60 * 枚举 {@link CommonStatusEnum} 65 * 枚举 {@link CommonStatusEnum}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/dataobject/knowledge/AiKnowledgeSegmentDO.java
@@ -58,6 +58,11 @@ public class AiKnowledgeSegmentDO extends BaseDO { @@ -58,6 +58,11 @@ public class AiKnowledgeSegmentDO extends BaseDO {
58 private Integer tokens; 58 private Integer tokens;
59 59
60 /** 60 /**
  61 + * 召回次数
  62 + */
  63 + private Integer retrievalCount;
  64 +
  65 + /**
61 * 状态 66 * 状态
62 * <p> 67 * <p>
63 * 枚举 {@link CommonStatusEnum} 68 * 枚举 {@link CommonStatusEnum}
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeDocumentMapper.java
@@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO @@ -8,7 +8,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 /** 10 /**
11 - * AI 知识库-文档 Mapper 11 + * AI 知识库文档 Mapper
12 * 12 *
13 * @author xiaoxin 13 * @author xiaoxin
14 */ 14 */
@@ -17,6 +17,7 @@ public interface AiKnowledgeDocumentMapper extends BaseMapperX&lt;AiKnowledgeDocume @@ -17,6 +17,7 @@ public interface AiKnowledgeDocumentMapper extends BaseMapperX&lt;AiKnowledgeDocume
17 17
18 default PageResult<AiKnowledgeDocumentDO> selectPage(AiKnowledgeDocumentPageReqVO reqVO) { 18 default PageResult<AiKnowledgeDocumentDO> selectPage(AiKnowledgeDocumentPageReqVO reqVO) {
19 return selectPage(reqVO, new LambdaQueryWrapperX<AiKnowledgeDocumentDO>() 19 return selectPage(reqVO, new LambdaQueryWrapperX<AiKnowledgeDocumentDO>()
  20 + .eqIfPresent(AiKnowledgeDocumentDO::getKnowledgeId, reqVO.getKnowledgeId())
20 .likeIfPresent(AiKnowledgeDocumentDO::getName, reqVO.getName()) 21 .likeIfPresent(AiKnowledgeDocumentDO::getName, reqVO.getName())
21 .orderByDesc(AiKnowledgeDocumentDO::getId)); 22 .orderByDesc(AiKnowledgeDocumentDO::getId));
22 } 23 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeMapper.java
1 package cn.iocoder.yudao.module.ai.dal.mysql.knowledge; 1 package cn.iocoder.yudao.module.ai.dal.mysql.knowledge;
2 2
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -9,7 +8,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; @@ -9,7 +8,7 @@ import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
9 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
10 9
11 /** 10 /**
12 - * AI 知识库基础信息 Mapper 11 + * AI 知识库 Mapper
13 * 12 *
14 * @author xiaoxin 13 * @author xiaoxin
15 */ 14 */
@@ -18,7 +17,10 @@ public interface AiKnowledgeMapper extends BaseMapperX&lt;AiKnowledgeDO&gt; { @@ -18,7 +17,10 @@ public interface AiKnowledgeMapper extends BaseMapperX&lt;AiKnowledgeDO&gt; {
18 17
19 default PageResult<AiKnowledgeDO> selectPage(AiKnowledgePageReqVO pageReqVO) { 18 default PageResult<AiKnowledgeDO> selectPage(AiKnowledgePageReqVO pageReqVO) {
20 return selectPage(pageReqVO, new LambdaQueryWrapperX<AiKnowledgeDO>() 19 return selectPage(pageReqVO, new LambdaQueryWrapperX<AiKnowledgeDO>()
21 - .eq(AiKnowledgeDO::getStatus, CommonStatusEnum.ENABLE.getStatus())  
22 - .likeIfPresent(AiKnowledgeDO::getName, pageReqVO.getName())); 20 + .likeIfPresent(AiKnowledgeDO::getName, pageReqVO.getName())
  21 + .eqIfPresent(AiKnowledgeDO::getStatus, pageReqVO.getStatus())
  22 + .betweenIfPresent(AiKnowledgeDO::getCreateTime, pageReqVO.getCreateTime())
  23 + .orderByDesc(AiKnowledgeDO::getId));
23 } 24 }
  25 +
24 } 26 }
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/dal/mysql/knowledge/AiKnowledgeSegmentMapper.java
@@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper; @@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
10 import java.util.List; 10 import java.util.List;
11 11
12 /** 12 /**
13 - * AI 知识库-分片 Mapper 13 + * AI 知识库分片 Mapper
14 * 14 *
15 * @author xiaoxin 15 * @author xiaoxin
16 */ 16 */
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentService.java
@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; 4 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO;
5 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; 5 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO;
6 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; 6 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
7 -import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateListReqVO; 7 +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentCreateListReqVO;
8 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; 8 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
9 9
10 import java.util.List; 10 import java.util.List;
@@ -41,6 +41,14 @@ public interface AiKnowledgeDocumentService { @@ -41,6 +41,14 @@ public interface AiKnowledgeDocumentService {
41 PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage(AiKnowledgeDocumentPageReqVO pageReqVO); 41 PageResult<AiKnowledgeDocumentDO> getKnowledgeDocumentPage(AiKnowledgeDocumentPageReqVO pageReqVO);
42 42
43 /** 43 /**
  44 + * 获取文档详情
  45 + *
  46 + * @param id 文档编号
  47 + * @return 文档详情
  48 + */
  49 + AiKnowledgeDocumentDO getKnowledgeDocument(Long id);
  50 +
  51 + /**
44 * 更新文档 52 * 更新文档
45 * 53 *
46 * @param reqVO 更新信息 54 * @param reqVO 更新信息
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeDocumentServiceImpl.java
@@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -8,7 +8,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO; 9 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentPageReqVO;
10 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO; 10 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentUpdateReqVO;
11 -import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateListReqVO; 11 +import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.AiKnowledgeDocumentCreateListReqVO;
12 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO; 12 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
13 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO; 13 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
14 import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeDocumentMapper; 14 import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeDocumentMapper;
@@ -84,15 +84,17 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic @@ -84,15 +84,17 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
84 for (int i = 0; i < createListReqVO.getList().size(); i++) { 84 for (int i = 0; i < createListReqVO.getList().size(); i++) {
85 AiKnowledgeDocumentCreateListReqVO.Document documentVO = createListReqVO.getList().get(i); 85 AiKnowledgeDocumentCreateListReqVO.Document documentVO = createListReqVO.getList().get(i);
86 String content = contents.get(i); 86 String content = contents.get(i);
87 - documentDOs.add(BeanUtils.toBean(documentVO, AiKnowledgeDocumentDO.class).setKnowledgeId(createListReqVO.getKnowledgeId())  
88 - .setContent(content).setContentLength(content.length()).setTokens(tokenCountEstimator.estimate(content)) 87 + documentDOs.add(BeanUtils.toBean(documentVO, AiKnowledgeDocumentDO.class)
  88 + .setKnowledgeId(createListReqVO.getKnowledgeId())
  89 + .setContent(content).setContentLength(content.length())
  90 + .setTokens(tokenCountEstimator.estimate(content))
89 .setStatus(CommonStatusEnum.ENABLE.getStatus())); 91 .setStatus(CommonStatusEnum.ENABLE.getStatus()));
90 } 92 }
91 knowledgeDocumentMapper.insertBatch(documentDOs); 93 knowledgeDocumentMapper.insertBatch(documentDOs);
92 94
93 // 4. 批量创建文档切片(异步) 95 // 4. 批量创建文档切片(异步)
94 - documentDOs.forEach(documentDO ->  
95 - knowledgeSegmentService.createKnowledgeSegmentBySplitContentAsync(documentDO.getId(), documentDO.getContent())); 96 + documentDOs.forEach(documentDO -> knowledgeSegmentService
  97 + .createKnowledgeSegmentBySplitContentAsync(documentDO.getId(), documentDO.getContent()));
96 return convertList(documentDOs, AiKnowledgeDocumentDO::getId); 98 return convertList(documentDOs, AiKnowledgeDocumentDO::getId);
97 } 99 }
98 100
@@ -102,6 +104,11 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic @@ -102,6 +104,11 @@ public class AiKnowledgeDocumentServiceImpl implements AiKnowledgeDocumentServic
102 } 104 }
103 105
104 @Override 106 @Override
  107 + public AiKnowledgeDocumentDO getKnowledgeDocument(Long id) {
  108 + return knowledgeDocumentMapper.selectById(id);
  109 + }
  110 +
  111 + @Override
105 public void updateKnowledgeDocument(AiKnowledgeDocumentUpdateReqVO reqVO) { 112 public void updateKnowledgeDocument(AiKnowledgeDocumentUpdateReqVO reqVO) {
106 // 1. 校验文档是否存在 113 // 1. 校验文档是否存在
107 validateKnowledgeDocumentExists(reqVO.getId()); 114 validateKnowledgeDocumentExists(reqVO.getId());
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeService.java
@@ -28,6 +28,14 @@ public interface AiKnowledgeService { @@ -28,6 +28,14 @@ public interface AiKnowledgeService {
28 void updateKnowledge(AiKnowledgeSaveReqVO updateReqVO); 28 void updateKnowledge(AiKnowledgeSaveReqVO updateReqVO);
29 29
30 /** 30 /**
  31 + * 获得知识库
  32 + *
  33 + * @param id 编号
  34 + * @return 知识库
  35 + */
  36 + AiKnowledgeDO getKnowledge(Long id);
  37 +
  38 + /**
31 * 校验知识库是否存在 39 * 校验知识库是否存在
32 * 40 *
33 * @param id 记录编号 41 * @param id 记录编号
yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/knowledge/AiKnowledgeServiceImpl.java
1 package cn.iocoder.yudao.module.ai.service.knowledge; 1 package cn.iocoder.yudao.module.ai.service.knowledge;
2 2
3 -import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;  
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgePageReqVO; 5 import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgePageReqVO;
@@ -8,11 +7,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow @@ -8,11 +7,9 @@ import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnow
8 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO; 7 import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
9 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO; 8 import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatModelDO;
10 import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeMapper; 9 import cn.iocoder.yudao.module.ai.dal.mysql.knowledge.AiKnowledgeMapper;
11 -import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;  
12 import cn.iocoder.yudao.module.ai.service.model.AiChatModelService; 10 import cn.iocoder.yudao.module.ai.service.model.AiChatModelService;
13 import jakarta.annotation.Resource; 11 import jakarta.annotation.Resource;
14 import lombok.extern.slf4j.Slf4j; 12 import lombok.extern.slf4j.Slf4j;
15 -import org.springframework.ai.vectorstore.VectorStore;  
16 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
17 14
18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 15 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -40,7 +37,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService { @@ -40,7 +37,7 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
40 37
41 // 2. 插入知识库 38 // 2. 插入知识库
42 AiKnowledgeDO knowledge = BeanUtils.toBean(createReqVO, AiKnowledgeDO.class) 39 AiKnowledgeDO knowledge = BeanUtils.toBean(createReqVO, AiKnowledgeDO.class)
43 - .setEmbeddingModel(model.getModel()).setStatus(CommonStatusEnum.ENABLE.getStatus()); 40 + .setEmbeddingModel(model.getModel());
44 knowledgeMapper.insert(knowledge); 41 knowledgeMapper.insert(knowledge);
45 return knowledge.getId(); 42 return knowledge.getId();
46 } 43 }
@@ -56,6 +53,13 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService { @@ -56,6 +53,13 @@ public class AiKnowledgeServiceImpl implements AiKnowledgeService {
56 AiKnowledgeDO updateObj = BeanUtils.toBean(updateReqVO, AiKnowledgeDO.class) 53 AiKnowledgeDO updateObj = BeanUtils.toBean(updateReqVO, AiKnowledgeDO.class)
57 .setEmbeddingModel(model.getModel()); 54 .setEmbeddingModel(model.getModel());
58 knowledgeMapper.updateById(updateObj); 55 knowledgeMapper.updateById(updateObj);
  56 +
  57 + // TODO @芋艿:如果模型变化,需要 reindex 所有的文档
  58 + }
  59 +
  60 + @Override
  61 + public AiKnowledgeDO getKnowledge(Long id) {
  62 + return knowledgeMapper.selectById(id);
59 } 63 }
60 64
61 @Override 65 @Override