[TOOLS] 12 分鐘閱讀OraCore 編輯部

模型分流把測試成本壓下來

我拆一個模型分流做法:先把 coding 任務分級,再把便宜模型放前面,保住品質又少燒錢。

分享 LinkedIn
模型分流把測試成本壓下來

我把 coding 任務先分級,再把便宜模型放前面,能省錢又不太傷品質。

我用 AI coding assistant 用到現在,最常冒出來的不是「它做不到」,而是「靠北,這題根本不值得用這麼貴的模型」。輸出看起來沒問題,demo 也挺順,直到我去看 usage log,才發現自己在替一個本來可以很無聊的任務,付了很不無聊的錢。這種感覺很差,因為它不是失敗,是默默漏錢。

更煩的是,這種浪費很容易被包裝成效率。大模型回得快、講得像樣、通常也能把事情推到八九成,所以你會懶得再想。久了之後,習慣就長歪了:什麼都先丟最貴的那顆。這不是架構能力,這比較像手滑。

我後來才想通,模型選擇不是一次性的「我家就用這個」決策,而是 triage 問題。不同任務本來就該走不同路徑。這篇把我拆開這套思路的來源放在這裡:The New Stack 對 Claude Fable 與 GPT-5.5 成本差異的文章。它不是在講玄學,是在提醒你同一個 coding test,放不同模型上,成本可以差很多。

我現在比較不把這件事看成模型選型,而是看成路由。簡單工作走便宜路,難工作才上重裝。對 agentic workflow 來說,這不是小優化,這是你帳單會不會失控的分水嶺。

別再用感覺選模型,這是在燒錢

訂閱 AI 趨勢週報

每週精選模型發布、工具應用與深度分析,直送信箱。不定期,不騷擾。

不會寄垃圾信,隨時可取消。

“Claude Fable cost $9 in one coding test. GPT-5.5 cost $1.50.”

這句話的重點不是誰比較強,而是同一種工作,放到不同模型上,成本可以差到很誇張。翻譯一下就是:你如果不先分類任務,就很容易把高價推理拿去做低價雜工。那不是聰明,那是浪費。

模型分流把測試成本壓下來

我看過很多團隊把 code review、test generation、refactor、甚至簡單 bug 修補,全丟給同一顆高階模型。理由通常很熟:比較保險、比較省事、比較不會出事。問題是,省事常常就是貴。只要任務本質上是格式轉換、局部改寫、結構抽取,你根本不需要拿最貴的腦袋去處理。

實操上,我會先把 AI 任務切成三桶。第一桶是低風險機械活,像 summarizing、rewrite、extract、format。第二桶是中風險工作,像寫測試、局部重構、dependency analysis。第三桶才是高風險,像架構決策、跨模組 bug 診斷、長鏈路 planning。第一桶幾乎不該碰最貴模型,第二桶用能過門檻的最便宜方案,第三桶才值得花錢。

這個切法聽起來很直白,但真的落地時,你會發現很多「我們以為很難」的工作,其實只是流程沒拆乾淨。你把任務拆開之後,貴模型的使用率通常會掉很多,而且不會影響結果。

我之前幫一個內部 code assistant 看過 log,最貴模型被拿去做的事情,大半是改命名、補註解、轉格式。那一刻我真的有點想翻桌。不是模型有問題,是我們把它當萬用刀,結果拿來切吐司。

模型分流其實就是 routing,只是換個比較不難聽的名字

所謂 model triage,我自己的白話版本就是:不要把昂貴 intelligence 用在便宜問題上。這概念一點都不新,我們早就在 compiler、cache、queue、background job 上做同樣的事。AI 只是把浪費放大,因為每次呼叫都會寫進帳單。

很多 agent builder 最常犯的錯,是先選模型,再補工具。這順序很怪。比較合理的是先問「這是什麼類型的工作」,再問「哪顆模型最適合」。不然你的 agent 就會變成一台永遠走最高配路線的自動販賣機,什麼都吐最貴版本。

實操寫法我會很土炮:在主模型呼叫前,加一個輕量 classifier。可以是規則,也可以是便宜模型,混用也行。我偏好先用規則,因為便宜、可預測、可 debug。像 request 裡有 summarize、extract、rewrite、format,就先走低階;有 bug、compare approaches、plan implementation,就往上;如果看不懂,就先問清楚,不要硬猜然後把錢燒掉。

  • 低階模型:抽取、改寫、分類、簡單 code edit。
  • 中階模型:寫測試、重構、dependency tracing、工具呼叫。
  • 高階模型:架構、跨系統 debug、長鏈路規劃。

