iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
AI Engineering

從 Claude Code 到無人值守:我的 AI Agent 工程化實戰系列 第 14 篇

Day 14|遙測:數字從哪來、為什麼會錯

  • 分享至 

  • xImage
  •  

Day 14|遙測:數字從哪來、為什麼會錯

有一次,我的逐輪用量紀錄上同時成立兩件互相打架的事:逐輪條列裡,每一輪都各自記著一筆花費,一行一行加起來看起來很合理;可是同一份紀錄的「累計」欄位,卻不聲不響地多出一大截,多出來的部分在上面任何一行都找不到對應。

沒有人說謊,兩個數字也都是系統自己寫下來的。差別在於,它們回答的根本不是同一個問題。

Day 13 把「看得見」補上了:即時觀測行、逐輪紀錄、儀表板都在跑,遙測管線是通的。但通不代表準。今天這篇處理前一篇留下的缺口——數字準不準,以及一個更難堪的版本:當欄位存在、查詢跑得動、圖也畫得出來的時候,你憑什麼相信那個數字量到的是你以為的東西。

(先聲明:本文只談數字怎麼被量錯與怎麼校正,不談定價、不解讀成本高低、不比較哪種比較划算。那是明天的事。)

事故:一整批花費,兩頭都不認領

漏掉的那截錢,源頭有兩個,而且它們會疊在一起。

第一個是位置問題。收尾時去讀本輪紀錄,最直覺的做法是讀主控自己的對話紀錄檔——那裡有這一輪的問答、工具呼叫、輸出量,看起來就是全部了。實際上不是:被派出去的執行者,用量不寫在主檔裡,而是各自留在自己的紀錄檔。

收尾邏輯的檔頭留著一筆 2026-09-05 的觀察紀錄(我引用的是當時寫下的文字,本次沒有重跑):那一輪派了 2 個執行者出去,主檔裡查不到它們的用量。只讀主檔,這批人就等於免費幹活。

第二個是歸屬問題,比第一個難。知道要去讀執行者的紀錄檔之後,下一個問題是:讀到的這些花費算哪一輪的?最自然的答案是看時間戳——落在這一輪區間內的就算這一輪。這個答案是錯的,而且錯得很有規律。

同一份檔頭記著一個具體案例:某次執行中,第 2 輪派出一位中層經理,中層又往下派了 6 個執行者。主控這邊第 2 輪先收尾、落檔了,那 7 個還在跑。

等它們陸續跑完,時間戳全部落在「第 2 輪已經收尾之後、第 3 輪還沒開始之前」那段縫裡。於是第 2 輪說我已經結束了不收,第 3 輪說那時我還沒開始也不收——那一整批的用量,逐輪條列一行都沒記,只有累計欄位悄悄漲。

這就是開頭那個矛盾的答案。不是加法算錯,是有一段時間沒有任何一輪願意認領。

遙測管線六段,每一段標出可能漏掉什麼

從兩份分開存放的紀錄,到收尾掛鉤、本地逐輪紀錄、暫存佇列、紀錄資料庫,最後到儀表板。旁邊的紙條寫的是它所連那一段可能把什麼弄丟,最後一張是讀法上的限制。

證據:欄位存在,不等於量得到

修掉歸屬之後,我以為剩下的只是讀表。結果這一輪盤點翻出更根本的一件事。

快取寫入分成兩種存留時間,短的一種和長的一種,換算倍率不同,混在一起當同一種算就會失真。程式邏輯有分計,資料表也真的有兩個欄位——看起來是做好了。這次我把全部歷史紀錄拉出來加總:長存留時間那一欄是 62,839,788,短存留時間那一欄是 0;再查「短存留時間大於 0」的列數,回傳 0 筆。近七天按日彙總也一樣,每一天的短存留時間都是 0。

誠實的寫法只有一種:分計欄位存在,程式也會分,但目前紀錄到的全部落在長存留時間那一種,另一種恆為零。我不知道那是工作型態使然、快取策略使然,還是上游行為使然——盤點資料回答不了這題。

我能確定的只有:如果之後有人拿這兩欄去比,會拿到一個看起來很乾淨、其實只有一邊有資料的比例。這正是這篇最想留下的那條教訓的實例:欄位存在不等於量得到,跑得出查詢不等於量到了東西。

同樣的分寸也適用在思考量上。逐輪紀錄的尾行長這樣(節錄):out 36,999(th 12,368)——輸出 36,999 個 token,其中 12,368 是思考。整條管線裡,思考量我只找到這一個來源;它被包在輸出量裡回報,本次盤點沒有找到第二個來源可以交叉比對。能量到已經不錯,但別假裝它有旁證。

Day 13 提過的兩條讀法邊界在這裡同樣成立:金額是等價成本、不是帳單;額度幅度含其他 session 與裝置的消耗。這兩句話不寫在旁邊,儀表板上的數字就會被當成帳單看。

解法:不要問「什麼時候」,問「這幾行算過沒有」

歸屬的修法,是把判斷依據整個換掉。

執行者的紀錄檔有一個好性質:只追加,寫過的行不會被回頭改寫。那就不必問時間。收尾時替每個執行者各記一個標記——已經算到第幾行;下一輪只認領標記之後新增的那些行,認領完把標記往前推。執行者何時真正跑完不再重要,只要它寫了新行,下一次歸屬掃描就會撿到,不重不漏,也不依賴時鐘精度。

用時間戳分輪會兩頭不認領,改用讀取位置標記後正確歸屬

中間那一列由上而下是事件發生的真實順序:主控收尾在前,執行者跑完在後。「做法 A」框是按時鐘分的結果,「做法 B」框是按讀取位置分的結果——差別在於問題換了:不是「這件事什麼時候發生」,是「這幾行我算過了沒有」。

管線後段還有兩個同類的坑,順手在圖上標掉。一是 Day 13 講過的即時觀測行:它是觀測不是會計,跟逐輪行相加就是重複計。二是入庫鏈——本地紀錄先進暫存佇列、再沖進紀錄資料庫,然後才到儀表板;卡在佇列還沒沖進去的那批,儀表板上看不到。那不是沒花,是還沒到。

新問題:校準完了,那一個 token 到底值多少

第二幕到這裡收得起來。從權限與危險指令攔截畫出邊界,到 session 從啟動到收尾誰在動,到中層經理為什麼跑完一輪就結束,到持久狀態與記憶根本不是同一件事,到回報被壓成正規化表格,到可觀測性讓這一切看得見,最後到今天:看得見的東西,還得先確定它量對了。幾乎每一步都是上一步壞掉之後被逼出來的。

但校準只解決了「這個數字是不是它宣稱的那個東西」。它沒有回答下一個問題:這個數字到底代表什麼。等價成本是按官方 API 定價換算的,那定價本身怎麼構成?快取為什麼會讓同樣一段內容差出一截?訂閱制底下,這些換算出來的數字該怎麼解讀才不會自欺?

這三題就是第三幕的開場。


明日預告:Day 15|token、快取與成本:帳到底怎麼算


上一篇
Day 13|看得見才管得住:可觀測性
下一篇
Day 15|token、快取與成本:帳到底怎麼算
系列文
從 Claude Code 到無人值守:我的 AI Agent 工程化實戰 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言