· ai-tools / llm / prompt-caching
Prompt caching năm 2026 — so sánh Anthropic, OpenAI và Gemini
Prompt caching giảm chi phí LLM 90%. Anthropic yêu cầu đánh dấu tường minh, OpenAI cache tự động, Gemini tính phí theo giờ. Đây là cách chọn đúng.
Bởi Ethan
3.069 từ · 16 phút đọc
Gửi một system prompt 50,000 token trong mỗi lần gọi API sẽ tốn $0.15 mỗi lần ở mức giá cơ bản của Sonnet 4.6. Với 10,000 lần gọi mỗi ngày, đó là $1,500 cho phần context bạn gửi đi không thay đổi mỗi lần. Cả ba nhà cung cấp LLM lớn hiện nay đều cung cấp prompt caching: cache prefix đó và đọc lại với chi phí chỉ bằng 10% giá gốc. Cơ chế của từng provider khác nhau đáng kể: Anthropic yêu cầu đánh dấu tường minh, OpenAI cache tự động mà không cần thay đổi code, còn Gemini tính thêm phí lưu trữ theo giờ — điều này thay đổi phép tính với các workload ít traffic.
Chọn Anthropic nếu bạn cần số liệu latency đã được kiểm chứng, kiểm soát tường minh các cache breakpoint, và chi phí theo token có thể dự đoán được. Chọn OpenAI nếu bạn muốn caching hoạt động mà không cần động vào API call. Chọn Gemini nếu bạn đang cache các asset multimodal lớn — video, PDF — và chấp nhận được mô hình tính phí lưu trữ.
Bài viết này dành cho ai
Các developer đang thêm caching vào integration LLM hiện có, hoặc đang chọn provider với caching là một yêu cầu. Nếu bạn chưa đạt ngưỡng tối thiểu 1,024 token, caching chưa áp dụng được cho bạn.
Prompt caching là gì
Khi bạn gọi một LLM, model sẽ chạy prefill trên toàn bộ input token trước khi tạo ra token output đầu tiên. Bước prefill này chiếm phần lớn thời gian đến token đầu tiên (TTFT). Prompt caching lưu trữ biểu diễn tensor key-value (KV) của prefix prompt trên server của provider. Với các request tiếp theo có prefix giống hệt, model bỏ qua hoàn toàn bước prefill cho các token đó và đọc tensor đã cache trực tiếp.
Kết quả: TTFT thấp hơn và chi phí per-token thấp hơn cho phần đã cache. Hạn chế: prefix phải khớp byte-cho-byte — một ký tự thay đổi là cache miss. Context theo từng request như timestamp, user ID, hoặc session token phải đặt sau cache boundary.
Anthropic — explicit prefix caching
Caching của Anthropic do developer kiểm soát. Bạn đặt marker cache_control: {type: "ephemeral"} trong API request để xác định điểm kết thúc của prefix được cache. Hệ thống hash mọi thứ đến block đó và kiểm tra cache store. Khi cache hit, các token đó tốn $0.30/M với Sonnet 4.6 thay vì $3.00/M — giảm 90%.
Cơ chế hoạt động
Thứ tự cache: tools → system → messages. Thay đổi tools sẽ invalidate cache của system và messages. Thay đổi system sẽ invalidate cache của messages. System prompt tĩnh nên đặt trong system; context theo từng user đặt trong messages sau breakpoint.
Bạn có thể đặt tối đa 4 breakpoint trong một request. Cache tìm lại tối đa 20 block từ mỗi breakpoint để tìm lần ghi trước, nên các conversation thread ngày càng dài vẫn có cache hit ngay cả khi tích lũy nhiều lượt. Mỗi cache hit sẽ reset TTL 5 phút mà không tốn thêm chi phí.
Với workload có khoảng ngừng dài hơn 5 phút, có thể dùng TTL 1 giờ với giá gấp 2 lần chi phí input cơ bản.
Bảng giá (theo 1M token)
| Model | Input cơ bản | Ghi 5 phút | Ghi 1 giờ | Đọc cache | Output |
|---|---|---|---|---|---|
| Claude Opus 4.8 | $5.00 | $6.25 | $10.00 | $0.50 | $25.00 |
| Claude Sonnet 4.6 | $3.00 | $3.75 | $6.00 | $0.30 | $15.00 |
| Claude Haiku 4.5 | $1.00 | $1.25 | $2.00 | $0.10 | $5.00 |
Chi phí ghi là 1.25 lần giá cơ bản với tùy chọn 5 phút. Chi phí đọc là 0.10 lần giá cơ bản.
Token tối thiểu: 1,024 với Opus 4.8 và Sonnet 4.6; 4,096 với Haiku 4.5 và các phiên bản Opus cũ.
Tác động đến latency (benchmark từ Anthropic)
| Kịch bản | Token được cache | TTFT trước | TTFT sau | Mức giảm |
|---|---|---|---|---|
| Chat với cuốn sách 100k token | ~100,000 | 11.5 s | 2.4 s | 79% |
| Multi-turn với system prompt dài | System prompt dài | ~10 s | ~2.5 s | 75% |
| Many-shot prompting | ~10,000 | 1.6 s | 1.1 s | 31% |
Các con số này đến từ bài đăng benchmark của Anthropic tại claude.com/blog/prompt-caching. Mức giảm chi phí trong cùng các kịch bản: 90%, 53%, và 86%.
Lưu ý quan trọng
Yêu cầu khớp chính xác. Bất kỳ thay đổi byte nào — một khoảng trắng thừa, thiết lập image detail khác, timestamp trong prompt — đều là cache miss. Kiểm tra kỹ code xây dựng prompt của bạn trước khi giả định prefix đã ổn định.
Request đầu tiên đồng thời. Cache entry chỉ khả dụng sau khi response đầu tiên bắt đầu streaming. Các request song song đến trước khi response đầu tiên hoàn tất đều sẽ là cache miss. Hãy khởi động cache bằng một request tuần tự trước khi mở rộng quy mô.
Thinking blocks. Với một số model variant, nội dung user không phải tool-result sẽ xóa thinking block trước đó khỏi cache. Kiểm tra tài liệu của model cụ thể trước khi dựa vào cached multi-turn thinking chain.
Ví dụ code
import anthropic
client = anthropic.Anthropic()
# Request đầu tiên — ghi cache (trả 1.25× cơ bản cho token được cache)
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{"type": "text", "text": "You are an expert analyzing legal documents."},
{
"type": "text",
"text": "<full legal document — 50,000 tokens>",
"cache_control": {"type": "ephemeral"}, # cache mọi thứ đến đây
},
],
messages=[{"role": "user", "content": "Summarize the key liability clauses."}],
)
# Kiểm tra usage để xác nhận ghi cache
print(response.usage.cache_creation_input_tokens) # > 0 ở lần gọi đầu
print(response.usage.cache_read_input_tokens) # 0 ở lần gọi đầu
# Request tiếp theo trong vòng 5 phút — đọc cache (trả 0.10× cơ bản)
response2 = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{"type": "text", "text": "You are an expert analyzing legal documents."},
{
"type": "text",
"text": "<full legal document — identical to above>",
"cache_control": {"type": "ephemeral"},
},
],
messages=[{"role": "user", "content": "What are the termination conditions?"}],
)
print(response2.usage.cache_read_input_tokens) # > 0 khi cache hit
print(response2.usage.cache_creation_input_tokens) # 0 khi cache hit
Để xem hướng dẫn triển khai đầy đủ — bao gồm prompt caching cùng với tool use và Message Batches API — xem Claude API 2026: Prompt Caching, Tool Use & Batches.
OpenAI — caching tự động
Caching của OpenAI hoàn toàn tự động. Không cần flag API, không cần thay đổi code. Hệ thống định tuyến request dựa trên hash của prefix prompt (khoảng 256 token đầu tiên) và trả về kết quả đã cache khi tìm thấy prefix khớp trên cùng server.
Cơ chế hoạt động
Hai tham số opt-in giúp tăng tỷ lệ cache hit.
prompt_cache_key: Gợi ý định tuyến, nhóm các request cùng prefix dài về cùng server. Nếu không có tham số này, request có thể đến các máy khác nhau và miss cache dù prefix giống hệt. Giữ mỗi tổ hợp (prefix, cache_key) dưới 15 request mỗi phút; vượt ngưỡng đó, request sẽ tràn sang server không cache.
prompt_cache_retention: "24h": Mở rộng cache từ in-memory (5–10 phút khi không hoạt động, tối đa 1 giờ) lên storage GPU-local 24 giờ. Hiện có trên GPT-5.5, GPT-5.5-pro, GPT-5.4, GPT-5.2, GPT-5.1, GPT-5, GPT-5-codex, và GPT-4.1 tính đến giữa năm 2026. Đây là lợi thế cạnh tranh đáng kể nhất của OpenAI trong lĩnh vực này: các workflow batch qua đêm và serverless deployment có thể giữ cache qua khoảng thời gian nhàn rỗi mà không cần bất kỳ logic khởi động nào.
Bảng giá
Không tính phí ghi thêm. Cache read tính giá thấp hơn đến 90% so với chi phí input token thông thường. Trang giá của OpenAI trả về HTTP 403 trong quá trình thu thập dữ liệu cho bài viết này, nên mức giá chính xác theo từng model chưa được xác minh độc lập. Mức giảm 90% được nêu trong tài liệu developer tại developers.openai.com/api/docs/guides/prompt-caching.
Token tối thiểu: 1,024. Dưới mức đó, cached_tokens: 0 xuất hiện trong response — không có lỗi, không có phạt.
Tác động đến latency
OpenAI tuyên bố giảm latency lên đến 80%. Không có bảng benchmark theo từng model hay phương pháp đo lường nào được công bố. Hãy coi đây là ước tính cận trên.
Lưu ý quan trọng
Không thể xóa cache thủ công. Việc loại bỏ cache diễn ra tự động khi không hoạt động. Nếu prefix của bạn đã cũ và đang trả về kết quả sai, bạn không thể ép buộc làm mới — phải chờ TTL hết hạn hoặc thay đổi prefix.
Miss cache do rate limit. Khi vượt 15 request mỗi phút với cùng prefix, tỷ lệ tràn sang server không cache tăng lên. Dùng prompt_cache_key để tập trung traffic trên một đường định tuyến.
Rate limit vẫn áp dụng. Token từ cache tính vào giới hạn TPM như token không cache.
usage.prompt_tokens_details.cached_tokens trong response cho biết có bao nhiêu token được lấy từ cache. Theo dõi điều này trong production để xác nhận cache đang hoạt động.
Ví dụ code
from openai import OpenAI
client = OpenAI()
STATIC_SYSTEM = """You are a senior financial analyst specializing in equity research.
[... 2,000+ tokens of background knowledge ...]"""
# Lần gọi đầu tiên — tự động miss cache (không cần thay đổi code)
response = client.responses.create(
model="gpt-5",
prompt_cache_key="equity-analyst-v1", # gợi ý định tuyến cho consistent hashing
prompt_cache_retention="24h", # chỉ dành cho GPT-5.x
input=[
{"role": "system", "content": STATIC_SYSTEM},
{"role": "user", "content": "Analyze AAPL Q2 2026 earnings."},
],
)
# Các lần gọi tiếp theo — cache hit khi prefix khớp
response2 = client.responses.create(
model="gpt-5",
prompt_cache_key="equity-analyst-v1",
prompt_cache_retention="24h",
input=[
{"role": "system", "content": STATIC_SYSTEM}, # phải khớp byte-cho-byte
{"role": "user", "content": "Compare MSFT Q2 2026 to AAPL."},
],
)
cached = response2.usage.prompt_tokens_details.cached_tokens
print(f"Token từ cache: {cached}")
Gemini — hai chế độ, một hóa đơn thêm
Gemini có hai chế độ caching. Implicit caching (chỉ Gemini 2.5 trở lên) không yêu cầu thay đổi code và chuyển tiền tiết kiệm cho bạn khi có cache hit. Explicit caching cho phép bạn tạo đối tượng CachedContent có tên, tham chiếu trong request, và trả phí lưu trữ theo giờ trong khi cache đang hoạt động.
Bảng giá (theo 1M token)
| Model | Input cơ bản | Đọc cache | Lưu trữ mỗi giờ |
|---|---|---|---|
| Gemini 2.5 Flash | $0.30 | $0.03 | $1.00 |
| Gemini 2.5 Pro (≤200k ctx) | $1.25 | $0.125 | $4.50 |
| Gemini 2.5 Pro (>200k ctx) | $2.50 | $0.25 | $4.50 |
| Gemini 3.5 Flash | $1.50 | $0.15 | $1.00 |
| Gemini 3.1 Pro Preview (≤200k) | $2.00 | $0.20 | $4.50 |
Cache read giảm 90% so với giá input cơ bản — cùng mức chiết khấu với Anthropic và OpenAI. Điểm khác biệt nằm ở phí lưu trữ: Gemini explicit caching tốn $1.00–$4.50 trên 1M token cache mỗi giờ, bất kể có bao nhiêu request đọc cache.
Điểm hòa vốn của Gemini 2.5 Pro: Lưu trữ tốn $4.50/M/giờ. Mỗi lần đọc cache tiết kiệm $1.125/M ($1.25 − $0.125). Bạn cần khoảng 4 lần đọc mỗi giờ trên mỗi 1M token cache để chi phí lưu trữ mới hòa vốn. Với workload ít traffic, explicit caching có thể tốn hơn so với việc gửi lại token.
Token tối thiểu: 2,048 với Gemini 2.5 Flash và Pro; 4,096 với Gemini 3.5 Flash và 3.1 Pro Preview.
Tác động đến latency
Không có con số latency nào được công bố. Google lưu ý rằng không có SLA về latency gắn với implicit cache hit. usage_metadata.cached_content_token_count trong response cho biết bao nhiêu token đến từ cache, nhưng benchmark TTFT không có trong tài liệu.
Lưu ý quan trọng
Phí lưu trữ tích lũy nhanh. Cache 1M token trên Gemini 2.5 Pro tốn $4.50/giờ. Để chạy 8 giờ và bạn đã chi $36 trước khi có query nào. Xóa cache khi dùng xong.
Thứ tự là bắt buộc. Nội dung được cache luôn là prefix. Context tĩnh phải đặt ở đầu prompt — bạn không thể cache phần giữa.
Không thể kiểm tra nội dung. Bạn không thể xem nội dung bên trong cache — chỉ có metadata: name, model, expire_time. Debug quá trình xây dựng cache trước khi tạo, không phải sau.
ttl và expire_time loại trừ lẫn nhau khi cập nhật cache. Chỉ truyền một trong hai, không dùng cả hai.
Ví dụ code
from google import genai
from google.genai import types
import io
import httpx
client = genai.Client()
# Tải document lớn lên một lần (trả đủ chi phí một lần)
pdf_bytes = httpx.get("https://example.com/large-report.pdf").content
document = client.files.upload(
file=io.BytesIO(pdf_bytes),
config=dict(mime_type="application/pdf"),
)
# Tạo cache — bắt đầu tính phí lưu trữ theo giờ
cache = client.caches.create(
model="gemini-2.5-flash",
config=types.CreateCachedContentConfig(
display_name="quarterly-report-2026",
system_instruction="You are a financial analyst. Answer based on the provided report.",
contents=[document],
ttl="3600s",
),
)
# Nhiều query — mỗi query trả giá đọc cache, không phải giá input đầy đủ
for question in [
"What was total revenue in Q1?",
"Summarize the risk factors.",
"Compare operating margins to prior year.",
]:
response = client.models.generate_content(
model="gemini-2.5-flash",
contents=question,
config=types.GenerateContentConfig(cached_content=cache.name),
)
meta = response.usage_metadata
print(f"Token từ cache: {meta.cached_content_token_count}")
# Xóa khi xong — ngừng trả phí lưu trữ
client.caches.delete(cache.name)
So sánh
| Tính năng | Anthropic Claude | OpenAI | Google Gemini |
|---|---|---|---|
| Loại caching | Explicit (developer kiểm soát) | Tự động | Implicit (auto, 2.5+) + explicit |
| Token tối thiểu | 1,024 (hầu hết model); 4,096 (Haiku 4.5, Opus cũ) | 1,024 | 2,048 (2.5 Flash/Pro); 4,096 (khác) |
| TTL | 5 phút mặc định; 1 giờ với giá 2× input cơ bản | 5–10 phút khi không hoạt động, tối đa 1 giờ; 24 giờ trên GPT-5.x | 1 giờ mặc định; có thể cấu hình |
| Phí ghi thêm | +25% hơn cơ bản (5 phút); +100% (1 giờ) | Không | Phí lưu trữ theo giờ ($1.00–$4.50/M/giờ) |
| Chiết khấu đọc cache | Giảm 90% | Giảm đến 90% | Giảm 90% |
| Mức giảm TTFT đã công bố | 31–79% (đã benchmark) | Đến 80% (tuyên bố, không có phương pháp) | Chưa công bố |
| Số breakpoint tối đa | 4 mỗi request | Không áp dụng (tự động) | Không áp dụng (một prefix mỗi request) |
| Quản lý cache thủ công | Một phần (reset TTL khi hit) | Không | CRUD đầy đủ |
| Hỗ trợ multimodal | Hình ảnh, tài liệu | Hình ảnh, tools | Video, PDF, audio, hình ảnh |
| Lưu trữ mở rộng | 1 giờ (opt-in) | 24 giờ trên GPT-5.x | TTL có thể cấu hình |
| Chia sẻ cross-request | Cấp workspace (Claude API) | Cấp organization | Cấp project |
Khi nào chọn provider nào
Anthropic nếu bạn muốn kiểm soát tối đa và dữ liệu minh bạch nhất. Các benchmark là con số thực từ nguồn công khai, có thể trích dẫn — bạn có thể chạy workload tương tự và so sánh. Bốn breakpoint tường minh mỗi request cho phép cache riêng tools, system context, và lịch sử conversation chung. Chiết khấu đọc 90% ngang với đối thủ. Hạn chế chính: bạn phải đánh dấu prompt bằng marker, và TTL mặc định 5 phút là ngắn với session ít sử dụng (tùy chọn 1 giờ có nhưng tốn thêm chi phí).
OpenAI nếu bạn muốn caching không cần thay đổi code, đặc biệt với workload serverless hay edge khi việc khởi động cache trước không thực tế. Thời gian lưu trữ 24 giờ trên GPT-5.x là lợi thế cụ thể cho các pipeline batch qua đêm. Điều bạn đánh đổi: không có benchmark latency đã công bố, không có kiểm soát chi tiết cache breakpoint, không có cách ép buộc làm mới cache khi nội dung đã cũ.
Gemini nếu bạn đang cache các asset multimodal lớn. Tải video 2 giờ lên một lần và query 50 lần là chính xác workload mà Gemini explicit caching được xây dựng cho — gửi lại nội dung nhị phân lớn theo từng request tốn kém đến mức không thực tế, và phí lưu trữ không đáng kể khi thay thế là hàng gigabyte dữ liệu qua mạng. Với workload chỉ có text và traffic thấp, hãy tính điểm hòa vốn trước khi thêm explicit caching: ở mức giá Gemini 2.5 Pro, bạn cần ít nhất 4 lần đọc mỗi giờ trên mỗi 1M token cache để bù đắp chi phí lưu trữ.
Để hiểu prompt caching nằm trong bức tranh chi phí lớn hơn của hệ thống AI production, xem chi phí thực của việc vận hành AI agent team năm 2026.
Đo lường hiệu quả caching
Cache chỉ tiết kiệm tiền nếu thực sự có cache hit. Thêm các trường này vào mỗi response log:
- Anthropic:
usage.cache_creation_input_tokensvàusage.cache_read_input_tokens - OpenAI:
usage.prompt_tokens_details.cached_tokens - Gemini:
usage_metadata.cached_content_token_count
Nếu tỷ lệ hit dưới 60% với các prompt bạn kỳ vọng có cache, có điều gì đó đang phá vỡ cache key — timestamp trong phần tĩnh của prompt, metadata theo từng request được đặt trước breakpoint, hoặc thiết lập model detail thay đổi theo request. Sửa logic xây dựng trước khi kết luận caching không hoạt động.
Nếu caching giảm chi phí mỗi lần gọi nhưng tổng ngân sách API vẫn cao, LLM cost routing có thể cắt giảm thêm bằng cách chuyển các query đơn giản sang model rẻ hơn — mức giảm 80% là phổ biến với workload phân loại hoặc tóm tắt.
Các công cụ observability như Braintrust và LangSmith hiển thị tỷ lệ cache hit và phân bổ chi phí theo session, giúp dễ dàng xác định phần nào của prompt gây ra miss.
Nguồn tham khảo
- Cơ chế và bảng giá Anthropic caching: platform.claude.com/docs/en/docs/build-with-claude/prompt-caching
- Benchmark TTFT và chi phí của Anthropic: claude.com/blog/prompt-caching
- Hướng dẫn OpenAI caching: developers.openai.com/api/docs/guides/prompt-caching
- Cơ chế Gemini caching: ai.google.dev/gemini-api/docs/caching
- Bảng giá Gemini: ai.google.dev/pricing