這樣做的好處是,你不再是憑感覺下注,而是把模型選擇變成 policy。政策一旦寫下來,就能測、能改、也能吵架。比起「我覺得這題比較難」,這種做法至少像個工程團隊。

還有一個很實際的好處:triage 會逼你定義什麼叫 good enough。這件事很煩,但必要。很多團隊口頭上說要最強模型,其實只是還沒有成功標準,所以只好用貴來掩飾不確定。

便宜模型不是次等品,重點是它少不必要的戲

我現在看模型,不太只看它聰不聰明。我更在意它會不會亂演。因為在 coding 工作裡,最討厭的不是答案不夠華麗,而是答案看起來很像對的,結果你還得花更多時間清理。

模型分流把測試成本壓下來

我遇過一種很典型的狀況:大模型寫出來的 code 很漂亮,但 review 成本高,因為它會塞很多自信但不必要的東西。小一點的模型呢,可能沒那麼會講故事,但產出比較直,反而更好讀、更好改。對日常工作來說,這常常更有用。

也就是說,品質不是單一維度。你要一起看 correctness、review cost、latency、spend。便宜但讓你多花兩倍 review 時間,不叫便宜;貴一點但讓你少問三輪問題,那可能反而划算。只看 benchmark 很容易自嗨,因為 benchmark 不會幫你付 cloud bill,也不會幫你消化工程師的注意力成本。

我之前做 unit test generation 時就踩過這個坑。大模型寫的測試比較漂亮,但小模型寫的版本,我掃得快、改得快、丟回去重跑也快。最後我選的不是最美的答案,而是最省總成本的答案。

實操上,我會開始記這幾個數:第一輪接受率、平均追問次數、人類修改時間、每個完成任務的總成本。只看 inference cost 太狹隘,因為真正貴的是整個流程,不是單次呼叫。

  • 看 first-pass acceptance rate,不要只看模型有沒有回。
  • 看 follow-up prompts 數量,這很誠實。
  • 看 human edit time,因為工程師時間最貴。
  • 看 completed task cost,不要只看單次 token。

當你開始這樣量,模型選擇就不再是信仰問題,而是營運問題。

Agent 需要預算,不只是腦袋

我會把這篇文章真正值得抄的地方,濃縮成一句話:如果你的 agent 能自己呼叫工具、自己繞圈思考、自己反覆嘗試,那它的成本也會跟著失控。這種系統不能只看「會不會做事」,還要看「做事會不會花太多錢」。

我看過很多 agent 在那邊 spinning wheels,查半天、試半天、重做半天,最後答案只好一點點,但費用已經翻過去了。那不是聰明,那是有 UI 的無限帳單。你如果不設 budget,它就會自己長出 budget 破洞。

實操寫法很直接:每個 agent 都要有 spend guardrails。不是只管安全,也要管花費。限制嘗試次數、限制 tool calls、只在低階失敗時升級、當邊際收益不值得時就停。這些規則看起來像在綁手綁腳,但其實是在保護你的產品不變成研究專案。

我特別建議 coding agent 先走兩段式。第一段做 task classification 和 difficulty estimation,第二段才決定 model 與 tool budget。低風險就卡住預算,高影響或低信心才升級。這樣不是很炫,但很有效。

我也喜歡把這件事做得很 boring。因為 boring 的意思通常是:帳單不會突然跳出來嚇你。這點真的很重要。

別讓 ego 決定你該不該升級模型

很多人會過度使用 premium model,不一定是技術判斷,更多時候是 ego。不是說大家愛面子,而是「用最強模型」聽起來比較安心,也比較像有在做事。問題是,你的工作不是去討好 API。你的工作是把事情做完,而且不要把錢燒得太難看。

還有一個很常見的狀況,是團隊把模型名稱當成能力證明。好像只要貼出某個高階模型的名字,整個系統就突然高級了。其實不是。真正有料的是你能不能把任務拆對、把升級條件寫清楚、把不該升級的地方壓住。

實操上,我會把 routing policy 寫得很短,直接放在 code 附近,不要丟到沒人看的簡報裡。規則要能被團隊真的照做:什麼情況用便宜模型、什麼情況才升級、誰可以 override、override 要寫理由。這種東西如果不落地,最後就會變成大家各自用各自喜歡的模型。

