如果有任何問題或建議,歡迎隨時聯繫我:
Day 9 講的快取,省錢的前提是「內容重複」。今天要講的 Batch API,省錢的邏輯完全不同——它不管你的內容重不重複,只問你一件事:這個任務,你願不願意晚一點拿到結果?
如果答案是「可以晚一點」,Batch API 直接把 input 和 output 通通打五折。不用重複內容、不用調整 prompt 結構,單純用「非即時」換「五折」。
這篇適合誰?如果你曾經需要一次處理成千上萬筆資料——幫一批客服工單分類、幫一堆文件產生摘要、跑大規模的模型評測——今天這篇就是為你寫的。如果你只是偶爾問幾個問題,這篇可以先收藏,等你真的有批量需求時再回來查。
本篇規格、折扣比例、限制條件,均於 2026 年 8 月對照 Batch processing 官方文件 查證。
| 天數 | 主題 | 描述 |
|---|---|---|
| Day 1 | Claude 模型怎麼選?2026 最新四階模型完整比較 | Fable 5 / Opus 5 / Sonnet 5 / Haiku 4.5 的定位、規格與適用場景 |
| Day 2 | Claude 的計價邏輯:搞懂 input / output 為什麼差 5 倍 | 不背數字,理解計價結構,建立可長期沿用的成本直覺 |
| Day 3 | 不知道用哪個模型?官方建議「從 Opus 5 開始」背後的思維 | 為什麼預設起手不是最便宜、也不是最強的那個 |
| Day 4 | Claude Haiku 4.5 適合做什麼?便宜模型的正確用法 | 便宜模型不是次等品,是專用工具 |
| Day 5 | Claude context window 是什麼?1M token 到底能塞多少東西 | 用實際檔案量換算,破除「塞越多越好」的迷思 |
| Day 6 | Claude 模型選擇決策表:一張圖判斷你該用哪一個 | 把前五天濃縮成一張可以貼在螢幕旁的決策流程 |
| Day 7 | Token 是什麼?為什麼你的 Claude 帳單比想像中貴 | 從 tokenizer 原理理解中文為什麼特別燒錢 |
| Day 8 | Claude 省 token 的 5 個實用技巧(一般使用者也適用) | 不寫程式也能立刻套用的五個習慣 |
| Day 9 | Prompt Caching 是什麼?讓重複內容只算 10% 費用 | 快取寫入與命中的計價邏輯,以及什麼時候會虧 |
| Day 10 | Claude Batch API 教學:非即時任務直接省一半費用 | 用時間換金錢,非同步任務的正確打開方式 |
| Day 11 | 新世代 tokenizer:同樣的中文為什麼變貴了 | Claude 4.7 世代換了 tokenizer,這對中文使用者的實際影響 |
| Day 12 | 對話越長越燒錢?Claude 長對話的成本陷阱與解法 | 每一輪都重算全部歷史——以及三種切斷成本累積的做法 |
| Day 13 | Claude 用量怎麼監控?成本失控前的預警機制 | 從 usage 欄位到 Console 儀表板,把帳單變成可觀測系統 |
| Day 14 | Claude effort 參數是什麼?五個檔位該怎麼設 | low / medium / high / xhigh / max 的取捨與實測建議 |
| Day 15 | Adaptive Thinking 是什麼?為什麼你不用再寫「think step by step」 | 模型自己決定何時思考,舊 prompt 技巧為何失效 |
| Day 16 | Claude 回答變淺了?檢查這兩個隱藏設定 | 排查思路:先看 effort,再看 thinking 設定 |
| Day 17 | Claude Prompt 寫法教學:官方最佳實踐的骨架 | 一個可以套用在 90% 情境的 prompt 結構 |
| Day 18 | 用 XML 標籤讓 Claude 輸出更穩定(結構化輸出教學) | 為什麼 Claude 特別吃 XML,以及怎麼設計標籤 |
| Day 19 | System Prompt 怎麼寫?角色設定的正確姿勢 | system 與 user 的分工,以及「你是一位專家」為什麼沒用 |
| Day 20 | Claude 幻覺怎麼防?降低錯誤輸出的實用做法 | 引用來源、允許說不知道、把驗證寫進流程 |
| Day 21 | Claude Code 是什麼?安裝與第一次使用完整教學 | 從安裝到跑完第一個任務,含常見卡關點 |
| Day 22 | Claude Code 省 token 設定:別讓它讀完整個專案 | CLAUDE.md、忽略規則與 context 控制的實戰配置 |
| Day 23 | MCP 是什麼?把外部工具接進 Claude 的原理與實作 | Model Context Protocol 的設計哲學與一個可跑的範例 |
| Day 24 | 前端如何呼叫 Claude API?Messages 端點入門 | 第一支 API 請求,以及為什麼不該在瀏覽器直接呼叫 |
| Day 25 | Claude 串流輸出(Streaming):打造即時回應體驗 | SSE 事件流解析與前端逐字渲染 |
| Day 26 | Claude API 錯誤處理與重試:正式環境該注意什麼 | 429 / 529 的正確退避策略與冪等性設計 |
| Day 27 | 模型分流(Model Routing)是什麼?別再一支模型用到底 | 依任務難度動態選模型的判斷邏輯 |
| Day 28 | LLM 成本優化架構:小模型前置分流 + 大模型收尾 | 一套可落地的分層架構與失敗處理 |
| Day 29 | Vibecoding 做出網站之後:AI 不會主動告訴你的那些事 | 門檻降低的是「做出來」,不是「做對」——怎麼問出你不知道要問的問題 |
| Day 30 | Claude 使用總整理:模型、成本、設定一次看懂 | 全系列濃縮成一份可以收藏的速查表 |
Batch API 的流程跟平常呼叫 Messages API 完全不同,它是三個步驟:
custom_id。processing_status 變成 ended,就能下載結果。from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request
client = anthropic.Anthropic()
message_batch = client.messages.batches.create(
requests=[
Request(
custom_id="ticket-001",
params=MessageCreateParamsNonStreaming(
model="claude-haiku-4-5-20251001",
max_tokens=200,
messages=[{"role": "user", "content": "將這則客服工單分類:..."}],
),
),
Request(
custom_id="ticket-002",
params=MessageCreateParamsNonStreaming(
model="claude-haiku-4-5-20251001",
max_tokens=200,
messages=[{"role": "user", "content": "將這則客服工單分類:..."}],
),
),
]
)
批次的規模上限:單一批次最多 100,000 筆請求或 256 MB,先達到哪個上限就以哪個為準。
官方明講:系統會盡快處理批次,多數批次在 1 小時內完成。 你可以在「所有請求都處理完」或「送出後滿 24 小時」這兩個條件中,先到者取得結果。
批次如果在 24 小時內沒處理完,會直接過期——過期的請求不會被處理,也不會被收費。除了過期,還有「使用者取消」的情況,取消前已處理的部分仍會保留結果,未處理的部分不收費。
結果保存期限是 建立後 29 天。過了這個期限,批次本身還查得到,但結果檔案就沒辦法下載了——如果你有留存需求,記得在這個時間窗內把結果搬到自己的儲存空間。
批次的折扣很單純——不管 input 還是 output,一律是標準單價的一半:
| 模型 | 批次 Input | 批次 Output |
|---|---|---|
| Claude Opus 5 | $2.50 / MTok | $12.50 / MTok |
| Claude Sonnet 5 | $1 / MTok | $5 / MTok |
| Claude Haiku 4.5 | $0.50 / MTok | $2.50 / MTok |
(原價分別是 Opus 5 的 $5/$25、Sonnet 5 的 $2/$10、Haiku 4.5 的 $1/$5——五折之後正好是一半,換算方式跟 Day 2 的基準價一致。以上批次價格於 2026 年 8 月查證。)
更值得注意的是:Batch API 支援 Prompt Caching,而且兩種折扣可以疊加。 也就是說,同一段被快取命中的內容,先套用快取的 0.1 倍價,再套用批次的 5 折——理論上能壓到極低的成本。但要留意,因為批次請求是非同步、並行處理,快取命中屬於「盡力而為」,官方觀察到的命中率區間是 30% 到 98%,取決於你的流量模式。
想拉高批次情境下的快取命中率,官方給了三個建議:
cache_control 結構——哪怕內容一樣,結構不一致也會找不到匹配。批次幾乎支援所有 Messages API 的功能——視覺輸入、工具使用(含 web search、code execution 等伺服器工具)、多輪對話、extended thinking,大部分 beta 功能都可以用。但有幾個參數會直接觸發驗證錯誤:
| 參數 | 為什麼不支援 |
|---|---|
stream: true |
批次結果是一整份檔案,不是即時串流 |
speed(Fast mode) |
Fast mode 針對同步請求的延遲做優化,跟非同步批次無關 |
store / previous_thread_event_id(Threads) |
Threads 是有狀態的,批次請求沒有狀態 |
max_tokens: 0(快取預熱) |
批次處理時間可能超過快取的存活時間,預熱了也可能白做 |
實務上的建議:先用一般的 Messages API 把單筆請求的格式驗證過,確定沒問題,再把同樣的結構包進批次。 批次的驗證是非同步的,如果格式錯了,你得等整批處理結束才會看到錯誤訊息——先驗證單筆,能省下大量除錯時間。
❌ Before:一筆一筆即時呼叫,卡在 rate limit 也卡在錢
results = []
for ticket in all_tickets: # 一萬筆工單
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=200,
messages=[{"role": "user", "content": f"分類這則工單:{ticket}"}],
)
results.append(response)
# 一萬次即時呼叫,逐一排隊,還要處理 rate limit 重試
✅ After:包成一個批次,五折處理,不用管 rate limit 節奏
requests = [
Request(
custom_id=f"ticket-{i}",
params=MessageCreateParamsNonStreaming(
model="claude-haiku-4-5-20251001",
max_tokens=200,
messages=[{"role": "user", "content": f"分類這則工單:{ticket}"}],
),
)
for i, ticket in enumerate(all_tickets)
]
batch = client.messages.batches.create(requests=requests)
# 之後輪詢 batch.processing_status,等 "ended" 再拿結果
這正是官方文件本身用來說明計價的情境:一萬筆客服工單、平均每則對話約 3,700 token、用 Haiku 4.5 處理,即時價大約 37 美元——換成批次,同樣的工作直接砍半,而且不用擔心一萬次連續呼叫撞上 rate limit。
這裡的取捨很清楚:你换到的是省一半的錢和更高的吞吐量,付出的代價是「不能馬上拿到結果」。 如果這是客服系統即時要回覆使用者的工單分類,Batch API 就不適合;但如果是每天跑一次的批次分類作業,這正是它的主場。
批次不是所有場景的答案,官方文件本身也點出了幾個限制值得先知道:
① 批次是 Workspace 層級的。 你只能看到「你的 API key 所屬 Workspace」建立的批次與結果——如果你的組織有多個 Workspace,批次不會跨 Workspace 共享,規劃時要記得這一點。
② 高吞吐量可能小幅超出你設定的 Workspace 費用上限。 因為批次處理是高並行的,官方明講「可能會稍微超出你 Workspace 設定的費用限制」——如果你的費用控管很嚴格,這是需要納入緩衝的細節,不要把費用上限設在剛剛好的邊界上。
③ 需要即時互動的場景完全不適用。 這聽起來像廢話,但實務上容易在灰色地帶誤判——例如「使用者送出表單後,系統在背景處理,晚一點用 email 通知結果」這種場景,看起來可以接受延遲,但如果使用者期待的是「幾秒鐘內」而不是「一小時內」,批次的時效仍然不夠快,這時候該用的是即時呼叫加上 Day 9 的快取,而不是批次。
一個簡單的判斷句:如果你會因為「結果晚一小時才出來」而需要另外設計一套通知機制,那通常就適合批次;如果晚一小時會讓使用者卡在畫面前不知道發生什麼事,那就不適合。
custom_id 對應,不要依賴順序批次結果是 .jsonl 格式,每一行對應一筆請求的結果。官方特別提醒:結果的回傳順序不保證跟你送出的順序一致,一定要用你自己設定的 custom_id 去比對,不要假設第一筆結果對應第一筆請求。
結果分四種類型:
| 類型 | 說明 | 是否收費 |
|---|---|---|
succeeded |
成功產生訊息 | 是 |
errored |
請求本身有誤(例如格式錯誤)或伺服器錯誤 | 否 |
canceled |
使用者在處理前取消 | 否 |
expired |
24 小時內沒處理完 | 否 |
只有真正成功的請求才會被收費——這代表你不用擔心格式寫錯了還要付冤枉錢,但也代表你需要自己檢查 request_counts,確認有多少筆真的成功,而不是假設送出去的一定全部處理完。
拿 Day 9 提過的那個官方情境延伸:一萬筆客服工單、平均每則對話約 3,700 token、用 Haiku 4.5 處理,即時價(標準單價)大約 37 美元。
把同樣的工作換算成三種處理方式,感受一下數量級的差異:
| 處理方式 | 相對成本 | 取捨 |
|---|---|---|
| 即時呼叫,無快取 | 基準(約 37 美元) | 立即拿到結果,但要處理一萬次連續呼叫的 rate limit |
| 批次處理(5 折) | 約一半 | 多數 1 小時內完成,最長等 24 小時 |
| 批次 + 快取(假設共用規則部分命中率 80%) | 明顯低於一半 | 需要設計成每筆請求共用相同的 cache_control 結構 |
這三種選項不是互斥的,而是同一個任務的三種配置。決定用哪一種,回到本篇一直在強調的那個判斷句:你能不能接受晚一點拿到結果。 能,就往批次的方向靠;不能,那就用即時呼叫搭配 Day 9 的快取策略,把「重複的部分」的成本壓低。
今日挑戰:盤點你目前的 Claude 使用情境裡,有沒有「其實不需要馬上拿到結果」的重複性任務——批次打標籤、批次摘要、批次翻譯都算。如果有,估算一下把它改成 Batch API 之後,五折能省下多少錢,值不值得為此重構一次流程。
反思:Batch API 的核心取捨是「用等待時間換金錢」。你的團隊裡,有哪些任務其實一直被當成「即時任務」在做,但仔細想想根本不需要即時?為什麼會養成「什麼都要馬上跑」的習慣——是真的有時效需求,還是單純圖方便沒去想過?
Batch API 的邏輯跟 Prompt Caching 完全不同軸線:快取靠「內容重複」省錢,批次靠「時間換金錢」省錢——兩者可以疊加,而且疊加時官方觀察到的快取命中率可以到 98%。
三個最重要的數字:五折(input 和 output 一致)、多數 1 小時內完成、最長 24 小時、結果保留 29 天。加上一個容易被忽略的細節:失敗、取消、過期的請求都不收費,你只為真正處理成功的部分付錢。
如果你的工作是大量、重複、不需要即時回應的任務,今天這篇就是那個「原來我一直在多付錢」的答案。
本日關鍵字回顧
custom_id:批次結果比對用的識別碼,結果回傳順序不保證與送出順序一致。errored、canceled、expired 均不計費,只有 succeeded 才收費。明天回到 Day 7 沒講完的伏筆——Claude 4.7 世代換了新的 tokenizer,同樣的中文內容,token 數變多了。這對已經在營運中的系統,實際衝擊有多大?
Day 11,新世代 tokenizer 對中文使用者的真實影響。