iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
Build on Google AI

在贏家書寫歷史之前:我所看見的 AI,與一位工程師共舞著系列 第 14 篇

Day 14 | 明天,我要和昨天的 Token 約會(下):Prompt Caching

  • 分享至 

  • xImage
  •  

前幾天我們探討了 KV Cache 的機制,但或許我們更在乎的是,這東西對於我們有影響嗎?他帶來的影響是什麼?

如果打開各家 AI 模型供應商的定價頁面(例如 Google Cloud 官方定價表 或是 Anthropic Claude 官方定價表),會發現計費標準通常不會只有標示 Input Token 或 Output Token 多少錢,還會明確列出如果 「Hit 快取(Cache Token)時」 Token 的計費方式。像 Gemini 甚至還會依照 Prompt Cache 的長度不同有不一樣的計價;Anthropic 也會明確標示新的 Token 在 Cache Write 多少錢,要保留在 Cache 多久也會有不同的價格。而這裡說的 Cache 就是指我們之前提到存在 GPU 顯存裡的 KV Cache。

因此,KV Cache 帶來的影響比想像的更深,尤其是在看 Token 使用量或是收到帳單的時候!往往 Cache Hit 時的收費會是一般 Input Token 的費用再打幾折(例如:1 折),所以運用得當的話,或許可以讓 AI 能再使用更久,或是帳單費用降得更低。而這整套機制在許多 AI 模型開發商的文件中,通常被叫做 Prompt Caching 或是 Context Caching。


一、為什麼改一個字,快取就失效?

在 Day 12 的時候,我們知道同一段對話內部的 KV 可以在 Decode 時重複利用;在 Day 13 的時候,我們知道透過 PagedAttention 的機制,相異的 Request 可以共享同一份 KV Cache;而在 Day 11 中,我們也知道跟 AI 的每一輪對話,底層其實就是發送多次的 Request。透過上述分析我們得知,我們的 System Prompt 以及每一輪對話的歷史紀錄,是很容易可以命中 Cache 的。

這就是 Prompt Caching 的基本概念,只要前面送出的內容有命中 Cache,就不用重新對這些 Token 做 Prefill 計算,首字生成時間(TTFT)與輸入費用都會大幅降低。但在實際使用時,可能會遇到一種狀況,假設一份長達一萬個 Token 的 Prompt,如果我們在第 500 個 Token 處修改了一個動態變數(例如加上當前時間戳記),後續 9,500 個 Token 的快取也會跟著全部失效,整段請求幾乎等於重新計算。

https://ithelp.ithome.com.tw/upload/images/20260927/20183607V8fzorpZk4.png

曾經聽過其他人針對這一點,覺得模型商刻意這樣設計很賤 XDD。但經過前幾天對於 Self-Attention 以及 KV Cache 更深入了解後,我們其實可以諒解,因為這就是 LLM 運作本身的機制(又或者說是條件):必須從第 1 個 Token 開始,100% 完全前綴連續匹配。 只要中間 1 個 Token 有改動,即使後面完全相同也無法重用舊快取。主要來自底層的兩個原因:

  1. RoPE 位置編碼位移:
    在 Day 08 我們提過,RoPE 是根據每個 Token 的「位置索引(Position Index)」來旋轉向量。一旦中間插入或刪除字元,後面所有 Token 的位置編號全部向後挪移,乘上的旋轉角度全都會不一樣,算出來的 Key 向量就會完全不同,所以無法直接重用。
  2. Causal Attention:
    在 Day 09 我們也提過透過 Causal Mask,每個 Token 都只會關注它前面所有的 Token。前面任何一個字元變動,後面緊接的 Token 回頭看時接收到的上下文就不一樣了,後面的 Token 對前面 Token 的關注度就很有可能改變,因此我們不能直接重用那些在改動點後面的 KV 向量,即便內容一樣。所以,模型必須從改動點開始重新 Prefill!

二、其他小東西

在各大廠商的定價文件中,通常有兩個關鍵設定:

  1. 存活時間(TTL):
    GPU 顯存非常有限,不可能永久保留快取。例如:Anthropic 預設的存活時間為 5 分鐘,若超時未有新請求存取,系統就會釋放顯存給其他請求使用。
  2. 寫入與讀取的費用差異:
    以 Anthropic 為例,第一次寫入快取的費用是一般 Input Token 的 1.25 倍;後續若命中快取(Cache Hit),費用則只有原本的 0.1 倍(1 折)。因此,只有在 TTL 內被重複呼叫 2 次以上的長文本,開啟快取才會真正節省成本。

我們在這篇文章將前面的內容全部串起來了,真開心。明天繼續加油唄~


參考資料


上一篇
Day 13 | 明天,我要和昨天的 Token 約會(中):PagedAttention
下一篇
Day 15 | 中場採訪:當 AI 回頭看著那位與我共舞的工程師
系列文
在贏家書寫歷史之前:我所看見的 AI,與一位工程師共舞著 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言