观测、审计、回放,为什么是 AI 系统的基础设施
补档说明:本文属于「AI 工程落地周记」系列,计划发布时间为 2025-10-20 16:10。当前先保留为草稿,后续补充真实案例、代码片段和复盘细节后再发布。
很多 AI 系统前期都把预算优先给了模型、Prompt、工作流和界面,等到线上开始出问题,团队才发现真正缺的是另外三样东西:
- 观测
- 审计
- 回放
这三件事听起来像“运维附属项”,但我现在越来越把它们看成 AI 系统的基础设施。因为没有它们,系统一旦出错,你几乎无法回答最关键的几个问题:
- 这次到底发生了什么
- 为什么会发生
- 影响了哪些请求
- 新版本和旧版本比,差异到底在哪
普通系统没有日志很痛苦,AI 系统没有这三层则会很快失去可治理性。
为什么 AI 系统特别需要这三层
因为它的错误通常不像普通接口那样“明确炸掉”,而更像:
- 回答变差了
- 结构化字段偶发错位
- 某类请求突然变贵
- fallback 比例变高
- 某个工作流开始更容易半路失败
这些问题往往没有一条单独的异常栈能完整解释。
观测解决的是“现在系统长什么样”
我这里说的观测,不只是打几条日志,而是让团队能看到:
- 请求量
- 成功率
- 超时率
- fallback 比例
- 模型分布
- 平均 token
- 成本变化
也就是把系统的运行状态变成可读的。
没有这层,你甚至不知道问题到底是局部异常,还是系统性漂移。
审计解决的是“这次决策是谁、基于什么做的”
AI 系统一旦开始参与:
- 审核
- 路由
- 工单建议
- 自动发布
就必须能回答责任问题。
这时只靠普通日志是不够的,还需要审计记录:
- 当时用了哪个模型版本
- 输入是什么
- 输出是什么
- 是否有人工批准
- 哪个节点执行了副作用
审计不是为了“事后看热闹”,而是为了当结果有争议时,系统能给出可追责证据。
回放解决的是“能不能把问题再放一次”
这是我觉得最容易被低估的一层。
很多团队能看到错误,也能知道版本,但就是没法稳定复现。结果每次排查都像猜谜。
回放的价值在于,它能让你拿着历史请求重新比较:
- 老版本 vs 新版本
- 原始路由 vs 新路由
- 原始 Prompt vs 修改后 Prompt
这会直接改变排查效率。
这三层最好长什么样
我现在比较理想的请求记录会至少保留:
{
"requestId": "req_123",
"route": "content_review",
"model": "model-a",
"promptVersion": "v17",
"inputDigest": "sha256:...",
"retrievalDocIds": ["doc_1", "doc_8"],
"outputSnapshot": {
"riskLevel": "high",
"shouldEscalate": true
},
"humanDecision": "approved",
"costUsd": 0.023,
"latencyMs": 1840
}
真正重要的不是字段名,而是这条记录能同时服务三件事:
- 观测统计
- 审计追溯
- 回放重跑
一个常见误解:日志多不等于可观测
很多系统也会输出很多内容,但问题在于它们只是“很多字”,不是“可分析的字段”。
例如你记录了一大段文本,却没有:
- requestId
- 模型版本
- promptVersion
- 路由结果
- fallback 原因
那后面依然很难聚合、回放和比较。
所以我现在更在意结构化事件,而不是堆更多自由文本日志。
为什么这三层应该在前期就做
因为越往后补,代价越高。
等系统上线一段时间才发现没有这些能力,往往意味着你要回头补:
- 事件模型
- 日志字段
- 数据脱敏
- 请求关联
- 存储和留存策略
这些都不是一句“多记点日志”就能补齐的。
总结
观测、审计、回放,为什么是 AI 系统的基础设施?因为它们决定了系统出了问题之后,团队能不能看见、能不能解释、能不能重现。
对 AI 系统来说,真正可持续的不是“先跑起来再说”,而是从一开始就让关键行为可追踪、关键决策可审计、关键请求可回放。只有这样,系统才不只是会工作,而是能被长期维护和持续改进。
