知识库管理
本文将详细介绍如何 Max_KB 的知识库管理功能,包括接口设计和代码实现。我们将通过具体的 API 接口示例和 Java 代码,深入探讨系统的各个组成部分。
一、接口设计
1. 获取知识库列表
请求方式:GET
接口路径:/api/dataset/{pageNo}/{pageSize}
示例请求:
GET /api/dataset/1/20
示例响应:
{
"message": null,
"data": {
"size": 20,
"total": 1,
"records": [
{
"tenant_id": "0",
"creator": "",
"create_time": 1730769172064,
"embedding_mode_id": "443263808507674624",
"remark": null,
"type": "0",
"updater": "",
"update_time": 1730769172064,
"deleted": 0,
"user_id": "1",
"meta": null,
"name": "ICS 141",
"id": "443309276048408576",
"desc": "ICS 141 课程资料"
}
],
"current": 1
},
"code": 200
}
2. 创建知识库
请求方式:POST
接口路径:/api/dataset
请求体: 注意是 embedding_mode_id
{
"name": "ICS 11",
"desc": "ICS 111 课程资料",
"embedding_mode_id": "443263808507674624",
"type": "0"
}
示例响应:
{
"message": null,
"data": {
"id": "443309276048408576",
"name": "ICS 141",
"desc": "ICS 141 课程资料"
// 其他字段省略
},
"code": 200
}
3. 验证知识库
请求方式:GET
接口路径:/api/valid/dataset/{id}
示例请求:
http://localhost:3000/api/valid/dataset/50
示例响应:
{
"code": 200,
"message": "成功",
"data": true
}
4. 获取单个知识库详情
请求方式:GET
接口路径:/api/dataset/{id}
示例请求:
http://localhost:3000/api/dataset/443309276048408576
示例响应:
{
"message": null,
"data": {
"tenant_id": "0",
"creator": "",
"create_time": 1730769172064,
"embedding_mode_id": "443263808507674624",
"remark": null,
"type": "0",
"updater": "",
"update_time": 1730769172064,
"deleted": 0,
"user_id": "1",
"meta": null,
"name": "ICS 141",
"id": "443309276048408576",
"desc": "ICS 141 课程资料"
},
"code": 200
}
二、代码实现
1. 控制器层
控制器层负责处理 HTTP 请求,并调用相应的服务层方法。以下是 AapiDatasetController
的实现:
package com.litongjava.maxkb.controller;
import com.litongjava.annotation.Delete;
import com.litongjava.annotation.Get;
import com.litongjava.annotation.Post;
import com.litongjava.annotation.RequestPath;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.maxkb.model.KbDatasetModel;
import com.litongjava.maxkb.service.MaxKbDatasetService;
import com.litongjava.maxkb.service.MaxKbDocumentService;
import com.litongjava.model.result.ResultVo;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.tio.utils.json.JsonUtils;
@RequestPath("/api/dataset")
public class AapiDatasetController {
@Get("")
public ResultVo list() {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbDatasetService.class).list(userId);
}
@Get("/{pageNo}/{pageSize}")
public ResultVo page(Integer pageNo, Integer pageSize) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbDatasetService.class).page(userId, pageNo, pageSize);
}
@Post
public ResultVo save(HttpRequest request) {
String bodyString = request.getBodyString();
KbDatasetModel kbDatasetModel = JsonUtils.parse(bodyString, KbDatasetModel.class);
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbDatasetService.class).save(userId, kbDatasetModel);
}
@Get("/{id}")
public ResultVo get(Long id) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbDatasetService.class).get(userId, id);
}
@Delete("/{id}")
public ResultVo delete(Long id) {
Long userId = TioRequestContext.getUserIdLong();
return Aop.get(MaxKbDatasetService.class).delete(userId, id);
}
}
2. 服务层
服务层负责业务逻辑的处理。以下是 MaxKbDatasetService
的实现:
import java.util.List;
import com.jfinal.kit.Kv;
import com.litongjava.db.TableInput;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.kit.RecordUtils;
import com.litongjava.maxkb.constant.TableNames;
import com.litongjava.maxkb.dao.MaxKbDatasetDao;
import com.litongjava.maxkb.model.KbDatasetModel;
import com.litongjava.maxkb.model.ResultPage;
import com.litongjava.model.page.Page;
import com.litongjava.model.result.ResultVo;
import com.litongjava.table.services.ApiTable;
public class MaxKbDatasetService {
public ResultVo page(Long userId, Integer pageNo, Integer pageSize) {
TableInput tableInput = new TableInput();
tableInput.setPageNo(pageNo).setPageSize(pageSize).set("user_id", userId);
TableResult<Page<Row>> tableResult = ApiTable.page(TableNames.max_kb_dataset, tableInput);
Page<Row> page = tableResult.getData();
int totalRow = page.getTotalRow();
List<Kv> kvs = RecordUtils.recordsToKv(page.getList(), false);
ResultPage<Kv> resultPage = new ResultPage<>(pageNo, pageSize, totalRow, kvs);
return ResultVo.ok(resultPage);
}
public ResultVo save(Long userId, KbDatasetModel kbDatasetModel) {
ResultVo resultVo = new ResultVo();
TableResult<Kv> saveOrUpdate = Aop.get(MaxKbDatasetDao.class).saveOrUpdate(userId, kbDatasetModel);
return resultVo.setData(saveOrUpdate.getData());
}
public ResultVo get(Long userId, Long id) {
ResultVo resultVo = new ResultVo();
TableResult<Row> result = Aop.get(MaxKbDatasetDao.class).get(userId, id);
Kv kv = result.getData().toKv();
return resultVo.setData(kv);
}
public ResultVo list(Long userId) {
TableResult<List<Row>> tableResult = ApiTable.list(TableNames.max_kb_dataset, TableInput.by("user_id", userId));
List<Row> data = tableResult.getData();
List<Kv> kvs = RecordUtils.recordsToKv(data, false);
return ResultVo.ok(kvs);
}
public ResultVo delete(Long userId, Long id) {
TableInput tableInput = TableInput.by("id", id).set("user_id", userId);
TableResult<Boolean> result = ApiTable.delete(TableNames.max_kb_dataset, tableInput);
Row deleteRecord = Row.by("dataset_id", id);
Db.delete(TableNames.max_kb_document, deleteRecord);
Db.delete(TableNames.max_kb_paragraph, deleteRecord);
return new ResultVo(result.getData());
}
}
3. 数据访问层
虽然本文未提供具体的 DAO(数据访问对象)代码,但在服务层中通过 MaxKbDatasetDao
进行了数据的增删改查操作。MaxKbDatasetDao
负责与数据库进行交互,执行实际的数据操作。
三、功能实现流程
获取知识库列表:用户发送 GET 请求到
/api/dataset/{pageNo}/{pageSize}
,控制器接收请求后调用MaxKbDatasetService
的page
方法,通过ApiTable.page
查询数据库并返回分页结果。创建知识库:用户发送 POST 请求到
/api/dataset
,包含知识库的详细信息。控制器解析请求体,调用服务层的save
方法,通过MaxKbDatasetDao
将新知识库保存到数据库。验证知识库:用户发送 GET 请求到
/api/valid/dataset/{id}
,系统返回该知识库是否存在的布尔值。获取单个知识库详情:用户发送 GET 请求到
/api/dataset/{id}
,控制器调用服务层的get
方法,返回指定 ID 的知识库详情。获取知识库文档:用户发送 GET 请求到
/api/dataset/{id}/document/{pageNo}/{pageSize}
,系统返回该知识库下的文档列表,支持分页。删除知识库:用户发送 DELETE 请求到
/api/dataset/{id}
,控制器调用服务层的delete
方法,删除指定 ID 的知识库,并同时删除相关联的文档和段落。
四、总结
通过上述接口设计和代码实现,我们构建了一个基本的知识库管理系统 Max_KB。该系统支持知识库的创建、查询、分页展示、验证和删除等功能。控制器层负责处理 HTTP 请求,服务层封装了业务逻辑,数据访问层则负责与数据库的交互。
在实际开发中,可以根据需求进一步扩展系统功能,如增加权限控制、优化查询性能、集成全文搜索引擎等。此外,结合前端框架,可以构建一个完整的知识库管理平台,提升用户体验和系统的实用性。
通过系统化的设计和模块化的代码实现,Max_KB 知识库管理功能具备了良好的可维护性和扩展性,能够满足不同场景下的知识管理需求。