返回部落格
指南·2026年5月24日·閱讀約 8 分鐘

Anthropic 提示詞快取——30 分鐘內將輸入費用降低 90%

完整解析:cache_control 的運作方式、為何 OpenAI 格式需要 Kunavo 為你設定斷點、代理迴圈的 4 斷點模式、哪些因素會悄悄破壞快取,以及如何確認命中率不為零。包含 Kunavo 各模型的快取費率。

如果你要傳送很長的系統提示——RAG 情境、工具目錄、代理規則、範例——你可能每次呼叫都在支付完整的輸入價格。Anthropic 的提示快取會將快取部分降至費率的 10%。OpenAI 也會以隱含方式做同樣的事。多數團隊認為這值得花 30 分鐘實作,因為它能穩定地讓輸入費用降低 60–90%。

Kunavo 兩者都支援。你自己的 cache_control 分界點會原封不動地透過 Messages API;在 Chat Completions 與 Responses API 上——其格式沒有可傳送此欄位的位置——Kunavo 會替你設定分界點,並在你已傳送的內容周圍補足,且絕不超過 4 的上限。本文會說明兩種方式、會悄悄使快取失效的陷阱,以及如何驗證命中率。

前後對照

一個將相同的 18K-token 系統提示傳送十次的天真迴圈:

naive.py
# What most people start with: every call re-pays for the whole prompt.
import anthropic

client = anthropic.Anthropic(
    api_key="sk-kn-...",
    base_url="https://api.kunavo.com",
)

SYSTEM = open("system-prompt.md").read()        # 18,000 tokens of rules + examples

# 10 user questions in a session. Every call sends the 18K-token system block.
for question in questions:
    resp = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=600,
        system=SYSTEM,
        messages=[{"role": "user", "content": question}],
    )

# Cost per call (input only): 18,000 × $3 / 1M = $0.054
# 10 calls: $0.54 in input alone.

現在將系統區塊標記為可快取——只需多一個欄位:

cached.py
# The fix: mark the static prefix as cacheable. After the first call,
# subsequent calls within ~5 minutes pay 10% the input rate on the cached
# portion. Same answer, 89% cheaper.
resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=600,
    system=[
        {
            "type": "text",
            "text": SYSTEM,
            "cache_control": {"type": "ephemeral"},  # mark cacheable
        }
    ],
    messages=[{"role": "user", "content": question}],
)

# First call (cache write):  18,000 × $3.75 / 1M = $0.0675  (1.25× input)
# Calls 2–10 (cache hit):    18,000 × $0.30 / 1M = $0.0054 each
# Total: $0.0675 + 9 × $0.0054 = $0.116  (was $0.54 — 78.5% saved)

你剛剛讓本次工作階段的輸入費用節省了 78.5%。第一次呼叫其實比簡單版本稍微更貴(寫入快取約為輸入費率的 1.25 倍)。第 2 至第 10 次呼叫支付 10% 的費率。交叉點在第 2 次呼叫——到第 3 次時你已經開始省錢。到第 10 次時,差距已經非常巨大。

OpenAI 風格:無需做任何事

OpenAI Chat Completions 格式沒有 cache_control 欄位,因為 OpenAI 會在自己的伺服器上隱含地進行快取。Claude 不會——它只快取分界點標記的內容。因此,當你透過 /v1/chat/completions 或 /v1/responses 使用 Claude 模型時,Kunavo 會替你設定分界點:對話至少有一個 assistant 回合後,在最後一則訊息上設定一個滾動分界點,接著在 system 後設定一個,在 tools 後再設定一個。在模型第一次回答之後傳送的 system 或 developer 訊息會留在對話中,而不會被提升到 system(除非它自己的分界點要求一小時快取)。如果請求以這樣一則訊息結尾,滾動分界點會放在緊鄰它前面的那個區塊上;剩下可用的分界點則放在最後幾則後面還有內容的這類訊息前面。你自行設定的任何分界點都會原封不動地保留在原位置——Kunavo 只會填補你留空的位置,且最多填到 4 個。無需設定;無論你透過 Anthropic 或 OpenAI 路由進入,同一模型的費用都相同:

openai_style.py
# OpenAI Chat Completions style — Kunavo sets the breakpoints for you.
# No flag to set. The "usage" object tells you what was cached.
from openai import OpenAI

client = OpenAI(
    api_key="sk-kn-...",
    base_url="https://api.kunavo.com/v1",
)

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[
        {"role": "system", "content": LONG_SYSTEM_PROMPT},  # >1024 tokens
        {"role": "user", "content": "Latest question…"},
    ],
)

# In the response:
#   resp.usage.prompt_tokens_details.cached_tokens  →  17,800
#   resp.usage.prompt_tokens                        →  18,200
# 17.8K/18.2K = 98% of input came from cache. Bill reflects that automatically.

讀取 usage.prompt_tokens_details.cached_tokens 以查看有多少內容來自快取。固定前綴越大,節省越多。經驗法則是:如果系統提示比可變的使用者內容更短,快取就沒什麼作用。重新整理提示,讓靜態部分更大並放在前面。

多層快取——最多 4 個分界點

