Vũ Văn HảiFull-stack · AI-native
Hướng dẫnBlog
Trao đổi dự án

© 2026 Vũ Văn Hải · Viết từ kinh nghiệm triển khai thật.

Trang chủHướng dẫnBlogRSS
  1. Blog
  2. /Kế toán token cho AI agent: hiểu token, cửa sổ ngữ cảnh và cache từ gốc

Kế toán token cho AI agent: hiểu token, cửa sổ ngữ cảnh và cache từ gốc

Model không có trí nhớ - mọi thứ trông giống trí nhớ đều do code của bạn gửi lại. Hiểu đúng một câu đó là hiểu toàn bộ chuyện token, cửa sổ ngữ cảnh và prompt caching, và vì sao hoá đơn của một agent lại phình lên.

Đăng: 23 thg 9, 202632 phút đọc
LLMTokenPrompt cachingCửa sổ ngữ cảnhClaude Code
Mục lục
  • Năm chữ phải thuộc trước khi đọc tiếp
  • Một lần gọi API: model không nhớ gì cả
  • Nhiều lượt chat: bạn gửi lại toàn bộ, mỗi lần
  • Một lượt có nhiều step nghĩa là gì
  • Trả lời thẳng bốn câu hay hỏi
  • Tính từng bước một lượt thật
  • Hai điều đọc ra từ mấy con số này
  • Cửa sổ ngữ cảnh: sức chứa một lần gọi
  • Cái vòng trong Claude Code là ô nào
  • Hình dạng của hai đường nói hết
  • Ba bằng chứng nó không phải số cộng dồn
  • Khoản to nhất mà người ta hay quên
  • Prompt caching: trả tiền lại nhưng rẻ hơn 10 lần
  • Nó làm gì
  • Ba loại token, ba mức giá
  • Luật quan trọng nhất: khớp theo TIỀN TỐ
  • Hai nhà cung cấp làm khác nhau chỗ nào
  • Những thứ phá cache mà không báo gì
  • Ba luật kiến trúc, quan trọng hơn cả việc đánh dấu cache
  • Bảng số liệu
  • Cửa sổ và giá của các model
  • Ngưỡng cache tối thiểu của Claude
  • Quy tắc cache của Claude
  • Thay đổi nào phá cache nào (Claude)
  • Quy tắc cache của OpenAI
  • ChatGPT khác API chỗ nào
  • Đối chiếu với zalo-agent
  • Đọc ba con số trên dashboard
  • Thuật ngữ

Model không có trí nhớ. Mọi thứ trông giống trí nhớ đều là do code của bạn gửi lại. Hiểu đúng một câu đó là hiểu được toàn bộ chuyện token, cửa sổ ngữ cảnh và cache.

Cách đọc bài này Đọc lần đầu thì đi tuần tự từ phần 1 - mỗi phần chỉ thêm một ý mới, có sơ đồ đi kèm. Quay lại tra cứu thì nhảy thẳng vào phần 4 - toàn bảng số, không văn xuôi.


Phần 1 - Nền tảng

Năm chữ phải thuộc trước khi đọc tiếp

Hầu hết hiểu nhầm về token đến từ việc năm chữ dưới đây bị dùng lẫn lộn. Bốn chữ trong số đó lồng vào nhau như búp bê Nga - cái ngoài chứa nhiều cái trong.

PHIÊN một cuộc trò chuyện, từ lúc mở tới lúc xoá LƯỢT một lần người dùng nhắn, bot trả lời xong STEP một lần gọi API. Một lượt có thể nhiều step. REQUEST gói dữ liệu gửi đi trong step đó = tổng TOKEN phải nằm vừa cửa sổ

Chỉ ô trong cùng - request - mới so được với cửa sổ ngữ cảnh. Ba ô ngoài là số cộng dồn, chúng có thể lớn hơn cửa sổ rất nhiều mà chẳng bao giờ tràn.

ChữNghĩa gọnVí dụ
TokenĐơn vị nhỏ nhất model đọc và viết. Không phải chữ, không phải từ."Xin chào" ~ 3-4 token
RequestMột gói dữ liệu gửi lên API. Chứa mọi thứ model được thấy lần đó.10.600 token
StepMột lần gọi API. Model đòi dùng tool thì phải thêm một step nữa.Lượt này có 2 step
LượtTrọn một lần hỏi-đáp với người dùng. Gồm 1 hoặc nhiều step.21.653 token
PhiênCả cuộc trò chuyện. Gồm nhiều lượt.84.601 token

