模型與計價:選對模型省十倍
一支剛接好的 Claude 程式,用 claude-opus-4-8 跑了一週,帳單出來是預期的十五倍。這不是虛構的故事——這是我見過最多次的新手坑。問題不在 Opus 不好,而在於「最強的模型」根本不是每個情境都需要的東西。
選模型就像選交通工具:同樣是台北市區一段路,你可以叫計程車、搭捷運,也可以叫直升機。直升機沒有壞,只是你去便利商店買罐飲料不需要它。Claude 的模型家族也是同樣邏輯——你需要的是「剛好夠用」,不是「最貴的」。
這堂學什麼
- Claude 模型家族全景:Haiku 4.5、Sonnet 4.6、Opus 4.8、Fable 5 的能力/速度/價格對照表
- Token 是什麼,怎麼用 API 回傳的
usage欄位算出每次請求的真實費用 - Input 與 Output token 的價差為什麼重要,以及怎麼靠「少說廢話」省錢
- 什麼任務選什麼模型的決策表,附一套從中間往兩端試的判斷原則
- Prompt Caching 與 Batch API 的折扣原理,以及在 Console 設定月用量上限
觀念一:模型家族全景
截至 2026 年 7 月,Anthropic Claude API 的主力模型分四個等級。以下是直接從官方文件查證的定價(全部都是美元,MTok = 一百萬 token):

| 模型 | API ID | 語境視窗 | 最大輸出 | 輸入 $/MTok | 輸出 $/MTok |
|---|---|---|---|---|---|
| Claude Haiku 4.5 | claude-haiku-4-5 |
200K | 64K | $1 | $5 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 |
1M | 64K | $3 | $15 |
| Claude Opus 4.8 | claude-opus-4-8 |
1M | 128K | $5 | $25 |
| Claude Fable 5 | claude-fable-5 |
1M | 128K | $10 | $50 |
四個等級的定位一句話:
- Haiku 4.5:最快、最便宜,適合高量、低複雜度任務——分類、標籤、情感判斷、路由。200K 語境視窗對大多數場景已綽綽有餘。
- Sonnet 4.6:日常生產環境的主力,智能與成本的黃金平衡點。速度快、語感好,是絕大多數應用的預設推薦。
- Opus 4.8:需要深度推理、多步驟規劃、複雜程式架構設計時才上。比 Sonnet 4.6 貴約 1.7 倍,但對應場景的能力差距是真實存在的。
- Fable 5:常時開啟 Adaptive Thinking,1M token 語境視窗,最大輸出 128K,是目前最強的通用模型。適合超長文件分析、極複雜代理任務。
語境視窗是「單次請求能放入的 token 上限」。Haiku 4.5 的 200K 大約能裝下 15 萬個中文字。Opus/Sonnet/Fable 的 1M 約等於一部百萬字小說。注意:Opus 4.7 以後的模型換了 tokenizer,同樣的文字最多會產生約 35% 更多 token,算成本時要考慮進去。
觀念二:Token 是什麼,怎麼算費用
Token 是模型處理文字的基本單位。它不等於字,也不等於詞,但有幾個實用的估算比例:
- 英文:1 token ≈ 0.75 個單字(100 個英文字 ≈ 133 tokens)
- 中文:1 token ≈ 1
1.5 個中文字(100 個中文字 ≈ 65100 tokens) - 程式碼:視語言而定,Python 大約 1 token ≈ 3~4 個字元
估算是一回事,最精準的方法是看 API 回傳的 usage 欄位——它直接告訴你這次請求消耗了幾個輸入 token、幾個輸出 token:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "用三句話解釋什麼是 JWT"}],
)
# usage 欄位直接拿
usage = response.usage
print(f"輸入 token: {usage.input_tokens}")
print(f"輸出 token: {usage.output_tokens}")
# 用 Sonnet 4.6 定價計算費用(美元)
# 輸入 $3/MTok、輸出 $15/MTok
input_cost = usage.input_tokens / 1_000_000 * 3.0
output_cost = usage.output_tokens / 1_000_000 * 15.0
print(f"本次費用:${input_cost + output_cost:.6f} USD")
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [{ role: "user", content: "用三句話解釋什麼是 JWT" }],
});
const { input_tokens, output_tokens } = response.usage;
// Sonnet 4.6 定價:輸入 $3/MTok、輸出 $15/MTok
const cost = (input_tokens / 1e6) * 3.0 + (output_tokens / 1e6) * 15.0;
console.log(`輸入 ${input_tokens} / 輸出 ${output_tokens} tokens`);
console.log(`本次費用:$${cost.toFixed(6)} USD`);

