你打一句話,AI 讀的是 10 萬個 token:提示詞快取的原理
模型沒有記憶,所以每一輪都要把整份對話重送一次。快取讓那份重複內容只收一折,代價是它只認「從第一個字開始一模一樣」的那一段。這篇不談設定,只把觀念講到你能自己判斷任何一個動作會不會打斷它。
目錄(14 節)
你在一個開了整個下午的對話裡打了一句話,大概 100 個 token。那一輪實際送出去的是 10 萬個,其中 99.9% 是一模一樣的重複內容。
這不是誇飾,也不是特例。這篇要講的「提示詞快取」,處理的就是這 10 萬個 token 的錢。它在每一家工具上都是預設開著的,沒有調得更好這個選項,所以真正該懂的不是怎麼設定,是它什麼時候會失效。
這篇只講觀念,不講設定,也盡量不出現價格。錢怎麼算、漏在哪、各家形態差在哪,在快取成本那篇。
三句話講完這篇
- 模型沒有記憶,所以每一輪都要把整份對話從頭重送一次,那才是你真正付錢的量
- 快取把「讀完那疊資料之後的狀態」凍結起來重用,但它只認從第一個字開始、連續一模一樣的那一段
- 所以你唯一要判斷的是:這個動作是追加在後面,還是動到前面
模型沒有記憶,這是所有事情的源頭
每次按下 Enter,送出去的不是你那一句話,是整份對話從頭到現在的全部內容。
模型是無狀態的,它不記得上一輪講過什麼。是我們每一輪都把整本簿子重新遞給它,最後一頁寫著新問題。介面看起來像「對話」,實際上比較像:你每次都遞給一位失憶的顧問一整疊資料,他從第一頁讀到最後一頁,然後回答。
理解這一句,後面全部都是它的推論。所謂快取,就是想辦法讓這位顧問不用每次都重讀那一疊。
快取存的不是答案,是讀完那疊資料之後的腦內狀態
那位顧問讀完 300 頁卷宗,腦中會建立起對這份卷宗的理解狀態。快取做的事,是把那個腦內狀態凍結起來。
下次你遞給他同樣的 300 頁加上新的第 301 頁,他不用重讀前 300 頁,直接解凍、接著讀第 301 頁就好。技術上那個腦內狀態叫 KV 張量,但你不用管這個名字。
這個比喻能推導出兩件事,而且兩件都很重要:
- 省的是重讀的力氣,所以輸入可以打到一折
- 不省回答的力氣,所以輸出永遠全價,沒有任何折扣
第二條是整件事的天花板。輸入重、輸出輕的工作(agent 讀十萬行程式碼只回兩百字)快取是決定性的;輸出重的工作(一次生成三千字)快取幫不上什麼忙。
還有一條容易被誤會的:快取不會讓回答變差。 它存的是確定性的中間計算結果,不是答案。命中與否,模型看到的東西完全一樣。沒有「為了準確度關掉快取」這種取捨。
為什麼只能從第一個字開始一模一樣
因為顧問對第 300 頁的理解,是建立在前面 299 頁之上的。同一句話放在不同脈絡,意思不一樣。
那個腦內狀態是按順序一層層疊上去的。你要是回頭去改第 3 頁,第 4 頁之後的所有理解都可能不同了,凍結的狀態就不能用,只能整份重讀。
這就是「前綴」的意思:只有從第一個字開始、連續一模一樣的那一段能重用。中間插一個字,後面全毀。
沒有逐檔案或逐段落的局部快取這回事。Anthropic、OpenAI、Gemini 三家的官方文件描述的都是同一個機制,差別只在要不要你手動開、最短要多少 token 才值得快取。
| 供應商 | 要不要你手動開 | 最短要多少 token |
|---|---|---|
| Anthropic | 預設關,要在請求裡標記 | 512 至 4,096,依模型 |
| OpenAI | 自動 | 1,024 |
| Gemini | implicit 自動,另有 explicit | 2,048 至 4,096,依模型 |
第一列有個陷阱值得單獨記住:Anthropic 沒開快取的失敗是靜默的。 不會報錯,只是每一輪都以全價重讀。所以直接接 API、從來沒帶過那個欄位的人,從來沒命中過快取。用 Claude Code 或任何 agent 工具的人不受影響,工具都已經幫你開好了。
第二列的存在理由是:建立快取本身要收一筆費用,太短的對話賺不回來。那筆費用多少、什麼時候回本,在成本那篇。
所以工具會把不常變的東西排在前面
既然只有前綴能重用,那讓前綴盡量不變就是設計重點。coding agent 的 context 都長這個樣子:
| 層 | 內容 | 什麼時候會變 |
|---|---|---|
| 系統提示詞 | 核心指令、工具定義、沙箱設定 | 載入的工具定義變了,或工具本身升級 |
| 專案脈絡 | 專案規則檔、自動記憶、環境資訊 | session 啟動時,或清空、壓縮之後 |
| 對話 | 你的訊息、回覆、工具結果 | 每一輪 |
順序是重點。動到對話層,前面兩層還是命中;動到系統提示詞,整份都要重算,因為後面所有內容都排在一個不同的前綴後面。
還有兩個東西不在提示詞文字裡,但同樣是快取的鍵:模型和 effort 等級。每個模型有自己的快取,同一個模型的每個 effort 等級也有自己的快取。
用一場真實對話走一遍
以我做這份研究時的那場 Claude Code 對話為例,數字是粗估,不是實測:
| 階段 | 這一輪新增什麼 | 累計要重送的量 |
|---|---|---|
| 還沒開始講話 | 系統提示詞、工具定義、專案規則檔、記憶索引 | 約 20,000 |
| 第一句話 | 那句話加上列目錄、讀檔的工具結果 | 約 24,000 |
| 做了 12 次網路查詢 | 每一份抓回來的網頁內容 | 約 38,000 |
| 寫了一篇 4,861 字的文章 | 整份 markdown | 約 45,000 |
| 跑 build、看了一張圖 | 終端機輸出加上圖片轉成的 token | 約 48,000 |
| 又做了 16 次研究 | 又一批網頁內容 | 約 74,000 |
| 寫了一份 HTML 報告 | 整份原始碼 | 約 88,000 |
| 再打一句約 100 token 的話 | 那句話 | 約 100,000 |
開頭那句 10 萬 token 就是這樣來的。而這個量級不是特例:華盛頓大學 SyFI Lab 的 TraceLab 收集了 43 位開發者八個月、約 4,300 個 session 的真實軌跡,量到 Claude Code 每一步的前綴中位數是 126,180 個 token,新增的只有 857 個。
前綴比新增內容大兩個數量級,這就是快取存在的理由,也是一次失效那麼痛的理由。
每個動作實際上發生了什麼
有了上面的模型,你可以自己判斷任何一個動作:它是追加在後面,還是動到前面?
| 動作 | 對快取的影響 | 為什麼 |
|---|---|---|
| 打一句話 | 全部命中,最便宜 | 追加在最後面,前面完全沒動 |
| agent 跑指令、讀檔、搜尋 | 全部命中 | 工具結果也是追加在最後面 |
| 抓一個網頁回來 | 當下命中,但留下永久成本 | 抓回來的內容黏在對話裡,之後每一輪都要重送 |
| 讀一張圖 | 同上 | 圖片一樣會轉成 token 並黏著 |
| 中途換模型或換 effort | 全部失效 | 這兩個是快取的鍵,換了就是另一份快取 |
| 離開座位超過 5 分鐘 | 最容易發生的一種失效 | 凍結狀態被清掉,回來的第一句話要重讀整份 |
倒數第二列跟最後一列的差別值得說清楚:換模型是你按的,離開座位不是。實測資料顯示後者才是主要的成本來源,這條在成本那篇有完整的數字。
還有一個表格裡看不出來的性質:對話裡的東西只進不出。 除非壓縮或倒帶,否則今天早上抓的那個網頁,到現在每一輪都還在被重送。這就是為什麼 agent 工具會有「工具延後載入」「大量輸出存成檔案」這些設計,不是為了整潔。
快取活多久,是送請求那一方寫死的
這是最常被誤會成「模型自己判斷」的一件事。
TTL(存活時間)是送請求的那一方在請求裡直接寫死的靜態參數,不是模型決定,也不是伺服器看情況判斷。不寫就是預設的 5 分鐘。在 coding agent 裡,是那個工具幫你決定,而且是固定設定,不是每一輪動態評估:
| 登入方式 | Claude Code 送出的 TTL | 為什麼是這個預設 |
|---|---|---|
| 訂閱(Pro、Max) | 自動 1 小時 | 你不按 token 付錢,多留 55 分鐘的成本落在供應商身上 |
| API key | 預設 5 分鐘,可用環境變數改 | 1 小時的快取寫入更貴,而這筆錢你付 |
| subagent | 一律 5 分鐘 | 不管你怎麼登入都一樣 |
這張表的來源是 Claude Code 官方快取文件。訂閱和 API 的分界怎麼影響你選方案,在月費實算那篇算過。
最後一個關於 TTL 的關鍵性質:它算的是「多久沒被碰」,不是「存在多久」。 每一次讀取都會讓計時器重來。所以只要你持續對話,整份前綴會一路被保溫,不會因為已經存在兩小時就自己過期。
各家都有一份作廢清單,但清單各家不同
機制五家通用,暴露給你的細節不一樣。文件寫得最完整的是 Claude Code,官方直接列了八個會作廢快取的動作。這一節綁定單一工具,但判斷原則可以搬到別家。
| 動作 | 打斷範圍 | 避不避得掉 |
|---|---|---|
| 切換模型 | 全部 | 可以,session 開頭就定好 |
| 切換 effort 等級 | 全部 | 可以,同上 |
| 開啟 fast mode | 全部 | 可以,開頭就開,這個成本一整段對話只發生一次 |
| MCP 伺服器連上或斷開 | 看情況 | 標準環境不用擔心,走 gateway 才要 |
| 啟用或停用 plugin | 只有帶 MCP 的會 | 可以 |
| 用 deny 規則擋掉整個工具 | 全部 | 可以,改用範圍規則 |
/compact |
對話層 | 部分,挑時機 |
| 升級 Claude Code | 全部 | 不行,但可以控制時機 |
清單本身不用背,八條全部都是同一句話的推論:動到前面就是全部,追加在後面就沒事。 有兩條例外值得單獨講,因為它們的行為跟直覺相反。
改專案規則檔不會打斷快取,但也不會生效
專案根目錄與使用者層級的 CLAUDE.md 是在 session 啟動時讀一次,然後留在記憶體裡。你在 session 中途改它,會同時得到一個好消息跟一個壞消息:快取不會失效,但改動也不會套用。
Claude 會繼續用 session 啟動時載入的那個版本工作,新內容要等下一次 /clear、/compact 或重啟才會載入。輸出風格(output style)也是同一個模式。
兩個例外會即時生效:子目錄裡的 CLAUDE.md,以及帶 paths: frontmatter 的規則。這兩種是等 Claude 第一次讀到符合的檔案時才載入,所以在載入之前改是有效的;載入之後就變成對話歷史的一部分,中途再改一樣不會回溯。
如果你曾經改完規則檔覺得「怎麼沒反應」,答案就在這裡。
想放棄一條路,/rewind 比 /compact 便宜
兩個都能讓對話變短,成本結構卻完全相反。
/rewind 是把對話截斷回較早的一輪。剩下的歷史就是當初建立快取用的同一份內容,前面兩層也沒動,所以下一輪直接命中那個較早的條目。而且中間每一輪都讀過那個前綴,等於一路把它保溫著。
/compact 是把歷史換成一份摘要。新的歷史比較短,但跟舊的不共用前綴,所以對話層整份重建。更關鍵的是產生摘要這件事本身要另外送一次請求,帶著跟你對話一樣的系統提示詞、工具和完整歷史。
快取還熱的時候,那次請求讀的是快取,所以中途壓縮沒有 context 大小看起來的那麼貴。但放久了再壓縮,就沒有快取可以讀,整份歷史要以未快取價重新處理。這是為什麼恢復一個放了很久的 session 特別貴。
判斷方式:想保留脈絡繼續做就 /compact,挑任務之間的自然斷點;想整個放棄一條路就 /rewind。
開新對話的判準不是快取
最常見的誤解,是把「開新 session」當成快取問題的解法。它不是解決快取,它是放棄快取。
要分清楚兩件不同的成本:前綴太長,是每一輪都要重送 10 萬 token,就算只收一折也是錢;快取沒命中,是那 10 萬 token 這一輪收全價。開新對話解決的是第一個,代價是必然發生第二個。
關鍵在這句:失效的成本等於前綴大小乘以全價,所以小前綴失效很便宜,大前綴失效很貴。
| 情況 | 該怎麼做 | 為什麼 |
|---|---|---|
| 任務換了,舊內容用不到 | 開新的 | 不然每一輪都在付錢重送廢話 |
| 同一任務、馬上回來 | 繼續用 | 快取還熱,這是最便宜的狀態 |
| 同一任務、要離開很久 | 可以開新的 | 反正回來一定失效,小的失效比大的划算 |
一句話:判準是「舊的內容對接下來還有沒有用」,不是快取。 快取只是讓「有用」的那個情況變便宜而已。
訂閱使用者真正只有兩個旋鈕
如果你是買訂閱在用,前面那些細節有一半不歸你管:快取設定沒有旋鈕可調,命中率你看不到也影響不了,各家 TTL 與寫入成本要做 API 選型時才用得上。
剩下的兩個旋鈕就是這篇的全部結論:任務結束就開新對話,要離開很久之前先把手上的收個尾。
按 token 付錢的人要管的事比較多,那些在快取成本那篇。至於這些習慣值多少錢,我們在另一篇實測裡量過一個極端例子:一句過時的規則檔指令讓同一個任務從 3 輪變成 9.7 輪,成本 2.26 倍,品質完全一樣。
這篇的限制
- 那張 10 萬 token 的對話推演是粗估,不是逐輪實測。 它示範的是量級與累積形態,不能當成你自己 session 的預測
- 底層機制的描述做了簡化。 實際上快取的是注意力算出來的 KV 張量,以區塊雜湊鏈的形式串起來,本文用「凍結腦內狀態」代替。想看實作層細節請直接讀各家官方文件
- 八項清單是 Claude Code 官方目前列出的範圍,不保證窮盡,且版本更新頻繁,舊版本行為不同
- 各家對快取行為的揭露程度差很多。 消費端的聊天介面(網頁版、App)三家都沒有公開快取行為,本文不涵蓋那一層
- 前沿的位置無關快取技術不在本文範圍。 目前商用 API 買得到的仍然是純前綴精確比對
- 本文機制描述實查於 2026 年 8 月 8 日