Tôi Suýt Đăng Một Con Số Sai 76%
Trang chủ/Tài Viết/AI
AI

Tôi Suýt Đăng Một Con Số Sai 76%

Quay lại Tài Viết

Bài 2/12 trong chuỗi Kinh tế Vibe Coding

Tôi từng nghĩ cộng token trong file nhật ký đơn giản là cộng dồn từng dòng lại — dòng nào cũng cộng cột usage, tưởng vậy là đủ kỹ. Con số ra được là 1,67 tỷ token, và tôi suýt đăng thẳng nó vào bài này. Chỉ đến khi dựng lại phép khử trùng lặp theo requestId, con số thật mới lộ ra: 946.786.932 token — thấp hơn gần một nửa.

Bẫy đếm trùng khiến tổng token phóng đại 1,76 lần
Bẫy đếm trùng khiến tổng token phóng đại 1,76 lần

Lý do rất đời thường: một lượt gọi API được nhật ký ghi thành nhiều dòng assistant — một dòng cho khối suy nghĩ, rồi mỗi công cụ được gọi lại thêm một dòng riêng — và tất cả các dòng đó chia sẻ chung đúng một khối usage. Cộng theo dòng nghĩa là cộng một hoá đơn nhiều lần. Trên một phiên mẫu, 65 lượt gọi thật sinh ra 118 dòng; 43 trong số đó có nhiều hơn một dòng, và cả 43 đều lặp y nguyên khối usage. Bằng chứng rõ nhất là lượt gọi req_011CeaWxtiSehQsDGwGLJGkA: nó xuất hiện ba lần trong nhật ký, cả ba dòng đều ghi cache_creation_input_tokens: 89.786 — con số y hệt nhau, không phải ba lượt nạp cache riêng biệt.

Bài trong chuỗi này từng trích một bộ số đo sai phạm vi vì đúng lỗi đó — 27 phiên, gộp nhiều dự án, đã cũ. Số đúng và cách tính lại nằm ở bài đừng để agent đọc cả repo; bài đó tôi không nhắc lại số ở đây, vì phạm vi đo của nó hẹp hơn phạm vi của bảng dưới.

Vì sao bài này tồn tại

Chuỗi mười hai bài của Kinh tế Vibe Coding đã từng để mỗi bài tự mang một bộ số riêng. Cách đó có một lỗ hổng: số ở bài này không tự cập nhật khi công cụ đo được vá lỗi, nên hai bài đứng cạnh nhau có thể đọc như đang mâu thuẫn dù cả hai đều từng đúng tại thời điểm viết.

Từ bài này trở đi, đây là nơi DUY NHẤT giữ bảng số gốc của chuỗi. Bài khác cần trích số thì trỏ ilink về đây, không tự mang thêm một bản sao. Nguồn của mọi bảng dưới là SO_LIEU_CHUAN.md trong repo — số giữ nguyên như file đó ghi, không làm tròn lại, không tự tính thêm. Chỉ có đúng một phép tính tôi cộng vào: file gốc ghi tiền bằng đô la Mỹ, còn bài này quy hết sang đồng theo một tỉ giá cố định 26.200 đ một đô, để con số đọc lên là con số người Việt hình dung được ngay.

Cửa sổ dữ liệu, và phần không đo được

Bảng dưới đây đo trên đúng một repo, my-website, không gộp dự án khác:

Công cụCửa sổ dữ liệuPhiênLượt gọiTokenĐộ tin cậy
Claude Code14/07–02/09/2026624.794946.786.932Đo được
Codex10/07–30/08/2026293.188437.691.606Đo được
Antigravity (Gemini)19/08–01/09/202654~5.874806.459.082 – 1.152.255.588Ước tính
Tổng đo được917.9821.384.478.538
Tổng gồm ước tính~145~13.856~2.363.674.338
↔ Kéo theo phương ngang để xem toàn bộ bảng
Token đo được trên repo my-website, theo công cụ
Claude Code
946,8
Codex
437,7
Antigravity (ước tính)
806,5 – 1.152,3

Đơn vị: triệu token. Thanh của Antigravity vẽ ở cận dưới khoảng ước tính, con số bên phải là cả khoảng.

