Claude Haiku 5.5 發布的隔天,我們用同一個模型評估了兩個產品。

其中一個,當天就把正式站的回答換成了它。另一個跑完評估,決定不換;隔天我們用更嚴格的規則重跑一次,還是不換。

這不是兩個產品意見不同,而是同一個模型、同一套評測紀律,量出了相反的結果。值得寫下來的有兩件事:結論為什麼會相反,以及我們怎麼讓這兩個相反的結論都站得住腳。後者更重要,因為模型評測有個老毛病:看到數字之後,規則會悄悄往想要的方向挪。

兩份成績單

Twinchat 是官網上的檢索式問答機器人(它的檢索怎麼出過錯,寫在 RAG 那篇)。每則回答都由撈回來的幾段知識庫文字寫成,並以串流送出。上線門檻有 13 項;我們讓原本的 Gemini 3.5 Flash-Lite 與 Claude Haiku 5.5 在同一份題目、同一版提示詞上各跑三次:

Gemini(原本) Haiku 5.5
13 項上線門檻 沒過(1 個關鍵案例) 全過
答案正確率 98.2% 100%
忠實度 100% 100%
拒答準確率 100% 96.9%
延遲 p50/p95 2.03/3.18 秒 1.57/2.24 秒
這輪評測的答案花費 1 約 0.47

更準、更快、答案花費約一半,只輸在拒答準確率。(這一版提示詞改過:原本只在拒答時才要求模型宣告,改成每則回覆都要宣告,兩個模型都用同一版重跑。第一輪 Claude 在這件事上掉了分,那是另一個故事。)當天,正式站的回答換成了 Haiku,Gemini 退成挑戰者,繼續用同一份題目量測。

同一天,Twinco 做了第一輪評估。Twinco 是 LINE 上的助理:一則訊息進來,模型要決定直接回,還是叫工具(日曆、記帳、天氣……);選了工具還要填日期與參數;結果再寫成一則幾十個字的短訊。111 題,每題三次,三次全過才算通過:

Gemini(現行) Haiku 關思考 Haiku 開思考
通過題數(/111) 108 93 105
單次呼叫 p95 約 1.5 秒 約 2.7 秒 約 3.4 秒
含 Markdown 的回覆 0 13 11

三項指標,Haiku 沒有一項贏。關掉思考,它會把「請問標題是什麼」問回給已經講過標題的人;打開思考,準確率追到 105,延遲卻更慢。

同一個模型,同一天,為什麼?

Twinchat Twinco
工作 從給定的段落寫出答案 選工具、填參數,再把結果寫成短訊
一輪的輸入 約 3,200 tokens 約 2,000~2,700 tokens(含工具宣告)
輸出 串流的長回答 很短(選工具那輪不到 100 tokens)
思考 關掉,正確率仍是 100% 關掉少 15 題,開著變慢
時間花在哪 生成速度(Haiku 較快) 讀提示詞、網路往返、思考

差別不在模型,在工作的形狀。這句話容易說,難的是:你得在看到數字之前,就決定哪一種形狀的證據算數。

第一份結果,我們自己就不信

那份評估的結論是「不做」,而它自己就寫下了重測之前該先做的三件事:開思考、補上「不要用 Markdown」的規則、把「先追問」類的規則改成說明契約。換句話說,我們量到的是用它最弱的設定,在一套為另一個模型磨了兩個月的流程裡上場的 Haiku。

這樣的結論不夠格當成決定。所以隔天我們重做,而這次的重點不是跑得更多,是在跑任何一題之前,先把規則寫下來並提交。