實際跑一次「用三句話解釋 JWT」大概花多少?以 Sonnet 4.6 算,輸入約 30 tokens($0.00009),輸出約 80 tokens($0.0012),一次約 $0.0013。但如果你每天跑 10 萬次這樣的請求(每月 300 萬次),用 Opus 4.8 就是約 $6,450/月,換成 Haiku 4.5 只要約 $1,290/月——同一份工作,差了五倍。選對模型就是最大的省錢。
觀念三:Input vs Output 的價差——輸出比你想的貴
定價表裡有個關鍵細節:輸出 token 的單價是輸入的 5 倍。
以 Sonnet 4.6 為例:輸入 $3/MTok,輸出 $15/MTok。你把一段 2,000 字的文件(≈1,333 tokens)丟進去,要求生成一篇 500 字摘要(≈333 tokens)。輸入 tokens 是輸出的四倍,費用卻是輸入 $0.004、輸出 $0.005——輸出反而更貴。
這告訴我們兩個實作習慣:
- 明確要求輸出格式,減少廢話:在 prompt 裡說「請用一句話回答」、「只回 JSON,不要解釋」。在 Opus 4.8 上,每減少 100 個輸出 token 就省 $0.0025。一天一萬次請求累積下來是 $25。
- 大量輸入不可怕,大量輸出才貴:把完整背景資料放進輸入、換取精簡的輸出,通常比多輪對話反覆追問更便宜。

觀念四:決策表——什麼任務選什麼模型

