知识库版本管理
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 版本管理的典型需求
| 需求 | 说明 |
|---|---|
| 安全入库 | 新版本先写入,不影响线上正在使用的版本 |
| 灰度验证 | 新版本入库后先评测,确定没问题再切换 |
| 快速回滚 | 新版本效果不好,一键切回旧版本 |
| 对比评测 | 同一个问题可以分别在新旧版本上验证召回效果 |
| 长期保留 | 历史版本不删除,作为 A/B 测试和故障分析的依据 |
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. 本讲实践闭环
| 项目 | 内容 |
|---|---|
| 本讲类型 | 工程治理 |
| 实践产物 | KnowledgeBaseVersionStore、版本状态机、激活和回滚能力 |
| 是否进入最终项目 | 是 |
| 验收方式 | 创建 staged 版本,激活为 active,再归档旧版本 |
| 后续落点 | 第 16 讲入库生成版本,第 17 讲质量门禁控制激活 |
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。
| 验证项 | 验证方式 | 期望结果 |
|---|---|---|
| 新建版本 | 执行 --new-version | 生成 STAGED 版本 |
| 激活版本 | 加 --activate | 新版本变 ACTIVE |
| 旧版本降级 | 多次激活 | 旧 ACTIVE 变 STAGED,保留回滚能力 |
| 检索过滤 | 查看 expr | 包含当前 kb_version |
| 回滚能力 | 指定历史版本激活 | active 指针切回历史版本 |
| 手动归档 | 调用 archive | 非 active 版本变 ARCHIVED |
9. 重点掌握
| 优先级 | 内容 | 原因 |
|---|---|---|
| ★★★ 必会 | 版本状态机:STAGED(已入库待验证)→ ACTIVE(在线检索使用)→ ARCHIVED(归档保留) | 知识库版本管理的核心模型 |
| ★★★ 必会 | O(1) 版本切换:激活只修改 JSON 文件的 active_version 指针,不更新 Milvus 数据 | 理解版本切换为什么是即时的,面试高频 |
| ★★★ 必会 | 版本号设计:kb_{scenario_id}_{timestamp}_{config_hash},配置哈希体现版本差异 | 从版本号直接判断配置是否变化 |
| ★★ 理解 | resolve_active_version() 的三级优先级:请求传入 > 环境变量 > 版本清单 active_version | 理解版本解析流程 |
| ★★ 理解 | version_metadata() 将版本信息写入每个 chunk 的 metadata,检索时通过 expr 过滤 | 写入和检索的版本关联机制 |
| ★★ 理解 | 安全入库流程:创建 STAGED → 入库 → 生成质量报告 → 检查 → 激活 | 生产环境的完整安全操作 |
| ★ 了解 | 版本清单 JSON 文件结构 | 了解持久化格式 |
| ★ 了解 | 评测时可以显式指定历史版本做对比 | 了解版本管理的扩展用途 |
10. 本讲小结
- 版本管理让知识库更新成为可逆操作:入库 → 评测 → 激活 →(效果不好)→ 回滚
- 版本状态机:STAGED(待验证)→ ACTIVE(在线使用)→ ARCHIVED(归档保留)
- 版本切换是 O(1) 操作:只修改 JSON 文件中的 active_version,不更新 Milvus 数据
- 版本号 = 时间戳 + 配置哈希,可以肉眼判断先后和配置差异
- 每个场景独立版本清单,不同行业场景可以独立管理知识库版本
- 评测脚本可以显式指定历史版本,实现新老版本对比

