在 API易 的實際使用中,OpenAI 和 Claude 系列的緩存寫入與命中都很正常,命中率也很高。Gemini 文本模型卻不一樣:緩存命中率很低,甚至基本沒有。這是一個可以在賬單和用量明細裏復現的事實,也是不少開發者在對賬時最困惑的地方。
本文基於 Google 官方文檔(截至 2026 年 10 月 20 日),拆解 Gemini 緩存命中率低的 5 類原因,並講清 AI Studio(Gemini Developer API)與 Vertex AI 的緩存計費是怎麼界定的。
這不是一篇“甩鍋式”分析。Google 官方並沒有“使用中轉會降低 Gemini 緩存命中率”的規則,我們也無法在沒有上游請求記錄的情況下,斷言某個具體原因一定成立。本文的做法是:先講官方規則,再列出哪些條件會讓規則“失效”,最後給出一套你自己就能跑的排查與核賬方法。
核心價值:讀完本文,你將理解 Gemini 緩存何時命中、何時不命中,掌握“總輸入包含緩存部分”這一計費要點,並能用官方響應字段獨立覈對賬單。

Gemini 緩存命中率核心要點
先把結論擺在前面。理解 Gemini 緩存,需要先分清“隱式緩存”和“顯式緩存”兩種機制,兩者的觸發方式和計費方式完全不同。
| 類型 | 如何使用 | 如何獲得緩存優惠 | 是否有存儲費 |
|---|---|---|---|
| 隱式緩存 Implicit caching | 支持的模型自動啓用,無須創建緩存對象 | 請求實際命中後,命中部分按緩存價格收費,不保證每次命中 | 沒有 |
| 顯式緩存 Explicit caching | 主動創建緩存對象,後續請求引用該對象 | 有效引用的緩存輸入享受緩存價格 | 有 |
官方文檔對 Developer API 的隱式緩存有一句關鍵表述:它不保證節省費用。顯式緩存雖然確定性更高,但需要額外的開發工作,包括創建緩存對象、管理有效期、在後續請求中引用該對象。
爲什麼 Gemini 的體驗和 OpenAI、Claude 不一樣
從使用者視角看,OpenAI 和 Claude 系列在 API易 上表現爲“發同樣的長前綴,就能穩定看到緩存寫入與命中”。Gemini 則要同時滿足幾個條件:模型支持隱式緩存、請求達到該模型的最低 token 門檻、可複用內容位於提示詞開頭、相似請求在較短時間內發出,而且在 Vertex 側還要落在同一個 Google Cloud 項目裏。
任何一個條件不滿足,請求都會按普通輸入價格計費,不會報錯,也不會有任何提示。這正是“命中率低”常常不被發現的原因:緩存沒命中是靜默發生的。
先界定一個概念:AI Studio 指什麼
本文把“AI Studio 渠道”理解爲 Gemini Developer API,也就是用 AI Studio 生成的 API Key 調用的那條路徑,與 Google Cloud 上的 Vertex AI 對比。兩者的緩存機制思路一致,但最低門檻數值、隔離範圍和存儲費規則存在差異,後文逐項展開。
Gemini 緩存命中率低的 5 類原因
下面的分析分兩層:前兩類是官方文檔明確的規則,後三類是“規則在中轉或工程實踐中被打破”的條件性解釋。我們無法僅憑“用了中轉”確定具體是哪一條,需要上游項目和請求記錄才能定位。
原因 1:請求沒有達到最低緩存 token 門檻
隱式緩存有最低 token 門檻,輸入太短的請求不會進入緩存。而且兩端的門檻並不完全一致。以下是當前文檔列出的部分模型數值:
| 模型 | Developer API 隱式緩存門檻 | Vertex 隱式緩存門檻 |
|---|---|---|
| Gemini 3.8 Flash | 4,096 | 6,144 |
| Gemini 3.1 Pro Preview | 4,096 | 6,144 |
| Gemini 2.5 Pro(舊一代,對照用) | 2,048 | 2,048 |
這裏有兩個容易踩的坑。第一,新一代模型(如 Gemini 3.8 Flash)的門檻比 2.5 系列更高,用早期版本的 2,048 去估算會誤判。第二,同一個模型在 Vertex 上的門檻可能更高,一個 5,000 token 的請求在 Developer API 上夠格,在 Vertex 上就不夠。
日常對話類請求通常只有幾百到一兩千 token,天然低於門檻,這是 Gemini 在聊天場景下命中率很低的最直接原因之一。需要強調的是,達到門檻只是必要條件,不代表必然命中。
原因 2:可複用內容不在提示詞開頭
Google 對兩端給出的建議一致:把較長、重複使用的內容放在提示詞開頭,並在較短時間內發送具有相似前綴的請求。緩存依賴的是共同前綴,而不是“請求裏包含同一份文檔”。
換句話說,兩次請求都帶了同一份文檔,並不足以保證命中。還要看它在請求中的位置,以及它前面的內容是否穩定。下面這種寫法就很容易破壞前綴:
# 反例:變化內容放在最前面
[當前時間:2026-10-20 10:31:07]
[請求 ID:a8f3...]
{system 指令}
{長文檔}
{用戶問題}
只要開頭有一個字符不同,後面的長文檔就無法與上一次請求形成共同前綴。這一點是依據官方建議做出的推斷,但在工程上非常常見。
原因 3:中轉層改變了前綴(條件性)
如果中轉層在提示詞開頭插入變化的時間、標識、追蹤字段,或者對多輪上下文做了重排、壓縮、截斷,就會改變共同前綴,降低命中機會。這是一種條件性分析,不能直接認定某家服務存在這些行爲。
排查時要區分兩個層面:你發給中轉的請求前綴是否穩定,以及中轉發給 Google 的請求前綴是否穩定。前者你可以自己控制,後者需要看上游請求記錄。
原因 4:請求被分散到不同的 Vertex 項目(條件性)
Vertex 明確規定:緩存按 Google Cloud 項目隔離,不跨項目共享。如果同一個會話的多次請求被輪詢到不同的 Vertex 項目,那麼項目 A 建立的緩存,項目 B 無法使用。
這裏要謹慎:“換 Key”是否丟緩存,取決於是否同時換了項目。不能直接認定每次換 Key 都會丟緩存,需要進一步確認 Key 與項目的對應關係。
原因 5:只轉發了生成請求,沒有使用顯式緩存
如果調用鏈路只是轉發 generateContent 請求,沒有創建緩存對象,也沒有在後續請求裏引用它,那麼整條鏈路只依賴隱式緩存。隱式緩存沒有確定性保證,無法獲得顯式緩存那樣“創建一次,反覆引用”的穩定收益。
下表把這幾類中轉場景與官方規則對應起來:
| 實際行爲 | 可能影響 | 對應的官方規則 |
|---|---|---|
| 同一會話輪詢到不同 Vertex 項目 | 無法複用另一個項目已有的緩存 | 緩存按項目隔離 |
| 開頭插入變化的時間、標識,或重排上下文 | 共同前綴被破壞,命中機會下降 | 長內容置於開頭、前綴相似 |
| 請求較短,固定可複用內容不足 | 達不到緩存門檻 | 最低 token 門檻 |
| 只轉發生成請求,沒有創建、引用顯式緩存對象 | 只能依賴隱式緩存,沒有確定性 | 顯式緩存須創建並引用對象 |