| 任務類型 | 建議模型 | 理由 |
|---|---|---|
| 分類、打標籤、情感分析 | Haiku 4.5 | 模式識別不需深度推理,量大省錢 |
| 短到中篇摘要 | Haiku 4.5 / Sonnet 4.6 | 依品質要求選擇,先試 Haiku |
| 客服自動回覆 | Sonnet 4.6 | 語感夠好、速度快,CP 值高 |
| 程式碼生成(中小型功能) | Sonnet 4.6 | 程式任務 CP 值最高的選擇 |
| 複雜多步驟推理 | Opus 4.8 | 邏輯鏈長、容錯率低的場合 |
| 法律/醫療文件精讀 | Opus 4.8 | 精準度優先,不能出錯 |
| 超長文件(>100K tokens) | Fable 5 | 1M 語境 + Adaptive Thinking |
| 大量非即時批次任務 | 任意 + Batch API | 所有模型都打五折,見下節 |
實用判斷原則:從中間往兩端試。 先用 Sonnet 4.6 試出你要的效果。品質夠了,降到 Haiku 4.5 看能否接受。Haiku 做不到才回 Sonnet。Sonnet 真的力不從心才升 Opus。永遠不要一開始就上 Opus——Opus 的定位是兜底,不是預設。
手把手實戰
把模型 ID 抽成常數,集中管理
第一個習慣建立起來:不要把模型 ID 字串散落在程式各處。API 的模型 ID 是固定 snapshot,但每隔幾個月你可能要升版——集中管理才不用全專案搜尋替換。
# models.py
# 2026-07 查證版本,需要升級時只改這一檔
HAIKU = "claude-haiku-4-5"
SONNET = "claude-sonnet-4-6"
OPUS = "claude-opus-4-8"
FABLE = "claude-fable-5"
# 依任務類型選模型的工具函式
def pick_model(task: str) -> str:
routing = {
"classify": HAIKU,
"summarize": SONNET,
"code_review": SONNET,
"legal_analysis": OPUS,
}
return routing.get(task, SONNET) # 不認識的任務預設 Sonnet
# 使用方式
# from models import pick_model
# model = pick_model("classify") # => "claude-haiku-4-5"
// models.js
export const HAIKU = "claude-haiku-4-5";
export const SONNET = "claude-sonnet-4-6";
export const OPUS = "claude-opus-4-8";
export const FABLE = "claude-fable-5";
export function pickModel(task) {
const routing = {
classify: HAIKU,
summarize: SONNET,
code_review: SONNET,
legal_analysis: OPUS,
};
return routing[task] ?? SONNET; // 不認識的任務預設 Sonnet
}
讀 usage 欄位,建一個費用累積計算器
把每次請求的 token 用量記起來,才能知道一天或一週的真實花費。以下是一個可以直接複製進專案的 CostTracker:
import anthropic
from dataclasses import dataclass
@dataclass
class CostTracker:
"""累積多次 API 請求的 token 用量並計算費用。"""
# 預設用 Sonnet 4.6 費率(更改模型時記得同步更新)
input_price_per_mtok: float = 3.0 # $3/MTok
output_price_per_mtok: float = 15.0 # $15/MTok
total_input: int = 0
total_output: int = 0
def record(self, usage: anthropic.types.Usage) -> None:
self.total_input += usage.input_tokens
self.total_output += usage.output_tokens
@property
def total_cost_usd(self) -> float:
return (
self.total_input / 1_000_000 * self.input_price_per_mtok +
self.total_output / 1_000_000 * self.output_price_per_mtok
)
def report(self) -> str:
return (
f"輸入 {self.total_input:,} tokens | "
f"輸出 {self.total_output:,} tokens | "
f"費用 ${self.total_cost_usd:.4f} USD"
)
# 實際使用範例
client = anthropic.Anthropic()
tracker = CostTracker()
prompts = [
"用一句話解釋 Docker",
"用一句話解釋 Kubernetes",
"用一句話解釋 CI/CD",
]
for prompt in prompts:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[{"role": "user", "content": prompt}],
)
tracker.record(response.usage)
print(tracker.report())
# 輸入 231 tokens | 輸出 147 tokens | 費用 $0.0029 USD
這個追蹤器是單次執行期的記憶體計算,不是持久化存儲。如果你要跨執行期累積,把 total_input 和 total_output 寫進資料庫或日誌檔。
在 Anthropic Console 設定月用量上限
程式算出成本是事後統計,事前設上限才能防爆帳。Console 有兩個地方要設:
- 登入 console.anthropic.com → 左側選單「Settings」→「Limits」
- Monthly spend limit:設你這個月能接受的最高費用,例如 $20
- Notification threshold:設到 80% 時 email 通知,讓你有時間反應
到達支出上限時,API 會回傳 HTTP 403,錯誤型別是 billing_error(別跟 529 搞混——529 是伺服器過載,可重試,跟你的額度無關)。你的程式要能分辨這兩種狀況:
import anthropic
client = anthropic.Anthropic()
try:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
print(response.content[0].text)
except anthropic.RateLimitError as e:
# HTTP 429:超過速率上限(請求頻率太高,短暫等待後重試)
print(f"速率上限,稍後再試:{e}")
except anthropic.PermissionDeniedError as e:
# HTTP 403:用 .type 分辨是額度耗盡(billing_error)還是權限問題
if e.type == "billing_error":
print("本月 API 支出已達上限,請到 Console 調整或等下個月重置。")
else:
raise
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
try {
const response = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello" }],
});
console.log(response.content[0].text);
} catch (err) {
if (err instanceof Anthropic.RateLimitError) {
console.error("速率上限,稍後再試");
} else if (
err instanceof Anthropic.PermissionDeniedError &&
err.type === "billing_error"
) {
console.error("本月 API 支出已達上限");
} else {
throw err;
}
}
Batch API:非即時任務省一半費用
如果你的任務不需要即時回應(例如每晚批次分析一千筆客戶評論、隔夜跑資料標籤),用 Batch API 直接省 50%。各模型批次費率:
| 模型 | 批次輸入 | 批次輸出 |
|---|---|---|
| Haiku 4.5 | $0.50/MTok | $2.50/MTok |
| Sonnet 4.6 | $1.50/MTok | $7.50/MTok |
| Opus 4.8 | $2.50/MTok | $12.50/MTok |
import anthropic
client = anthropic.Anthropic()
# 準備批次請求列表
texts = [
"這個產品真的很棒!下次還會再買。",
"品質很差,完全不值這個價格,不推薦。",
"還可以,沒有特別的感覺。",
]
requests = [
{
"custom_id": f"review-{i}",
"params": {
"model": "claude-haiku-4-5", # 批次任務優先考慮 Haiku
"max_tokens": 32,
"messages": [
{
"role": "user",
"content": (
f"請判斷以下評論的情感,只回答「正面」「負面」或「中立」:\n{text}"
),
}
],
},
}
for i, text in enumerate(texts)
]
# 送出批次,馬上拿到 batch_id
batch = client.messages.batches.create(requests=requests)
print(f"Batch ID: {batch.id}")
print(f"狀態: {batch.processing_status}")
# Batch ID: msgbatch_01xxxxx
# 狀態: in_progress
# 通常 1 小時以內完成,最長 24 小時
結果出來後用 batch_id 輪詢或在 Console 查看。10,000 筆評論(每筆約 50 輸入 + 10 輸出 tokens,合計 0.5 MTok 輸入、0.1 MTok 輸出)用 Haiku 批次費用大約 $0.50;即時 API 則是 $1.00——省了一半,品質完全一樣。

