如果有任何問題或建議,歡迎隨時聯繫我:
Day 2 埋了一個數字:快取命中只算 0.1 倍 input 價,是四種計價光譜裡最便宜的一格。Day 8 又埋了一個直覺:把「穩定不變的內容」跟「每次都變的內容」分開放。
今天把這兩件事合起來,講完整的 Prompt Caching。
先講一個容易誤解的地方:很多人以為快取是「Claude 記得我們聊過什麼」,像人腦的記憶一樣。不是。 快取是一個更機械、更純粹計價層面的機制——它讓你不用為「同一段已經送過的內容」重新付全額,僅此而已。它不會讓 Claude 更懂你,也不會跨對話保留記憶。搞懂這個邊界,你才知道快取解決的是什麼問題、不解決什麼問題。
本篇規格、倍率與行為細節,對照 Prompt caching 官方文件 查證。
| 天數 | 主題 | 描述 |
|---|---|---|
| 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 使用總整理:模型、成本、設定一次看懂 | 全系列濃縮成一份可以收藏的速查表 |
官方對快取的核心說明其實很機械:在內容區塊上標記 cache_control,等於寫入一筆快取——「從開頭到這個標記點的內容」的雜湊值。 之後的請求如果前綴(開頭那一段)跟這筆記錄一致,就算命中,用 0.1 倍價讀取;不一致,就得重新寫入。
這代表快取比對的是內容前綴,不是語意、不是主題、更不是「這是同一個使用者」。你昨天問的問題如果今天再問一次但整段文字一字不差,也不會自動命中——除非你把它結構化成會被重複讀取的前綴。
啟用方式有兩種:
自動快取(Automatic caching):在請求最外層放一個 cache_control,系統自動套用到最後一個可快取的區塊,並且隨著多輪對話自動往前推進快取點——每一次新請求都把「上一輪為止」的內容當作可讀取的快取,新增的部分才是新寫入的。
顯式快取斷點(Explicit breakpoints):直接在特定內容區塊上放 cache_control,最多可設 4 個斷點,適合「不同區塊變動頻率不同」的情境——例如工具定義幾乎不變、大段背景資料一天更新一次、使用者訊息每次都不同,這時分開設斷點比整段自動快取更有效率。
兩種方式可以混用,自動快取會佔用 4 個斷點中的一個。
用 Opus 5(input 基準價每百萬 token $5)為例,四種 token 各自的價格:
| 項目 | 相對倍率 | 每百萬 token(Opus 5) |
|---|---|---|
| 一般 input | 1× | $5 |
| 5 分鐘快取寫入 | 1.25× | $6.25 |
| 1 小時快取寫入 | 2× | $10 |
| 快取命中(讀取) | 0.1× | $0.50 |
寫入比一般 input 貴——5 分鐘版本貴 25%,1 小時版本貴一倍。但只要被讀到一次,5 分鐘版本就已經回本(寫入 1.25×,讀取只要 0.1×);1 小時版本則需要被讀到兩次才划算。
TTL(存活時間)的計算方式也值得記住:存活時間是從「寫入或讀取那筆快取的請求開始」算起,不是從回應結束算起。 換句話說,模型生成回應花的時間,也算在這 5 分鐘或 1 小時裡——如果你的請求本身處理得很慢,留給下一次命中的時間窗其實比你想的短。
快取有最小可快取長度的門檻,短於這個長度的內容,就算標了 cache_control 也不會真的被快取——不會報錯,就是安靜地不生效:
| 模型 | 最小可快取 token 數 |
|---|---|
| Opus 5、Fable 5、Mythos 5 | 512 |
| Sonnet 5、Sonnet 4.6、Sonnet 4.5、Opus 4.8 | 1,024 |
| Opus 4.7、Mythos Preview | 2,048 |
| Opus 4.6、Opus 4.5、Haiku 4.5 | 4,096 |
怎麼確認自己是不是真的命中了?看回應的 usage 欄位:
{
"cache_creation_input_tokens": 5120,
"cache_read_input_tokens": 1800,
"input_tokens": 50
}
如果 cache_creation_input_tokens 和 cache_read_input_tokens 都是 0,代表這次請求完全沒有被快取——可能是內容太短,也可能是前綴不一致(下一節講原因)。三個欄位加總,才是這次請求實際的總 input token 數。
快取讀取採向後查找:系統在你設定的斷點位置往回檢查最多 20 個區塊,找是否有先前寫入過的匹配前綴。這代表快取斷點不能離「真正穩定的內容」太遠,否則可能超出查找範圍而找不到。
官方文件裡有個很實用的除錯案例:如果你的 prompt 結構是「五段固定不變的系統資訊(區塊 1-5)+ 一段每次都帶時間戳的請求內容(區塊 6)」,而你把 cache_control 設在區塊 6,那麼查找永遠找不到匹配——因為時間戳每次都不同,區塊 6 本身從來不會重複。正確做法是把斷點往前移到區塊 5,也就是「最後一個跨請求維持不變」的區塊。
會讓快取整段失效的常見動作:
tool_choice → 對話快取失效budget_tokens)→ 對話快取失效特別提醒(呼應 CLAUDE.md 已記錄的重點):改變 output_config.effort 的值,會讓對話快取失效——對工具快取與系統快取的影響則跟 thinking 參數一樣,依模型而定。如果你的應用會動態調整 effort(例如依任務難度切換),要有心理準備:每次切換都可能打掉這一段的快取,Day 14 會再展開 effort 的完整用法。
❌ Before:把常變動的內容跟穩定內容混在一起
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system=f"現在時間:{datetime.now()}\n\n{COMPANY_STYLE_GUIDE}", # 時間戳在最前面,每次都不同
messages=[{"role": "user", "content": user_question}],
)
✅ After:穩定內容在前、標記快取,變動內容放後面
response = client.messages.create(
model="claude-opus-5",
max_tokens=1024,
system=[
{
"type": "text",
"text": COMPANY_STYLE_GUIDE, # 穩定不變的規格書
"cache_control": {"type": "ephemeral"},
},
{
"type": "text",
"text": f"現在時間:{datetime.now()}", # 每次都變的部分,放在快取斷點之後
},
],
messages=[{"role": "user", "content": user_question}],
)
Before 版本把時間戳放在最前面,等於每一次請求的前綴都不一樣——快取永遠找不到匹配,
cache_control標了等於白標。After 版本只做一件事:把會變的東西挪到快取斷點後面。這正是 Day 8 技巧五那句話的完整版本:「把穩定不變的內容跟每次都變的內容分開放」。如果你的規格書本身超過 512 tokens(多數公司風格指南、產品文件都輕鬆超過),這個改動能讓第二次以後的每一次呼叫,那一大段固定內容只算 0.1 倍價錢。
快取不只用在即時請求上。Message Batches API(Day 10 主題)也支援 prompt caching,而且快取折扣可以跟批次的 5 折疊加。差別在於批次請求是非同步、並行處理的,快取命中屬於「盡力而為」,命中率官方觀察值落在 30% 到 98% 之間,取決於你的流量模式——這也是為什麼想在批次情境用好快取,得讓多筆請求共用完全相同的 cache_control 結構,並維持穩定的送出節奏。
看到這裡你可能想問:上面全部都在講 cache_control 這個參數,那我平常是在終端機裡用 Claude Code、或在編輯器裡叫它改程式碼,我有辦法用到快取嗎?
有,而且方式跟前面完全相反——你不用標,但你會不小心打斷它。
官方講得很明確:Claude Code 自動幫你處理快取,你不需要(也沒辦法)手動標記斷點。它每一輪都把「系統提示 → 專案脈絡 → 對話歷史」照這個順序排好,讓最不常變動的東西排在最前面,新內容永遠往後面接——這正是第一節講的前綴匹配原理,只是有人幫你排好了。
所以你能做的不是「設定快取」,是別在任務進行到一半時去動那些會重算前綴的東西。官方文件有一句話可以直接當結論:
"Pick your model and effort level at the top of a session, then save
/compactfor natural breaks between tasks. The fewer changes you make mid-task, the higher your cache hit rate."(開場就把模型和 effort 選定,把
/compact留到任務之間的自然段落。你在任務中途做的改動越少,快取命中率越高。)
具體來說:
| 會打斷快取(下一輪變慢也變貴) | 不會打斷(可以放心做) |
|---|---|
用 /model 換模型(每個模型有各自的快取) |
編輯你 repo 裡的檔案 |
用 /effort 改檔位 |
切換權限模式(Shift+Tab) |
| 開啟 fast mode | 呼叫 skill 或 slash command |
| 接上或斷開 MCP server | /recap |
| 啟用/停用 plugin | /rewind |
/compact 壓縮對話 |
開 subagent |
兩個值得單獨記住的細節:
① 想放棄一段走錯的路時,/rewind 比 /compact 便宜。 因為 rewind 是把對話截斷回到之前的某一輪,而那個前綴早就被快取過了,直接命中;/compact 則是生一份新摘要,等於建立一個全新的前綴,得從頭寫入。官方原文:「Rewinding truncates back to a prefix that is already cached, rather than building a new one as compaction does.」
② 快取的範圍是「同一台機器 + 同一個目錄」。 兩個不同目錄開的 session 不會共用彼此的快取——包含同一個 repo 的不同 git worktree,因為系統提示裡embedded 了工作目錄路徑,路徑不同前綴就不同。
(Claude Code 還有一批跟 CLAUDE.md、TTL 設定有關的快取行為,那是 Day 22 的主場,這裡先不展開。)
但 Day 8 講的那個原則在任何介面都成立:把穩定不變的內容放前面、每次都變的內容放後面。 就算你看不到快取的計費細節,這個習慣本身就會讓你的請求結構更清楚。
快取不是萬用的省錢按鈕。把第二節的價目表倒過來看,有兩種情境你標了 cache_control 反而更貴:
① 內容只會被讀一次。 5 分鐘快取的寫入價是 1.25×,讀取一次省下的是「本來 1× 的 input,變成 0.1× 的讀取」——這個差額要靠至少一次命中才能打平寫入多付的那 25%。如果這段內容天生就是一次性的(例如每次都不一樣的使用者輸入),標了快取只是白白多付 25% 的寫入成本,永遠等不到回本的那一次讀取。
② 內容雖然會被重複讀,但重複的間隔超過 TTL。 5 分鐘內沒有第二次請求進來,快取就過期了,前面寫入多付的成本直接打水漂。如果你的重複請求間隔不穩定、有時候隔了 10 分鐘才有下一筆,換成 1 小時版本的快取(寫入 2×)反而更划算——但 1 小時版本要兩次命中才能回本,門檻更高。判斷原則很簡單:先估你的內容多久會被重複讀到一次、讀幾次,再回頭選 TTL。
這兩種情境的共通點是:快取的價值來自「被重複讀取」,不是來自「被標記」。 標記本身不會讓你變便宜,只有真正命中才會。這也是為什麼第三節一直強調要回頭檢查 usage 裡的 cache_creation_input_tokens 和 cache_read_input_tokens——沒有實際數據佐證的快取策略,很可能是在做反效果的優化。
今日挑戰:檢查你目前的 system prompt 或最常重複使用的一段內容,量一下它有沒有超過你使用模型的最小可快取長度(Opus 5 是 512 tokens,用 Day 7 學到的 count_tokens 就能量)。如果超過,試著加上 cache_control,跑兩次相同結構的請求,比對第二次的 cache_read_input_tokens 是否符合預期。
反思:快取解決的是「重複內容不用重新付全額」,但它不會讓 Claude 記得你們之前聊過什麼——這兩件事很容易被搞混。你有沒有曾經誤以為「開了快取=Claude 有記憶」的經驗?這個誤解會讓你在系統設計上做出什麼錯誤假設?
Prompt Caching 的本質很單純:替一段內容的前綴建一筆雜湊記錄,之後前綴一致就用 0.1 倍價讀取。 它不理解語意,只比對內容是否一致。
今天最重要的三件事:第一,寫入比一般 input 貴(1.25× 或 2×),但通常一次命中就回本;第二,內容太短不會被快取,而且不會報錯——記得檢查 usage 欄位確認是否真的命中;第三,改變 effort、工具定義、圖片、thinking 設定都會讓快取失效,這些是實務上最容易讓快取「突然不見了」的地方。
而如果你不寫程式、平常是在 Claude Code 裡工作——快取一直都在幫你省,你只是沒看到它。 你能做的不是設定它,是別在任務中途換模型、換 effort,把 /compact 留到任務之間的自然段落。
把 Day 8 那句「穩定內容放前面、變動內容放後面」落地成今天的具體做法,你就有了一套能立刻套用的快取策略。
本日關鍵字回顧
output_config.effort 一定會讓對話快取失效,是動態調整 effort 時的隱藏成本。/rewind 因命中舊前綴而比 /compact 便宜。明天接著講計價光譜裡的另一個折扣——不靠快取,直接把 input 和 output 都打五折的 Batch API,以及它跟今天的快取怎麼疊加使用。
Day 10,用時間換金錢的非同步任務打開方式。