規則長這樣:

  • 一、淘汰(任何一條不過就出局)
    • 錯誤、逾時、拒答合計不超過 1%。
    • 整輪 p95 對同場基準的倍數,bootstrap 95% 區間的上界不超過 1.5;p99 不超過 10 秒。
    • 品質題的輸出:Markdown 至多 1/90,英文或推理外洩、簡體字都是 0。
  • 二、不比現在差
    • 路由題的嚴格通過數(三次全過才算)不低於基準減 3,且 McNemar 檢定沒有顯著變差。
    • 日曆寫入、記帳金額、天氣縣市等類別,沒有新的穩定失敗。
  • 三、值得換(跨供應商)
    • 兩位評審都判同一邊,或整輪 p95 不超過基準的 0.8 倍;另外要有人明確接受固定成本。
  • 都沒過:維持現行,並寫下重測條件。

這幾條裡有四個設計值得拆開講。

打平就不換。 換的代價不對稱:同一家換版幾乎零工程;跨供應商要先拆出供應商介面(估計 11~20 個工作天)、重做額度換算,還要改隱私權政策並讓會員重新同意。所以規則寫的是「打平=不換,跨供應商要明確勝出」。這條在看到任何數字之前就寫得出來,因為它只取決於成本結構,不取決於結果。

先淘汰,後比品質。 延遲不需要評審,幾分鐘就量得出來;品質要請兩位評審正反兩種順序各判一次,再加人工盲評,貴很多。把便宜的關卡排前面,淘汰的模型就不進評審——這次三個挑戰者都在第一關出局,省下了預估花費的一半以上。代價要寫明:沒跑評審,回覆好壞沒有結論,表上只看得到格式與有沒有亂加數字。

題目也要先寫好。 路由題是既有的 114 題加 25 道新題。新題在跑任何挑戰者之前寫好,因為既有題目是一題一題照現行模型的失敗長出來的——只用它們,等於讓考卷站在現行模型那一邊。整個實驗只送合成資料,沒有任何會員的訊息、行程或帳目。

意外照時間記,不回頭改。 正式跑之前的冒煙與試跑,發現兩處跟登記不同:Gemini 3.8 Flash 對最低的思考層級一律回 400,那個變體只好取消;回覆品質那個階段改成五個變體全跑,緊接在路由階段後面、同一個尖峰,因為整輪延遲要用它的第二輪延遲去組,分開時段會把排隊差異混進倍數。這兩件事照時間記在文件末尾,登記的內容原樣不動;第二件還多補一條——送評審的設定照第一階段決定,不看這一階段的結果來挑。

結果:第一關就出局

基準用的是補了格式規則的那一版提示詞(P1,原因在後面)。Haiku 的 low、medium 是思考的 effort 設定。

現行 Haiku low Haiku medium Gemini 3.8 Flash
錯誤/逾時/拒答 0 0 0 0
整輪 p95 1.75 秒 3.33 秒 3.81 秒 7.86 秒
對基準的倍數(95% 區間) — 1.90(1.74~2.05) 2.17(1.98~2.53) 4.49(3.91~5.76)

規則要求區間的上界不超過 1.5。三個挑戰者連下界都超過了,這不是邊界案例。

怎麼知道這不是抖動?我們多量了一組 A/A 對照:同一顆模型,只差一份提示詞。它對基準的倍數是 1.13(區間 1.04~1.29)。同一個模型也量得出 13%,代表區間低估了同時段的波動——但 1.9 與 4.5 遠在這個範圍之外,夜間的試跑(每個變體 30 筆)方向也一致。

準確率這一欄,反而是打平:

嚴格通過(139 題) 比基準差/好(題數) McNemar p
現行(原提示詞) 136 3/1 0.63
現行(P1,基準) 138 — —
Haiku(low) 136 3/1 0.63
Haiku(medium) 135 4/1 0.38
Gemini 3.8 Flash 134 5/1 0.22

沒有一個顯著變差。「Haiku 比較笨」不是這張表能支持的結論,它輸在時間。Gemini 3.8 Flash 則連第二關也沒過:134 低於基準減 3 的 135。同家升級幾乎零工程,卻是三個裡面最慢的一個。

時間花在哪

整輪 p95 只告訴你慢,不告訴你慢在哪。所以另外量了地板延遲:極短的請求各送 20 次,把網路與排隊,從思考與輸出裡拆出來。