Câu chốt của phần này Ba con số 10.600 / 21.653 / 84.601 ở trên đều là token, đều lấy từ cùng một cuộc trò chuyện thật, và không cái nào sai. Chúng đo ba thứ khác nhau. Chỉ con số đầu - request - mới liên quan tới chuyện "có tràn cửa sổ không".

Một lần gọi API: model không nhớ gì cả

Đây là điều quan trọng nhất trong cả tài liệu. Model không có trí nhớ giữa các lần gọi.

Hãy hình dung mỗi lần gọi API là bạn đưa một tập hồ sơ cho một chuyên gia chưa từng gặp bạn bao giờ. Người đó đọc trọn tập hồ sơ, viết câu trả lời, rồi quên sạch. Lần sau bạn quay lại, đó là một người mới tinh - bạn phải đưa lại cả tập hồ sơ, kèm phần mới.

MÁY CỦA BẠN REQUEST system prompt định nghĩa tool toàn bộ tin nhắn (cũ lẫn mới) gửi MÁY NHÀ CUNG CẤP MODEL đọc TOÀN BỘ tập hồ sơ rồi viết câu trả lời trả CÂU TRẢ LỜI + số token đã dùng rồi QUÊN SẠCH không lưu gì cho lần sau

Thuật ngữ kỹ thuật cho việc này là stateless - không giữ trạng thái. Đúng với cả Claude lẫn OpenAI.

Hệ quả phải nhớ Mọi thứ trông giống "trí nhớ" của một con bot - nhớ tên bạn, nhớ chuyện hôm qua, nhớ vừa gọi tool gì - đều không nằm trong model. Chúng nằm trong code của bạn, và được gửi lại ở mỗi lần gọi.

Nhiều lượt chat: bạn gửi lại toàn bộ, mỗi lần

Vì model quên sạch, muốn nó biết chuyện cũ thì code của bạn phải gửi lại. Không có cách nào khác.

MỖI Ô = MỘT TIN NHẮN GỬI KÈM Lượt 1 Tên tôi là An 1 tin Lượt 2 Tên tôi là An Chào An! Tôi tên gì? 3 tin Lượt 3 Tên tôi là An Chào An! Tôi tên gì? An ạ Cảm ơn Ô đậm = tin mới. Ô mờ = tin cũ, vẫn phải gửi lại và vẫn tính tiền. Hội thoại càng dài, mỗi lượt càng đắt - dù bạn chỉ gõ thêm hai chữ.

Đây chính là bài toán mà prompt caching sinh ra để giải. Sẽ nói ở phần 3.

// Lượt 3 gửi đi trông như thế này - KHÔNG phải chỉ "Cảm ơn"
messages: [
  { role: "user",      content: "Tên tôi là An" },
  { role: "assistant", content: "Chào An!" },
  { role: "user",      content: "Tôi tên gì?" },
  { role: "assistant", content: "An ạ" },
  { role: "user",      content: "Cảm ơn" }        // chỉ dòng này là mới
]

Phần 2 - Trọng tâm

Một lượt có nhiều step nghĩa là gì

Đây là chỗ hay rối nhất, nên ta đi thật chậm.

Model không chạy được tool. Nó chỉ có thể nói ra rằng nó muốn gọi tool nào với tham số gì. Việc chạy tool là của code bạn. Mà muốn model biết kết quả, bạn phải gọi API thêm một lần nữa - vì model đã quên sạch lần trước.

Nên một lượt cần dùng tool sẽ có ít nhất hai lần gọi API. Mỗi lần gọi đó gọi là một step.

MÁY CỦA BẠN MÁY NHÀ CUNG CẤP STEP 1 Gom hồ sơ: system + tool + lịch sử + tin mới của người dùng 10.600 token Đọc tất cả. Quyết định: "Tôi cần gọi tool schedule_task" viết ra 196 token trả về CODE CỦA BẠN chạy tool Model không chạm được vào máy bạn. Không tốn token nào ở bước này. STEP 2 Gom lại TOÀN BỘ hồ sơ của step 1 + lời model đòi tool + kết quả tool vừa chạy 10.803 token Đọc LẠI TỪ ĐẦU (đã quên step 1) "Đã đặt lịch 11:00 ngày 30/08" viết ra 54 token Model KHÔNG nhớ step 1. Bạn gửi lại nên nó mới biết.