🎯 技術建議:在排查 Gemini 緩存問題時,建議先通過 API易 apiyi.com 用同一份固定長前綴連續發起多次請求,再對比各次返回的緩存 token 字段。用受控的請求先排除前綴和門檻問題,再判斷是否與鏈路有關。
沒有上游項目和請求記錄,就無法僅憑“用了中轉”確定原因,也沒有官方依據認定 Vertex 的命中率必然高於 Developer API。
AI Studio 與 Vertex 緩存計費如何界定
很多人把“緩存命中”理解成免費或者整條請求統一打折,這是不對的。兩端的計費都要區分四類項目:普通輸入、緩存輸入、輸出,以及顯式緩存的存儲費。
兩端計費規則對照
| 計費項 | Developer API(AI Studio) | Vertex AI |
|---|---|---|
| 普通輸入(未命中部分) | 按普通輸入單價 | 按普通輸入單價 |
| 緩存輸入(命中部分) | 按緩存輸入單價,定價頁單獨列出 | 按緩存輸入單價,定價頁單獨列出 |
| 輸出 | 另計 | 另計 |
| 創建緩存使用的輸入 | 計入緩存 token 使用費 | 按標準輸入價格收費 |
| 隱式緩存存儲費 | 沒有 | 沒有 |
| 顯式緩存存儲費 | 按存儲時長計費 | 有存儲費 |
Developer API 文檔把緩存 token 使用費、存儲時長、非緩存輸入和輸出都列爲計費因素。Vertex 則另外明確了兩點:創建緩存所用的輸入按標準輸入價格收費,隱式緩存沒有存儲費,顯式緩存有存儲費。具體單價請以兩端當前的官方定價頁爲準,不同模型和版本會變化。
輸入費用的計算公式
對於普通文本生成請求,可以按下面的結構理解輸入費用:
輸入費用 =
(總輸入 tokens − 緩存命中 tokens)× 普通輸入單價
+ 緩存命中 tokens × 緩存輸入單價
輸出費用另算,顯式緩存還要另加存儲費。舉一個假設的例子:某次請求總輸入爲 10,000 tokens,其中緩存命中 8,000 tokens,那麼按普通價格計費的是 2,000 tokens,按緩存價格計費的是 8,000 tokens。
一個最容易算錯的點:總輸入已包含緩存部分
核賬時要看 Google 的原始響應,而不是隻看中轉後臺顯示的“緩存命中率”。在 generateContent 響應的 usageMetadata 中,有兩個關鍵字段:
| 字段 | 含義 | 核賬注意點 |
|---|---|---|
usageMetadata.promptTokenCount |
總輸入 tokens | 包含緩存部分 |
usageMetadata.cachedContentTokenCount |
緩存部分的 tokens | 命中緩存的數量 |
因此,不能把 promptTokenCount 全部按普通價格算完,再額外加一筆緩存輸入費,那樣會重複計費。正確做法是先用總輸入減去緩存部分,得到按普通價格計費的部分。如果你使用的是新的 Interactions API,官方給出的緩存統計字段是 usage.total_cached_tokens。
兩件必須分開的事
還需要區分兩件事:Google 上游實際命中了多少緩存,以及中轉如何把這部分優惠計入你的賬單。前者可以用官方字段衡量,後者取決於中轉自身的計費規則,Google 官方文檔無法替其證明。所以對賬時,建議同時覈對上游返回的緩存字段和賬單明細的計費口徑。
💡 選擇建議:對賬時先看請求級別的緩存 token 字段,再看賬單彙總。如果需要在 OpenAI、Claude 和 Gemini 之間做同口徑對比,可以通過 API易 apiyi.com 用同一份提示詞分別調用,便於快速切換模型。
Gemini 與 Claude、OpenAI 的緩存計費差異
三家的緩存思路不同,對賬口徑也不同。下表按“怎麼觸發、怎麼計費”對比,折扣比例和時長會隨模型版本調整,下表爲寫作時的大致口徑,具體數值請以各家官方定價頁爲準:
| 對比項 | Gemini | Claude | OpenAI |
|---|---|---|---|
| 觸發方式 | 隱式自動 + 顯式緩存對象兩套機制 | 顯式:請求裏用 cache_control 標記緩存斷點 |
自動,無需改代碼 |
| 緩存寫入費 | 隱式無;顯式創建時按輸入計費,另有存儲費 | 有,寫入單價高於普通輸入(5 分鐘與 1 小時有效期單價不同) | 沒有單獨的寫入費 |
| 緩存讀取(命中)價 | 低於普通輸入,折扣隨模型而定 | 約爲普通輸入的 1/10 | 低於普通輸入,折扣隨模型而定 |
| 存儲費 | 僅顯式緩存,按存儲時長計費 | 無,按寫入時選擇的有效期計 | 無 |
| 最低門檻 | 隨模型和渠道不同,Vertex 可能高於 Developer API | 隨模型不同,常見爲 1,024 或更高 | 通常 1,024 tokens 起 |
| 命中保證 | 隱式不保證,顯式較確定 | 標記斷點後,在有效期內通常穩定命中 | 自動前綴匹配,不保證 |
| 用量字段 | cachedContentTokenCount(含在 promptTokenCount 內) |
cache_creation_input_tokens、cache_read_input_tokens,與普通輸入 tokens 分開列出 |
prompt_tokens_details.cached_tokens(含在 prompt_tokens 內) |
這張表裏有三處最容易混淆:
- 寫入費:Claude 寫緩存要多付錢,讀緩存才便宜,所以“寫得多、讀得少”會比不用緩存更貴;OpenAI 沒有寫入費,不命中也不會多花錢;Gemini 隱式緩存同樣沒有寫入費,只有顯式緩存會產生創建與存儲成本。
- 誰來決定緩存:Claude 由請求方明確標記斷點,所以命中表現最可預期;OpenAI 與 Gemini 隱式緩存都由平臺自動判斷,開發者只能靠穩定前綴提高概率。這也是用戶感覺 Claude、OpenAI “命中穩定”而 Gemini 不穩定的原因之一:Gemini 要同時受門檻、前綴、渠道隔離幾項影響。
- 總輸入口徑:Gemini 與 OpenAI 的總輸入已包含緩存部分,要先扣除再計價;Claude 的
input_tokens不含緩存讀寫部分,三項要分別計價後相加。把一家的公式套到另一家,賬會算錯。通過 API易 apiyi.com 做跨模型對賬時,請先確認各家返回的字段口徑。

