知识库版本管理
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。4. 版本号设计
4.1 版本号生成
4.2 为什么版本号包含配置哈希
设计意图:从版本号可以直接判断两个版本是否使用同一套配置。5. 版本清单文件
5.1 文件结构
5.2 KnowledgeBaseVersionStore 类
6. 与 Milvus 检索的集成
6.1 写入时携带版本信息
6.2 检索时过滤版本
6.3 评测用历史版本
7. 全量重建的安全流程
8. 本讲实践闭环
通过标准:任意时刻每个场景只有一个 active 版本,版本可追踪、可回滚。
8.1 本讲从 0 到 1 实现闭环
这一讲的核心是把“重建知识库”变成可追踪、可回滚的发布动作。实现顺序如下:- 先定义版本状态:
STAGED、ACTIVE、ARCHIVED。 - 再实现版本清单 store,把每个场景的版本列表和 active 指针持久化。
- 然后在入库脚本里先创建 staged 版本,质量通过后再激活。
- 最后保证同一个场景任意时刻只有一个 active 版本。
qa_core/governance/kb_versions.py::KnowledgeBaseVersion。
qa_core/governance/kb_versions.py::activate_version()。
STAGED,不是自动归档为 ARCHIVED。归档是单独的 archive_version() 操作,并且不能归档当前 active 版本。
入库时,每个 chunk 都要写入 scenario_id 和 kb_version。线上检索通过 Milvus expr 只查当前 active 版本。
来源:真实代码调用点,见 qa_core/governance/kb_versions.py 和 qa_core/retrieval/filters.py。
scripts/rebuild_kb_version.py。
Docker Compose 模式下执行前,先确认项目根目录已经存在 .env.compose。
验收重点:知识库更新必须可追踪、可回滚,不能直接覆盖线上数据。
9. 重点掌握
10. 本讲小结
- 版本管理让知识库更新成为可逆操作:入库 → 评测 → 激活 →(效果不好)→ 回滚
- 版本状态机:STAGED(待验证)→ ACTIVE(在线使用)→ ARCHIVED(归档保留)
- 版本切换是 O(1) 操作:只修改 JSON 文件中的 active_version,不更新 Milvus 数据
- 版本号 = 时间戳 + 配置哈希,可以肉眼判断先后和配置差异
- 每个场景独立版本清单,不同行业场景可以独立管理知识库版本
- 评测脚本可以显式指定历史版本,实现新老版本对比

