#AI#RAG#DevOps

RAG 索引制品发布:签名清单、可复现构建与原子回滚

同名索引可能来自不同语料、解析器或权限覆盖。本文把 RAG 索引视为不可变制品,用签名 manifest、摘要校验和原子别名控制晋级与回滚。

本文要点

  • 主题聚焦:AI、RAG、DevOps
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年2月4日·更新于 2026年7月20日

knowledge-prod-v7 无法说明源快照、解析器、chunk 参数、embedding 权重和 ACL 覆盖;分片漏传或 alias 被手改后仍可能显示成功。RAG 增量索引一致性 约束单文档事件,本篇把整批输出变成可验证的不可变 release。

Manifest 是发布 API,不是备注

定义 rag.index.release.v1,序列化规则和字段语义随版本冻结。一个最小清单应包含:

json
{
  "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

相关推荐