常見坑
坑 1:模型 ID 打錯,收到 404 或 400
anthropic.NotFoundError: 404 {"type":"error","error":{"type":"not_found_error",
"message":"model: claude-opus-4 not found"}}
claude-opus-4 已退役,現在要用 claude-opus-4-8。模型 ID 的命名規則是 claude-{系列}-{大版號}-{小版號},不同世代的後綴不一樣。遇到 404,第一步就是去 platform.claude.com/docs/en/about-claude/models/overview 複製最新 ID。推薦的做法是把 ID 集中寫在一個 models.py / models.js 常數檔(步驟 1),而不是散落在各個呼叫點——升版時只改一個地方。
坑 2:以為 max_tokens 是費用上限
max_tokens 只是輸出長度的天花板,不影響輸入費用。你設了 max_tokens=10,但輸入了一萬 token 的文件,那一萬 token 的輸入費用照算。想控制成本,要同時從兩側下手:輸入端——不要把沒用到的上下文塞進去;輸出端——設合理的 max_tokens 並在 prompt 裡要求精簡輸出。max_tokens 只管「最多輸出多少」,管不了「最多花多少錢」。
坑 3:每次請求都重送一大段 system prompt,不知道在燒錢
假設你有一個 3,000 token 的 system prompt(詳細的角色設定、業務規則),每次對話都完整帶上。一天 1,000 次對話,光 system prompt 就是 3M 輸入 token——用 Sonnet 4.6 是 $9。但啟用 Prompt Caching 之後:第一次寫入快取費用是標準輸入價的 1.25 倍,之後每次命中快取只要標準輸入價的 10%(省 90%)。快取有效期 5 分鐘或 1 小時可選。同樣 3M tokens:標準費 $9,快取命中費 $0.90——省了 90%。完整實作留到第 7 課,這堂課先知道這個機制存在,以及它的折扣有多誇張。
坑 4:Batch API 誤以為可以即時拿到結果
Batch API 是非同步的——你送出請求,API 給你一個 batch_id,結果最長 24 小時後才完整回來(通常不到 1 小時,但沒有保證)。如果你在需要即時回應的場景(例如網頁 UI 的聊天框)用 Batch API,用戶會等到天荒地老。Batch 只適合排程/離線作業:定時批次分析、隔夜跑資料處理、不需要即時結果的大量任務。判斷原則:用戶在等,就用同步 API;沒有人在等,就考慮 Batch。
坑 5:把費率寫死在程式各處,官方調價或換模型後全部算錯
Anthropic 的定價與 tokenizer 都會隨模型世代調整——例如 Opus 4.7 之後換了 tokenizer,同一段文字會被切成更多 token,等於實質變貴;不同模型之間單價又差好幾倍。如果你的 CostTracker 或估算邏輯把費率硬編碼(hardcode)在十幾個檔案裡,哪天官方調價、或你把某條 pipeline 從 Sonnet 4.6 換成 Haiku 4.5,算出來的成本就會全錯,而且得一個一個檔案改。把費率集中成設定檔或環境變數,只改一個地方:
import os
# 費率從環境變數讀取,預設 Sonnet 4.6 標準價($3 / $15)
SONNET_INPUT_PRICE = float(os.getenv("SONNET_INPUT_PRICE", "3.0"))
SONNET_OUTPUT_PRICE = float(os.getenv("SONNET_OUTPUT_PRICE", "15.0"))
作業
- 把第 1 課寫的程式複製出來,把
model分別換成claude-haiku-4-5、claude-sonnet-4-6、claude-opus-4-8,送同一個 prompt,印出各自的usage.input_tokens、usage.output_tokens和估算費用。觀察輸出品質的差異是否值得價格差距。 - 在 Anthropic Console 設定月用量上限(新手建議從 $5~$10 開始),並在你的程式裡加上
APIStatusError的例外處理,遇到 529 要印出有意義的提示訊息。 - 實作一個
CostTracker類別(可以直接複製本課範例),在你的測試流程裡累積追蹤 token 用量,最後print(tracker.report())看一下跑一批請求的實際費用。 - 選做:把步驟 2 的 Batch API 範例跑起來,送 5 筆以上的批次請求,用
client.messages.batches.retrieve(batch.id)輪詢狀態,等到processing_status變成ended後把結果印出來。
下一課預告
你現在會選模型、會看費用、會設上限——API 使用的成本意識已經建好了。但目前你的 Claude 程式每次對話都是一個失憶的陌生人,第一輪說過的事下一輪它完全不記得;而且你沒有辦法告訴它「你是誰、你的規矩是什麼」。
第 3 課教你兩件事:用 System Prompt 給 Claude 一個固定的身分與行為規範,以及用多輪對話結構讓它記住完整的對話脈絡——這是從「會呼叫 API」跨到「做出真正產品」的關鍵一步。