Quay lại blog
Hướng dẫn·24 tháng 5, 2026·Đọc 8 phút

Bộ nhớ đệm prompt của Anthropic — giảm 90% hóa đơn input trong 30 phút

Toàn cảnh: cách cache_control hoạt động, lý do định dạng OpenAI cần Kunavo tự thiết lập các điểm ngắt cho bạn, mô hình 4 điểm ngắt cho vòng lặp agent, những yếu tố âm thầm làm hỏng bộ nhớ đệm và cách xác minh tỷ lệ truy cập bộ nhớ đệm khác không. Bao gồm mức giá bộ nhớ đệm của Kunavo theo từng mẫu.

Nếu bạn gửi một system prompt dài — ngữ cảnh RAG, danh mục công cụ, quy tắc agent, ví dụ — có lẽ bạn đang trả toàn bộ giá đầu vào cho mỗi lượt gọi. Bộ nhớ đệm prompt của Anthropic giảm phần được lưu trong bộ nhớ đệm xuống 10% đơn giá. OpenAI cũng làm điều tương tự một cách ngầm định. Hầu hết các nhóm nhận thấy việc này đáng 30 phút triển khai vì nó thường xuyên giảm 60–90% dòng chi phí đầu vào.

Kunavo hỗ trợ cả hai. Các điểm ngắt cache_control của bạn đi nguyên vẹn qua Messages API; trên Chat Completions và Responses API — nơi định dạng không có trường tương ứng để gửi — Kunavo thiết lập chúng giúp bạn và bổ sung xung quanh phần bạn đã gửi mà không bao giờ vượt quá giới hạn 4. Bài viết này trình bày cả hai cách, các lỗi âm thầm làm bộ nhớ đệm mất hiệu lực và cách xác minh tỷ lệ cache hit.

Trước và sau

Một vòng lặp ngây thơ gửi cùng system prompt 18K token mười lần:

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.

Bây giờ đánh dấu khối system có thể lưu trong bộ nhớ đệm — thêm một trường:

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)

Bạn vừa tiết kiệm 78,5% chi phí đầu vào trong phiên này. Lượt gọi đầu tiên thực tế đắt hơn một chút so với phiên bản ngây thơ (~1,25× đơn giá đầu vào để ghi bộ nhớ đệm). Các lượt gọi từ 2 đến 10 trả 10% đơn giá. Điểm hòa vốn là lượt gọi 2 — đến lượt 3 bạn đã có lợi. Đến lượt 10 thì chênh lệch rất lớn.

Phong cách OpenAI: không cần làm gì

Định dạng OpenAI Chat Completions không có trường cache_control, vì OpenAI tự động lưu trong bộ nhớ đệm trên máy chủ của họ. Claude thì không — chỉ lưu những gì được đánh dấu bằng điểm ngắt. Vì vậy khi truy cập mô hình Claude qua /v1/chat/completions hoặc /v1/responses, Kunavo thiết lập các điểm ngắt thay bạn: một điểm ngắt trượt ở tin nhắn cuối khi cuộc hội thoại có ít nhất một lượt assistant, sau đó một điểm sau system và một điểm sau tools. Một tin nhắn system hoặc developer được gửi sau câu trả lời đầu tiên của mô hình vẫn nằm lại trong cuộc hội thoại thay vì được đưa lên system (trừ khi chính điểm ngắt của nó yêu cầu bộ nhớ đệm có thời hạn một giờ). Khi yêu cầu kết thúc bằng một tin nhắn như vậy, điểm ngắt trượt được đặt trên khối ngay trước nó, còn các điểm ngắt còn dư được đặt ngay trước những tin nhắn như vậy mà phía sau vẫn còn nội dung, bắt đầu từ tin nhắn nằm sau cùng. Mọi điểm ngắt bạn tự thiết lập được giữ nguyên đúng vị trí — Kunavo chỉ điền vào các vị trí bạn để trống, và chỉ cho đến khi tổng số đạt giới hạn 4 điểm ngắt. Không cần cấu hình, và cùng một mô hình có cùng chi phí dù bạn truy cập qua tuyến Anthropic hay 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.

Đọc usage.prompt_tokens_details.cached_tokens để xem bao nhiêu dữ liệu được phục vụ từ bộ nhớ đệm. Tiền tố cố định càng lớn thì càng tiết kiệm. Quy tắc đơn giản: nếu system prompt ngắn hơn nội dung user biến đổi, bộ nhớ đệm không giúp được nhiều. Hãy định hình lại prompt để phần tĩnh lớn và nằm ở đầu.

Bộ nhớ đệm nhiều lớp — tối đa 4 điểm ngắt

Với các vòng lặp agent trong đó một số lớp thay đổi nhanh hơn lớp khác, hãy thiết lập nhiều điểm ngắt cache_control. Mỗi điểm là ảnh chụp của mọi thứ cho đến vị trí đó:

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.

Khóa bộ nhớ đệm là toàn bộ tiền tố. Thêm một token ở vị trí N sẽ làm mất hiệu lực mọi điểm ngắt tại hoặc sau N. Thứ tự rất quan trọng: nội dung ổn định nhất trước. Lớp quy tắc hiếm khi thay đổi; cơ sở tri thức cập nhật hàng tuần; cuộc hội thoại tăng lên sau mỗi lượt.

