知识库独立导出与导入方案
项目地址:https://github.com/WiSiW/AI-RAG
摘要
在现有按 kb_id 隔离 PostgreSQL 数据、Milvus 集合、Whoosh 目录和 MinIO 文档的基础上,新增知识库级可移植包。支持“文档包”和“携带索引的完整包”两种导出模式,导入时创建全新知识库并重映射全部 ID,不影响现有知识库。
包格式与数据边界
- 导出为 ZIP,
manifest.json记录包版本、导出时间、源知识库配置、模型描述、文档/Chunk 数量、索引版本、Embedding 维度和文件 SHA-256。 - 包结构固定为:
manifest.jsondocuments.jsonl:文档记录、标签、元数据、chunk 配置chunks.jsonl:L1/L2/L3、摘要、关键词、QA 对、上下文前缀和父子关系originals/{document_id}/{filename}:MinIO 原始文件index/milvus_vectors.jsonl:完整包才有,包含表示行、问题索引和向量index/bm25_documents.jsonl:完整包才有,包含可重建 BM25 的字段checksums.sha256
- “文档包”不包含向量和 BM25,但保留原始文件、文档元数据、chunk、增强字段和 QA;导入时只需重新生成 Embedding/索引,不重新解析、分块或调用增强模型。
- “完整包”额外包含可移植向量与 BM25 快照;导入时重建 Milvus/Whoosh,而不是复制原始数据库二进制。
- 不导出模型 API Key、对话、评估历史、发布接口或其他知识库数据。
- ZIP 使用 manifest SHA-256 做完整性校验;通过 HTTPS 下载,不额外做内置密码加密。
- 导入前禁止路径穿越、超限解压、未知 schema、重复条目和校验和不匹配。
导出与一致性
- 新增异步导出任务;导出期间通过活动 transfer job 给知识库加写锁,拒绝上传、删除、重索引、知识库设置修改和其他导入写入。
- 任务读取一致的知识库快照,流式打包原始文件、JSONL 和可选索引,不把整个包放入内存;成品上传到 MinIO 的独立导出前缀。
- Milvus 按主键分页读取指定知识库 v2 集合的全部表示行和向量;记录 schema/collection 版本及 Embedding 描述。
- Whoosh 导出规范化 BM25 文档字段,导入时重建索引目录。
- 任务结束或失败后自动释放写锁;异常记录到任务错误中,保留已生成临时文件供诊断但不允许下载未完成包。
- 导出包由管理员手动删除;下载接口只允许访问已完成且属于当前管理员的 transfer job。
导入与索引恢复
- 导入默认创建新知识库,并生成新
kb_id、document_id、chunk_id,建立完整旧 ID → 新 ID 映射,修复 L1 的parent_chunk_ids、L3 的parent_chunk_id、QA 和向量引用。 - 名称冲突时自动生成“原名(导入 2)”等唯一名称。
- 导入请求必须选择目标 Embedding、Enrichment 模型;Rerank 和默认 LLM 可选。模型 API Key 不随包迁移。
- 完整包默认采用严格索引恢复:目标 Embedding 的
provider/model_name/dimensions必须与 manifest 一致,此时直接重映射并写入导出向量。 - 用户可选择
index_policy=rebuild:即使模型不同,也基于包内 chunk 和 QA 重新生成全部表示向量;文档包始终使用该策略。 - 严格模式下模型不匹配返回明确错误,不自动混用不同向量空间。
- 原始文件重新上传到目标 MinIO 新对象键;文档和 chunk 按 manifest 恢复,最终状态设为
ready。 - 导入任务失败时删除新建知识库、文档、chunk、对象存储文件、Milvus 集合和 Whoosh 目录,保证失败不留下半成品。
- 导入完成后新知识库使用
index_version=v2,可立即检索、问答和继续上传文档。
API 与页面
POST /api/v1/knowledge-bases/{id}/exports:创建导出任务,参数mode=documents|full。GET /api/v1/knowledge-base-transfers/{job_id}:查询导出/导入进度、计数和错误。GET /api/v1/knowledge-base-transfers/{job_id}/download:下载已完成导出包。POST /api/v1/knowledge-base-imports/inspect:上传 ZIP 并返回 manifest 摘要、模型要求和校验结果,不创建知识库。POST /api/v1/knowledge-base-imports:上传包并创建新知识库,参数包括name、模型映射和index_policy=strict|rebuild。DELETE /api/v1/knowledge-base-transfers/{job_id}:删除历史任务及导出对象。- 新增
knowledge_base_transfer_jobs:类型、KB ID、模式、状态、进度、对象键、manifest、错误和时间戳。 - 知识库详情页增加“导出知识库”,可选择文档包或完整包并展示进度。
- 知识库列表增加“导入知识库”向导:上传、预检、名称/模型映射、选择严格恢复或重新建索引、执行导入。
- 两种任务均按
queued/running/completed/failed轮询,完成后提供下载或跳转新知识库。
测试与验收
- 文档包导出后导入空实例,验证文档、标签、元数据、L1/L2/L3、QA、父子关系和原始文件完整。
- 完整包在兼容 Embedding 环境下严格导入,验证无需重新调用 Embedding 即可检索。
- 模型签名不匹配时严格模式失败;
rebuild模式成功重新嵌入并重建索引。 - 验证旧 ID → 新 ID 映射、对象键重写、QA/父子引用和名称自动去重。
- 验证导出写锁阻止上传、删除、重索引和设置修改,任务结束后恢复。
- 验证异常中断、校验失败、路径穿越和模型缺失均触发完整回滚。
- 验证大文件流式打包、ZIP 解压限制和下载鉴权。
- 前端验证双模式导出、导入预检、模型映射、进度轮询和完成后跳转,并通过生产构建。
假设与默认值
- 一次只处理一个知识库包;不支持合并到已有知识库。
- 完整包默认使用
index_policy=strict,由导入请求显式切换为rebuild。 - 模型配置不随包复制,导入时必须映射目标环境现有模型。
- 不包含对话、评估、发布接口和用户权限数据。
- 包为带 SHA-256 校验的普通 ZIP,依赖 HTTPS 和管理员鉴权保护传输安全。
- Milvus/Whoosh 导入采用可移植数据快照并重建索引,不直接复制实例内部文件。
最后更新: 2026年11月03日 15:01