Vòng lặp này lặp tới khi model thôi đòi tool. Trong ví dụ trên nó dừng sau 2 step.

Trả lời thẳng bốn câu hay hỏi

Nhiều step có phải là cùng một lần gọi API không?

Không. Mỗi step là một lần gọi API riêng biệt, độc lập hoàn toàn. Lượt 2 step = 2 lần gọi. Lượt 5 step = 5 lần gọi.

Có phải cùng một model không?

Cùng model (trừ khi code bạn cố ý đổi), nhưng không cùng phiên làm việc. Coi như bạn hỏi cùng một chuyên gia hai lần, mà giữa hai lần đó người ta bị xoá trí nhớ.

Trong lượt đó, model có thấy đủ ngữ cảnh của các step trước không?

Có - nhưng không phải vì model nhớ. Là vì code bạn gom lại và gửi kèm. Step 2 nhận đúng mọi thứ step 1 đã gửi, cộng thêm hai mẩu mới: lời model đòi tool, và kết quả tool. Nếu code bạn quên gửi kèm, model sẽ hành xử như chưa từng gọi tool bao giờ.

Nhiều step thì token tăng thế nào?

Tăng nhân lên, không phải cộng thêm chút ít. Mỗi step trả tiền lại cho toàn bộ ngữ cảnh, mà ngữ cảnh còn phình dần vì kết quả tool cứ tích tụ.

NGỮ CẢNH GỬI ĐI Ở MỖI STEP Step 1 10.600 Step 2 10.803 Step 3 + kết quả web_fetch Step 4 Phần đậm nhất là ngữ cảnh gốc - nó bị gửi lại NGUYÊN VẸN ở mọi step. Mỗi mảng nhạt hơn là một kết quả tool cộng thêm vào, rồi cũng bị gửi lại mãi.

Vì thế một tool trả về nội dung dài (đọc trang web, đọc tài liệu) đắt hơn nhiều so với vẻ ngoài của nó: bạn trả tiền cho nó ở mọi step còn lại của lượt.

Ảnh là khoản đắt nhất Một tấm ảnh tốn cỡ hàng nghìn token. Nạp lại 3 ảnh cũ vào mỗi lượt, mà lượt chạy 8 step, là bạn trả tiền cho 3 tấm ảnh đó 8 lần. Đo trên bot thật: lượt có ảnh khoảng 12.600 token, lượt chỉ có chữ khoảng 2.600.

Tính từng bước một lượt thật

Số dưới đây chép nguyên từ trace của một bot Zalo đang chạy - không phải ví dụ dựng ra. Người dùng nhắn "nhắc lúc 11h đi ạ", bot đặt lịch rồi trả lời.

  • Step 1. Code gom hồ sơ và gửi đi: 10.600 token vào. Model đọc xong, viết ra một câu ngắn kèm lời gọi tool: 196 token ra. Step này tốn: 10.600 + 196 = 10.796.
  • Code bạn chạy tool schedule_task, tạo lịch trong database. Bước này 0 token - không đụng gì tới model.
  • Step 2. Code gom lại tất cả của step 1, cộng lời đòi tool và kết quả tool, gửi đi: 10.803 token vào. Model viết câu trả lời cuối: 54 token ra. Step này tốn: 10.803 + 54 = 10.857.
  • Model không đòi tool nữa, vòng lặp dừng. Tổng cả lượt: 21.653 token.

Hai điều đọc ra từ mấy con số này

Một. Step 2 gửi 10.803, chỉ hơn step 1 đúng 203 token. Vì nó gửi lại y nguyên 10.600 của step 1, cộng thêm hai mẩu mới. Ngữ cảnh gần như không đổi - nhưng bạn trả tiền cho nó lần thứ hai.

Hai. Tổng lượt 21.653 gần gấp đôi ngữ cảnh thật. Không phải vì hồ sơ dày lên gấp đôi, mà vì cùng một hồ sơ bị tính tiền hai lần.

BA CON SỐ, CÙNG MỘT CUỘC TRÒ CHUYỆN Một request 10.803 so được với cửa sổ ngữ cảnh Một lượt 21.653 chỉ là tiền, không so được Cả phiên 84.601 cũng chỉ là tiền, cộng dồn từ lúc mở cuộc trò chuyện Cùng tỉ lệ. Ba thanh này đo ba thứ khác nhau.

Cửa sổ ngữ cảnh mặc định của bot này là 128.000, và nó chỉ dùng tới 70% để chừa chỗ. Request 10.803 token đang chiếm khoảng 12% ngân sách - còn rất xa tràn.

