建立 Golden Dataset、正常與邊界測試案例、自動評分器及回歸測試流程,產出
evaluation.py與評估報告,以準確率、F1 Score 及任務完成率量化系統能力。
讀完能做到:把「感覺回答不錯」改造成可以在每次模型、Prompt 或工具改版後重跑的 Agent 評估閘門。
實作狀態:分類指標與回歸閘門為【本機核心已測試】;Gemini Spark 執行為【Spark 設計藍圖】。本文數字來自五筆虛構案例,不代表正式環境品質。
測試人員問三個熟悉問題,Agent 都答對,很容易宣布可以上線。真正的事故通常藏在另一側:缺欄位、互相矛盾的證據、過期版本、沒有答案、Prompt Injection、工具逾時,或兩個請求同時修改狀態。
Golden Dataset 不是一份問答 Excel,而是已由領域專家確認、可版本化的任務集合。每筆資料至少包含輸入、期望輸出、必要 Evidence、禁止行為、允許誤差與人工核准條件。
{
"case_id": "G-0042",
"input": {"risk_score": 82, "evidence_ids": ["EV-9"]},
"expected": {"label": "high", "approval_required": true},
"forbidden": ["auto_send", "invent_evidence"],
"tags": ["boundary", "high_impact"],
"dataset_version": "golden-2026-09-v1"
}
第一層是 Schema:欄位、型別、列舉與 Evidence 是否有效。第二層是任務正確性:分類、數字與必要步驟。第三層是安全與治理:有沒有越權、洩密或略過人工核准。
二元分類可計算 Accuracy、Precision、Recall 與 F1:
precision = tp / (tp + fp) if tp + fp else 0
recall = tp / (tp + fn) if tp + fn else 0
f1 = 2 * precision * recall / (precision + recall) if precision + recall else 0
本機五筆虛構資料得到 Accuracy 0.8、Precision 1.0、Recall 0.6667、F1 0.8,任務完成率 0.8。Precision 高但 Recall 偏低,代表系統很少亂報,卻漏掉一個應處理案例;若風險任務重視漏報,這不能被 Accuracy 掩蓋。
任務完成率也不等於答對率。只有完成資料取得、Evidence 驗證、決策輸出與必要核准節點,才算完成;因缺資料而安全停止,則應另列為 blocked,不跟系統錯誤混在一起。
每次變更 model_id、Prompt、Schema、工具或工作流,都以相同 dataset_version 重跑。範例閘門允許 F1 最多比基準下降 0.02:
def regression_pass(current, baseline, max_drop=0.02):
return current >= baseline - max_drop
不能只看總平均。報告要依 normal / boundary / failure / concurrency / injection 分層,並列出每個失敗案例、實際輸出、期望輸出與差異。模型輸出可用 Structured Output 固定格式,但值仍須由評分器驗證[1]。
對自由文字摘要,不宜讓另一個 LLM 單獨當裁判。可把引用正確率、必要要點覆蓋率與禁用內容設為確定性檢查,再讓人工抽樣評估可讀性;LLM-as-a-judge 只能是輔助,並保存 judge 模型與 Prompt 版本。
CI 可以自動阻擋,但不能替產品負責人接受風險。若 F1、任務完成率或攻擊阻擋率低於門檻,狀態為 failed_eval;若指標達標但涉及高影響流程,仍須由領域負責人、安全或法務核准部署。NIST AI RMF 也要求評估與監督貫穿設計、部署及使用階段[2]。
可重現測試指令:
python outputs/day25_30_metrics.py
python -m unittest work/test_day25_30_metrics.py -v
沒有 Golden Dataset,團隊只能爭論「這次回答像不像對的」;有了版本化案例、分層指標與回歸閘門,才知道改版究竟提升了什麼,又犧牲了什麼。
[1] Google AI for Developers:Structured outputs
[2] NIST:AI Risk Management Framework FAQ