- 問題
- AI 功能的測試有兩個互相衝突的需求:要量得準,就得用真的模型回應;要能在 CI 上跑,就不能依賴網路、金鑰與額度。多數專案的妥協是「AI 那段不測」,然後改壞了也不知道。
- 做法
- 真實的模型回應只在我自己的電腦上錄一次,存成回放檔(cassette)。回放檔的鍵包含模型 ID 與輸入的雜湊,所以換模型、改 prompt 都會換一份檔案,不會悄悄沿用舊答案。CI 設成只讀回放檔,找不到就判失敗——這一條是整套機制的關鍵:如果缺檔時自動退回呼叫模型,「回放檔被誤刪」就會表現成 CI 全綠。
- 量什麼
- 五個評測套件,每一個都對人工定案的 golden 量測,門檻寫在一份 JSON 裡,規則是只升不降。檢索的 hybrid(向量加分詞全文檢索,用 RRF 融合)在 golden 40 筆上 Recall@5 是 1.0000,原本的
LIKE查詢是 0.8750;分類的 accuracy 0.9891、macro-F1 0.9744;整條管線對自製樣卷的章節正確率 1.00。 - 哪些數字只報告不擋
- 有些指標我刻意不設門檻。本機模式以 OCR 為主拆題,每一題都要人工確認才入庫,所以入庫率設計上一律是 0,拿它比門檻沒有意義;零成本閘門的通過率也只報告——本機的分類呼叫不花錢,而拆題模型自己猜的章節不可靠,閘門通過率高不代表好。章節對不對由另一個指標把關。把不該比的數字拿來比,等於自己製造假訊號。
- 結果
- CI 三個 job:單元測試跑 Node 22 與 24、整合測試用 pgvector 的 service container、桌面版另一個。4,536 項單元測試(4,535 過、1 略過)、697 項整合測試、126 項桌面測試,整個流程不需要任何金鑰,也不連網。
- 邊界
- 回放檔證明的是「程式對同一份模型回應的處理沒有變」,不是「模型今天還會給出同樣的回應」。模型漂移要靠重錄才看得見,而在純 CPU 的機器上重錄一輪要好幾小時。所以我把重錄當成一個有成本的決定在排程,而不是假裝這個問題不存在。
NOTE · · 應用於 教學出卷助手
讓 CI 評測 AI,而且不連網、不用金鑰
模型的回應只在我自己的電腦上錄一次,存成回放檔。CI 只讀回放檔,找不到就判失敗,不會改去呼叫模型。
看這篇筆記應用的作品
這篇筆記的實際應用

教學出卷助手
把散落在考卷裡的題目,變成能依學生需求組卷的題庫。
看個案研究 →