Repo này mở ngày 21/04/2026, 392 lượt commit, nhưng không công cụ nào giữ đủ nhật ký từ ngày đó. Claude Code có cơ chế dọn dẹp mặc định xoá transcript sau 30 ngày, nên phần dữ liệu đầy đủ chỉ còn lại từ khoảng 03/08/2026 — bốn tháng đầu gần như mất trắng, chỉ còn sót lại vài phiên dài từng được mở lại trong tháng 08. Codex và Antigravity không tự xoá nhật ký, nhưng phiên đầu tiên của mỗi công cụ chạm vào repo này muộn hơn: Codex từ 10/07, Antigravity từ 19/08 — ngày cài đặt công cụ.

Công cụĐầy đủ từNguyên nhân thiếu
Claude Code~03/08/2026Cơ chế dọn dẹp mặc định 30 ngày xoá transcript
Codex12/05/2026Không xoá nhật ký; phiên đầu chạm my-website là 10/07
Antigravity14/08/2026Ngày cài đặt; quỹ đạo my-website đầu tiên là 19/08
↔ Kéo theo phương ngang để xem toàn bộ bảng

Ước lượng thận trọng cho phần Claude Code đã mất (21/04–02/08, 230 lượt commit), lấy mức tiêu thụ token trung bình mỗi commit đo được ở cửa sổ đầy đủ làm chuẩn: nếu cường độ làm việc bằng một nửa tháng 08 thì khoảng 627 triệu token đã trôi mất không đo lại được; nếu giữ nguyên cường độ thì khoảng 1,253 tỷ. Cộng phần đo được và phần ước tính, toàn vòng đời repo rơi vào khoảng 3,0–3,6 tỷ token — gần một phần ba con số đó là suy đoán, không phải số đo.

Bên trong hoá đơn Claude Code

Đây là bảng quan trọng nhất của cả chuỗi, vì phần lớn kết luận về chi phí trong các bài khác đều bắt nguồn từ đây:

Loại tokenSố lượng% tokenĐơn giá so với input% chi phí
Cache read923.581.49597,55%0,1x61,2%
Cache write18.101.1971,91%2,0x23,8%
Output4.374.4980,46%5,0x14,5%
Input tươi729.7420,08%1,0x0,5%
Tổng946.786.932100%100%
↔ Kéo theo phương ngang để xem toàn bộ bảng
Khối lượng token và hoá đơn không đi cùng nhau
% token% chi phí
Cache read
97,55%
61,2%
Cache write
1,91%
23,8%
Output
0,46%
14,5%
Input tươi
0,08%
0,5%

Đọc bảng này là đọc ba con số lệch pha nhau theo đúng kiểu đáng chú ý nhất: cache read chiếm 97,55% khối lượng token nhưng chỉ 61,2% hoá đơn, vì giá của nó chỉ bằng một phần mười giá input. Ngược lại cache write chỉ chiếm 1,91% khối lượng nhưng ăn tới 23,8% hoá đơn, đứng ngay sau cache read và trước cả output — lý do là 100% lượt ghi cache trên repo này rơi vào bậc giá TTL một giờ (gấp đôi giá input), không có lượt nào rơi vào bậc rẻ hơn của TTL năm phút. Tỉ lệ token phía input trên output là 215,4 : 1, trung bình mỗi lượt gọi mang theo 197.494 token, và trong phần output có 941.297 token thuộc khối suy nghĩ (thinking) — khoảng 22% output, tính tiền như output thường.

Chia theo mô hình đã dùng:

Mô hìnhLượt gọiTokenChi phí niêm yết (đồng)
claude-opus-54.592911.799.49518.868.716
claude-opus-4-814126.602.856651.070
claude-fable-5253.356.070193.880
claude-sonnet-5365.028.51174.146
Tổng4.794946.786.93219.787.812
↔ Kéo theo phương ngang để xem toàn bộ bảng

Đơn giá thực tế sau khi pha trộn cả bốn mô hình và cả cache: khoảng 20.908 đ mỗi triệu token. Nếu tắt cache hoàn toàn, cùng khối lượng công việc đó tốn 126.310.200 đ — nghĩa là cache đang cắt 84,3% hoá đơn. Trên cửa sổ dữ liệu đầy đủ (03/08–02/09, 162 lượt commit), chi phí Claude Code trung bình mỗi lượt commit là 113.184 đ. Cả ba công cụ trong bài này đều chạy trên gói thuê bao, không phải trả theo API — số tiền ở đây chỉ để so sánh mức tiêu thụ, không phải tiền đã trả thật.

