286 lines
7.4 KiB
Markdown
286 lines
7.4 KiB
Markdown
# 知识库模块使用文档
|
||
|
||
## 概述
|
||
|
||
知识库模块提供了创建、管理和查询知识库的功能,支持文档的上传、分割和检索。本模块与外部API服务交互,实现知识库的高级功能。
|
||
|
||
## 模型结构
|
||
|
||
### KnowledgeBase 模型
|
||
- 核心知识库模型,包含知识库的基本信息和文档引用
|
||
- 支持多种知识库类型:管理级、部门级、成员级、私有、保密级
|
||
- 与外部知识库API进行同步
|
||
|
||
### KnowledgeBaseDocument 模型
|
||
- 知识库文档关联模型
|
||
- 保存文档基本信息和外部文档ID
|
||
- 提供文档状态管理(有效/已删除)
|
||
|
||
## API接口使用方法
|
||
|
||
### 1. 知识库创建
|
||
```
|
||
POST /api/knowledge-base/
|
||
```
|
||
|
||
**请求参数:**
|
||
```json
|
||
{
|
||
"name": "知识库名称",
|
||
"desc": "知识库描述",
|
||
"type": "private", // admin/leader/member/private/secret
|
||
"department": "部门名称", // 当type为leader或member时必填
|
||
"group": "组名称" // 当type为member时必填
|
||
}
|
||
```
|
||
|
||
**注意事项:**
|
||
- 名称必须唯一
|
||
- 权限等级与用户角色匹配:
|
||
- 管理员可创建所有类型知识库
|
||
- 部门领导可创建成员级和私有知识库
|
||
- 普通成员只能创建私有知识库
|
||
|
||
### 2. 知识库查询
|
||
```
|
||
GET /api/knowledge-base/
|
||
GET /api/knowledge-base/{id}/
|
||
```
|
||
|
||
**查询参数:**
|
||
- `page`: 页码
|
||
- `page_size`: 每页数量
|
||
- `keyword`: 搜索关键词
|
||
|
||
**搜索接口:**
|
||
```
|
||
GET /api/knowledge-base/search/?keyword=关键词
|
||
```
|
||
|
||
### 3. 知识库更新
|
||
```
|
||
PUT/PATCH /api/knowledge-base/{id}/
|
||
```
|
||
|
||
**请求参数:**
|
||
与创建接口相同,支持部分字段更新
|
||
|
||
### 4. 知识库删除
|
||
```
|
||
DELETE /api/knowledge-base/{id}/
|
||
```
|
||
|
||
**注意事项:**
|
||
- 删除知识库会同时删除本地数据和外部知识库数据
|
||
- 如果外部删除失败,本地数据仍会被删除
|
||
|
||
### 5. 知识库类型修改
|
||
```
|
||
POST /api/knowledge-base/{id}/change_type/
|
||
```
|
||
|
||
**请求参数:**
|
||
```json
|
||
{
|
||
"type": "private",
|
||
"department": "部门名称",
|
||
"group": "组名称"
|
||
}
|
||
```
|
||
|
||
### 6. 文档上传
|
||
```
|
||
POST /api/knowledge-base/{id}/upload_document/
|
||
```
|
||
|
||
**请求参数:**
|
||
- 使用multipart/form-data格式
|
||
- 字段名使用`files`或`file`
|
||
- 支持多文件批量上传
|
||
|
||
**接口响应:**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "文档上传完成,成功: X,失败: Y",
|
||
"data": {
|
||
"uploaded_count": X,
|
||
"failed_count": Y,
|
||
"total_files": Z,
|
||
"documents": [文档列表],
|
||
"failed_documents": [失败文档列表]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 7. 获取文档列表
|
||
```
|
||
GET /api/knowledge-base/{id}/documents/
|
||
```
|
||
|
||
### 8. 获取文档内容
|
||
```
|
||
GET /api/knowledge-base/{id}/document_content/?document_id=xxx
|
||
```
|
||
|
||
### 9. 删除文档
|
||
```
|
||
DELETE /api/knowledge-base/{id}/delete_document/?document_id=xxx
|
||
```
|
||
|
||
## 操作流程
|
||
|
||
### 知识库创建流程
|
||
1. 验证用户权限与知识库类型匹配
|
||
2. 创建本地知识库记录
|
||
3. 调用外部API创建知识库
|
||
4. 更新本地记录的external_id
|
||
5. 创建相应的权限记录
|
||
|
||
### 文档上传流程
|
||
1. 验证用户对知识库的编辑权限
|
||
2. 验证知识库external_id存在且有效
|
||
3. 调用分割API处理文件(支持批量处理)
|
||
4. 获取分割结果,处理每个文档
|
||
5. 调用上传API将文档发送到外部知识库
|
||
6. 创建本地文档记录,关联外部文档ID
|
||
|
||
## 注意事项
|
||
|
||
1. **外部API依赖**
|
||
- 知识库功能强依赖外部API服务
|
||
- 如果外部API不可用,部分功能将无法正常工作
|
||
- 外部服务响应超时可能导致操作失败
|
||
|
||
2. **权限管理**
|
||
- 知识库访问基于用户角色和显式权限控制
|
||
- 默认权限基于知识库类型和用户所属部门/组
|
||
- 可通过权限表提供额外访问权限
|
||
|
||
3. **文件处理**
|
||
- 支持多种文件格式,但实际处理能力依赖外部API
|
||
- 大文件上传可能需要较长时间,请确保请求超时设置合理
|
||
- 批量上传文件时注意总大小限制
|
||
|
||
4. **数据一致性**
|
||
- 本地数据与外部API数据同步依赖于操作成功
|
||
- 操作失败可能导致数据不一致
|
||
|
||
## 需要优化的地方
|
||
|
||
1. **错误处理**
|
||
- 完善外部API调用的错误处理机制
|
||
- 对特定异常类型进行更精确的处理
|
||
- 减少使用通用异常捕获,改为针对特定异常处理
|
||
|
||
2. **事务管理**
|
||
- 增强本地数据库操作与外部API调用的事务一致性
|
||
- 在外部API调用失败时,回滚本地数据库事务
|
||
- 提供数据修复工具,处理不一致状态
|
||
|
||
3. **模型定义优化**
|
||
- 修复to_response_dict方法中对不存在字段的引用
|
||
- 移除或添加缺失的字段:meta、embedding_mode_id等
|
||
- 优化from_external_format方法的参数使用
|
||
|
||
4. **批量处理能力**
|
||
- 进一步优化文件批量处理的效率
|
||
- 提供异步处理大量文件的能力
|
||
- 增加处理进度反馈机制
|
||
|
||
5. **日志与监控**
|
||
- 增强日志记录的详细程度和结构化
|
||
- 添加关键操作的审计日志
|
||
- 实现对外部API调用的监控和告警
|
||
|
||
6. **响应格式统一**
|
||
- 标准化API响应格式
|
||
- 统一错误码和错误信息的表达方式
|
||
- 提供结构化的错误详情
|
||
|
||
## 开发指南
|
||
|
||
### 架构说明
|
||
- 本地模型与外部知识库API保持同步
|
||
- 本地存储基本元数据,内容存储在外部API
|
||
- KnowledgeBaseDocument作为文档映射和状态管理工具
|
||
|
||
### 外部API交互
|
||
- 所有外部API调用封装在external_api_service.py中
|
||
- 使用requests库进行API请求
|
||
- 提供统一的错误处理和日志记录
|
||
|
||
### 示例代码
|
||
|
||
**创建知识库:**
|
||
```python
|
||
from apps.knowledge_base.models import KnowledgeBase
|
||
from apps.common.services.external_api_service import create_external_dataset
|
||
|
||
# 创建本地知识库
|
||
knowledge_base = KnowledgeBase.objects.create(
|
||
name="测试知识库",
|
||
desc="这是一个测试知识库",
|
||
type="private",
|
||
user_id=request.user.id
|
||
)
|
||
|
||
# 创建外部知识库
|
||
try:
|
||
external_id = create_external_dataset(knowledge_base)
|
||
knowledge_base.external_id = external_id
|
||
knowledge_base.save()
|
||
except ExternalAPIError as e:
|
||
# 处理错误
|
||
logger.error(f"创建外部知识库失败: {str(e)}")
|
||
```
|
||
|
||
**上传文档:**
|
||
```python
|
||
from apps.common.services.external_api_service import call_split_api_multiple, call_upload_api
|
||
|
||
# 分割文件
|
||
split_response = call_split_api_multiple(files)
|
||
|
||
# 处理分割结果
|
||
if split_response and split_response.get('code') == 200:
|
||
documents_data = split_response.get('data', [])
|
||
for doc in documents_data:
|
||
# 上传到外部知识库
|
||
doc_data = {
|
||
"name": doc.get('name'),
|
||
"paragraphs": [...] # 组装段落数据
|
||
}
|
||
upload_response = call_upload_api(external_id, doc_data)
|
||
|
||
# 处理上传结果
|
||
if upload_response and upload_response.get('code') == 200:
|
||
# 创建本地文档记录
|
||
document_id = upload_response['data']['id']
|
||
KnowledgeBaseDocument.objects.create(...)
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
1. **创建知识库失败**
|
||
- 检查API_BASE_URL配置是否正确
|
||
- 验证外部API服务是否可用
|
||
- 检查用户权限是否满足要求
|
||
|
||
2. **文档上传失败**
|
||
- 检查文件格式是否支持
|
||
- 查看日志了解具体错误原因
|
||
- 验证知识库external_id是否正确
|
||
|
||
3. **查询文档内容失败**
|
||
- 确认文档ID是否存在
|
||
- 检查用户是否有查看权限
|
||
- 验证外部API连接状态
|
||
|
||
## 未来计划
|
||
|
||
- 添加文档版本控制功能
|
||
- 增强文档搜索和过滤能力
|
||
- 提供文档内容编辑功能
|
||
- 优化多文件批处理性能
|
||
- 添加知识库统计和分析功能 |