精華筆記

· @aihub.tw

Claude API 開發實戰

模型與計價:選對模型省十倍

模型與計價:選對模型省十倍

一支剛接好的 Claude 程式,用 claude-opus-4-8 跑了一週,帳單出來是預期的十五倍。這不是虛構的故事——這是我見過最多次的新手坑。問題不在 Opus 不好,而在於「最強的模型」根本不是每個情境都需要的東西。

選模型就像選交通工具:同樣是台北市區一段路,你可以叫計程車、搭捷運,也可以叫直升機。直升機沒有壞,只是你去便利商店買罐飲料不需要它。Claude 的模型家族也是同樣邏輯——你需要的是「剛好夠用」,不是「最貴的」。

這堂課適合誰 適合:已經能用 Claude API 發出第一支請求的開發者(本課程屬工程師專區)。需要基礎:Python 或 JavaScript 基礎,看得懂 JSON 格式的 API 回傳。前置課:第 1 課「第一支程式:呼叫 Claude API」。

這堂學什麼

  • 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 ≈ 11.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`);

Token 費用計算流程

實際跑一次「用三句話解釋 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——輸出反而更貴。

這告訴我們兩個實作習慣:

  1. 明確要求輸出格式,減少廢話:在 prompt 裡說「請用一句話回答」、「只回 JSON,不要解釋」。在 Opus 4.8 上,每減少 100 個輸出 token 就省 $0.0025。一天一萬次請求累積下來是 $25。
  2. 大量輸入不可怕,大量輸出才貴:把完整背景資料放進輸入、換取精簡的輸出,通常比多輪對話反覆追問更便宜。

各模型 Input vs Output 定價比對

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

模型選擇決策流程圖

任務類型 建議模型 理由
分類、打標籤、情感分析 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_inputtotal_output 寫進資料庫或日誌檔。

在 Anthropic Console 設定月用量上限

程式算出成本是事後統計,事前設上限才能防爆帳。Console 有兩個地方要設:

  1. 登入 console.anthropic.com → 左側選單「Settings」→「Limits」
  2. Monthly spend limit:設你這個月能接受的最高費用,例如 $20
  3. 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——省了一半,品質完全一樣。

Batch API vs 即時 API 成本與時間對比

常見坑

坑 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. 把第 1 課寫的程式複製出來,把 model 分別換成 claude-haiku-4-5claude-sonnet-4-6claude-opus-4-8,送同一個 prompt,印出各自的 usage.input_tokensusage.output_tokens 和估算費用。觀察輸出品質的差異是否值得價格差距。
  2. 在 Anthropic Console 設定月用量上限(新手建議從 $5~$10 開始),並在你的程式裡加上 APIStatusError 的例外處理,遇到 529 要印出有意義的提示訊息。
  3. 實作一個 CostTracker 類別(可以直接複製本課範例),在你的測試流程裡累積追蹤 token 用量,最後 print(tracker.report()) 看一下跑一批請求的實際費用。
  4. 選做:把步驟 2 的 Batch API 範例跑起來,送 5 筆以上的批次請求,用 client.messages.batches.retrieve(batch.id) 輪詢狀態,等到 processing_status 變成 ended 後把結果印出來。

下一課預告

你現在會選模型、會看費用、會設上限——API 使用的成本意識已經建好了。但目前你的 Claude 程式每次對話都是一個失憶的陌生人,第一輪說過的事下一輪它完全不記得;而且你沒有辦法告訴它「你是誰、你的規矩是什麼」。

第 3 課教你兩件事:用 System Prompt 給 Claude 一個固定的身分與行為規範,以及用多輪對話結構讓它記住完整的對話脈絡——這是從「會呼叫 API」跨到「做出真正產品」的關鍵一步。

#Claude API#模型選擇#計價#Token#成本控制

← 回所有文章