Cache cắt 84,3% hoá đơn cho cùng khối lượng công việc
Có cache — thực tế
19.787.812 đ
Không cache
126.310.200 đ

Chi phí niêm yết quy đổi theo tỉ giá cố định 26.200 đ một đô la Mỹ, dùng để so sánh mức tiêu thụ — cả ba công cụ đều chạy trên gói thuê bao, không phải tiền đã trả thật.

Có một quy tắc hành động rút ra thẳng từ hai dòng cache read/cache write ở bảng trên — phần đó tôi để dành cho một bài riêng, vì nó cần không gian để giải thích cho đúng, không nhét gọn trong một bảng được.

Đối chiếu với quy mô cả dự án

Repo my-website không phải toàn bộ khối lượng công việc của từng công cụ — đây là tỉ trọng nó chiếm trong tổng số đo được trên máy:

Công cụToàn bộ dự ánRiêng my-websiteTỉ trọng
Claude Code — token1.730.624.349946.786.93254,7%
Codex — token2.739.866.428437.691.60616,0%
Antigravity — bước mô hình9.4575.87562,1%
↔ Kéo theo phương ngang để xem toàn bộ bảng

Con số "toàn bộ dự án" của Claude Code được khử trùng lặp toàn cục nên thấp hơn tổng cộng dồn từng thư mục dự án lại — hai phép cộng không dùng chung đơn vị đếm nên không so trực tiếp được với nhau.

Một bài khác trong chuỗi đo trên dự án nội bộ aup-sourcing-ai, không phải my-websitebài phối hợp Claude và Gemini ghi rõ phạm vi đó ngay trong bài, số khác nhau vì repo khác nhau, không phải vì mâu thuẫn.

Tự đo cho dự án của bạn

Script sinh lại toàn bộ các bảng trên: npx tsx scripts/analyze-agent-sessions.ts. Nó đọc thư mục ~/.claude/projects/, tự khử trùng lặp theo requestId trước khi cộng — đúng cái bẫy đã mở đầu bài này. Nếu bạn tự viết lại phép đo của riêng mình, nhớ ba việc: khử trùng theo requestId (hoặc uuid nếu bản ghi không có requestId) trước khi cộng bất cứ cột nào, không tin một script tự xưng là "đã đo được" cho tới khi đối chiếu được bằng chứng cụ thể như lượt gọi lặp dòng ở trên, và đừng chờ tới lúc cần số mới nhớ ra transcript đã bị dọn — dọn dẹp mặc định 30 ngày âm thầm ăn mất bốn tháng dữ liệu đầu của chính repo này.

Muốn giữ được số đo cho cả vòng đời một dự án dài hơn 30 ngày, có hai cách: tăng cleanupPeriodDays trong cấu hình trước khi bắt đầu dự án, hoặc định kỳ sao lưu thư mục ~/.claude/projects/ ra chỗ khác. Tôi chỉ biết cách thứ hai sau khi đã mất bốn tháng đầu không lấy lại được.

Điều tôi giữ lại từ lần sửa này

Con số không tự nhiên sai — nó sai vì cách đếm sai, và cách đếm sai lại rất dễ trông như đúng, vì mỗi dòng nhật ký nhìn riêng lẻ đều hợp lệ. Cái duy nhất bắt được lỗi là đối chiếu bằng chứng cụ thể: một requestId lặp lại ba lần với cùng một khối usage, chứ không phải tin vào tổng số đã cộng xong.

Từ giờ mỗi bài trong chuỗi này trích số bằng cách trỏ về bài này, không tự mang một bản sao nữa. Bảng ở đây sẽ còn được cập nhật khi công cụ đo tiến bộ hơn — phần còn lại của chuỗi chỉ cần trỏ đúng chỗ.

Gửi bài này cho người đang cần

Facebook

← Bài trước

Quản Lý Chi Phí Token Khi Vibe Code: Khung Quyết Định Ba Tầng