七月,我写过一位农夫在黎明时分走在葡萄园里,把一颗葡萄压碎在折射仪的棱镜上,然后把“13.5 Brix”敲进一个聊天窗口。另一端的智能体并不关心这个数字是怎么来的。我写道,对 Digital Scribe 来说,数字就是数字。 在葡萄园里,这个立场站得住脚。新鲜葡萄汁,正是折射仪被造出来要读的东西。 今年秋天,我把同一种仪器对准了正在发酵的果汁。事实证明,那个智能体本该在意。 **三个批次和一块棱镜** 过去几周,我起了三个小批次:一批黑莓酒,现在正在大桶陈酿;一批梨酒,9月24日开始发酵;一批柳兰蜂蜜酒,两天后加了酵母。它们都是一加仑的批次,这对这个故事很重要,因为在这个体量下,每取一次样,都是你喝不到的酒,也是你放进去的氧气。 所以我用折射仪跟踪它们。几滴液体滴在玻璃棱镜上,合上盖,对着光,从刻度上读一个数。这个数是白利度,大致就是溶解糖的百分比。它快、便宜,每次只花几滴。黑莓酒主发酵期间,我一天测两次,每次压帽都测。 而一旦发酵开始,折射仪就是错的。 **仪器并没有撒谎** 折射仪测的是光穿过液体时弯曲了多少。溶解的糖会让光弯曲,所以在新鲜果汁里,弯曲的程度是糖含量的一个好代理指标。仪器上的刻度,就是按这个假设校准的。 发酵打破了这个假设。酵母把糖转化成酒精,而酒精也会让光弯曲。主发酵开始几天后,折射仪报告的是残留糖和已产生酒精的叠加效果,却把这一切都当成糖来呈现。读数会比真实糖含量偏高。如果照单全收,它会告诉你发酵比实际进度落后。 要得到能用的数字,得把每个读数套进一个校正公式。多数家酿葡萄酒的人用的是基于最初为酿酒开发的公式做的计算器,而每一个都需要同一个额外输入:加酵母之前测的那个原始读数。 黑莓酒上就是这么做的: 没有任何东西出故障。仪器做的正是它被造出来要做的事。变的是它所对准的系统,一个在某种状态下可靠的代理数字,到了下一种状态就成了误导。 **两种仪器,都不测糖** 传统替代方案是比重计,一个配重的玻璃浮子。它沉得越深,液体密度越低。糖让液体更稠密,所以比重下降意味着糖在被消耗。 但比重计也不测糖。它测的是密度,而酒精比水密度低,所以随着发酵推进,酒精自己就把读数往下拉。一支发酵完成的干型酒,读数常常低于1.000,比纯水还低——如果比重计真是糖度计,这不可能。 所以折射仪测的是光怎么弯,比重计测的是液体有多重。两者都不测我真正在意的东西:还剩多少糖,酵母还在不在工作,这酒好了没有。这些是我推断出来的。仪器给的是证据。 哪怕读数稳定,也是模糊的。发酵结束的传统标志,是连续几天读数不变。但一个停滞的发酵,同样会连续几天读数不变。蜂蜜酒在这方面臭名昭著:蜂蜜几乎没有天然缓冲能力,发酵推进时pH会往下漂,酵母可能在远未发酵干时就慢下来或停住。一条平线,可能是完成了,也可能是卡住了,仪器分不出来。要靠别的证据区分:这条线是在哪里变平的,pH在怎么走,你原本预期看到什么。 证据和状态之间的这个区别,听起来像抠字眼,直到你发现,在软件里我们一直在犯这个错。 **你的仪表盘有同样的问题** CPU使用率不等于健康。一个服务在15% CPU时可能已经死锁,在90%时可能正干着你想要它干的事。HTTP 200不等于正确,它只说明服务器返回了响应,不说明响应是对的。一个绿色的健康检查,只说明健康检查端点应答了。模型置信度不等于真相,它只是模型对自己输出产生的一个数字。 这些指标,最初都是在特定条件下合理的代理。然后系统变了,新的故障模式出现了,或者有人开始优化这个数字本身,代理就漂离了它本该代表的状态。而仪表盘还在用一模一样的权威感渲染它。 这就是折射仪问题。指标是为系统的某一种状态校准的,现在却在另一种状态下被读取,而显示上没有任何东西告诉你这一点。就像那条平的发酵线,一个稳定的指标可以意味着两种相反的事:一个安静的错误率,可能意味着一个健康的服务,也可能意味着一个一小时前就不再接收流量的服务。 失败不在于收集指标。失败在于把指标当成了状态,而不是把它当成关于状态的证据。 **一个读数需要它的历史** 回到那个校正公式。要解释今天的读数,你需要发酵开始前的那个读数。没有它,当前的数字几乎无法解释。同一个白利度值,可能描述一个刚刚开始的发酵,也可能描述一个接近完成的发酵,完全取决于它从哪里开始。 一个测量的意义,取决于它的来历。 我认为,这正是可观测性实践最常做得不够的地方。我们存下数值和时间戳,就把它叫作一条记录。我们通常会丢掉的,是以后解释它所需的一切:哪个仪器……

打开网易新闻 查看精彩图片