{"product_id":"prompt-caching-tiết-kiệm-90-chi-phi-cho-system-prompt-lặp-lại","title":"Prompt Caching — Tiết kiệm 90% chi phí cho system prompt lặp lại","description":"\n\u003cp\u003eTrong hầu hết ứng dụng sử dụng Claude API, system prompt chiếm phần lớn input token nhưng lại giống hệt nhau qua hàng nghìn request. Prompt Caching cho phép bạn lưu trữ phần nội dung tĩnh này trên server của Anthropic, giúp giảm tới 90% chi phí input token và tăng tốc thời gian phản hồi. Bài viết này hướng dẫn chi tiết cách triển khai, tính toán chi phí, và các chiến lược tối ưu.\u003c\/p\u003e\n\n\u003ch2\u003ePrompt Caching hoạt động như thế nào?\u003c\/h2\u003e\n\u003cp\u003eKhi bạn gửi một request tới Claude API, phần lớn input thường gồm: system prompt (hướng dẫn cho model), context cố định (tài liệu tham khảo, few-shot examples), và nội dung thay đổi (câu hỏi của người dùng). Prompt Caching cho phép bạn đánh dấu phần nội dung tĩnh để Anthropic lưu cache trên server.\u003c\/p\u003e\n\u003cp\u003eCơ chế hoạt động cụ thể:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eLần gọi đầu tiên (cache write):\u003c\/strong\u003e toàn bộ nội dung được gửi và xử lý bình thường. Phần được đánh dấu cache sẽ được lưu trên server. Bạn trả thêm 25% phí cho phần được cache (cache write cost)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eCác lần gọi tiếp theo (cache hit):\u003c\/strong\u003e phần đã cache không cần gửi lại, chỉ tính 10% giá gốc. Thời gian xử lý cũng nhanh hơn vì model không cần đọc lại phần đã cache\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eKhi cache hết hạn (cache miss):\u003c\/strong\u003e quay lại trạng thái ban đầu, cần cache write lại\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eThời gian sống của cache (TTL)\u003c\/h3\u003e\n\u003cp\u003eCache có thời gian sống mặc định là 5 phút kể từ lần sử dụng cuối cùng. Mỗi lần cache hit sẽ reset TTL về 5 phút. Nghĩa là nếu ứng dụng của bạn có request liên tục (ít nhất 1 request mỗi 5 phút), cache sẽ không bao giờ hết hạn.\u003c\/p\u003e\n\n\u003ch2\u003eTriển khai Prompt Caching trong Python\u003c\/h2\u003e\n\u003cp\u003eĐể sử dụng Prompt Caching, bạn thêm thuộc tính cache_control vào phần nội dung muốn cache. Yêu cầu tối thiểu là nội dung cache phải đạt 1.024 token trở lên cho Claude Sonnet và Opus, hoặc 2.048 token cho Claude Haiku.\u003c\/p\u003e\n\n\u003ch3\u003eCách đánh dấu cache cho system prompt\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003eimport anthropic\n\nclient = anthropic.Anthropic()\n\n# System prompt dai (thuong la huong dan chi tiet cho model)\nsystem_prompt = \"\"\"Ban la tro ly ho tro khach hang cua cong ty XYZ.\nQuy tac xu ly:\n1. Luon chao hoi lich su truoc khi tra loi\n2. Neu khach hoi ve gia, tham khao bang gia duoi day\n3. Neu khach khieu nai, the hien su thong cam truoc\n4. Khong bao gio hua dieu gi ngoai chinh sach\n5. Ket thuc bang cau hoi \"Con dieu gi toi co the giup ban?\"\n\nBang gia san pham:\n[... danh sach 500 san pham voi gia ...]\n\nChinh sach doi tra:\n[... 2000 tu mo ta chinh sach ...]\n\nFAQ:\n[... 3000 tu cac cau hoi thuong gap ...]\n\"\"\"\n\nresponse = client.messages.create(\n    model=\"claude-sonnet-4-20250514\",\n    max_tokens=1024,\n    system=[\n        {\n            \"type\": \"text\",\n            \"text\": system_prompt,\n            \"cache_control\": {\"type\": \"ephemeral\"}\n        }\n    ],\n    messages=[\n        {\"role\": \"user\", \"content\": \"San pham A gia bao nhieu?\"}\n    ]\n)\n\n# Kiem tra cache usage\nprint(f\"Cache write tokens: {response.usage.cache_creation_input_tokens}\")\nprint(f\"Cache read tokens: {response.usage.cache_read_input_tokens}\")\nprint(f\"Uncached tokens: {response.usage.input_tokens}\")\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eCache nhiều block nội dung\u003c\/h3\u003e\n\u003cp\u003eBạn có thể đánh dấu cache cho nhiều phần khác nhau, ví dụ system prompt và conversation history:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eresponse = client.messages.create(\n    model=\"claude-sonnet-4-20250514\",\n    max_tokens=1024,\n    system=[\n        {\n            \"type\": \"text\",\n            \"text\": system_prompt,\n            \"cache_control\": {\"type\": \"ephemeral\"}\n        }\n    ],\n    messages=[\n        # Lich su hoi thoai cu (cache lai)\n        {\"role\": \"user\", \"content\": \"Xin chao\"},\n        {\"role\": \"assistant\", \"content\": \"Xin chao! Toi co the giup gi cho ban?\"},\n        {\"role\": \"user\", \"content\": \"Cho toi xem bang gia\"},\n        {\n            \"role\": \"assistant\",\n            \"content\": [\n                {\n                    \"type\": \"text\",\n                    \"text\": \"Day la bang gia cua chung toi: ...\",\n                    \"cache_control\": {\"type\": \"ephemeral\"}\n                }\n            ]\n        },\n        # Tin nhan moi (khong cache)\n        {\"role\": \"user\", \"content\": \"San pham B co giam gia khong?\"}\n    ]\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTriển khai trong Node.js\u003c\/h2\u003e\n\u003cp\u003eCú pháp tương tự trong JavaScript\/TypeScript:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eimport Anthropic from \"@anthropic-ai\/sdk\";\n\nconst client = new Anthropic();\n\nasync function chatWithCaching(userMessage, conversationHistory) {\n  const systemContent = [\n    {\n      type: \"text\",\n      text: longSystemPrompt,\n      cache_control: { type: \"ephemeral\" }\n    }\n  ];\n\n  \/\/ Danh dau cache cho message cuoi trong lich su hoi thoai\n  const messages = [...conversationHistory];\n  if (messages.length \u0026gt; 0) {\n    const lastMsg = messages[messages.length - 1];\n    if (typeof lastMsg.content === \"string\") {\n      messages[messages.length - 1] = {\n        ...lastMsg,\n        content: [\n          {\n            type: \"text\",\n            text: lastMsg.content,\n            cache_control: { type: \"ephemeral\" }\n          }\n        ]\n      };\n    }\n  }\n\n  \/\/ Them tin nhan moi cua nguoi dung\n  messages.push({ role: \"user\", content: userMessage });\n\n  const response = await client.messages.create({\n    model: \"claude-sonnet-4-20250514\",\n    max_tokens: 1024,\n    system: systemContent,\n    messages: messages\n  });\n\n  console.log(\"Cache write:\", response.usage.cache_creation_input_tokens);\n  console.log(\"Cache read:\", response.usage.cache_read_input_tokens);\n\n  return response;\n}\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eTính toán chi phí tiết kiệm\u003c\/h2\u003e\n\u003cp\u003eGiả sử bạn có system prompt dài 4.000 token và nhận 1.000 request mỗi ngày. Sử dụng Claude Sonnet:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eKịch bản\u003c\/th\u003e\n      \u003cth\u003eChi phí input mỗi request\u003c\/th\u003e\n      \u003cth\u003eChi phí 1.000 request\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eKhông cache\u003c\/td\u003e\n      \u003ctd\u003e4.000 x $3\/1M = $0.012\u003c\/td\u003e\n      \u003ctd\u003e$12.00\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCache (lần đầu - write)\u003c\/td\u003e\n      \u003ctd\u003e4.000 x $3.75\/1M = $0.015\u003c\/td\u003e\n      \u003ctd\u003e$0.015 (1 lần)\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eCache (999 lần sau - hit)\u003c\/td\u003e\n      \u003ctd\u003e4.000 x $0.30\/1M = $0.0012\u003c\/td\u003e\n      \u003ctd\u003e$1.20\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTổng với cache\u003c\/td\u003e\n      \u003ctd\u003e-\u003c\/td\u003e\n      \u003ctd\u003e$1.215\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eTiết kiệm\u003c\/td\u003e\n      \u003ctd\u003e-\u003c\/td\u003e\n      \u003ctd\u003e$10.785 (89.9%)\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eCon số tiết kiệm phụ thuộc vào hai yếu tố: tỷ lệ cache hit (càng cao càng tiết kiệm) và kích thước phần được cache so với phần không cache (phần cache càng lớn, tiết kiệm càng nhiều).\u003c\/p\u003e\n\n\u003ch3\u003eCông thức tính chi phí\u003c\/h3\u003e\n\u003cpre\u003e\u003ccode\u003edef estimate_caching_savings(\n    cached_tokens,\n    uncached_tokens_per_request,\n    total_requests,\n    cache_hit_rate=0.95,\n    model=\"claude-sonnet-4-20250514\"\n):\n    \"\"\"Uoc tinh chi phi tiet kiem khi dung Prompt Caching.\"\"\"\n    # Gia cho Claude Sonnet (USD per token)\n    base_price = 3.0 \/ 1_000_000\n\n    # Khong cache\n    no_cache_cost = (cached_tokens + uncached_tokens_per_request)                     * base_price * total_requests\n\n    # Co cache\n    cache_write_cost = cached_tokens * (base_price * 1.25)  # 125% gia goc\n    cache_read_cost = cached_tokens * (base_price * 0.1)    # 10% gia goc\n    uncached_cost = uncached_tokens_per_request * base_price\n\n    num_writes = total_requests * (1 - cache_hit_rate)\n    num_reads = total_requests * cache_hit_rate\n\n    with_cache_cost = (\n        num_writes * cache_write_cost +\n        num_reads * cache_read_cost +\n        total_requests * uncached_cost\n    )\n\n    savings = no_cache_cost - with_cache_cost\n    savings_pct = (savings \/ no_cache_cost) * 100\n\n    print(f\"Khong cache: ${no_cache_cost:.2f}\")\n    print(f\"Co cache: ${with_cache_cost:.2f}\")\n    print(f\"Tiet kiem: ${savings:.2f} ({savings_pct:.1f}%)\")\n\n    return savings\n\n# Vi du\nestimate_caching_savings(\n    cached_tokens=4000,\n    uncached_tokens_per_request=200,\n    total_requests=10000,\n    cache_hit_rate=0.98\n)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNên cache cái gì và không nên cache cái gì?\u003c\/h2\u003e\n\u003cp\u003eKhông phải tất cả nội dung đều nên cache. Dưới đây là hướng dẫn chi tiết:\u003c\/p\u003e\n\n\u003ch3\u003eNên cache\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSystem prompt dài:\u003c\/strong\u003e hướng dẫn chi tiết, quy tắc xử lý, persona description\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eTài liệu tham khảo:\u003c\/strong\u003e bảng giá, chính sách, FAQ, knowledge base\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eFew-shot examples:\u003c\/strong\u003e các ví dụ mẫu để model học theo format output\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eConversation history:\u003c\/strong\u003e phần lịch sử hội thoại không thay đổi trong multi-turn chat\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eSchema và template:\u003c\/strong\u003e JSON schema, output template, format instructions\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch3\u003eKhông nên cache\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNội dung thay đổi thường xuyên:\u003c\/strong\u003e dữ liệu real-time, timestamp, context động\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNội dung quá ngắn:\u003c\/strong\u003e dưới 1.024 token (Sonnet\/Opus) hoặc 2.048 token (Haiku) sẽ không đủ điều kiện cache\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNội dung khác nhau mỗi request:\u003c\/strong\u003e ví dụ user-specific context mà mỗi user có nội dung riêng\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eNội dung hiếm khi lặp lại:\u003c\/strong\u003e nếu mỗi request có system prompt khác nhau, cache write cost sẽ cao hơn lợi ích\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eChiến lược cache warming\u003c\/h2\u003e\n\u003cp\u003eCache warming là kỹ thuật gửi request \"giả\" để tạo cache trước khi có request thật từ người dùng. Điều này đảm bảo request đầu tiên của người dùng đã được cache hit, giảm latency.\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003easync def warm_cache(client, system_prompt):\n    \"\"\"Gui request gia de tao cache truoc khi co traffic that.\"\"\"\n    response = client.messages.create(\n        model=\"claude-sonnet-4-20250514\",\n        max_tokens=1,\n        system=[\n            {\n                \"type\": \"text\",\n                \"text\": system_prompt,\n                \"cache_control\": {\"type\": \"ephemeral\"}\n            }\n        ],\n        messages=[\n            {\"role\": \"user\", \"content\": \"ping\"}\n        ]\n    )\n\n    if response.usage.cache_creation_input_tokens \u0026gt; 0:\n        print(f\"Cache warmed: {response.usage.cache_creation_input_tokens} tokens cached\")\n    return True\n\n\n# Goi ham nay khi ung dung khoi dong\n# hoac dinh ky moi 4 phut de cache khong het han\nimport asyncio\n\nasync def keep_cache_warm(client, system_prompt, interval=240):\n    \"\"\"Giu cache song bang cach refresh dinh ky.\"\"\"\n    while True:\n        await warm_cache(client, system_prompt)\n        await asyncio.sleep(interval)  # 4 phut (truoc khi TTL 5 phut het han)\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003eKhi nào cần cache warming?\u003c\/h3\u003e\n\u003cul\u003e\n  \u003cli\u003eỨng dụng có traffic không đều (ví dụ: ít request vào ban đêm, dẫn đến cache hết hạn)\u003c\/li\u003e\n  \u003cli\u003eSystem prompt rất dài (hàng nghìn token), cache miss gây tăng latency đáng kể\u003c\/li\u003e\n  \u003cli\u003eỨng dụng yêu cầu latency thấp nhất quán cho mọi request\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eMonitoring cache hiệu quả\u003c\/h2\u003e\n\u003cp\u003eĐể đảm bảo Prompt Caching hoạt động hiệu quả, bạn cần theo dõi các metric quan trọng:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eclass CacheMonitor:\n    def __init__(self):\n        self.total_requests = 0\n        self.cache_hits = 0\n        self.cache_writes = 0\n        self.total_cached_tokens = 0\n        self.total_uncached_tokens = 0\n\n    def record(self, usage):\n        \"\"\"Ghi nhan usage tu response.\"\"\"\n        self.total_requests += 1\n\n        if usage.cache_read_input_tokens \u0026gt; 0:\n            self.cache_hits += 1\n            self.total_cached_tokens += usage.cache_read_input_tokens\n\n        if usage.cache_creation_input_tokens \u0026gt; 0:\n            self.cache_writes += 1\n\n        self.total_uncached_tokens += usage.input_tokens\n\n    def report(self):\n        \"\"\"In bao cao cache hieu suat.\"\"\"\n        hit_rate = (self.cache_hits \/ self.total_requests * 100\n                    if self.total_requests \u0026gt; 0 else 0)\n\n        print(f\"Tong request: {self.total_requests}\")\n        print(f\"Cache hits: {self.cache_hits} ({hit_rate:.1f}%)\")\n        print(f\"Cache writes: {self.cache_writes}\")\n        print(f\"Cached tokens: {self.total_cached_tokens:,}\")\n        print(f\"Uncached tokens: {self.total_uncached_tokens:,}\")\n\n# Su dung\nmonitor = CacheMonitor()\n\nresponse = client.messages.create(...)\nmonitor.record(response.usage)\n\n# In bao cao dinh ky\nmonitor.report()\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eNhững lỗi thường gặp\u003c\/h2\u003e\n\u003cp\u003eDưới đây là các lỗi phổ biến khi triển khai Prompt Caching và cách khắc phục:\u003c\/p\u003e\n\n\u003ch3\u003e1. Cache không hoạt động (luôn miss)\u003c\/h3\u003e\n\u003cp\u003eNguyên nhân phổ biến nhất là nội dung cache thay đổi giữa các request. Cache key được tính dựa trên toàn bộ nội dung. Dù chỉ thay đổi một ký tự, cache sẽ miss hoàn toàn.\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# SAI: timestamp thay doi moi request -\u0026gt; luon cache miss\nsystem = f\"Ban la tro ly. Hien tai la {datetime.now()}. ...\"\n\n# DUNG: tach phan tinh va phan dong\nsystem_static = \"Ban la tro ly. Quy tac: ...\"  # cache phan nay\nuser_msg = f\"Hien tai la {datetime.now()}. Cau hoi: ...\"  # khong cache\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch3\u003e2. Cache quá ngắn, không đủ điều kiện\u003c\/h3\u003e\n\u003cp\u003eNội dung cache phải đạt tối thiểu 1.024 token (Sonnet\/Opus) hoặc 2.048 token (Haiku). Nếu system prompt ngắn hơn, hãy cân nhắc thêm few-shot examples hoặc tài liệu tham khảo vào phần cache.\u003c\/p\u003e\n\n\u003ch3\u003e3. Cache hết hạn do traffic thấp\u003c\/h3\u003e\n\u003cp\u003eNếu khoảng cách giữa hai request liên tiếp vượt quá 5 phút, cache sẽ hết hạn. Sử dụng cache warming để giải quyết vấn đề này.\u003c\/p\u003e\n\n\u003ch3\u003e4. Cache nhiều phiên bản khác nhau\u003c\/h3\u003e\n\u003cp\u003eNếu ứng dụng có nhiều loại system prompt (ví dụ cho từng ngành hoặc từng khách hàng), mỗi phiên bản sẽ có cache riêng. Hãy tối ưu bằng cách đặt phần chung lên trước và cache phần đó, phần riêng đặt sau và không cache.\u003c\/p\u003e\n\n\u003ch2\u003eCache cho multi-turn conversation\u003c\/h2\u003e\n\u003cp\u003eTrong ứng dụng chat, mỗi tin nhắn mới đều gửi lại toàn bộ lịch sử hội thoại. Prompt Caching đặc biệt hiệu quả ở đây vì phần lịch sử cũ không thay đổi giữa các lượt chat:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003eclass CachedChatSession:\n    \"\"\"Phien chat voi Prompt Caching tu dong.\"\"\"\n\n    def __init__(self, client, system_prompt, model=\"claude-sonnet-4-20250514\"):\n        self.client = client\n        self.system_prompt = system_prompt\n        self.model = model\n        self.messages = []\n\n    def send(self, user_message):\n        \"\"\"Gui tin nhan voi cache tu dong cho lich su.\"\"\"\n        # Danh dau cache cho system prompt\n        system = [\n            {\n                \"type\": \"text\",\n                \"text\": self.system_prompt,\n                \"cache_control\": {\"type\": \"ephemeral\"}\n            }\n        ]\n\n        # Copy messages va danh dau cache cho tin cuoi\n        # trong lich su (truoc tin moi)\n        messages = []\n        for i, msg in enumerate(self.messages):\n            if i == len(self.messages) - 1 and msg[\"role\"] == \"assistant\":\n                # Tin cuoi cua assistant -\u0026gt; cache breakpoint\n                messages.append({\n                    \"role\": \"assistant\",\n                    \"content\": [\n                        {\n                            \"type\": \"text\",\n                            \"text\": msg[\"content\"],\n                            \"cache_control\": {\"type\": \"ephemeral\"}\n                        }\n                    ]\n                })\n            else:\n                messages.append(msg)\n\n        # Them tin moi cua nguoi dung\n        messages.append({\"role\": \"user\", \"content\": user_message})\n\n        response = self.client.messages.create(\n            model=self.model,\n            max_tokens=2048,\n            system=system,\n            messages=messages\n        )\n\n        # Luu vao lich su\n        self.messages.append({\"role\": \"user\", \"content\": user_message})\n        assistant_text = response.content[0].text\n        self.messages.append({\"role\": \"assistant\", \"content\": assistant_text})\n\n        return {\n            \"text\": assistant_text,\n            \"cache_read\": response.usage.cache_read_input_tokens,\n            \"cache_write\": response.usage.cache_creation_input_tokens,\n            \"uncached\": response.usage.input_tokens\n        }\n\n# Su dung\nsession = CachedChatSession(client, long_system_prompt)\nr1 = session.send(\"Xin chao\")  # cache write system prompt\nr2 = session.send(\"Ban co the giup gi?\")  # cache read system + write history\nr3 = session.send(\"Cho toi xem bang gia\")  # cache read system + history\u003c\/code\u003e\u003c\/pre\u003e\n\u003cp\u003eQua mỗi lượt chat, phần đã cache ngày càng lớn (system prompt + lịch sử tích lũy), trong khi phần uncached chỉ là tin nhắn mới nhất. Điều này giúp tiết kiệm đáng kể khi conversation dài nhiều lượt.\u003c\/p\u003e\n\n\u003ch2\u003eSo sánh hiệu suất: có cache vs không cache\u003c\/h2\u003e\n\u003cp\u003eDưới đây là kết quả benchmark thực tế cho một ứng dụng chatbot hỗ trợ khách hàng với system prompt 5.000 token, trung bình 8 lượt chat mỗi phiên:\u003c\/p\u003e\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eMetric\u003c\/th\u003e\n      \u003cth\u003eKhông cache\u003c\/th\u003e\n      \u003cth\u003eCó cache\u003c\/th\u003e\n      \u003cth\u003eCải thiện\u003c\/th\u003e\n    \u003c\/tr\u003e\n  \u003c\/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí input trung bình mỗi phiên\u003c\/td\u003e\n      \u003ctd\u003e$0.156\u003c\/td\u003e\n      \u003ctd\u003e$0.022\u003c\/td\u003e\n      \u003ctd\u003e85.9%\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eLatency trung bình (TTFT)\u003c\/td\u003e\n      \u003ctd\u003e1.2 giây\u003c\/td\u003e\n      \u003ctd\u003e0.8 giây\u003c\/td\u003e\n      \u003ctd\u003e33.3%\u003c\/td\u003e\n    \u003c\/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eChi phí 10.000 phiên\/tháng\u003c\/td\u003e\n      \u003ctd\u003e$1,560\u003c\/td\u003e\n      \u003ctd\u003e$220\u003c\/td\u003e\n      \u003ctd\u003e$1,340 tiết kiệm\u003c\/td\u003e\n    \u003c\/tr\u003e\n  \u003c\/tbody\u003e\n\u003c\/table\u003e\n\n\u003cp\u003eLưu ý: cải thiện latency đến từ việc server không cần xử lý lại phần đã cache. Mức cải thiện phụ thuộc vào tỷ lệ cached tokens so với tổng tokens.\u003c\/p\u003e\n\n\u003ch2\u003eKết hợp Prompt Caching với các kỹ thuật tối ưu khác\u003c\/h2\u003e\n\u003cp\u003ePrompt Caching mang lại hiệu quả cao nhất khi kết hợp với các kỹ thuật tối ưu khác:\u003c\/p\u003e\n\u003cul\u003e\n  \u003cli\u003e\n\u003cstrong\u003eBatch API + Caching:\u003c\/strong\u003e giảm 50% giá qua Batch API, giảm thêm 90% giá input qua caching. Tổng tiết kiệm có thể đạt 95% cho phần input token\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eModel cascade + Caching:\u003c\/strong\u003e dùng Haiku cho tác vụ đơn giản (với cache), escalate lên Sonnet khi cần (cũng với cache)\u003c\/li\u003e\n  \u003cli\u003e\n\u003cstrong\u003eStreaming + Caching:\u003c\/strong\u003e cache không ảnh hưởng đến streaming, bạn vẫn nhận response từng phần như bình thường\u003c\/li\u003e\n\u003c\/ul\u003e\n\n\u003ch2\u003eThứ tự nội dung trong prompt khi dùng cache\u003c\/h2\u003e\n\u003cp\u003eVì cache hoạt động theo prefix (từ đầu đến vị trí cache_control), thứ tự sắp xếp nội dung rất quan trọng:\u003c\/p\u003e\n\u003cpre\u003e\u003ccode\u003e# Thu tu toi uu:\n# 1. Noi dung tinh, it thay doi nhat (cache)\n# 2. Noi dung ban tinh (co the cache breakpoint thu 2)\n# 3. Noi dung dong (khong cache)\n\nsystem = [\n    {\n        \"type\": \"text\",\n        \"text\": \"Huong dan chung va quy tac xu ly...\",  # it thay doi\n        \"cache_control\": {\"type\": \"ephemeral\"}\n    }\n]\n\nmessages = [\n    # Lich su hoi thoai (cache breakpoint thu 2)\n    {\"role\": \"user\", \"content\": \"...\"},\n    {\"role\": \"assistant\", \"content\": [\n        {\"type\": \"text\", \"text\": \"...\",\n         \"cache_control\": {\"type\": \"ephemeral\"}}\n    ]},\n    # Tin nhan moi nhat (khong cache)\n    {\"role\": \"user\", \"content\": \"Cau hoi moi cua nguoi dung\"}\n]\u003c\/code\u003e\u003c\/pre\u003e\n\n\u003ch2\u003eBước tiếp theo\u003c\/h2\u003e\n\u003cp\u003ePrompt Caching là một trong những kỹ thuật tối ưu chi phí hiệu quả nhất khi làm việc với Claude API. Kết hợp caching với error handling và retry strategy sẽ giúp xây dựng ứng dụng production vững chắc và tiết kiệm. Khám phá thêm tại \u003ca href=\"\/collections\/nang-cao\"\u003eThư viện Nâng cao Claude\u003c\/a\u003e.\u003c\/p\u003e\n","brand":"Minh Tuấn","offers":[{"title":"Default Title","offer_id":47730150539476,"sku":null,"price":0.0,"currency_code":"VND","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0821\/0264\/9044\/files\/prompt-caching-ti_t-ki_m-90-chi-phi-cho-system-prompt-l_p-l_i.jpg?v=1774715509","url":"https:\/\/claude.vn\/products\/prompt-caching-ti%e1%ba%bft-ki%e1%bb%87m-90-chi-phi-cho-system-prompt-l%e1%ba%b7p-l%e1%ba%a1i","provider":"CLAUDE.VN","version":"1.0","type":"link"}