系列:30 天用 Google AI 打造臺灣防災速報 App(Day 27/30)
改了提示詞或分級表,怎麼知道是變好還是變壞?今天替兩個 AI 輸出各出一張考卷:Day 9 的警報分級,和 Day 8 的速報摘要。兩張分開出,因為它們出錯的代價不一樣。
準確率或 F1 這類單一分數,表達不出漏報和誤報的代價差異。所以分級考卷先看漏報底線,再看誤報。這個做法參考同屆 Fngi 的〈評測:False Negative 才是要命的那一個〉。
正式流程的推播底線:
分級本身的錯誤另外算:判得比正解低是漏報(包括把警戒判成資訊),判得比正解高是誤報。
一共 67 題,分四個子集,數字分開報。正常案例通常佔多數,混在一起算,會把髒資料和刁鑽案例的失敗蓋掉。
| 子集 | 題數 | 真實/改寫 | 內容 |
|---|---|---|---|
| 正常格式 | 19 | 19/0 | CAP 欄位齊全的官方電文,依類別與等級分層抽 |
| 髒資料 | 16 | 6/10 | 真實:摘要不到 20 字。改寫:全形數字、摘要截斷到 25 字、句中斷行、標題缺漏 |
| 刻意刁鑽 | 16 | 12/4 | 真實:已過期、同一條更新鏈的後續電文、解除電文。改寫:CAP status 改成 Test |
| 像警報但不是 | 16 | 16/0 | 停水、例行水庫放流等官方等級是資訊的電文 |
「像警報但不是」這一組最容易被忽略:考卷裡沒有「正確答案是不推」的題目,就量不到資訊級被升級、或不該推卻推的錯誤。
樣本不夠的地方也照實標出來:存檔裡沒有欄位齊全的「氣象極重大」,交通類只有 2 則官方等級電文,地震海嘯類只有 4 則(地震報告走另一條流程)。在評測紀錄的類別細表裡,題數少於 3 的項目都標「樣本不足」。
每一題長這樣(節錄):
{
"id": "negative-001",
"subset": "negative",
"group": "民生",
"category": "停水",
"source": "real",
"input": {"title": "停水", "summary": "機電設備臨時故障", "sender": "台灣自來水公司"},
"cap": {"severity": "Minor"},
"expect_level": "info"
}
推播用正式的判斷函式離線跑,不連資料庫、不發送。
A 的結果:四個子集都是漏報 0、誤報 0;刻意刁鑽與像警報但不是共 32 題,推播違規 0;應推的 10 題全部有推。
B 一跑就看出問題:
原因在 Day 9 的分級表:表上沒有列「大雷雨即時訊息」,淹水只寫「紅色=重大」,還寫了「水庫放流=警戒」「整區停水=警戒」。模型照表判,表和官方的實際用法對不上。照官方等級的實際分布改了分級表後,同一份考卷的結果:
| 子集 | 題數 | B 漏報/誤報/架構上限(改表前 → 改表後) |
|---|---|---|
| 正常格式 | 19 | 24/0/9 → 0/2/9(57 次) |
| 髒資料 | 16 | 18/3/0 → 1/0/0(48 次) |
| 刻意刁鑽 | 16 | 39/0/3 → 0/0/3(48 次) |
| 像警報但不是 | 16 | 0/24/0 → 0/0/0(48 次) |
剩下的錯誤:一則水利題三輪中有一輪判低;一則強風電文明寫「黃色燈號」(正解警戒),三輪中兩輪判成重大。三輪結果一致的題數是 65/67。
這組數字要和正式環境的實際比例一起看:存檔裡有等級的 1,214 則電文中,由 AI 補判的只有 4 則(0.3%),其餘都是官方等級。而且 AI 補判的等級只在 App 裡顯示,不推播(Day 25)。所以 B 的錯誤影響的是少數電文的顯示顏色,不會讓推播漏掉或多發。
摘要沒有標準答案,所以拿 Day 8 定的四條當檢核規則:
| 檢核 | 怎麼查 |
|---|---|
| 1. 60 字左右 | 程式,70 字以內算過 |
| 2. 數字、地名完整 | 程式:摘要不得出現原文沒有的數字;電文內文 3 個縣市以內時都要保留 |
| 3. 不臆測 | 評審模型打 1–5 分,4 分以上算過 |
| 4. 語氣冷靜 | 評審打分,加上程式查驚嘆號 |
被測的是正式流程用的 gemini-3.1-flash-lite,評審用 gemini-3.1-pro-preview。評審的提示詞裡寫明每個分數的定義和例子,例如不臆測的 3 分是「有一處輕微推論,例如把原文沒寫的時間、範圍說得更具體」,2 分是「新增一項原文沒有的事實或建議」。
考卷是 17 則真實電文,都是摘要超過 60 字的;60 字以內的電文正式流程直接用原文,不呼叫模型。
| 檢核 | 修正前 | 修正後 |
|---|---|---|
| 1. 70 字以內 | 5/17(中位數 91 字) | 12/17(中位數 60 字) |
| 2a. 沒有新增數字 | 17/17 | 13/17 |
| 2b. 縣市完整(內文 3 個縣市以內的 8 則) | 8/8 | 7/8 |
| 3. 不臆測 4 分以上 | 9/17 | 12/17 |
| 4. 語氣冷靜 | 17/17 | 17/17 |
| 四條全過 | 4/17 | 8/17 |
修正的是兩件事:提示詞明寫不超過 60 字;程式加上勸告句檢查,摘要出現原文沒有的勸告句就重寫一次,仍有就改用原文前段。
修正後新增數字的 4 則都是水庫放流:模型把一長串鄉鎮改寫成「等 11 鄉鎮市及 4 鄉鎮」。逐則核對,數目是對的,但原文沒有這兩個數字。程式規則照樣判不過,我們保留這個嚴格度:防災摘要裡的數字,應該都能在原文找到。縣市完整少的那 1 則,是一則降雨摘要漏列了宜蘭縣和屏東縣。
比對原文要看電文的所有欄位。 4 則水庫放流摘要寫了「請下游民眾遠離河床」,只看說明欄會判成模型自己加的勸告句;但水利署電文的 <instruction> 欄本來就有「請沿岸附近民眾加強注意並遠離河床」。比對和評審都要拿到指示欄,正式流程的勸告句檢查也一樣。
評審要拿到和原文一樣多的資訊。 只給評審標題和內文、不給發布單位,它會把摘要裡的「中央氣象署」判成新增事實。
評審自己也會判錯。 有 2 則被評審判成臆測,人工核對後是評審錯:一則說模型加了「今日」,原文其實寫「時間為今日」;另一則說模型新增「雲林縣」,原文就寫「雲林縣斗六市」。這 2 則另有長度不過,所以四條全過的 8/17 不受影響。所以評審的分數拿來追蹤趨勢,判不過的題目一定要人工看過。
考卷和修正都用同一批電文,可能只是把規則調到剛好過這批題目。所以再用修正後才進來的新電文,照同樣規則出一份獨立的考卷。
這段期間只有強風、水庫放流和停水,沒有大雨、雷雨、淹水,分級只抽得出 19 題,摘要只有 6 則。這組只能檢查規則有沒有對新電文失準,不能取代完整考卷。
沒過的那則是真錯誤。原文列了 12 個縣市,摘要寫成「桃園市至屏東縣」,等於多涵蓋了原文沒有的臺南市、高雄市、嘉義市,評審給 1 分。程式的縣市檢查只在電文內文 3 個縣市以內時套用,所以沒攔下;縣市多的電文被寫成「A 至 B」區間,是目前檢查的缺口,列為待修。
每次動到提示詞、分級表或換模型版本,前後各跑一次這兩張考卷,四個子集逐欄比對,不看總分。完整跑一輪,分級 3 輪加摘要評審,費用估計不到 0.5 美元。
明天 Day 28:費用與資安。