Skip to main content

知识库版本管理

Written: 2026.06
第 14 章跟敲代码:codealong/chapters/ch14_kb_versioning。 这部分代码是本章跟敲版,用来先跑通核心闭环;完整项目源码仍以本讲后文标注的 qa_core/scripts/ 等路径为准。
上一讲应用入口与环境前置校验
下一讲数据隔离与多租户设计

1. 本讲目标

  • 理解为什么 RAG 系统需要知识库版本管理
  • 掌握版本状态机的设计(STAGED → ACTIVE → ARCHIVED)
  • 理解版本切换的实现(O(1) 操作,不批量更新 Milvus)
  • 理解版本号生成的设计(时间戳 + 配置哈希)

2. 前置知识 — 为什么 RAG 需要版本管理

2.1 不加版本管理的风险

假设你用一个脚本把 500 个业务文档写入 Milvus。运行完毕后:
版本管理的核心价值:让知识库的更新成为可逆操作

2.2 版本管理的典型需求


3. 版本状态机

3.1 三种状态

3.2 安全入库与激活流程

  • STAGED:版本已写入 Milvus,但线上检索不使用。通常用于新入库的版本,等待评测验证。
  • ACTIVE:当前在线检索使用的版本。同一场景只有一个 ACTIVE 版本。
  • ARCHIVED:不再使用的历史版本。数据和 Milvus chunk 都保留,但不参与在线检索。

3.3 状态转换实现

下面的代码展示的是步骤 5(激活)和归档操作。步骤 1(创建版本)见 ensure_version(),步骤 2(入库写入)见第 16 讲,步骤 3-4(质量报告和门控)见第 17 讲。

3.4 激活操作的轻量性

关键设计:激活版本只修改一个 JSON 文件,不碰 Milvus。
如果激活需要修改所有 chunk 的 metadata,一个 10 万条 chunk 的知识库需要很长时间。通过把版本切换放在检索表达式中,版本切换变成了 O(1) 操作。

4. 版本号设计

4.1 版本号生成

4.2 为什么版本号包含配置哈希

设计意图:从版本号可以直接判断两个版本是否使用同一套配置。
如果两个版本的 hash 相同但日期不同,说明是同一套配置下的数据更新(新增/修改了文档)。 如果 hash 不同,说明 Embedding 模型、Reranker 模型或 Chunk 方案有变化,需要重点关注召回质量的对比。

5. 版本清单文件

5.1 文件结构

5.2 KnowledgeBaseVersionStore 类


6. 与 Milvus 检索的集成

6.1 写入时携带版本信息

每条 FAQ 和 chunk 入库时,这些字段都会被写入 metadata:

6.2 检索时过滤版本

6.3 评测用历史版本


7. 全量重建的安全流程

执行顺序:
关键安全点:即使新的 STAGED 版本已经写入了 Milvus,只要没有执行激活步骤,线上检索仍然使用旧的 ACTIVE 版本。用户完全无感知。

8. 本讲实践闭环

通过标准:任意时刻每个场景只有一个 active 版本,版本可追踪、可回滚。

8.1 本讲从 0 到 1 实现闭环

这一讲的核心是把“重建知识库”变成可追踪、可回滚的发布动作。实现顺序如下:
  1. 先定义版本状态:STAGEDACTIVEARCHIVED
  2. 再实现版本清单 store,把每个场景的版本列表和 active 指针持久化。
  3. 然后在入库脚本里先创建 staged 版本,质量通过后再激活。
  4. 最后保证同一个场景任意时刻只有一个 active 版本。
实现完成后,相关代码结构应该是下面这张图: 来源:真实代码逻辑压缩版,对应 qa_core/governance/kb_versions.py::KnowledgeBaseVersion
激活版本不是改 Milvus 数据,而是修改版本清单里的 active 指针。这样切换速度快,也能随时回滚。 来源:真实代码逻辑压缩版,对应 qa_core/governance/kb_versions.py::activate_version()
注意:真实代码激活新版本时,旧 ACTIVE 会降为 STAGED,不是自动归档为 ARCHIVED。归档是单独的 archive_version() 操作,并且不能归档当前 active 版本。 入库时,每个 chunk 都要写入 scenario_idkb_version。线上检索通过 Milvus expr 只查当前 active 版本。 来源:真实代码调用点,见 qa_core/governance/kb_versions.pyqa_core/retrieval/filters.py
验收时先创建 staged,再激活,再检查旧 active 是否归档。 来源:命令行验收,对应 scripts/rebuild_kb_version.py。 Docker Compose 模式下执行前,先确认项目根目录已经存在 .env.compose
闭环验证重点: 验收重点:知识库更新必须可追踪、可回滚,不能直接覆盖线上数据。

9. 重点掌握

10. 本讲小结

  • 版本管理让知识库更新成为可逆操作:入库 → 评测 → 激活 →(效果不好)→ 回滚
  • 版本状态机:STAGED(待验证)→ ACTIVE(在线使用)→ ARCHIVED(归档保留)
  • 版本切换是 O(1) 操作:只修改 JSON 文件中的 active_version,不更新 Milvus 数据
  • 版本号 = 时间戳 + 配置哈希,可以肉眼判断先后和配置差异
  • 每个场景独立版本清单,不同行业场景可以独立管理知识库版本
  • 评测脚本可以显式指定历史版本,实现新老版本对比
下一讲数据隔离与多租户 — 租户/数据集/角色隔离、Milvus 表达式过滤