我自己比較喜歡把這叫做 model humility。不是說模型很弱,而是說很多工作其實沒必要把最貴的算力拿出來。能用小模型解決,就先用小模型;真的不行,再有意識地升級。

我會怎麼把這套真的做進產品

如果今天要我把這套 triage 做進一個產品,我不會先搞什麼巨型 router service,也不會先寫一個看起來很企業的 policy engine。那種東西很容易變成另一個平台專案,最後大家只是在幫架構本身打工。

我會先做三件事:一個便宜 classifier、一條清楚的 escalation path、一份完整 log。先把 80% 的價值拿到,後面再慢慢調。這樣比較像工程,不像表演。

白話一點就是:

  • 先分類任務。
  • 先用最便宜、但夠用的模型。
  • 失敗、模糊、高風險才升級。
  • 把 cost、retries、human edits 記下來。
  • 每週回頭修 routing 規則。

我看過夠多 AI 系統之後,越來越確定一件事:失敗通常不是「模型太小」,而是「我們根本沒問這題值不值得走昂貴路徑」。那是 routing 問題,不是 intelligence 問題。

而且這件事很好測。你可以直接把一些任務往下路由,再把一些往上路由,比 acceptance rate、latency、spend。便宜路徑守得住就留,守不住就承認它不夠用。至少你學到東西,不是默默燒錢。

可抄的模板

# AI coding tasks 的 model triage policy

## 目標
用最便宜、但足夠完成任務的模型。
只有在任務模糊、風險高、或第一次失敗時才升級。

## 任務分桶

### Bucket 1:低成本機械活
使用最便宜且可接受的模型。
例子:
- 摘要 code / 文件
- 改寫文字
- 抽取欄位
- 格式化 JSON / markdown
- 簡單 code edit

### Bucket 2:中等複雜度工作
先用中階模型。
失敗再升級。
例子:
- 寫 unit tests
- 小型 refactor
- dependency tracing
- tool-assisted lookup
- 單一檔案或模組內的 bug isolation

### Bucket 3:高複雜度或高風險工作
直接用最強模型。
例子:
- 架構決策
- 跨服務 debugging
- 長鏈路 planning
- security-sensitive changes
- 需求不清楚的任務

## Routing 規則

1. 如果 request 明顯是機械活,走 Bucket 1。
2. 如果需要 reasoning 但範圍有限,走 Bucket 2。
3. 如果 request 模糊、面向使用者、或做錯代價很高,走 Bucket 3。
4. 如果 Bucket 1 失敗兩次,升到 Bucket 2。
5. 如果 Bucket 2 失敗兩次,或任務仍然模糊,升到 Bucket 3。
6. 如果還是不清楚,先問 clarifying question,不要硬猜。

## 成本 guardrails

- 最多 2 次 retry 才能升級
- 每個任務最多 3 次 tool calls
- 每個 bucket 設 token budget
- 如果下一次嘗試的改善機率很低,就停

## 要記錄的 metrics

- 使用哪個 model
- 任務屬於哪個 bucket
- retry 次數
- tool call 次數
- human edit time
- first-pass acceptance rate
- 每個完成任務的總成本

## 每週 review 問題

- 哪些任務其實被過度路由到昂貴模型?
- 哪些便宜模型任務其實需要太多修補?
- escalation 有沒有發生在對的地方?
- 我們是不是在 routine work 上付 premium rates?
- 哪些 routing 規則該收緊?

## 簡單 implementation sketch

text
if task.is_mechanical():
    model = cheap_model
elif task.is_bounded_reasoning():
    model = mid_model
elif task.is_ambiguous() or task.is_high_risk():
    model = premium_model

result = run_model(model, task)

if result.failed and retries < 2:
    escalate_one_level()


## 團隊規則
如果你 override router,請寫下理由。

## 成功定義
在不降低 first-pass usefulness、也不增加 human cleanup time 的前提下,把總成本壓下來。

這份模板故意寫得很平,因為你真的不需要什麼華麗系統。你需要的是一套規則,能阻止 AI spend 每次都在有人說「直接上最強模型」時偷偷往上漂。

原始來源是 The New Stack 這篇文章。上面對 routing、分桶、guardrails 的整理是我自己的拆解與改寫,不是原文照抄。