home / experiments / when the instrument broke
Experiment
量測系統壞掉的那一週,儀表板照樣有數字
這是一次靜默失效。不是資料變難看,是資料根本沒進來——而畫面上看不出來。
發生了什麼
我在 shell.fans 上跑一組固定的 AI 能見度探測:同一批問題、固定週期、兩個平台。2026-08-24 那次執行,OpenAI 側 22 題全部失敗,Anthropic 側 22 題全部正常。
| 日期 | 平台 | 模型 | 成功 | 失敗 |
|---|---|---|---|---|
| 2026-08-17 | OpenAI | gpt-4o-mini-search-preview | 22 | 0 |
| 2026-08-17 | Anthropic | claude-haiku-4-5 | 22 | 0 |
| 2026-08-24 | OpenAI | (無模型紀錄) | 0 | 22 |
| 2026-08-24 | Anthropic | claude-haiku-4-5 | 22 | 0 |
| 2026-08-31 | OpenAI | gpt-5-search-api | 22 | 0 |
| 2026-08-31 | Anthropic | claude-haiku-4-5 | 22 | 0 |
原因很平凡:我用的那個模型退役了。請求被拒絕,錯誤被寫進 error_message,然後流程繼續往下跑。
為什麼沒有立刻發現
因為另一個平台還活著。
摘要層把兩個平台的結果合併成單一數字。一邊有資料、一邊沒有,合併之後仍然是一個看起來正常的數字——只是它現在只代表一半的世界,而畫面上沒有任何地方說明這件事。
這是我從這次學到最有用的一句話:量測系統的失效不會長得像失效,它會長得像「數字變了」。而數字變了是我每天都在看的東西,不會觸發警覺。
如果那次是兩個平台同時掛掉,我當天就會發現——因為畫面會空白。偏偏是一半,反而撐住了假象。
改了什麼
- 平台維度不再合併顯示。每個平台的成功數、失敗數、以及當次實際使用的模型,都分開列出。合併後的單一數字保留,但旁邊一定要有拆解。
- 把模型名稱寫進每一筆結果。原本只有執行層記錄設定值,結果層沒有。出事時我無法從資料本身回答「這批數字是哪個模型跑的」,得去翻設定檔的歷史。現在每一筆都自帶模型名。
- 整批失敗要當成失敗,不是零分。原本 22 題全錯會被算成「提及 0 次」,在圖表上與「真的一次都沒被提到」長得一模一樣。這兩件事必須用不同的方式呈現。
沒有改的部分,以及為什麼
我沒有加「模型退役自動偵測」。理由是:退役的形式不只一種(回 404、回 400、靜默改指向別的模型、或只是變慢),寫一條規則去猜下一次會長什麼樣子,通常只會擋住我已經遇過的那一種。
真正有效的是讓失敗無法被摘要吸收掉。只要每個平台的失敗數都攤在畫面上,不管原因是什麼,我都會看到。
如果你也在跑這類量測
- 把「沒有資料」和「資料是零」畫成不同的樣子。這兩者在多數圖表工具的預設行為裡是同一個點。
- 每一筆觀測都要自帶當時的量測條件(模型、版本、題組)。寫在設定檔裡不夠——你回頭查的時候,設定檔已經是新的了。
- 不要讓多來源的摘要掩蓋單一來源的死亡。合併是為了好讀,不是為了好看。
這次事件也連帶影響了另一件事:修好的時候我換了模型,而換模型代表前後的數字不能直接比。那是另一篇的主題。