對於不同層變動速度不同的代理迴圈,設定多個 cache_control 分界點。每個分界點都是截至該位置的全部內容快照:

breakpoints.py
# Anthropic supports up to 4 cache breakpoints per request — use them
# to keep the cache hot even as later layers change.
client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=600,
    system=[
        {"type": "text",
         "text": ROLE_AND_RULES,                      # ~3,000 tokens
         "cache_control": {"type": "ephemeral"}},     # breakpoint 1
        {"type": "text",
         "text": LARGE_KNOWLEDGE_BASE,                # ~15,000 tokens, rarely changes
         "cache_control": {"type": "ephemeral"}},     # breakpoint 2
    ],
    messages=[
        {"role": "user",
         "content": [
             {"type": "text",
              "text": CONVERSATION_HISTORY,           # grows each turn
              "cache_control": {"type": "ephemeral"}}, # breakpoint 3
             {"type": "text", "text": new_question},
         ]},
    ],
)

# When CONVERSATION_HISTORY changes, breakpoints 1+2 still hit cache.
# Only breakpoint 3 + the new question pay full input rate.

快取金鑰是整個前綴。在位置 N 加入一個 token,N 或之後的每個分界點都會失效。順序很重要:最穩定的內容放在最前面。規則層應該很少變動;知識庫每週更新;對話則每回合增長。

悄悄破壞快取的常見方式

  • 在提示中放入目前日期或 request_id。每次呼叫都是新的前綴,快取命中率為 0%。請雜湊提示輸入並在多次呼叫間比較。
  • 非確定性的系統提示組裝。如果你從 dict 建立系統提示,在某些 Python 版本中,dict 的迭代順序很重要。請明確排序索引鍵。
  • 快取存留時間約為 5 分鐘。流量稀疏的模式(每 10 分鐘呼叫一次)會完全沒有命中。請批次處理呼叫,或接受損失。
  • 1,024-token 的最低要求。低於 1K token 時,OpenAI 風格的快取不會啟用。請將小型靜態片段合併成一個較長的前綴。
  • 工具/函式定義是前綴的一部分。目錄中加入新工具會使所有人的快取失效。請讓工具目錄保持穩定,並為其建立版本。

驗證命中率

看不見的快取不是工程,而是希望。每次呼叫都記錄 usage:

observe.py
# Always read usage. If cached_tokens is 0 when you expected a hit,
# something's wrong — usually a non-deterministic prefix.
resp = client.messages.create(...)
u = resp.usage
print({
    "input_uncached":  u.input_tokens,
    "input_cache_read": u.cache_read_input_tokens,
    "input_cache_write": u.cache_creation_input_tokens,
    "output": u.output_tokens,
})

# A common gotcha: putting today's date or a request_id in the system prompt
# silently invalidates the cache. Hash your inputs; verify cache_read_input_tokens
# is non-zero on the 2nd identical call.

在 Kunavo 控制面板中,Usage 頁面會顯示每天每個模型的快取拆分。如果看到 cache_read_input_tokens 在總輸入中的百分比持續增加,表示快取正在運作。如果維持在 0 或大幅波動,請逐項檢查上面的陷阱清單。

在 Kunavo 上實際要花多少費用

每個模型的快取費率都公布在定價頁:

  • Anthropic 模型:快取讀取為輸入費率的 10%——在Claude Fable 5.1上的比例為2.5%,在Claude Opus 5.5上的比例為5%。快取寫入為輸入費率的 1.25 倍——這是 Anthropic 的五分鐘倍數;Kunavo 對一小時寫入也收取相同的 1.25 倍,低於 Anthropic 的 2 倍。
  • OpenAI/Gemini 模型:快取讀取為輸入費率的 10%(供應商公布的比例)。GPT-5.6 與 GPT-6 Astra 的快取寫入為 1.25 倍,其他所有模型則為一般輸入費率。
  • 所有快取定價都已包含 Kunavo 的模型折扣(依模型計算,低於上游標示價格)。因此,在 Kunavo 上,Sonnet 4.6 的快取讀取為 $3 × 0.40 × 0.10 = $0.12 per 1M tokens。約比未快取的上游費率便宜 25 倍。

快取不是答案的情況

有幾種情況不值得投入這項工作:

  • 短提示(總計 <1K token)。額外負擔占主導;直接不要使用。
  • 沒有重複流量的單次任務。第一次呼叫稍微更貴——快取要到第 2 次以上才會回本。
  • 高輸出、低輸入的任務(創意寫作、程式碼生成)。輸入本來就只占帳單的一小部分。請改為專注於輸出預算上限。

對其他所有情況——RAG 聊天機器人、使用固定工具目錄的代理程式、依靜態評分規準執行的分類器、使用一致 few-shot 範例的結構化擷取管線——快取是在一個下午內即可部署、投資報酬率最高的最佳化方式。將它與我們成本最佳化指南中的另外四項技巧搭配,即使輸出品質完全不打折,也能實際降低 70% 的成本。

已經在使用 Kunavo?開啟 /app/usage,查看你最大模型的快取欄位。如果是零,你就正在白白損失省錢機會。完整指南:/docs/caching。