Writer 換模型實驗

COFACTS AI · 實驗二 · 2026-10-16

Writer 換模型實驗

writer(調度代理)目前用 Gemini 3 Flash。如果換成 Claude Haiku 或 Claude Sonnet,在正式環境出錯的決策點,以及正式環境做對的決策點上,會不會做出更好的判斷?

結論:依 Claude Opus 評審,16 個案例(7 個失敗案例+9 個對照組)中,Sonnet 有 15 個排第一(含 c01 與 Haiku 並列),唯一例外是 w05,由 Haiku 排第一。Haiku 排第一 2 次(w05,以及 c01 並列)。Gemini 當時的輸出在 16 個案例中有 14 個排最後,c05、c06 排第二。只看 9 個對照組,Sonnet 9 個都排第一,Gemini 有 7 個排最後。第二位評審 Gemini(Argon)在 7 個失敗案例給出完全相同的排名,整體也是 Sonnet 最好(第一 12 次),但在對照組 Sonnet 領先 Gemini 的幅度小很多(平均 24.3 對 21.0,Claude Opus 評審是 23.9 對 16.3),Haiku 是否勝過 Gemini 也要看評審是誰。這值得做一次跑完整流程的正式 A/B。出處必須可追溯到工具輸出的程式檢查(#144、#118)仍然要做。

1緣由

Langfuse 使用者回饋(score user-thumbs,production,2026-08-01 起,資料至 10-16)共 178 筆:130 讚、46 倒讚、2 筆為 0。

每月倒讚比例

月份評分數倒讚倒讚比例
8 月862327%
9 月501836%
10 月(至 16 日)42512%

倒讚勾選的原因(可複選)

原因次數
沒抓到重點11
回應文字與出處不符9
提供不存在的出處8
出處摘要錯誤8
出處不足7
篇幅過長6
資訊錯誤或過時6

我們對約 33 個倒讚 trace 做了根因分析,逐一追查最終草稿引用的每個網址來自哪裡。34 份最終草稿全部把每個主張設成 verifier_confirmed=true。其中 21 份至少引用一個 verifier 沒讀過的網址,13 份引用了任何工具輸出都沒有出現過的網址,共 23 個,全是模型自己做出來的。

類別機制約涉及 trace 數
Agate 只相信 writer 自己填的旗標:verifier 沒跑、失敗或給 ✗,writer 仍標已確認後起草18
B模型依格式自己拼出網址(Blogger 日期路徑、WHO slug、相鄰 id)14
D回合中斷,多數是 #145 之前 Cloudflare 125 秒逾時(已修)13
E範圍或脈絡錯誤:把一起轉傳的訊息當本文、session 內文章太多、抓錯重點7
C真實網址配錯主張5
F來源政策:用訊息本身當證據、選港陸媒體而非台灣官方來源3

draft_factcheck_response 的 claim_sources 檢查(adk/cofacts_ai/tools.py 第 542 行)只看 writer 自己填的 verifier_confirmed 布林值。A、B、C、E 很多是 writer 判斷或遵守指令的問題,所以我們的假設是:Claude 比較會照指示做,也比較會判斷子代理的輸出。這個實驗就是在檢驗這個假設。

2實驗方式

  1. 選決策點。案例組合是 7 個失敗案例加 9 個對照組。失敗案例 w01–w07 是正式環境在該步驟出錯的 writer 決策點;對照組是使用者按讚的決策點。案例清單在 exp/cases/index.md,每個案例的評分筆記在 exp/grader/<id>/notes.md。
  2. 挑選 c03–c09。c01、c02 是最早挑的兩個對照組。c03–c09 取自 8 到 10 月使用者按讚的 session。我們篩了約 25 份候選草稿,對每份做客觀檢查:每個網址都出現在先前的工具輸出、使用者訊息或 Cofacts 資料裡;每個 verifier_confirmed 主張都有 verifier 對該網址的 ✓;沒有把 ✗ 的主張改標;沒有編造數字;引用的網址都做過 HTTP 檢查。約 15 份沒通過而淘汰。入選的 7 個包含 4 個起草決策點,以及 3 個非起草決策點(處理 verifier 的 ✗、組 verifier 請求、處理子代理錯誤)。每個案例來自不同 session,也不和 w01–w07、c01、c02 共用 session。
  3. 重建 writer 當時的輸入。從 Langfuse 還原 writer 在決策點收到的完整輸入:system prompt、10 個工具宣告、整段對話(含工具結果)。10 個案例是逐字紀錄;6 個從最後一次有紀錄的輸入開始,依 ADK 自己的 history 規則往後重建。這套規則在 165 個有紀錄的輸入中重現了 164 個;c05 跨 3 個 trace 重建,較早的紀錄輸入全部吻合。Gemini 的 thinking 段落省略。
  4. 重播給 Claude。透過 Claude Code 子代理交給 Claude Haiku 與 Claude Sonnet(alias「haiku」「sonnet」)。API 錯誤訊息確認 Sonnet 是 claude-sonnet-5-5;Haiku 推定為 5.5。Claude 看不到圖片,只拿到佔位文字與 OCR;Gemini 當時在 9 個案例中看得到圖片。
  5. 處理 Sonnet 的分類器。Sonnet 5.5 的安全分類器(reasoning_extraction)擋下 5 個案例(w01、w02、w04、c01、c02,重試也被擋),並在 w07 回合中途切斷。去掉「[thinking omitted]」標記、改寫重播說明之後(資訊不變,檔案為 exp/cases/<id>/prompt_s.md),6 個都跑完。Haiku 沒有遇到這個問題。c03–c09 只有這種去掉 thinking 標記的版本,Haiku 與 Sonnet 都跑這份。
  6. 盲評。每個案例由一位 Claude Opus 評審處理。評審拿到打亂成 A/B/C 的三份輸出(Gemini 實際輸出、Haiku、Sonnet)、完整 prompt,以及 grader notes 當答案。5 項標準各給 1–5 分,再排出名次。w01–w07、c01、c02 的 notes 描述了 Gemini 當時的做法,所以這 9 個案例的 Gemini 輸出不算真正盲評。c03–c09 的 notes 只寫正確做法的標準,從不描述正式環境的輸出,所以這 7 個案例對 Gemini 也是真正的盲評。
  7. 第二位評審。使用者另外在 gemini.google.com 用 Google Gemini(模型選單顯示「Argon」)評同一批材料。評分標準、指示與 A/B/C 字母都和 Claude Opus 評審相同。不同的是,Gemini 評審在同一段對話中評完全部 23 個項目(含 proofreader 實驗的項目),材料是一個 zip 檔一次上傳;Claude Opus 評審則是每個 writer 案例各用一個子代理。結果存在 gemini_judge_results.jsonl。
  8. 解盲。用 exp/keys/writer_key.json 把兩位評審的 A/B/C 對回模型。

評分標準(每項 1–5 分,滿分 25)

案例與輸入來源

案例類型失敗類別prompt 字元數輸入來源有圖片
需要 JavaScript 才能顯示案例表。

3結果

各案例排名與總分(滿分 25,兩位評審並列;底色標示兩位評審排名不同的案例)

需要 JavaScript 才能顯示結果表。

名次以各評審的 RANKING 為準,不一定和總分順序相同。Claude Opus 評審:c01 中 Haiku 總分 25、Sonnet 24,判定兩者並列第一;c03 中 Sonnet 與 Haiku 都是 24 分,因為 Sonnet 對證據的檢視較細而排它第一;c05 中把 Gemini(17 分)排在 Haiku(19 分)前面,因為 Gemini 交出了使用者要求的新版草稿,Haiku 只做了沒說明理由的重查。Gemini 評審:w01 中 Sonnet 與 Haiku 都是 25 分,排 Sonnet 第一;c03 中 Haiku 與 Sonnet 都是 25 分,排 Haiku 第一;c04 中 Gemini 與 Haiku 都是 22 分,排 Gemini 第二。c02 與 w05 來自同一個 session,彙總時不算獨立。

雙評審對照

兩位評審拿到相同的材料與指示,A/B/C 字母也相同。Claude Opus 評審每個案例各自獨立評分;Gemini 評審在同一段對話評完所有項目。

怎麼解讀

附帶發現

按讚不代表出處可靠

挑選 c03–c09 時,我們篩了約 25 份使用者按讚的草稿,其中約 15 份沒通過客觀的出處檢查。常見的問題有三種:把 verifier 標 ✗ 的主張改標成已確認(例如 CPI 房租、民調、魔鬼路、魚膠原蛋白、印度移工、健康習慣等主題);把流傳的貼文本身當成它自己的證據;數字錯誤或沒有經過驗證。使用者按讚時,通常看不出出處有沒有問題。這支持在程式層級檢查每個出處能否追溯到工具輸出(#144)。使用者回饋與 writer 自己填的旗標,都抓不到這類錯誤。

4所有例子

每個案例依序列出:背景、使用者在決策點之前的最後一則訊息、正確做法、三個模型的輸出,以及兩位評審的分數與評語。輸出逐字保留;函式呼叫以參數清單呈現,字串參數中的 \n 顯示為換行,格式標籤(Text:、Function call:)與「[thinking omitted]」已移除。Claude Opus 評審的評語是評審報告的中文翻譯;Gemini 評審的評語原本就是中文,逐字保留。完整 prompt 太大(最大約 80 萬字元),沒有放進頁面。

需要 JavaScript 才能顯示案例。

5評估與建議

成本估算

依 Langfuse 30 天實際 token 推算:writer 780 次呼叫、125 個回合。範圍取決於 Claude 對中文的 token 倍率(1.0–1.6 倍,未實測)。Sonnet 的數字假設有 prompt caching。Vertex 上的 Claude 價格可能和官方價不同。

writer 模型writer 每 30 天(美元)全部 agent 每 30 天(美元)
Gemini 3 Flash(現況)10.6738.14
Claude Sonnet 5.5(有 caching)47.5–76.1約 75–104
Claude Haiku 5.56.6–11.3約 34–39(推算)

ADK 1.26 的 Claude adapter 目前不設 cache_control、不串流、不吃 thinking 設定,遇到 gs:// 圖片會丟出 NotImplementedError。上線前要先處理這幾點,否則上面的 caching 估算不成立,圖片訊息也跑不動。

風險

Sonnet 5.5 的分類器在這次實驗的包裝下大量誤擋(6 個案例需要改寫重播說明;c03–c09 一開始就用改寫版,沒有測原版)。上線前要在真實的 writer 流量上確認是否會被擋。Vertex 沒有伺服器端 fallback,需要在客戶端做 fallback。

建議

6限制