地板 p50(尖峰) 第一輪 p50/p95 第一輪輸出 token(其中思考)
現行(基準) 0.63 秒 0.78/1.14 秒 45(0)
Haiku(low) 0.94 秒 1.25/3.04 秒 183(79)
Gemini 3.8 Flash 2.41 秒 2.29/6.65 秒 94(32)

Haiku 的網路與排隊只多了 0.3 秒。p95 的差距來自思考與較長的輸出:同樣一次工具選擇,輸出 token 是 4 倍。Gemini 3.8 Flash 則是另一個故事:極短的請求在尖峰就要 2.4 秒,那是服務端的排隊,跟我們的請求大小無關,沒有任何提示詞改寫救得了它。

這也解釋了 Twinchat 為什麼相反。那邊的答案是長的、串流的、不需要思考,生成速度是主要成分,Haiku 的優勢剛好用得上;Twinco 的主呼叫只輸出幾十個 token,生成速度幾乎不是成本,剩下的是讀提示詞、往返網路,還有 Haiku 非開不可的思考。每多一次模型往返,就多一份這樣的延遲——這也是按鈕那篇索性讓按鈕跳過模型的原因。

現行模型有看不見的主場優勢

第一輪評估裡最有價值的觀察,不是 Haiku 哪裡弱,而是我們的提示詞與流程哪裡在替現行模型補洞。

  • 工具描述裡到處是「缺少標題就先追問,不要自行猜測」。那是衝著 Gemini 愛自己補資訊寫的。Haiku 的傾向剛好相反、又更照字面聽話,同一句話把它推向多問:「刪掉明天的會議」被判成沒有標題。
  • 流程刻意讓模型「資訊不全也先叫工具」,再由程式掛按鈕追問;修改行程則是模型直接叫修改工具,由程式用使用者講的名詞去找行程。挑戰者共同的失敗都出在修改行程:Haiku 先問「原本幾點」,Haiku 開 medium 與 Gemini 3.8 Flash 則先去查行程。它們的選擇本身說得通,只是不符合這套流程的契約,而題目的期望值也是照這個契約寫的。

要分清兩種東西:契約是流程對下游的承諾(資訊不全也先叫工具,程式會追問);補丁是衝著某個模型的毛病寫的(不要自行猜測)。公平的比較要先把補丁改寫成契約的語言,而且——這一點最容易漏——同一份改寫也要套在基準上。

我們把這份改寫叫 P1:主提示詞補上回覆格式的規則與「資訊夠就叫工具」的規則,三份行程工具描述裡的「先追問」改寫成與實際行為一致的契約。套在基準上之後,現行模型也變好了:

現行模型 原提示詞 P1
路由題嚴格通過(/139) 136 138
品質題含 Markdown 的回覆(30 題各三次) 7 0
回覆裡的數字不在工具結果裡 12 1
回覆字數中位數 111 59

「新增行程沒講時刻」那一類從 0/3 變成 3/3。原本的提示詞對現行模型也有疏漏,只是它剛好沒踩到。主場優勢有一部分,是沒有人替它寫下來的規則。

我們沒有把 P1 帶進正式提示詞:字數中位數從 111 掉到 59,是精簡還是過短,要評審或盲評才知道,而這一輪沒有跑評審。

token 是供應商自己的尺

Claude 數同一段繁體中文,token 是 Gemini 的 1.58 倍(Twinchat 用兩家各自的免費計數端點,對四份知識庫文件量出來,每份落在 1.54 到 1.63 之間);Twinco 帶著工具宣告的請求量出來是 1.63 到 1.67。每個 token 的單價便宜 3 到 5 倍,被這個倍數吃掉大半,每輪成本只便宜約四成。Gemini 3.8 Flash 則是現行的 2.6 倍,供應商宣布的調價生效之後是 5.2 倍。

