发布单元与版本谱系

本节目标

把“换了模型”扩展为对整个LLM复合应用的版本管理,并学会为每次回答保留可重建的谱系。

为什么不能只记模型名

同一个模型在不同Prompt、知识库、检索top-k、工具schema或安全策略下会表现得像不同系统。反过来,供应商模型名未变也不足以证明行为永远不变。因此运维对象应是一个 release manifest(发布清单),而不是一个孤立字符串。

最小发布单元

组件应固定的证据常见隐形变化
应用代码Git commit、构建制品摘要未提交本地改动
API 与 SDKAPI 契约版本、SDK 锁文件摘要SDK 自动升级、字段或错误语义变化
Prompt模板ID、内容摘要、变量契约在管理页直接编辑
上下文组装策略、系统信息顺序、截断规则token预算或会话摘要变化
检索索引/快照ID、Embedding、Chunking、过滤、top-k、Reranker文档同路径被覆盖
模型供应商、模型固定版本或可验证识别符、推理参数latest或浮动别名
工具名称、schema摘要、实现版本、权限策略工具名不变但副作用改了
护栏输入/输出策略、分类器版本、降级策略策略热更新未进入发布记录
评测回归集、评分器、人工标注规范与门策略版本只保留总分而丢失样本结果
路由与价格路由/回退清单、价格口径与生效时间自动换供应商或用当前价格回算历史

不可变版本与可移动别名

不可变版本指向一个确定内容;production、champion、latest等别名是可移动指针。别名便于运维,但发布系统必须:

  1. 在开始时解析别名;
  2. 将实际版本和内容摘要写入发布记录;
  3. 发布中途不再重新解析;
  4. 在Trace中记录实际版本,而不只记别名。

对不提供固定模型快照的供应商,当前只能记录可获得的最强证据,加强回归评测和Canary,并明确标注“无法证明服务端权重不变”。

一个简化manifest

{
  "release_id": "support-agent-2026-07-14.1",
  "app": {"commit": "6f1a2c9"},
  "api": {"contract": "responses-v3", "sdk_lock": "sha256:..."},
  "prompt": {"id": "triage-v4", "sha256": "sha256:..."},
  "context_policy": "context-v3",
  "retrieval": {"snapshot": "kb-2026-07-10", "config": "retrieval-v7"},
  "model": {"provider": "provider-a", "version": "pinned-model-id"},
  "tools": [{"name": "lookup_ticket", "schema": "sha256:...", "implementation": "tool-v5"}],
  "guardrail_policy": "guardrails-v2",
  "eval": {"suite": "support-regression-v8", "rubric": "rubric-v4", "grader": "grader-v5"},
  "routing": {"policy": "routing-v3", "fallback": "fallback-release-v2"},
  "pricing_policy": "price-snapshot-2026-07-12"
}

这段是可复制的严格 JSON,故不在行尾插入会破坏语法的注释:release_id 是一次不可变发布身份;app 与 api 固定代码和接口合同;prompt、context_policy、retrieval、model 与 tools 共同定义模型运行输入与外部能力;guardrail_policy 绑定安全控制;eval 固定离线证据;routing 固定路由和降级路径;pricing_policy 固定成本解释口径。

sha256:...是教学占位符,不是真实摘要。真实manifest还需包含创建者、创建时间、评测证据、审批与回滚目标。

谱系查询要回答什么

从任意一次线上输出的request_id开始,应能回答:当时运行的release是谁?用了哪些文档或工具?评测过哪些版本化门?同一release是否会因外部依赖漂移而改变?如果不能回答,系统只有“日志”,没有完整谱系。

常见错误与排查

  • 用文件名当版本:prompt.txt可以被覆盖;保留内容摘要和不可变快照。
  • 工具schema版本化,实现没有:同一参数可能开始产生新副作用;两者都要固定。
  • 只记知识库名:文档会持续变化;记快照或索引构建ID。
  • 把会话原文当谱系:原文可含个人信息和密钥;谱系优先记版本和摘要,内容需独立的必要性、脱敏和保留期策略。

练习与自测

为“基于内部文档回答报销问题”的助手写一份manifest,必须包含Prompt、上下文、检索、模型、工具、护栏和评测。然后回答:

  1. 为什么Git commit不能代替Prompt内容摘要?
  2. 如果供应商只给一个浮动模型名,你能证明什么,不能证明什么?
  3. 为什么回滚必须以整个manifest为单元?

小结与下一步

LLMOps的第一步是让行为变化有名字、有证据、能比较。下一步用 网关、配额与弹性 控制这些发布单元如何访问外部模型。

参考资料