Lỗi đọc số hay gặp nhất Nhìn thấy 84.601 token trên bảng điều khiển rồi lo "sắp tràn cửa sổ 128.000". Không phải. Đó là tiền đã tiêu cho cả cuộc trò chuyện, cộng dồn qua nhiều lượt. Con số cần nhìn để lo chuyện tràn là 10.803 - ngữ cảnh của một request.

Dấu hiệu phân biệt: số cộng dồn chỉ tăng, kể cả khi bạn xoá sạch ngữ cảnh. Số request thì lên xuống theo độ dài hội thoại.

Cửa sổ ngữ cảnh: sức chứa một lần gọi

Cửa sổ ngữ cảnh (context window) là sức chứa tối đa của MỘT request. Không phải của cả cuộc trò chuyện.

CỬA SỔ NGỮ CẢNH - MỘT REQUEST system prompt định nghĩa tool lịch sử hội thoại + kết quả tool ảnh chỗ cho model viết câu trả lời Vượt cửa sổ thì API trả lỗi, không tự cắt giúp. Nên mọi agent nghiêm túc đều phải tự cắt bớt ngữ cảnh TRƯỚC khi gửi. Điều dễ quên: phần model sắp VIẾT RA cũng ăn vào cùng ngân sách.

Đây là lý do bot thật thường chỉ dùng tới 70% cửa sổ khai báo - phần chừa lại dành cho câu trả lời và cho sai số ước lượng.

Vì sao bot "quên" chuyện cũ Không phải model kém trí nhớ. Là vì code của bạn đã cắt bớt lịch sử trước khi gửi, để nó vừa cửa sổ. Trí nhớ của một agent là do code quyết định - muốn nhớ lâu hơn thì sửa cách cắt, không phải đổi model.

Cái vòng trong Claude Code là ô nào

Claude Code hiện một chỉ báo ngữ cảnh, và nó tăng sau mỗi tin. Câu hỏi tự nhiên: vậy nó đang đếm cả phiên à?

Không. Nó là ô REQUEST - ô trong cùng của sơ đồ búp bê Nga ở đầu tài liệu.

Nó tăng sau mỗi tin, nhưng không phải vì nó cộng dồn. Là vì chính cái request đó phình ra: mỗi lượt, code nối thêm tin mới vào danh sách tin nhắn, nên lần gọi API kế tiếp mang theo nhiều chữ hơn lần trước. Một cái duy nhất, ngày càng to.

Hình dạng của hai đường nói hết

trần cửa sổ ngữ cảnh 1 2 3 4 5 6 lượt thứ vượt trần mà KHÔNG sao cả /compact vòng context = một REQUEST token cộng dồn cả phiên

Thang đo minh hoạ, không phải số thật. Điều cần nhìn là hình dạng: đường cộng dồn chỉ leo và vượt trần vô hại, đường request rơi thẳng đứng khi ngữ cảnh bị nén.

Ba bằng chứng nó không phải số cộng dồn

Quan sátNếu là số cộng dồn thìThực tế
Mới mở phiên, chưa gõ chữ nàophải bằng 0đã có sẵn 10-20%: system prompt, định nghĩa tool, CLAUDE.md, schema MCP
Chạy /compact hoặc /clearkhông đổi - tiền đã tiêu không đòi lại đượctụt xuống
Sau 6 lượt, mỗi lượt khoảng 10Khơn 60Kcó thể mới khoảng 12K

Phép thử quyết định Cái gì tụt xuống được thì cái đó đang đo sức chứa. Số cộng dồn không bao giờ tụt.

Ví như: vòng context là độ đầy của một cái vali sức chứa cố định - nhét thêm thì đầy lên, bỏ bớt ra thì vơi đi. Token cộng dồn là tổng số ký đã khiêng cả ngày - không bao giờ giảm, và lớn gấp nhiều lần sức chứa cái vali là chuyện bình thường. Cả hai cùng tăng trong một phiên bình thường. Đó chính là lý do chúng dễ bị nhầm là một.

Khoản to nhất mà người ta hay quên

Mỗi lần gọi API, Claude Code mang theo: system prompt, định nghĩa toàn bộ tool, nội dung CLAUDE.md, schema MCP, toàn bộ lịch sử hội thoại, và kết quả của mọi tool đã chạy.

