daren/apps/knowledge_base/knowledge_base_readme.md

286 lines
7.4 KiB
Markdown
Raw Normal View History

2025-05-29 10:08:06 +08:00
# 知识库模块使用文档
## 概述
知识库模块提供了创建、管理和查询知识库的功能支持文档的上传、分割和检索。本模块与外部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连接状态
## 未来计划
- 添加文档版本控制功能
- 增强文档搜索和过滤能力
- 提供文档内容编辑功能
- 优化多文件批处理性能
- 添加知识库统计和分析功能