Các cách phổ biến âm thầm làm hỏng bộ nhớ đệm

  • Đưa ngày hiện tại hoặc request_id vào prompt. Mỗi lượt gọi là một tiền tố mới, tỷ lệ cache hit là 0%. Hãy băm các đầu vào prompt và so sánh giữa các lượt gọi.
  • Ghép system prompt không xác định. Nếu xây dựng system từ một dict, thứ tự lặp qua dict quan trọng trong một số phiên bản Python. Hãy sắp xếp khóa một cách rõ ràng.
  • Thời gian tồn tại của bộ nhớ đệm là khoảng 5 phút. Mẫu lưu lượng thưa (một lượt gọi mỗi 10 phút) sẽ không có cache hit. Hãy gom các lượt gọi theo lô hoặc chấp nhận phần thất thoát.
  • Mức tối thiểu 1.024 token. Dưới 1K token, bộ nhớ đệm kiểu OpenAI không hoạt động. Hãy gộp các mảnh tĩnh nhỏ thành một tiền tố dài duy nhất.
  • Công cụ / định nghĩa hàm là một phần của tiền tố. Thêm công cụ mới vào danh mục sẽ làm mất hiệu lực bộ nhớ đệm của mọi người. Hãy giữ danh mục công cụ ổn định và lập phiên bản cho nó.

Xác minh tỷ lệ cache hit

Bộ nhớ đệm mà bạn không thể nhìn thấy không phải kỹ thuật — đó là hy vọng. Hãy ghi log usage ở mỗi lượt gọi:

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.

Trong bảng điều khiển Kunavo, trang Usage hiển thị phân bổ bộ nhớ đệm theo từng mô hình mỗi ngày. Nếu thấy cache_read_input_tokens tăng dần theo tỷ lệ phần trăm của tổng đầu vào, bộ nhớ đệm đang hoạt động. Nếu vẫn ở 0 hoặc dao động mạnh, hãy kiểm tra danh sách lỗi ở trên.

Chi phí thực tế trên Kunavo

Tỷ lệ bộ nhớ đệm của mọi mô hình được công bố trên trang giá:

  • Mô hình Anthropic: lượt đọc từ bộ nhớ đệm bằng 10% đơn giá đầu vào — 2,5% ở Claude Fable 5.1; 5% ở Claude Opus 5.5. Lượt ghi bộ nhớ đệm bằng 1,25× đơn giá đầu vào — hệ số năm phút của Anthropic — và Kunavo tính lượt ghi một giờ theo cùng mức 1,25×, thấp hơn mức 2× của Anthropic.
  • Mô hình OpenAI / Gemini: lượt đọc từ bộ nhớ đệm bằng 10% đơn giá đầu vào (tỷ lệ được các nhà cung cấp công bố). Lượt ghi bộ nhớ đệm là 1,25× trên GPT-5.6 và GPT-6 Astra, còn mọi mô hình khác dùng đúng đơn giá đầu vào.
  • Mọi mức giá bộ nhớ đệm đã bao gồm chiết khấu mô hình của Kunavo (thấp hơn giá niêm yết upstream tùy mô hình). Vì vậy lượt đọc cache Sonnet 4.6 trên Kunavo là $3 × 0.40 × 0.10 = $0.12 per 1M tokens. Rẻ hơn khoảng 25× so với đơn giá upstream khi không lưu trong bộ nhớ đệm.

Khi bộ nhớ đệm không phải là câu trả lời

Một vài trường hợp công sức bỏ ra không đáng:

  • Prompt ngắn (tổng cộng <1K token). Chi phí phụ trội chiếm ưu thế; đơn giản là không cần làm.
  • Nhiệm vụ một lần không có lưu lượng lặp lại. Lượt gọi đầu tiên đắt hơn một chút — bộ nhớ đệm chỉ hoàn vốn từ lượt gọi 2 trở đi.
  • Nhiệm vụ đầu ra cao, đầu vào thấp (viết sáng tạo, sinh mã). Đầu vào vốn chỉ chiếm phần nhỏ của hóa đơn. Thay vào đó, hãy tập trung giới hạn ngân sách đầu ra.

Với mọi trường hợp còn lại — chatbot RAG, agent có danh mục công cụ cố định, bộ phân loại chạy trên rubric tĩnh, pipeline trích xuất có cấu trúc với few-shot nhất quán — bộ nhớ đệm là tối ưu hóa có ROI cao nhất mà bạn có thể triển khai trong một buổi chiều. Kết hợp với bốn kỹ thuật khác trong hướng dẫn tối ưu chi phí của chúng tôi, mức giảm 70% chi phí là thực tế mà không phải đánh đổi chất lượng đầu ra.

Đang dùng Kunavo? Mở /app/usage và kiểm tra cột cache cho mô hình lớn nhất của bạn. Nếu giá trị bằng 0, bạn đang bỏ lỡ cơ hội tiết kiệm chi phí. Hướng dẫn đầy đủ: /docs/caching.