Khoản cuối là khoản đắt. Một lệnh đọc file 2000 dòng nằm lại trong ngữ cảnh và bị gửi lại ở mọi lượt sau đó - đúng cơ chế cột tích luỹ ở mục về step, chỉ khác là ở đây nó tích luỹ qua cả phiên chứ không riêng một lượt. Đó là lý do vòng nhảy vọt sau vài thao tác đọc file, dù bạn chỉ gõ một câu ngắn.

Hệ quả thực dụng /clear giữa hai việc không liên quan là thói quen đáng có: nó vứt đống kết quả tool cũ đang bị chở đi chở lại mỗi lượt.


Phần 3 - Tiết kiệm

Prompt caching: trả tiền lại nhưng rẻ hơn 10 lần

Phần 1 và 2 để lại một vấn đề rõ ràng: cùng một đống chữ bị gửi đi gửi lại rất nhiều lần - mỗi step một lần, mỗi lượt một lần. Prompt caching sinh ra để giải đúng chuyện đó.

Nó làm gì

Nhà cung cấp lưu lại trạng thái tính toán của phần đầu prompt. Lần sau bạn gửi một prompt có phần đầu giống hệt từng byte, họ nạp lại trạng thái đã lưu thay vì tính lại từ đầu. Bạn được giảm giá và nhận trả lời nhanh hơn.

Hiểu nhầm phổ biến nhất, nói rõ luôn Cache không làm token cũ miễn phí. Chúng vẫn bị đếm, vẫn bị tính tiền ở mọi lượt - chỉ là rẻ hơn khoảng 10 lần. Và chúng vẫn chiếm chỗ trong cửa sổ ngữ cảnh y như thường. Cache giúp rẻ đi, không giúp nhét được nhiều hơn.

Ba loại token, ba mức giá

Loại tokenHệ số giáÝ nghĩa
Chưa cache1,0xGiá đầy đủ. Phần mới của mỗi request.
Ghi cache1,25xĐắt hơn một chút, trả một lần lúc tạo.
Đọc cache0,1xRẻ hơn 10 lần. Phần thưởng của mọi lần sau.

Đúng cho cả Claude và OpenAI (GPT-5.6 trở lên). Claude có thêm lựa chọn giữ cache 1 giờ, giá ghi 2,0x.

Luật quan trọng nhất: khớp theo TIỀN TỐ

Cache khớp theo phần đầu của prompt, không phải theo từng đoạn rời rạc. Đổi một byte ở giữa thì mọi thứ từ đó trở đi mất cache - kể cả phần phía sau không đổi gì.

ĐÚNG system + tool + lịch sử cũ (không đổi) câu hỏi mới Phần xanh cache được, lần sau chỉ trả 0,1× cho nó. SAI ngày giờ hiện tại system + tool + lịch sử cũ + câu hỏi mới Ngày giờ đổi mỗi phút, nằm ở ĐẦU, nên toàn bộ phía sau mất cache. Không có lỗi nào báo. Chỉ là hoá đơn cao gấp 10 lần bình thường.

Quy tắc rút gọn: thứ không đổi để trước, thứ đổi mỗi lần để sau. Đúng cho cả hai nhà cung cấp.

Hai nhà cung cấp làm khác nhau chỗ nào

ClaudeOpenAI
Cách bậtTự đánh dấu bằng cache_controlTự động, không cần sửa code
Chọn chỗ cắt cacheCó, tối đa 4 điểmKhông, hệ thống tự chọn
Xem được kết quả ởcache_read_input_tokenscached_tokens

Chi tiết đầy đủ nằm ở phần tra cứu. Điểm khác biệt thực dụng: Claude cho bạn quyết định chỗ nào đáng cache, OpenAI lo hộ - đổi lại Claude tối ưu sâu hơn được, và cũng sai được nhiều hơn.

Những thứ phá cache mà không báo gì

Mọi mục dưới đây hỏng im lặng - không lỗi, không cảnh báo, chỉ là tiền tăng. Đây là danh sách để grep trong code dựng prompt.

Mẫu codeVì sao phá
Date.now() trong system promptPhần đầu đổi mỗi request
randomUUID() đặt sớmMỗi request thành một tiền tố riêng
JSON.stringify() không sắp keyThứ tự key không ổn định, byte khác nhau
Nhét user id vào system promptMỗi người một tiền tố, không chia sẻ được
if (flag) system += "..."Mỗi tổ hợp cờ là một tiền tố khác
tools = buildTools(user)Tool nằm ở vị trí đầu tiên - hỏng là hỏng hết

