對應原題(Common ‧ Evaluation and Observability)

  • Design the regression gate that decides whether a prompt or model change ships. — Asked at: Anthropic
  • Design online evaluation: what do you log, what do you sample, and what do you A/B? — Asked at: Perplexity
  • How do you manage prompt versioning and rollbacks in production?

🎯 什麼情境該想到我

當你「改了 prompt,不知道該不該上線」的時候。
★ 核心主張:prompt 改動必須被當成程式碼改動對待——版本控制、code review、CI gate、可回退。
把 prompt 當成「隨時可以在後台改一改的設定」,是 LLM 產品事故最大的來源。

⚙️ Part 1:上線閘門(Regression Gate)

五層閘門(由快到慢、由便宜到貴)

層檢查什麼耗時何時跑
1. 靜態檢查prompt 模板的變數都有綁定、必要區段存在、token 數在預算內、無硬編碼密鑰秒每次 commit
2. 斷言測試可程式驗證的性質:格式合法、該拒答有拒答、無 PII 洩漏、引用 span 有效秒–分每次 commit
3. 回歸集評估固定 100–300 題的核心指標分每次 PR
4. Pairwise 對照舊版 vs 新版,裁判做 A/B(見 LLM-as-Judge)分–時合併前
5. 金絲雀 / 線上 A/B真實流量時–天發布時

第 1、2 層應該像 lint 一樣快、一樣自動。 大多數團隊直接跳到第 3 層,結果 CI 太慢就沒人跑。

★ 通過條件怎麼定(關鍵設計)

絕對不能只看「平均分數有沒有變高」。 要分三類指標:

類別例子通過條件
① 硬性護欄(不得退步)安全拒答率、PII 洩漏、格式合法率、引用有效性、contradiction rate★ 任何退步都擋,不看統計顯著性
② 目標指標答案正確率、groundedness、使用者任務完成率改善要有統計顯著性
③ 成本與延遲p95 TTFT、每請求 token 數、每請求成本不得超過預算 X%

★ 兩個最容易做錯的地方

1. 被雜訊騙

同一個 prompt 跑兩次,分數就會不同(見 取樣與解碼策略:temperature=0 也不保證可重現)。

→ 每個版本要跑多次(3–5 次)取平均,並算信賴區間。
「新版 82.3% vs 舊版 81.7%」很可能只是雜訊。沒有信賴區間的 gate 會讓你不斷部署隨機漫步。

2. ★ 只看總體,掩蓋子群崩壞

總體 +2%,但「中文查詢」-15%、「長文件」-20%——總體分數會蓋住它。

→ Gate 必須分子群評估:每個查詢類型、每個語言、每個資料源、每個使用者層級。
任一子群顯著退步就要人工判斷,不能自動放行。

Gate 的輸出要可讀

不要只給一個分數。要列出哪些案例從對變錯(逐案 diff)。
「這 7 個案例退步了」比「分數 -0.4%」有用一百倍——前者能直接除錯,後者只能猜。

⚙️ Part 2:Prompt 版本管理與回退

Prompt 存哪裡

程式碼庫外部 prompt 平台
可 review / diff✅⚠️
與程式碼版本綁定✅❌
可走 CI gate✅⚠️
熱更新❌ 要部署✅
事故時能 git revert✅⚠️

★ 建議:程式碼庫是真相來源。
需要熱更新時,用 feature flag 切換「哪個已提交的版本生效」,
而不是讓人直接在後台編輯 prompt 文字。
兩者的差別是:前者所有可能生效的內容都經過 review 與 gate,後者沒有。

一個「版本」是什麼

★ prompt、模型、參數、工具 schema 是一組,不能分開版控:

version: v2026.09.20-3
prompt_hash:    sha256:a3f1...
model:          claude-sonnet-5
params:         {temperature: 0.2, top_p: 0.9, max_tokens: 2048}
tools_schema:   sha256:9c2e...      # ★ 改工具定義也會改變行為
retrieval_cfg:  {top_k: 50, reranker: bge-v2}
eval_results:   {...}               # 這個版本通過 gate 時的分數

回退必須整組回退。 只回退 prompt 而留著新模型,是一個沒有被測試過的組合。

★ 每個線上回應都要記錄它用的是哪個版本

沒有這一欄,事故時無法回答「壞掉的那些請求是哪個版本產生的」——整個歸因鏈斷掉。

⚙️ Part 3:線上評估

★ 前提:離線分數好,線上未必好

常見原因(見 Benchmark 污染與分數失真):真實查詢分布與評估集不同、真實輸入更髒、使用者行為與評估假設不同、長尾佔比被低估。

記什麼(Log)

類別內容
請求層trace_id、使用者/租戶(雜湊)、版本、時間
內容完整輸入、輸出、system prompt 的 hash
檢索命中的 doc ID + 版本 + 分數 + 是否命中快取
工具每次呼叫的名稱、參數、回傳、耗時、成敗
效能TTFT、TPOT、總延遲、排隊時間(見 Prefill 與 Decode)
成本input / output / cache-read / cache-write token 數
★ 隱式回饋追問、複製、重新提問、放棄、停留時間、有沒有捲到底
顯式回饋讚/倒讚、回報、編輯後採用

抽樣什麼(Sample)

全量記 metadata(便宜),抽樣記完整內容(貴)。

抽樣策略用途
隨機抽樣(如 1%)★ 無偏的基準,用來估算整體品質
★ 分層過取樣負回饋、低信心、高價值使用者、新版本、異常延遲、觸發護欄 這些要大比例抽
全量記錄的例外安全事件、工具執行失敗、contradiction 告警 —— 100% 留存

★ 只做分層過取樣而沒有隨機基準,會讓你的品質估計嚴重偏悲觀(因為你只看了壞的)。兩者都要。

A/B 什麼

指標類型例子
★ 主要指標=使用者行為任務完成率、追問率(越低越好)、複製率、留存、轉換
代理指標groundedness、裁判勝率 —— 快,但不是真相
★ 護欄指標p95 延遲、每請求成本、錯誤率、安全事件數、拒答率 —— 任一惡化就停

三個實驗設計要點:

  1. ★ 分流單位是「使用者」不是「請求」 —— 同一個人在兩版之間跳,體驗不一致、指標也被污染
  2. 要跑夠久 —— 至少一個完整週期(週內效應),並避開新奇效應
  3. 同時跑多個實驗要注意互動 —— prompt 改動與檢索改動同時上,結果無法歸因

⚠️ Part 4:注意 / 什麼時候不適用

  • ★ Gate 太嚴會讓人繞過它。如果每個小改動都要跑 2 小時的評估,團隊會開始「直接在後台改」。分層設計就是為了讓快的路徑真的快。
  • Gate 太鬆等於沒有。至少硬性護欄那一組不能妥協。
  • 評估集會被過擬合。調 prompt 調久了就是在對著回歸集調——要有不用來調參的 holdout(見 沒有標註時怎麼建評估集)。
  • 裁判換版本,歷史分數作廢。裁判模型升級要重跑一次基準線。
  • ★ 日誌是 PII 的匯聚點。完整輸入輸出含使用者資料,保存期限、存取控制、去識別化都要設計(見 PII、紅隊與公平性稽核)。
  • A/B 需要足夠流量。小產品可能永遠跑不出顯著性——那就靠人工複核與逐案檢視,不要假裝有統計結論。
  • 不要在事故中做 A/B。線上出問題就直接回退,事後再分析。

🧪 我實際套用的紀錄

  • 2026-09-20:從面試題庫展開。待辦:把 prompt 移進程式碼庫,並加上第 1、2 層的秒級 gate。

🔗 相關