你個本地 LLM 到底幾勁?自己起個 Eval 測試集由零開始評分
唔好靠 vibe check——用 promptfoo 加自製港式測試集,量化的 model 揀 model 先唔會買錯
重點整理
- 痛點:網上 benchmark 話 90 分嘅 model,用到你嘅港式場景就亂晒——因為 benchmark 唔代表你嘅 use case
- 四大 eval 類型:精確匹配、關鍵字斷言、LLM-as-judge、人手抽檢——各有適用場景同成本
- 實戰:用 promptfoo 起一個 20 題港式客服 eval,全程免費,附完整可抄 config
- 進階:eval 唔止揀 model 用——改 prompt 之後跑一次回歸測試,防止愈改愈差
Benchmark 嘅分數唔係你嘅分數
啲人揀本地 model 嘅習慣:上網睇 benchmark 排名,邊個高分就裝邊個。但 MMLU 考嘅係美式學術題,你嘅 use case 係「用廣東話答香港客服查詢」——兩者關係可能係零。
真正有用嘅係 自己起一個細細哋嘅 eval set:20 至 50 題你自己場景嘅真實問題加理想答案。之後無論換 model、改 prompt、調 temperature,都跑一次睇分數——呢個先係你場景嘅 benchmark。
四種評分方法(由平到貴)
| 方法 | 例子 | 適用 |
|---|---|---|
| 精確匹配 | 答案等於 "28°C" | 有標準答案嘅抽取/分類任務 |
| 關鍵字斷言 | 答案要包含 "退款" 同 "7 日" | 檢查有冇講到重點 |
| LLM-as-judge | 用另一個 model 按 rubric 評 1-5 分 | 開放式答案,冇標準答案 |
| 人手抽檢 | 自己瞇 10 條 | 任何方法嘅最後防線 |
LLM-as-judge 好方便但有坑:judge model 鍾意俾中間分(7/10 症候群)、對長答案有偏好。所以 rubric 一定要寫得具體:「用咗廣東話?有冇直接回答問題?有冇編造資料?」逐項評分好過一句「答得好唔好」。
實戰:promptfoo 港式客服 eval
promptfoo 係免費開源工具,一個 YAML config 就可以跑齊多 model 對比:
# promptfooconfig.yaml
description: "港式客服 eval - qwen3 vs llama3"
prompts:
- "你係香港電訊公司客服。用廣東話回答客人問題。問題:{{{{question}}}}"
tests:
- vars:
question: "我個網絡尋日晚上八點斷咗,可唔可以扣返啲月費?"
assert:
- type: contains
value: "紀錄"
- type: llm-rubric
value: "答案應該表示會幫客人查紀錄或者提出補償方案,唔可以編造具體賠償金額"
- vars:
question: "點樣轉合約?"
assert:
- type: contains-any
value: ["續約", "轉台"]
- type: llm-rubric
value: "答案應該問清楚客人現時合約或者講明查詢方法,唔可以直接報價"
跑 promptfoo eval 就有齊兩個 model 嘅分數對比;promptfoo view 開 web UI 睇逐題答對答錯。
由零起一個 eval set 嘅流程
- 收集真實問題:翻你自己嘅 chat log、email、客服紀錄,揀 20 條最常見加最棘手。
- 寫理想答案:唔使完美,寫低「起碼要講到咩」就夠——通常係 2 至 3 個關鍵點。
- 分配斷言:有硬答案嘅用 contains,主觀嘅用 llm-rubric,每題 1 至 3 個斷言。
- 跑基線:而家個 model 先跑一次,記低分數。
- 回歸測試:之後每次改 prompt,跑一次對比——分數跌咗即係你改壞咗。
Eval 都會有偏見
留意三個坑:eval 題全部出自你自己手筆,會偏向啱你而家個 prompt 嘅寫法;llm-rubric 用嘅 judge model 本身都有偏好(建議 judge 同被評 model 唔好同款);分數長期 95%+ 即係 eval set 太易,要加難題。
總結
「邊隻 model 好」呢條問題冇通用答案,只有「喺我嘅 20 條題目度邊隻好」。今晚花一個鐘起個 eval set,之後每次換 model、改 prompt 都有數字靠——呢個係由「感覺佢幾勁」去到「知道佢幾勁」嘅一步。
延伸閱讀
- Function Calling 小模型實戰——改完 tool 設計之後用 eval 驗證
- Ollama vs llama.cpp 實戰對決——未裝好環境嘅先睇呢篇