Ba luật kiến trúc, quan trọng hơn cả việc đánh dấu cache

  • Đóng băng system prompt. Đừng nhét ngày giờ, chế độ, tên người dùng vào đó. Cần bơm ngữ cảnh động thì bơm ở cuối danh sách tin nhắn - một tin ở lượt 5 không phá gì trước lượt 5.
  • Đừng đổi tool hay model giữa chừng. Tool nằm ở vị trí đầu tiên; thêm, bớt hay đổi thứ tự một tool là mất sạch cache. Cache cũng gắn theo model, đổi model là mất.
  • Lệnh gọi phụ phải dùng lại y nguyên phần đầu của lệnh chính. Tóm tắt, nén ngữ cảnh, sub-agent - nếu dựng lại system hoặc tool khác đi một chút là trượt sạch cache của lệnh cha.

Cách kiểm nhanh Chạy hai request liên tiếp có phần đầu giống hệt, rồi xem cache_read_input_tokens (Claude) hoặc cached_tokens (OpenAI). Vẫn bằng 0 nghĩa là chắc chắn có thứ đang phá tiền tố - diff byte của hai prompt đã dựng để tìm.


Phần 4 - Tra cứu

Bảng số liệu

Cửa sổ và giá của các model

ModelCửa sổInput $/1MOutput $/1M
Claude Opus 51M$5,00$25,00
Claude Sonnet 51M$3,00$15,00
Claude Haiku 4.5200K$1,00$5,00
GPT-5.6 Sol~1,05M$5,00$30,00
GPT-5.6 Terra~1,05M$2,00$12,00
GPT-5.6 Luna~1,05M$0,20$1,20

Giá Claude từ tài liệu chính thức Anthropic. Giá và cửa sổ GPT-5.6 từ nguồn tổng hợp bên thứ ba (8/2026) - kiểm lại trang giá chính thức trước khi tính chi phí thật. GPT-5.6 còn có mức long-context: vượt 272K token đầu vào thì cả request bị tính khoảng 2x input, khoảng 1,5x output.

Ngưỡng cache tối thiểu của Claude

ModelTiền tố tối thiểu
Claude Opus 5, Fable 5, Mythos 5512
Opus 4.8, Sonnet 5, Sonnet 4.6 / 4.5, Opus 4.1 / 4, Sonnet 41.024
Opus 4.7, Mythos Preview, Haiku 3.52.048
Opus 4.6, Opus 4.5, Haiku 4.54.096

Bẫy đáng nhớ nhất trong tài liệu này Ngưỡng này không tăng đều theo đời model. Một prompt 3.000 token cache được trên Opus 5 và Sonnet 4.5, nhưng im lặng không cache trên Opus 4.6 hay Haiku 4.5. Ngắn hơn ngưỡng thì không báo lỗi - chỉ là cache_creation_input_tokens: 0 và hoá đơn gấp 10 lần.

Quy tắc cache của Claude

ĐiềuQuy tắc
Thứ tự rendertools -> system -> messages
Số điểm cắt tối đa4 mỗi request
TTL5 phút (mặc định) hoặc 1 giờ
Giá ghi1,25x (5 phút) / 2,0x (1 giờ)
Giá đọc0,1x
Điểm hoà vốn2 request (TTL 5 phút) / 3 request (TTL 1 giờ)
Cửa sổ dò ngượcTối đa 20 khối nội dung - lượt nhiều tool dễ vượt và trượt im lặng
Request song songCache chỉ đọc được sau khi response đầu bắt đầu stream
// Công thức phải nhớ khi đọc usage của Claude
tổng prompt = input_tokens                  // phần chưa cache
            + cache_creation_input_tokens   // phần vừa ghi vào cache
            + cache_read_input_tokens       // phần đọc từ cache

// Nhìn mỗi input_tokens rồi tưởng ngữ cảnh nhỏ là hiểu sai.

Thay đổi nào phá cache nào (Claude)

Thay đổiCache toolsCache systemCache messages
Định nghĩa tool (thêm/bớt/đổi thứ tự)mấtmấtmất
Đổi modelmấtmấtmất
Nội dung system promptgiữmấtmất
tool_choice, ảnh, bật/tắt thinkinggiữgiữmất
Nội dung tin nhắngiữgiữmất

Nghĩa là đổi tool_choice hay bật tắt thinking từng request không hề mất cache tools và system. Chỉ đổi tool và đổi model mới buộc dựng lại toàn bộ.

Quy tắc cache của OpenAI

ĐiềuQuy tắc
Cách bậtTự động, không cần khai báo
Ngưỡng tối thiểu1.024 token (GPT-5.6+). Model cũ: 1.024 - 2.048
Bước tăng tiền tốModel cũ: theo bội số 128 token
Giá đọc0,1x (giảm 90%)
Giá ghi1,25x trên GPT-5.6+
TTLGPT-5.6+: chỉ 30m. Model cũ có thể tới 24 giờ
Hết hạn thực tếThường bị dọn sau 5-10 phút không dùng, tối đa 1 giờ
Trường báo cáocached_tokens trong prompt_tokens_details / input_tokens_details

Đừng tin số cũ Nhiều bài trên mạng còn ghi OpenAI giảm 50% - đó là mức lúc ra mắt năm 2024. Hiện tại là 90%. Tra về giá thì luôn kiểm ngày của nguồn.

ChatGPT khác API chỗ nào

Câu hỏi hay gặp: "trên ChatGPT tôi đâu có gửi lại gì, sao nó vẫn nhớ?"

Vì ChatGPT là một ứng dụng dựng trên API, và chính nó lo phần gửi lại. Server của họ lưu hội thoại, mỗi lượt tự ghép lại rồi gửi cho model. Từ góc nhìn model thì vẫn là toàn bộ hội thoại được gửi lại mỗi lượt - y hệt bot của bạn.

API trực tiếpChatGPT
Ai giữ lịch sửBạnOpenAI
Ai quyết định cắt gì khi dàiBạnOpenAI
Model có thấy toàn bộ hội thoại?Có, phần bạn gửiCó, phần họ ghép
Trả tiền theoTokenGói thuê bao
Xem được số token?Có, trong usageKhông

Khi hội thoại ChatGPT vượt cửa sổ, họ tự cắt hoặc tóm tắt phần cũ - đó là lý do đôi khi nó "quên" thứ bạn nói ở đầu một cuộc trò chuyện rất dài. Cơ chế y hệt cái bạn phải tự viết cho agent của mình.

Về cửa sổ theo gói Cửa sổ của ChatGPT Free / Plus / Pro nhỏ hơn cửa sổ tối đa của model trên API, và các con số lưu hành trên mạng mâu thuẫn nhau - nguồn bên thứ ba, đổi liên tục, khác nhau theo chế độ trả lời nhanh hay suy nghĩ sâu. Cần con số chính xác thì tra trang trợ giúp chính thức của OpenAI tại thời điểm đó.

Đối chiếu với zalo-agent

Tài liệu này ban đầu viết để giải thích chi phí token cho zalo-agent - một agent mã nguồn mở (MIT) chạy trên nền Zalo. Bảng dưới ánh xạ các khái niệm ở trên sang đúng chỗ trong repo, phòng khi bạn muốn xem một cài đặt thật.

Khái niệm trong bài nàyTrong repo
Cửa sổ ngữ cảnhLLM_CONTEXT_WINDOW, mặc định 128.000
Chừa chỗ cho câu trả lờinganSachAnToan() - chỉ dùng tới 70%
Tự cắt trước khi gửiBỏ ảnh cũ trước, rồi mới bỏ tin cũ
Đếm token chứ không đếm tinMột tin Zalo dài tuỳ ý, đếm tin không chặn được ngữ cảnh phình
Trần ảnh nạp lạiHISTORY_IMAGE_CONTEXT_LIMIT
Bật cacheHeader x-session-id ổn định theo thread
Số token cộng dồn của phiênCột total_tokens trong bảng agent_turns
Trần số step một lượtLLM_MAX_STEPS

Đọc ba con số trên dashboard

Thấy ở đâuLà loại nàoSo với cửa sổ?
Sessions: "6 tin - 84.601 token"Cả phiênKhông
Trace, nhãn thẻ lượt: "2 step - 21.653 token"Một lượtKhông
Trace, trong step: "10.600 vào / 196 ra"Một requestCó - chính nó

Thuật ngữ

TừNghĩa
TokenĐơn vị model đọc và viết. Tiếng Việt tốn nhiều token hơn tiếng Anh cho cùng một ý - đừng ước lượng bằng số từ.
Context windowSức chứa tối đa của một request. Gồm cả phần model sắp viết ra.
StatelessKhông giữ trạng thái. Server quên sạch sau mỗi lần gọi.
StepMột lần gọi API bên trong một lượt. Model đòi tool xong là sang step mới.
Agent loopVòng lặp: gọi model, model đòi tool, code chạy tool, gửi kết quả, lặp tới khi model thôi đòi.
PrefixPhần đầu của prompt. Cache khớp theo đây.
BreakpointChỗ đánh dấu "cache tới đây". Chỉ Claude có.
TTLCache sống được bao lâu nếu không ai dùng lại.
Cache write / readLần đầu tạo cache (đắt hơn) và những lần dùng lại (rẻ hơn nhiều).

Cách bài này được dựng. Bố cục theo Diataxis - tách phần giải thích (phần 1 đến 3, đọc tuần tự) khỏi phần tra cứu (phần 4, nhảy thẳng vào). Trình bày theo nguyên tắc của Mayer: định nghĩa từ vựng trước khi dùng, mỗi mục một ý, sơ đồ đặt ngay cạnh đoạn văn nó minh hoạ, và dùng màu nhất quán cho ba loại token suốt bài.

Nguồn. Phần Claude từ tài liệu chính thức của Anthropic. Phần OpenAI từ trang hướng dẫn prompt caching chính thức và bài công bố tính năng. Giá và cửa sổ GPT-5.6, cùng con số về gói ChatGPT, từ nguồn tổng hợp bên thứ ba tháng 8/2026 và đã đánh dấu rõ tại chỗ. Mọi số đo trong phần ví dụ chép trực tiếp từ trace của một bot đang chạy, không phải ví dụ dựng ra.

Bài liên quan

  • Chrome riêng cho chrome-devtools-mcp: đăng nhập được và không đụng Chrome chính

    Cấu hình một hồ sơ Chrome riêng cho từng project để chrome-devtools-mcp (Claude Code, Cursor...) điều khiển, vẫn đăng nhập được Google/Cloudflare và giữ phiên, chạy nhiều project song song, không chạm vào Chrome cá nhân của bạn.

    Công cụ dev

    Công cụ dev
  • Sửa lỗi kết nối Claude Code trên Windows (ECONNREFUSED, Bun crash)

    Xử lý triệt để hai lỗi hay gặp khi cài Claude Code trên Windows - không kết nối được API (ECONNREFUSED) và sập Bun (Internal assertion failure) - bằng cách gỡ bản NPM, xóa cache cấu hình và cài bản Native Stable.

    Công cụ dev

    Công cụ dev

Viết bởi Vũ Văn Hải

Tôi là Hải, full-stack developer ở TP. Hồ Chí Minh. Các bài ở đây đúc kết từ những hệ thống tôi tự dựng và vận hành. Cần dựng hoặc gỡ rối một hệ thống tương tự? Cứ nhắn tôi.

Trao đổi dự ánXem thêm bài viết

Thấy sai sót hoặc lệnh không còn chạy? Báo cho tôi

Mục lục

  • Năm chữ phải thuộc trước khi đọc tiếp
  • Một lần gọi API: model không nhớ gì cả
  • Nhiều lượt chat: bạn gửi lại toàn bộ, mỗi lần
  • Một lượt có nhiều step nghĩa là gì
  • Trả lời thẳng bốn câu hay hỏi
  • Tính từng bước một lượt thật
  • Hai điều đọc ra từ mấy con số này
  • Cửa sổ ngữ cảnh: sức chứa một lần gọi
  • Cái vòng trong Claude Code là ô nào
  • Hình dạng của hai đường nói hết
  • Ba bằng chứng nó không phải số cộng dồn
  • Khoản to nhất mà người ta hay quên
  • Prompt caching: trả tiền lại nhưng rẻ hơn 10 lần
  • Nó làm gì
  • Ba loại token, ba mức giá
  • Luật quan trọng nhất: khớp theo TIỀN TỐ
  • Hai nhà cung cấp làm khác nhau chỗ nào
  • Những thứ phá cache mà không báo gì
  • Ba luật kiến trúc, quan trọng hơn cả việc đánh dấu cache
  • Bảng số liệu
  • Cửa sổ và giá của các model
  • Ngưỡng cache tối thiểu của Claude
  • Quy tắc cache của Claude
  • Thay đổi nào phá cache nào (Claude)
  • Quy tắc cache của OpenAI
  • ChatGPT khác API chỗ nào
  • Đối chiếu với zalo-agent
  • Đọc ba con số trên dashboard
  • Thuật ngữ