開發文件

提示詞快取

很長的系統提示詞、文件或多輪對話歷史,每次請求都原樣重發,其實大部分內容沒變。提示詞快取把這些重複的開頭部分快取起來,命中快取的部分按遠低於正常輸入的價格計費,回應也更快。

快取是怎麼命中的

快取按字首匹配:從請求開頭起,只要內容逐位元組相同,就能命中。中間任何一處改動,都會讓它之後的內容全部失效。所以要把不變的內容放前面(系統提示詞、工具定義、參考文件),會變的放後面(使用者的新問題、時間戳等)。

GPT 系列:自動快取

GPT 模型會自動快取較長的請求字首,不需要改程式碼。命中的 token 數在 usage.prompt_tokens_details.cached_tokens:

json
"usage": {
  "prompt_tokens": 12400,
  "completion_tokens": 310,
  "prompt_tokens_details": { "cached_tokens": 11264 }
}

Claude 系列:用 cache_control 標記

Claude 需要你在內容區塊上標記快取斷點 cache_control,斷點之前的全部內容(工具定義 → system → messages)會被快取:

cache_claude.py
from anthropic import Anthropic

client = Anthropic(api_key="sk-...", base_url="https://api.flyrouter.ai")

long_document = open("manual.md").read()  # 很長、每次都相同的參考文件

msg = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=2048,
    system=[
        {"type": "text", "text": "你是產品客服,只根據下面的手冊回答問題。"},
        {"type": "text", "text": long_document, "cache_control": {"type": "ephemeral"}},
    ],
    messages=[{"role": "user", "content": "如何重設裝置?"}],
)
print(msg.usage)
  • 預設快取 5 分鐘,每次命中會重新計時。請求間隔較長時可用 {"type": "ephemeral", "ttl": "1h"} 快取 1 小時。
  • 一個請求最多 4 個快取斷點。
  • 內容太短不會被快取(新款 Claude 約 512 token 起,舊款更高),也不會報錯。

用 usage 裡的兩個欄位確認效果:

欄位意義
cache_creation_input_tokens本次寫入快取的 token 數
cache_read_input_tokens本次命中快取的 token 數

連續幾次請求後 cache_read_input_tokens 仍然是 0,通常是字首裡混進了每次都變的內容。

計費

  • 快取命中:按快取讀取價計費,遠低於正常輸入價。
  • 寫入快取(Claude):首次寫入按快取寫入價計費,略高於正常輸入價;1 小時快取的寫入價更高。
  • 各模型的快取讀取、寫入單價見 模型價格。

一段內容只要被重複使用兩次以上,開啟快取基本都更划算。

常見的快取失效原因

  • 在系統提示詞裡放了目前時間、請求 ID 等每次都變的內容。
  • 工具列表的順序或內容每次不同。
  • 序列化 JSON 時鍵的順序不固定。
  • 切換了模型:快取按模型隔離,換模型後需要重新寫入。
FlyRouter

一組 Key,直飛全球大型模型