7.7 KiB
RAG 知识库文档管理接口与行为变更说明
最后整理:2026-05-11 对应后端提交:
8206ed7对应控制器:fastapi_modules/fastapi_leaudit/controllers/ragChatController.py对应服务:fastapi_modules/fastapi_leaudit/services/impl/ragDatasetServiceImpl.py统一前缀:/api/v3/rag
1. 目标
本文档说明本次 RAG 知识库“文档管理”相关后端改动,重点覆盖:
- 知识库文档批量删除
- 删除结果明细返回
- 处理中 / 索引中文档删除限制
- 文档上传改为异步处理
- 文档重处理改为异步处理
- 前端轮询所依赖的状态流转
- 向量化调用的分批与错误处理
不在本文范围内:
- 聊天接口
- 应用管理接口
- 知识库基础 CRUD
- 子分段 / 分段编辑细节
2. 相关权限
本次涉及的接口主要使用以下权限:
| 接口 | 权限 |
|---|---|
GET /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId}/indexing-status |
rag:dataset:read |
POST /api/v3/rag/datasets/{DatasetId}/documents |
rag:dataset:update |
POST /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId}/update-by-file |
rag:dataset:update |
DELETE /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId} |
rag:dataset:delete |
POST /api/v3/rag/datasets/{DatasetId}/documents/batch-delete |
rag:dataset:delete |
补充:
- 后端控制器层会先检查权限键。
- 服务层还会继续校验角色范围。
- 当前允许执行文档上传 / 删除的角色范围仍为:
provincial_adminsuper_adminadmin
3. 本次行为变化总览
3.1 批量删除
新增接口:
POST /api/v3/rag/datasets/{DatasetId}/documents/batch-delete
行为:
- 支持单请求删除多个文档
- 返回删除成功数量、跳过数量、已删除 ID、跳过原因明细
3.2 删除限制
删除接口不再允许删除“处理中”的文档。
当前视为处理中、不可删除的状态:
waitingparsingcleaningsplittingindexing
当前允许删除的状态:
completederrorpaused
3.3 上传与重处理改为异步
此前:
- 上传接口会等完整解析、切分、向量化完成后才返回
现在:
- 上传接口创建文档记录后立即返回
- 后台使用异步任务继续完成后续处理
- 前端通过
indexing-status接口轮询状态
3.4 向量化调用分批
此前:
- 一次性将全部 chunk 发给 embedding 接口
现在:
- 按
RAG_CONFIG["EMBED_BATCH_SIZE"]分批提交 - 默认值由配置控制,未配置时使用
10
目的:
- 降低 DashScope / embedding 服务因单次输入过大返回
400 Bad Request的概率
4. 接口说明
4.1 上传知识库文档
POST /api/v3/rag/datasets/{DatasetId}/documents
请求:
multipart/form-datafile: 文件内容data: 可选,JSON 字符串,表示处理配置
当前支持格式:
.pdf.docx.txt.md.json
成功响应示例:
{
"code": 200,
"msg": "success",
"data": {
"document": {
"id": "12",
"name": "示例文档.pdf",
"indexing_status": "indexing",
"word_count": 0,
"hit_count": 0,
"enabled": true
},
"batch": "12"
}
}
说明:
- 返回时不代表向量化已经完成。
batch当前等同于documentId,前端可直接拿去轮询状态。
4.2 重处理知识库文档
POST /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId}/update-by-file
行为与上传接口一致:
- 先把文档状态置为
indexing - 清理旧向量
- 立即返回
- 后台异步重建 chunk 与向量
成功响应示例:
{
"code": 200,
"msg": "success",
"data": {
"document": {
"id": "12",
"name": "示例文档.pdf",
"indexing_status": "indexing",
"word_count": 0,
"hit_count": 0,
"enabled": true
},
"batch": "12"
}
}
4.3 查询文档处理状态
GET /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId}/indexing-status
成功响应示例:
{
"code": 200,
"msg": "success",
"data": [
{
"id": "12",
"indexing_status": "splitting",
"processing_started_at": 1778490000,
"parsing_completed_at": 1778490003,
"cleaning_completed_at": 1778490005,
"splitting_completed_at": null,
"completed_at": null,
"paused_at": null,
"error": null,
"stopped_at": null,
"completed_segments": 0,
"total_segments": 24
}
]
}
状态流转顺序:
indexing(创建记录后的初始状态)parsingcleaningsplittingindexing(写入向量阶段)completed
失败时:
- 状态会更新为
error error字段会记录截断后的错误信息
4.4 单文档删除
DELETE /api/v3/rag/datasets/{DatasetId}/documents/{DocumentId}
行为:
- 实际内部复用批量删除逻辑
- 如果目标文档处于处理中状态,会直接返回 400
错误示例:
{
"code": 400,
"msg": "文档仍在处理中,暂不允许删除",
"data": null
}
4.5 批量删除文档
POST /api/v3/rag/datasets/{DatasetId}/documents/batch-delete
请求体:
{
"document_ids": [12, 13, 14]
}
成功响应示例:
{
"code": 200,
"msg": "success",
"data": {
"result": "success",
"requestedCount": 3,
"deletedCount": 2,
"skippedCount": 1,
"deletedIds": [12, 13],
"skipped": [
{
"id": 14,
"name": "处理中示例.pdf",
"reason": "文档仍在处理中,暂不允许删除"
}
]
}
}
说明:
- 后端会先查询所有目标文档
- 对可删除文档:
- 删除 Chroma 中对应向量
- 删除 OSS 对象
- 逻辑删除
rag_document
- 完成后统一回写:
rag_dataset.document_countrag_dataset.total_chunks
5. 后端内部状态处理说明
5.1 异步处理任务
上传 / 重处理现在通过内部异步任务 _run_document_indexing_task(...) 执行后续工作。
任务步骤:
- 更新状态为
parsing - 提取文本
- 更新状态为
cleaning - 构建 chunk
- 更新状态为
splitting - 调 embedding 接口生成向量
- 更新状态为
indexing - 写入 Chroma
- 更新状态为
completed - 同步
rag_dataset统计字段
异常时:
- 状态写为
error indexing_error写入错误摘要
5.2 向量化分批
方法:
_embed_texts(texts, model_name)
变化:
- 以前单次请求提交全部文本
- 现在按批次循环提交
错误处理:
- 若 embedding 服务返回 HTTP 错误
- 服务层会转成:
向量化服务调用失败: <上游错误文本>
以便前端直接显示可读错误
6. 前后端联调注意事项
6.1 上传成功不等于处理完成
前端不能再以“上传接口返回 200”判断文档已经可检索。
正确做法:
- 调上传接口
- 读取响应中的
batch - 轮询
indexing-status - 直到状态变为:
completed- 或
error
6.2 批量删除要接删除明细
前端不应只提示“删除成功”。
建议按以下优先级展示:
- 全部删除成功:提示删除数量
- 部分删除成功:提示成功数 + 跳过数
- 全部跳过:提示未删除,并展示跳过原因
6.3 处理中状态要禁用删除入口
虽然服务端已经拦截,但前端仍应同步禁用:
- 单删按钮
- 批量多选框
避免用户误操作后频繁打到 400
7. 对应提交
本次后端变更对应提交:
8206ed7feat: improve rag dataset document management
如果后续继续扩展:
- 文档状态更多细粒度字段
- chunk 统计维度
- 删除结果补充更多结构化信息
建议继续更新本文,而不是另起一份零散说明。