avatar
蕭富云行動應用開發者 · Android & Flutter

分母才是難的那一半 — 怎麼量 agent 有沒有守規矩

2026-08-31 · 10 min read

說明: 本文由 AI(Claude)根據我的初始筆記與想法完成。

上一篇〈唯一一道等人的閘〉的結尾留了一句話——我沒辦法證明模型守得住那八段。所以下一步不是再加規則。是去量它到底守了多少。

這篇就是量了之後的心得。先講結論:打分不難。難的是決定分母。我改了三次分母,分數從 11% 一路升到 24%。而模型的行為,一次都沒變。

量法本身很樸素

每一條規則都留得下痕跡——閘門的 block 寫出來了沒、審查的判決那一行有沒有出現、測試跑完回傳的是不是 error。量法就是:把所有 session 的逐字稿撈出來,切成一段一段,每段問一次——這條規則該在這裡發生嗎?發生了嗎?

分子是「發生了」的段數。分母是「該發生」的段數。分子幾乎不會出錯,痕跡就是痕跡。坑,全在分母裡。

第一次改分母:把不是作品的段落拿掉

最早的版本,把每一個會動手的段落都算進「該審查」的分母。結果一看,有 163 段只跑了 git commitmkdirinstall.shtee 這類東西。佔分母三成,合規率 1%。

當然是 1%。這些段落根本沒有作品可審,審查的規則本來就不該在這裡發生。拿掉之後,合規率從 11% 變成 15%。

第二次改分母:段落切錯了

拿掉雜訊之後,還是有東西不對勁。390 個「欠審查」的段落裡,58 個判決那一行明明在段落裡——只是不在最後一次編輯之後。

追下去,發現是段落的邊界切錯了。兩件相接的任務被折成同一段。第一件做完、審查了、判決寫了。接著第二件開始編輯,沒審查就結束。從整段來看,最後一次編輯之後沒有判決,判失分。

這個讀數是整個反過來的。審查過的第一件被扣了分,沒審查的第二件躲在同一段裡,完全沒被計到。荒謬。

改法是「判決一寫下,這一段就關掉」。之後合規率從 15% 變成 24%。

三次分數上升,零次行為改變

三個數字排在一起看:

分母的版本合規率模型行為
含純指令段落11%
拿掉純指令段落15%沒變
判決一寫下就關段24%還是沒變

每一次都是分母變得更真,不是紀律變得更好。這是整篇文章的骨:看到一個「agent 合規率」的數字,先別急著信。先問它的分母是誰、什麼時候改過。沒有分母歷史的分數,不能拿來跟上個月比。

別讓總結者替自己打分

第二類坑跟分母無關。跟「誰給誰打分」有關。

規則是這樣寫的:審查有發現就先修,修完才能寫完工報告,報告最後一行寫 Compliance Review: PASS。這條規則本身沒錯。但如果量法去讀的是那一行——它只可能是 100%。因為寫那行的正是被審查的主線,主線永遠會等到自己覺得過了才寫。這不是量測,是自問自答。

所以判決只能讀審查者自己的逐字稿:那個被派出去、唯讀、跟主線沒有共同記憶的 agent,到底說了什麼。主線那一行是宣稱。審查者的紀錄才是證據。

同一個陷阱換了個樣子,出現在閘門的接受率上。閘門停下來等人時,使用者從幾個選項裡挑一個回答。如果「挑了一個」一律算成「接受了計畫」,那分母裡就有十分之一結構性地卡在 100%——不管計畫寫得多爛。

結構性不等於確定性

判定分成兩層。結構性的判定只讀 tool_result 的 error 旗標,完全不解析輸出字串——不會被格式改壞。聽起來很可靠。

然後上一篇那個坑回來了。這次帶著數字:

flutter analyze 2>&1 | tail -6

沒有 set -o pipefail,shell 回報的是 tail 的離開狀態。從逐字稿看,99% 被 pipe 過的 lint 執行都回報乾淨——不管 linter 到底抓到什麼。這些不算通過。我另立一類叫「無法量測」,印在那一列下方,兩邊都不計。

同一列還挖出幾個小的:

結構性的意思是「不靠模型判讀」。不是「不會錯」。

不知道就別猜

第三類坑:量法遇到不確定的事情,怎麼辦。我的答案是兩邊都不計,另外記一筆。

閘門寫了,使用者沒回話,session 就結束了。這不算接受,也不算拒絕。記成 abandoned。沉默不是對計畫的判決。

使用者回報 bug,但那個 bug 歸屬於哪一個「完成」不確定——寧可丟掉,也不假設它指向最近的那一個。那一列會誠實承認自己因此高估,把未歸屬的筆數印在下方。

丟掉資料很痛。但一個假設錯了的歸屬,會讓整列數字往錯的方向偏——而且你看不出來。這才是真正麻煩的地方。

兩層信心,不要平均

前面說判定分兩層。結構性讀離開狀態。啟發式讓模型讀一段逐字稿判斷意圖(按 session 與回合快取,不重複問)。

這兩層的可信度差很多。所以標題數字分成兩個報,不用一個平均數假裝確定。另外按模型切分——Opus、Sonnet、Fable 各一欄。「模型會忘規則」這件事本來就跟模型有關,混在一起就看不到差異了。

合規率儀表板:標題數字、依模型切分的折線,以及每一列下方另計的放棄與未歸屬筆數

儀表板在 2026-08-31 的樣子。每一列下方的小字,就是被排除在分母之外的東西。合規審查那一列,在本文寫成時已經走到 37% 了。

誠實但書

三件事要先說。

啟發式那一半,是模型在判模型。比沒有好,但它的分母也是我定的。

lint 那一列的分母目前最薄。短期的波動別讀成趨勢。

這些比率仍然不是紀律的證明。它們證明的只是痕跡有沒有留下。一個規則可以被守了,但沒留痕跡。也可以留了痕跡,但沒被真的守住。這點我一直提醒自己。

一句話收尾

想知道 agent 有沒有守規矩,先別看分數。先問三件事:這個分數的分母是誰,誰在給誰打分,不知道的時候它怎麼辦。三個都答得出來,那個數字才開始有意義。