Gemini 緩存命中率快速上手:自己跑一次測試
理論說完,動手驗證最可靠。下面的思路是:構造一段超過最低門檻的固定長前綴,把變化的問題放在最後,連續請求幾次,觀察緩存 token 字段的變化。
極簡示例
以下代碼使用 OpenAI 兼容格式調用,並打印返回的用量信息。字段名以實際返回爲準,不同接入方式下緩存相關字段的命名可能不同:
import time
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # 使用 API易 統一接口
)
# 固定的長前綴:務必超過目標模型的最低緩存門檻
LONG_PREFIX = "這裏放一段穩定不變的長文檔或系統指令……" * 800
for i in range(3):
resp = client.chat.completions.create(
model="gemini-3.8-flash",
messages=[
{"role": "system", "content": LONG_PREFIX},
{"role": "user", "content": f"請用一句話總結,第 {i} 次提問"},
],
)
print(i, resp.usage)
time.sleep(2)
查看完整測試與核賬代碼
import time
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # 使用 API易 統一接口
)
LONG_PREFIX = "這裏放一段穩定不變的長文檔或系統指令……" * 800
def extract_cached_tokens(usage) -> int:
"""嘗試從 usage 中讀取緩存 token 數,字段名以實際返回爲準"""
details = getattr(usage, "prompt_tokens_details", None)
if details is not None:
cached = getattr(details, "cached_tokens", None)
if cached is not None:
return cached
return 0
def estimate_input_cost(total_in: int, cached: int,
normal_price: float, cached_price: float) -> float:
"""
按官方口徑估算輸入費用:
總輸入已包含緩存部分,所以普通部分 = 總輸入 - 緩存部分
單價請填入官方定價頁當前數值(每百萬 token)
"""
normal_part = total_in - cached
return (normal_part * normal_price + cached * cached_price) / 1_000_000
def run_test(model: str, rounds: int = 3):
results = []
for i in range(rounds):
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": LONG_PREFIX},
{"role": "user", "content": f"請用一句話總結,第 {i} 次提問"},
],
)
usage = resp.usage
cached = extract_cached_tokens(usage)
results.append((i, usage.prompt_tokens, cached))
print(f"第 {i} 次:總輸入={usage.prompt_tokens},緩存命中={cached}")
time.sleep(2)
return results
if __name__ == "__main__":
for m in ["gemini-3.8-flash"]:
print("模型:", m)
run_test(m)
🚀 快速開始:推薦使用 API易 apiyi.com 搭建這個對比測試。同一份腳本只需替換 model 參數,就能依次測 Gemini、OpenAI 和 Claude 系列,直觀看到不同模型的緩存表現差異。
測試時要控制的變量
跑測試時,建議逐條檢查下面這份清單,避免把“自己的問題”誤判成“鏈路的問題”:
| 檢查項 | 做法 | 目的 |
|---|---|---|
| 前綴長度 | 確保大於目標模型當前的最低門檻 | 排除門檻問題 |
| 前綴穩定性 | 不在開頭放時間戳、請求 ID | 排除前綴被破壞 |
| 變化內容位置 | 用戶問題放在最後 | 保證共同前綴最長 |
| 請求間隔 | 在較短時間內連續發送 | 符合官方建議 |
| 對照組 | 同一提示詞測 OpenAI 或 Claude | 判斷是模型機制還是鏈路問題 |
如何解讀測試結果
如果前綴足夠長、結構穩定、間隔很短,但 Gemini 仍然幾乎沒有緩存命中,而同樣的提示詞在 OpenAI 或 Claude 上命中正常,就說明差異來自 Gemini 自身的緩存機制和上游鏈路條件,而不是你的提示詞寫法。這時可以考慮改用顯式緩存,把需要複用的長內容固定下來,主動創建緩存對象並在請求中引用。
如果你的業務本來就是短對話,那麼與其追求命中率,不如接受 Gemini 在這類場景下緩存收益有限,把成本優化的重點放在模型選擇和輸出長度控制上。
常見問題
Q1: 爲什麼 Gemini 的緩存命中率明顯低於 OpenAI 和 Claude?
Gemini 的隱式緩存需要同時滿足模型支持、達到最低 token 門檻、前綴穩定、時間相近,Vertex 側還受項目隔離限制,並且官方明確不保證命中。任何一環不滿足,都會靜默按普通輸入計費。具體到某條鏈路的原因,需要結合上游請求記錄判斷。
Q2: Google 官方是否說過使用中轉會降低緩存命中率?
沒有。官方只給出了緩存依賴的條件:可複用的前綴、最低 token 門檻和作用範圍。如果鏈路改變了這些條件,命中率就可能下降。想對比不同模型的緩存表現,可以通過 API易 apiyi.com 用同一份提示詞做受控測試。
Q3: 緩存命中的部分是免費的嗎?
不是。命中部分按緩存輸入單價收費,價格低於普通輸入但並非爲零。兩端的定價頁都分別列出普通輸入與緩存輸入價格,顯式緩存另外還有存儲費。
Q4: 賬單上的輸入 token 要不要再單獨加緩存部分?
不要。`promptTokenCount` 是總輸入,已經包含緩存部分。應當用總輸入減去 `cachedContentTokenCount`,得到按普通價格計費的部分,再單獨計算緩存部分。
Q5: AI Studio 和 Vertex 的緩存門檻一樣嗎?
不完全一樣。按當前文檔,Gemini 3.1 Pro Preview 與 Gemini 3.8 Flash 在 Developer API 爲 4,096,在 Vertex 爲 6,144;舊一代的 Gemini 2.5 Pro 兩端都是 2,048。門檻會隨模型版本調整,建議以官方文檔當前數值爲準。
Q6: 換了 API Key,緩存會丟嗎?
要看是否換了項目。Vertex 的緩存按 Google Cloud 項目隔離,不跨項目共享,所以換到不同項目的 Key 會丟緩存;同一項目下的不同 Key 則不能直接認定丟失。
Q7: 我該用隱式緩存還是顯式緩存?
如果你有固定的大段內容(長文檔、長系統指令)需要被反覆引用,顯式緩存的確定性更好,但要承擔開發成本和存儲費。如果只是偶爾複用,隱式緩存零成本,但收益不可預期。可以先通過 API易 apiyi.com 做小規模對比,再決定是否投入顯式緩存的開發。
Q8: 中轉後臺顯示的命中率可以直接作爲對賬依據嗎?
不建議。應以官方原始響應的緩存字段爲準。另外,Google 上游的實際命中與中轉如何計入你的賬單是兩件事,後者需要覈對中轉自身的計費規則。
緩存命中率 Key Takeaways
- 現象是事實:OpenAI 與 Claude 系列緩存命中穩定,Gemini 命中率低甚至接近沒有,需要單獨分析。
- 官方不保證命中:Gemini 隱式緩存不保證節省費用,顯式緩存需要主動創建並引用緩存對象。
- 門檻因模型而異:新一代模型門檻更高,且 Vertex 與 Developer API 的數值可能不同。
- 前綴決定命中:長內容放開頭,開頭不要插入時間、ID 等變化內容,否則共同前綴被破壞。
- Vertex 按項目隔離:緩存不跨項目共享,請求分散到不同項目會丟失緩存。
- 總輸入含緩存:
promptTokenCount已包含緩存部分,核賬時要先扣除再分別計價。 - 用字段對賬:以官方響應的緩存字段爲準,並通過 API易 apiyi.com 做同提示詞的跨模型對比。
總結
Gemini 緩存命中率低,是由多個條件疊加造成的:隱式緩存不保證命中、最低 token 門檻隨模型升高、前綴必須穩定、Vertex 緩存按項目隔離,以及顯式緩存需要主動創建。其中後幾項在鏈路層面被改變時,命中率就會下降,但具體原因必須結合上游項目和請求記錄才能確定。
計費方面,記住三點:緩存命中不是免費;總輸入包含緩存部分,不能重複計費;顯式緩存另有存儲費,隱式緩存沒有。核賬以官方響應字段爲準,同時單獨覈對中轉的計費口徑。
下一步建議:用本文的測試腳本,在固定長前綴下對 Gemini 與 OpenAI、Claude 做一次對照測試,再決定是否引入顯式緩存。推薦通過 API易 apiyi.com 快速驗證效果,多個模型共用同一套接口,對比成本低。
參考資料
- Gemini API 緩存文檔:隱式緩存與顯式緩存的官方說明
- 鏈接:
ai.google.dev/gemini-api/docs/caching -
說明: 包含最低 token 門檻與計費因素
-
Gemini API 定價頁:普通輸入、緩存輸入、輸出與存儲價格
- 鏈接:
ai.google.dev/gemini-api/docs/pricing -
說明: 覈對當前單價的依據
-
Vertex AI 上下文緩存概覽:緩存的項目隔離與計費規則
- 鏈接:
docs.cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-overview -
說明: 說明 Vertex 緩存不跨項目共享
-
Gemini API generateContent 參考:響應中的 usageMetadata 字段
- 鏈接:
ai.google.dev/api/generate-content - 說明: 核賬時使用的緩存 token 字段
作者:APIYI Team
技術交流:歡迎在評論區討論 Gemini 緩存的排查經驗,更多資料可訪問 API易 docs.apiyi.com 文檔中心