成本倒是其次。更麻煩的是所有拿 token 當單位的東西,換了供應商就換了一把尺:

  • Twinco 的會員額度以 token 計。不處理的話,同一則對話扣得多 58% 以上,會員實際用得到的則數掉到約六成,畫面上寫的「約 N 則」卻不變。真要換,額度得改扣「Gemini 等價 token」:每個模型一個係數,扣額度時用原始 token 乘上它。代價是係數只是近似值,每換一次模型都要重量。
  • Twinchat 的 token 計數器用在文件分段與上下文預算。照 Claude 的尺重校,放得進預算的段落會掉到現在的約 63%,每份文件下次重建索引都要重切——那已經是另一個系統,不是通過評測的那一個。所以它刻意不動計數器,成本改由供應商回報的實際用量來算。

兩個產品對同一件事做了不同的處理,共同點是:這個決定是換之前就寫下來的,不是換了之後才發現額度悄悄縮水。

退回只是改設定

Twinchat 換上 Claude 的同時,把退路也寫好了:把兩行環境設定對調(回答模型與挑戰者模型),再重新建立容器。不需要發版。有一個坑要寫進手冊:restart 會保留舊的環境變數,要用 up -d 讓它重建。

輸入框上方有一行揭露,說明答案由哪家 AI 產生。供應商名稱是依設定的模型在每次回應時帶入,不是寫死在版面上,所以退回時揭露跟著走,不必為此發版。

跨供應商的自動備援,我們刻意不做。同一家降級幾乎是零成本:同一份工具定義、同一把金鑰、同一套 token 計價單位。換供應商,這三樣都得平行維護一套,而且 tokenizer 不同會動到計費語義。供應商全面故障時,回答會失敗,補救是上面那個手動退回。

否決也要附重測條件

不換不等於永遠不換。Twinco 的文件末尾寫下了什麼時候再量:

  • Haiku:整輪 p95 要回到基準的 1.5 倍以內,現在是 1.9 倍。關思考會掉準確率,所以要等更快的模型,或供應商的延遲改善;就算過了,修改行程的契約與簡體字也要先處理。
  • Gemini 3.8 Flash:要支援最低思考層級,或尖峰的地板延遲回到 1 秒內;價格是現行的 2.6 到 5.2 倍,品質要明顯勝出才划算。
  • 形狀改變時:出現不在乎延遲的長文字工作(例如批次產生的內容),那種形狀才接近 Twinchat 量到 Haiku 佔優的情境。

重測用的是同一份題目與同一套規則,所以下一次的數字可以直接跟這一次比。

可以帶走的原則

  • 決策規則(淘汰、勝出、重測條件)在跑任何一題之前就提交,跑完不改。執行中發現與登記不同的地方,照時間附在後面,不回頭改原文。
  • 換的代價不對稱時,打平就是不換:同一家換版可以輕一點,跨供應商要明確勝出。這條只取決於成本結構,所以能在看到數字之前寫下。
  • 便宜的關卡排前面。淘汰的不進昂貴的評審,但要把「品質沒有結論」寫下來,不要把沒輸當成贏。
  • 題目集也有主場優勢。另寫一批不是從現行模型失敗長出來的新題,並在跑任何挑戰者之前凍結。
  • 先量 A/A 對照:同一顆模型只差一份提示詞,倍數是多少,那就是你的噪音底線。
  • 分清契約與補丁。補丁改寫成契約的語言之後,同一份改寫也要套在基準上,否則量到的是「誰比較不需要補丁」。
  • 延遲要拆開量:地板(網路與排隊)、思考、輸出長度。工作的形狀——串流的長回答,還是幾十個 token 的工具選擇——決定哪一項占大宗,也決定誰佔優。
  • token 是供應商自己的尺。額度、分段預算、成本,凡是用 token 當單位的東西,換供應商之前先決定要不要換算、怎麼換算。
  • 退回要是改設定,不是發版;揭露要跟著設定走。跨供應商的自動備援會牽動計費與揭露,不做是刻意的。
  • 否決要附重測條件。「什麼時候再看」寫下來,才不會變成永遠不看,也不會變成每次新模型一出就重吵一次。