RAG 索引制品发布:签名清单、可复现构建与原子回滚
同名索引可能来自不同语料、解析器或权限覆盖。本文把 RAG 索引视为不可变制品,用签名 manifest、摘要校验和原子别名控制晋级与回滚。
本文要点
- 主题聚焦:AI、RAG、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
knowledge-prod-v7 无法说明源快照、解析器、chunk 参数、embedding 权重和 ACL 覆盖;分片漏传或 alias 被手改后仍可能显示成功。RAG 增量索引一致性 约束单文档事件,本篇把整批输出变成可验证的不可变 release。
Manifest 是发布 API,不是备注
定义 rag.index.release.v1,序列化规则和字段语义随版本冻结。一个最小清单应包含:
{
"schema": "rag.index.release.v1",
"releaseId": "idx_20260718_01",
"sourceSnapshot": "sha256:...",
"parserImage": "sha256:...",
"chunkerConfig": "sha256:...",
"embedding": {
"model": "vendor/model@sha256:...",
"dimensions": 1024,
"metric": "cosine"
},
"aclSchema": 3,
"documents": 482091,
"chunks": 2948812,
"shards": [{
"mediaType": "application/vnd.codenodex.rag-shard.v1",
"digest": "sha256:...",
"size": 817263,
"uri": "store://cas/sha256/...",
"objectVersion": "gen-8841"
}],
"coverageReport": "sha256:...",
"evaluationReport": "sha256:..."
}
每个 shard 使用 OCI descriptor 式 mediaType + digest + size,并绑定对象存储不可变 version/generation;URI 只是位置。staging 只能条件创建内容寻址对象,禁止覆盖,mutable latest 永不进入 manifest。源快照包含 connector 水位、资源版本和墓碑摘要;解析器、OCR、chunk 配置、metadata schema、embedding 维度与 metric 都属于索引 ABI,任一变化都生成新 release。
构建身份签名,运行身份只验证
builder 上传所有不可变 shard 后,对 canonical manifest bytes 计算 SHA-256 并签名。Sigstore 验证端固定 issuer、subject、certificate identity 和 Rekor 策略;离线 KMS 固定 key ID、算法和轮换窗口,拒绝 manifest 指定远程公钥。SLSA provenance 记录 builder 与输入,RAG manifest 另行绑定数量、ACL 覆盖和评测。
promotion service 只有读制品、验签和切别名权限,不能构建或修改 shard;builder 能写 staging,不能切生产。人工审批绑定 manifest digest,而不是可变 release 名。这样审批后替换同名文件会在验签前失败,AI 供应链安全 的制品身份边界才真正覆盖索引数据。
可复现不等于浮点逐字节相同
输入、解析和切分应确定性重放,产生相同 ID、文本 hash、metadata 和顺序。embedding 跨硬件存在数值差异时,要么固定环境并发布实际 shard digest,要么定义 top-k 重合率、排序相关性和最大距离偏差,不能假装逐字节可复现。
验收器不信 builder 的 success:它按 descriptor 打开精确 object version,核对实际 size、media type 并流式复算 digest,再确认 release ID、维度、metric 与 aclSchema 一致,比较源、索引和删除集合。权限 coverage 必须 100%,未知 schema、孤儿、重复 ID 和未完成 shard 都为 0。RAG 引用溯源 所需 source version 与 chunk hash 同样来自该制品。
晋级是条件更新,不是复制目录
生产只解析含 manifest digest 与单调 generation 的 active-release。promotion 在审批 generation 未变且候选验签、门禁通过时 CAS。worker 验证后固定本地只读文件句柄/快照;若不能本地固定,每次打开都指定签名中的 object version,并在交给索引 reader 前复核 size 与 digest。禁止先验证可变 URI、关闭后再按同名路径打开;同一请求也不得跨 generation 混读。
切换前跑固定事实查询、空结果、精确字符串、跨租户负向样本、已删除文档和引用展开,并比较 RAG Embedding 迁移 中的召回、延迟与质量门槛。金丝雀按租户稳定分桶,报告绑定候选 digest。若 manifest 相同,重复 promotion 是幂等 no-op;若名字相同而 digest 不同,直接拒绝。
故障注入与原子回滚
演练篡改 shard、伪造 size/media type、验签后替换同名对象、返回错误 generation、漏分片、证书过期、coverage 缺失及 CAS 后崩溃。候选只能保持 STAGED 或完整切换;新 worker 无法复核 descriptor 就拒绝 ready,已有固定且验证过的只读句柄可在规定期限内服务,不能跳过摘要检查。
至少保留上一个已验证 release 到回滚窗口结束。质量或延迟退化时,CAS 把指针切回旧 manifest digest 并提升 generation,不修改新旧 shard;删除或撤权等当前事实仍由实时 deny waterline 执行,回滚索引不能复活被禁止资源。回滚后重放触发 query 与引用审计,确认所有 worker 收敛到同一 generation。流程可借鉴 模型服务金丝雀发布,但索引回滚额外要求源版本和权限状态不倒退。
延伸阅读
Related