跳到正文
深圳 · 大湾区 · 地球

AI 系统可观测性不是一块监控面板:复现不了故障,就等于还在跑演示

链路、token 记账和重放不是监控功能,而是上线闸门。它们决定第二天早上你能不能打开那一次运行:有序的步骤、实际的输入、回答它的模型版本、花掉的钱。

6 分钟阅读1,391
AI SystemsEnterprise暂无译文。

判据只有一条:第二天早上能不能打开那次运行

没有链路追踪、token 记账和失败重放的 AI 工作流不算在生产,只是运行时间更长的演示,而第一次真正花钱的故障会以一封客户邮件的形式到达。

第二天早上的测试很简单。生产系统里我打开那一次运行:有序的步骤、实际收到的输入、回答它的模型版本、花掉的钱,改一个变量就能复现故障。演示里只有一条 200 OK 的日志和一个无法验证的猜测。

没有链路追踪、token 记账和失败重放的 AI 工作流不算上生产,只是运行时间更长的演示——第一次花真钱的故障无法复现,而无法复现的故障只能用观点回答。

观点能过技术评审,过不了成本审阅:问「你怎么知道修好了」的人,握着明年的预算签字权。

不复现的故障,代价落在四个地方

四个地方都不在模型账单上:缺陷触发不了就改不掉,工作流带着故障上线;范围分不清,只能蒙眼接受风险或把流程关掉;修复无法被证明,下一次审批又是一次信任投票;事故没有金额,就没法和提前防住它的成本放进同一张表。

我交付过的系统里见过三次同样的走向:资深工程师的注意力被占掉一周,原因没人写下来,流程被悄悄改回人工复核。

三个原语,各自回答一个问题

链路、token 记账和重放会分别失效,多数团队只有其中一个。

链路不是日志。日志是按时间排的行,链路是带 run id 和父级 span id 的树,你能从失败那一步往回走到产生它的判断。没有父级 id,第四步的一次重试只是第二条同名记录,你分不清它替换了第一次还是并行跑过,故障于是无从复现。

token 记账把成本和 token 挂到「运行」上,不是账号或日期上。缺了它,推理开销就是没有分母的月度汇总,效率说法无法被证伪。

重放用冻结环境重新执行一次抓取下来的运行:同样的输入、检索结果和 prompt 版本,模型回答从记录里取,不再发实时请求。只有它能确立因果关系:它必须在模型调用之前开始,并决定这次运行要不要发生——在我交付的工作流里,这个决定来自第一次模型调用之前就用幂等键认领运行的编排层,它也让重试可以安全重放,而不是第二次扣费。

谁来回答哪一种故障

你实际会遇到的故障靠什么回答没有它,多久才有答案谁先发现
某客户的报价低了 20%带当次价目表的运行链路翻日志翻几天客户,在续约时
用量没变,某月开销上涨按运行归集的成本与重试次数到季度结账那天财务
质量下滑,说不清哪天开始模型、prompt、schema 的版本戳几周的模式比对一位评审,偶然发现
供应商在没变的别名后换了模型记录里的版本串与冻结样例比对直到有人升级为止公司外部
法务要求删除某客户的数据运行记录上按主体建的索引临时手工翻找法务,在被要求之后

最后三行决定流程能不能留在生产。算力超支只是难堪,带着可信数字的错误输出是负债:一次运行两美分,产出的是一份错掉的 40 万元报价。

一次运行多少钱,其中多少是重试

单位价格用示例值,换成你供应商的现行价目,结构不变:缓存输入 8,000 token 按每百万 $0.25,新输入 2,000 按每百万 $2.50,输出 1,200 按每百万 $10.00,一次尝试约 1.9 美分。每月 2,400 次成功运行,理想路径约 $46。

再把尝试次数和运行次数分开数:18% 的运行重试一次、4% 重试两次,多出 528 次尝试、约 $10,账单读数 $56——重试比理想路径高 22%,占整月账单的 18%,没有按运行的记录就无法归因。

我见过这个倍数走得更远:一条工作流把 schema 校验失败当成临时抖动反复重试,而不是交给人工,八天里跑到理想成本的 3.4 倍,因为所有汇总表里失败的那一步都像噪声。

写进合同的数字是每次成功运行成本:窗口内总花费除以同一窗口内的成功运行次数,放弃和失败的运行留在分子里。财务审的就是这个数。

要让重放成立,运行当时必须记下什么

一切能改变输出的东西都要在运行那一刻记下:输入引用及其哈希、渲染后的 prompt 及其哈希、模型 id 与供应商返回的版本串、工具 schema 版本、工具返回或其哈希、解码参数、尝试序号、终态。少一个字段,重放比较的就是两个不同的实验。

有三样东西会在不报错的情况下改变:供应商能在别名不变时更新模型,检索到的数据会在事后排查时轮换,prompt 可以被编辑而不留版本戳。只拿得到别名时,为每个 prompt 版本冻结二十组输入输出对每周比对,静默变更会表现为精确匹配率下降和输出长度漂移。

重放有硬上限:托管模型不会对同样的输入返回逐字节相同的结果。所以要跑两遍——第一遍用确定性壳层重放、模型回答从记录里取,确立原因;第二遍重发实时调用,检验故障是否还在。只做第一遍,等于拿上个月的模型确认修复。

代价的另一面:链路是客户数据的一份副本,所以要有保留窗口和按主体可检索的索引:完整载荷留 30 到 90 天,骨架留十三个月,全部可按主体 id 删除。一条十二步的运行记录只有几十 KB,每月 2,400 次运行不到 100 MB。链路长在供应商平台里时,把导出写进合同。

批下一张 AI 账单之前问四个问题

  • 给我看上周最差的那次运行:完整的链路、有序的步骤、它实际收到的输入、成本。
  • 上个月每次成功运行的成本是多少,其中重试和放弃的尝试占多少?
  • 某一天发出去的那份输出,是哪个模型版本、哪个 prompt 版本、哪批检索结果产生的?
  • 把上个月最严重的故障重跑一遍。原因在壳层里复现吗,修复在实时调用下仍然成立吗?

第四个是上线闸门,也是存疑的 CFO 唯一需要听到的问题:它把「这套 AI 系统能跑」换成了「这是同一次故障、这是原因、这是它不再发生的那次运行」。

闸门该放在哪里

要重放,不要报告。挑财务暴露最大的那条流程——错一次要用合同而不是 token 来计量的那条——在不问原作者的前提下从运行记录还原上个月最差的一次输出。超过十分钟还没还原出来,你就是在按生产的价钱买一个演示,下一次事故将由谁更会争辩来决定。构建时花两到四个人日把记录做出来是便宜的那个选项;补做要两到四周,因为你要重建没人写下来的决策。

继续阅读

更多「AI 系统架构」

准备构建一套系统?[ 预约会议 ]