Commit 10c477ab authored by 陈立彬's avatar 陈立彬

知识库管理

parent 151e5a2b
package cn.breeze.elleai.application.dto.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
public class KbRequestDto implements Serializable {
@Schema(description = "页码")
@JsonProperty("page_no")
private Integer pageNo = 1;
@Schema(description = "分页数量")
@JsonProperty("page_size")
private Integer pageSize = 10;
@Schema(description = "名称")
private String name;
@Schema(description = "状态(0禁用 1启用)")
private Integer status;
@Schema(description = "分类ID")
@JsonProperty("tag_id")
private Integer tagId;
}
package cn.breeze.elleai.application.dto.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
public class KbSaveDto implements Serializable {
private Long id;
/**
* 知识分类ID
*/
private Long tagId;
/**
* 问题
*/
private String question;
/**
* 答案
*/
private String answer;
/**
* 状态0停用,1启用
*/
private Integer status;
}
package cn.breeze.elleai.application.dto.response;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class KbDto implements Serializable {
private Long id;
/**
* 知识分类ID
*/
private Long tagId;
/**
* 问题
*/
private String question;
/**
* 答案
*/
private String answer;
/**
* 状态0停用,1启用
*/
private Integer status;
/**
* 创建时间
*/
private Date createAt;
/**
* 更新时间
*/
private Date updateAt;
}
package cn.breeze.elleai.application.dto.response;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class KbTagDto implements Serializable {
private Long id;
/**
* 分类名称
*/
private String name;
private String description;
/**
* 状态0停用,1启用
*/
private Integer status;
/**
* 创建时间
*/
private Date createAt;
/**
* 父级ID(1级为0)
*/
private Long parentId;
}
package cn.breeze.elleai.application.service;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.langchain.VectorSegment;
import cn.breeze.elleai.application.dto.request.KbRequestDto;
import cn.breeze.elleai.application.dto.request.KbSaveDto;
import cn.breeze.elleai.application.dto.response.KbDto;
import cn.breeze.elleai.application.dto.response.KbTagDto;
import cn.breeze.elleai.domain.sparring.model.request.KbRequestModel;
import cn.breeze.elleai.domain.sparring.model.request.KbSaveModel;
import cn.breeze.elleai.domain.sparring.model.response.KbResponseModel;
import cn.breeze.elleai.domain.sparring.model.response.KbVectorResponseModel;
import cn.breeze.elleai.domain.sparring.service.KbService;
import cn.breeze.elleai.domain.sparring.service.KbTagService;
import cn.breeze.elleai.domain.sparring.service.KbVectorService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.mybatisflex.core.paginate.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 应用服务
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class AppKbService {
private final KbService kbService;
private final KbTagService kbTagService;
private final KbVectorService kbVectorService;
private final AIService aiService;
/************************************************** 知识库 **************************************************/
/**
* 更新知识库
* @param id
* @param status
*/
public void updateKbStatus(Integer id, Integer status) {
KbResponseModel kbResponseModel = kbService.kbDetail(id);
if(Objects.nonNull(kbResponseModel)) {
kbService.updateKbStatus(id, status);
// 启用/禁用 同步更新向量数据库
KbVectorResponseModel vectorResponseModel = kbVectorService.kbVectorDetail(id);
if(Objects.equals(status, 0)) {
aiService.removeSegments(List.of(String.valueOf(vectorResponseModel.getVectorId())));
} else {
VectorSegment vectorSegment = new VectorSegment();
vectorSegment.setContent(kbResponseModel.getQuestion() + "\n" + kbResponseModel.getAnswer());
Map<String, Object> metadata = new HashMap<>();
metadata.put("kb_id", kbResponseModel.getStatus());
metadata.put("tag_id", kbResponseModel.getTagId());
metadata.put("question", kbResponseModel.getQuestion());
metadata.put("answer", kbResponseModel.getAnswer());
vectorSegment.setMetadata(metadata);
aiService.addVectorSegments(List.of(vectorSegment));
}
}
}
/**
* 删除知识库
* @param id
*/
public void deleteKb(Integer id) {
kbService.deleteKb(id);
KbVectorResponseModel vectorResponseModel = kbVectorService.kbVectorDetail(id);
aiService.removeSegments(List.of(String.valueOf(vectorResponseModel.getVectorId())));
}
/**
* 获取知识库详情
* @param id
* @return
*/
public KbDto kbDetail(Integer id) {
KbResponseModel model = kbService.kbDetail(id);
KbDto result = BeanUtil.copyProperties(model, KbDto.class);
return result;
}
/**
* 保存知识库
* @param dto
*/
public void saveKb(KbSaveDto dto) {
KbSaveModel model = BeanUtil.copyProperties(dto, KbSaveModel.class);
kbService.saveKb(model);
}
/**
* 知识库分页查询
* @param request
* @return
*/
public PageResult<KbDto> kbPaginQuery(KbRequestDto request) {
KbRequestModel requestModel = BeanUtil.copyProperties(request, KbRequestModel.class);
Page<KbResponseModel> page = kbService.kbPaginQuery(requestModel);
PageResult<KbDto> pageResult = PageResult.of(request.getPageNo(), request.getPageSize(), (int) page.getTotalRow(), null);
if(CollectionUtil.isNotEmpty(page.getRecords())) {
List<KbDto> dtoList = page.getRecords().stream().map(v -> {
KbDto dto = BeanUtil.copyProperties(v, KbDto.class);
return dto;
}).collect(Collectors.toList());
pageResult.setItems(dtoList);
}
return pageResult;
}
/**
* 知识库分类列表
* @return
*/
public List<KbTagDto> kbTagList() {
// DataDicResponseModel dataDicByCode = commonService.getDataDicByCode(Codes.DATA_DIC_KDB_CATEGORY_LIST);
// if(Objects.nonNull(dataDicByCode) && StrUtil.isNotEmpty(dataDicByCode.getDataValue())) {
// return JSONObject.parseArray(dataDicByCode.getDataValue(), KnowledgeDataBaseCategoryDto.class);
// }
return null;
}
}
package cn.breeze.elleai.controller.admin;
import cn.breeze.elleai.application.dto.ApiResponse;
import cn.breeze.elleai.application.dto.PageResult;
import cn.breeze.elleai.application.dto.request.KbRequestDto;
import cn.breeze.elleai.application.dto.request.KbSaveDto;
import cn.breeze.elleai.application.dto.request.WikiCategoryRequestDto;
import cn.breeze.elleai.application.dto.request.WikiCategorySaveDto;
import cn.breeze.elleai.application.dto.response.KbDto;
import cn.breeze.elleai.application.dto.response.WikiCategoryDto;
import cn.breeze.elleai.application.service.AppKbService;
import cn.breeze.elleai.config.QueryParam;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/admin/kb")
@Tag(name = "管理端-知识库", description = "知识库")
@RequiredArgsConstructor
public class KbController {
private final AppKbService kbService;
@Operation(summary = "知识库详情")
@GetMapping("/detail/{id}")
public ApiResponse<KbDto> detail(@Schema(description = "知识库ID") @PathVariable("id") Integer id) {
KbDto detail = kbService.kbDetail(id);
return ApiResponse.ok(detail);
}
@Operation(summary = "启用/禁用知识库")
@PostMapping("/update_status/{id}/{status}")
public ApiResponse<String> updateStatus(@Schema(description = "知识库ID") @PathVariable("id") Integer id,
@Schema(description = "状态(0禁用 1启用)") @PathVariable("status") Integer status) {
kbService.updateKbStatus(id, status);
return ApiResponse.ok("ok");
}
@Operation(summary = "删除知识库")
@PostMapping("/delete/{id}")
public ApiResponse<String> delete(@Schema(description = "知识库ID") @PathVariable("id") Integer id) {
kbService.deleteKb(id);
return ApiResponse.ok("ok");
}
@Operation(summary = "保存知识库")
@PostMapping("/save")
public ApiResponse<String> saveOrUpdate(@RequestBody KbSaveDto dto) {
kbService.saveKb(dto);
return ApiResponse.ok("ok");
}
@Operation(summary = "知识库列表")
@GetMapping("/list")
public ApiResponse<PageResult<KbDto>> list(@QueryParam KbRequestDto request) {
PageResult<KbDto> pageResult = kbService.kbPaginQuery(request);
return ApiResponse.ok(pageResult);
}
// @Operation(summary = "知识库分类详情")
// @GetMapping("/tag/detail/{id}")
// public ApiResponse<WikiCategoryDto> categoryDetail(@Schema(description = "知识库分类ID") @PathVariable("id") Integer id) {
// WikiCategoryDto detail = examineService.wikiCategoryDetail(id);
// return ApiResponse.ok(detail);
// }
//
// @Operation(summary = "启用/禁用知识库分类")
// @PostMapping("/tag/update_status/{id}/{status}")
// public ApiResponse<String> updateCategoryStatus(@Schema(description = "知识库分类ID") @PathVariable("id") Integer id,
// @Schema(description = "状态(0禁用 1启用)") @PathVariable("status") Integer status) {
// examineService.updateWikiCategoryStatus(id, status);
// return ApiResponse.ok("ok");
// }
//
// @Operation(summary = "删除知识库分类")
// @PostMapping("/tag/delete/{id}")
// public ApiResponse<String> deleteCategory(@Schema(description = "知识库分类ID") @PathVariable("id") Integer id) {
// examineService.deleteWikiCategory(id);
// return ApiResponse.ok("ok");
// }
//
// @Operation(summary = "保存知识库分类")
// @PostMapping("/tag/save")
// public ApiResponse<String> saveOrUpdateCategory(@RequestBody WikiCategorySaveDto dto) {
// examineService.saveWikiCategory(dto);
// return ApiResponse.ok("ok");
// }
//
// @Operation(summary = "知识库分类列表")
// @GetMapping("/tag/list]")
// public ApiResponse<PageResult<WikiCategoryDto>> categoryList(@QueryParam WikiCategoryRequestDto request) {
// PageResult<WikiCategoryDto> pageResult = examineService.wikiCategoryPaginQuery(request);
// return ApiResponse.ok(pageResult);
// }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment