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.
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.
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ọn | Ví 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 |
| Request | Mộ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 |
| Step | Mộ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ượt | Trọ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ên | Cả 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.
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.
Đâ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.
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ụ.
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.
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.
Đâ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
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át | Nếu là số cộng dồn thì | Thực tế |
|---|---|---|
| Mới mở phiên, chưa gõ chữ nào | phải bằng 0 | đã có sẵn 10-20%: system prompt, định nghĩa tool, CLAUDE.md, schema MCP |
Chạy /compact hoặc /clear | không đổi - tiền đã tiêu không đòi lại được | tụt xuống |
| Sau 6 lượt, mỗi lượt khoảng 10K | hơn 60K | có 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
/cleargiữ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 token | Hệ số giá | Ý nghĩa |
|---|---|---|
| Chưa cache | 1,0x | Giá đầy đủ. Phần mới của mỗi request. |
| Ghi cache | 1,25x | Đắt hơn một chút, trả một lần lúc tạo. |
| Đọc cache | 0,1x | Rẻ 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ì.
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
| Claude | OpenAI | |
|---|---|---|
| Cách bật | Tự đánh dấu bằng cache_control | Tự động, không cần sửa code |
| Chọn chỗ cắt cache | Có, tối đa 4 điểm | Không, hệ thống tự chọn |
| Xem được kết quả ở | cache_read_input_tokens | cached_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 code | Vì sao phá |
|---|---|
Date.now() trong system prompt | Phần đầu đổi mỗi request |
randomUUID() đặt sớm | Mỗi request thành một tiền tố riêng |
JSON.stringify() không sắp key | Thứ tự key không ổn định, byte khác nhau |
| Nhét user id vào system prompt | Mỗ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ặccached_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
| Model | Cửa sổ | Input $/1M | Output $/1M |
|---|---|---|---|
| Claude Opus 5 | 1M | $5,00 | $25,00 |
| Claude Sonnet 5 | 1M | $3,00 | $15,00 |
| Claude Haiku 4.5 | 200K | $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
| Model | Tiền tố tối thiểu |
|---|---|
| Claude Opus 5, Fable 5, Mythos 5 | 512 |
| Opus 4.8, Sonnet 5, Sonnet 4.6 / 4.5, Opus 4.1 / 4, Sonnet 4 | 1.024 |
| Opus 4.7, Mythos Preview, Haiku 3.5 | 2.048 |
| Opus 4.6, Opus 4.5, Haiku 4.5 | 4.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: 0và hoá đơn gấp 10 lần.
Quy tắc cache của Claude
| Điều | Quy tắc |
|---|---|
| Thứ tự render | tools -> system -> messages |
| Số điểm cắt tối đa | 4 mỗi request |
| TTL | 5 phút (mặc định) hoặc 1 giờ |
| Giá ghi | 1,25x (5 phút) / 2,0x (1 giờ) |
| Giá đọc | 0,1x |
| Điểm hoà vốn | 2 request (TTL 5 phút) / 3 request (TTL 1 giờ) |
| Cửa sổ dò ngược | Tối đa 20 khối nội dung - lượt nhiều tool dễ vượt và trượt im lặng |
| Request song song | Cache 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 đổi | Cache tools | Cache system | Cache messages |
|---|---|---|---|
| Định nghĩa tool (thêm/bớt/đổi thứ tự) | mất | mất | mất |
| Đổi model | mất | mất | mất |
| Nội dung system prompt | giữ | mất | mất |
tool_choice, ảnh, bật/tắt thinking | giữ | giữ | mất |
| Nội dung tin nhắn | giữ | 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ều | Quy tắc |
|---|---|
| Cách bật | Tự động, không cần khai báo |
| Ngưỡng tối thiểu | 1.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á đọc | 0,1x (giảm 90%) |
| Giá ghi | 1,25x trên GPT-5.6+ |
| TTL | GPT-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áo | cached_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ếp | ChatGPT | |
|---|---|---|
| Ai giữ lịch sử | Bạn | OpenAI |
| Ai quyết định cắt gì khi dài | Bạn | OpenAI |
| Model có thấy toàn bộ hội thoại? | Có, phần bạn gửi | Có, phần họ ghép |
| Trả tiền theo | Token | Gói thuê bao |
| Xem được số token? | Có, trong usage | Khô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ày | Trong repo |
|---|---|
| Cửa sổ ngữ cảnh | LLM_CONTEXT_WINDOW, mặc định 128.000 |
| Chừa chỗ cho câu trả lời | nganSachAnToan() - chỉ dùng tới 70% |
| Tự cắt trước khi gửi | Bỏ ảnh cũ trước, rồi mới bỏ tin cũ |
| Đếm token chứ không đếm tin | Một tin Zalo dài tuỳ ý, đếm tin không chặn được ngữ cảnh phình |
| Trần ảnh nạp lại | HISTORY_IMAGE_CONTEXT_LIMIT |
| Bật cache | Header x-session-id ổn định theo thread |
| Số token cộng dồn của phiên | Cột total_tokens trong bảng agent_turns |
| Trần số step một lượt | LLM_MAX_STEPS |
Đọc ba con số trên dashboard
| Thấy ở đâu | Là loại nào | So với cửa sổ? |
|---|---|---|
| Sessions: "6 tin - 84.601 token" | Cả phiên | Không |
| Trace, nhãn thẻ lượt: "2 step - 21.653 token" | Một lượt | Không |
| Trace, trong step: "10.600 vào / 196 ra" | Một request | Có - 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 window | Sức chứa tối đa của một request. Gồm cả phần model sắp viết ra. |
| Stateless | Không giữ trạng thái. Server quên sạch sau mỗi lần gọi. |
| Step | Một lần gọi API bên trong một lượt. Model đòi tool xong là sang step mới. |
| Agent loop | Vò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. |
| Prefix | Phần đầu của prompt. Cache khớp theo đây. |
| Breakpoint | Chỗ đánh dấu "cache tới đây". Chỉ Claude có. |
| TTL | Cache sống được bao lâu nếu không ai dùng lại. |
| Cache write / read | Lầ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.