🤖 Ước lượng chi phí token khi gọi AI API

By Better Wise

Bài trước bạn đã gắn tag chi phí và đặt budget alert để biết tiền đang chảy đi đâu và bị chặn lại khi vượt ngưỡng. Nhưng budget alert chỉ hét lên khi tiền đã tiêu, còn muốn đặt ngưỡng cho đúng thì phải ước lượng trước. Với AI API, tiền không tính theo tháng mà tính theo token, nên một đoạn code lặp 1.000 lần có thể sinh ra hoá đơn mà không ai thấy trong lúc review.

Sau bài này, bạn sẽ:

  • Hiểu một request AI được tính tiền theo input token và output token như thế nào.
  • Tính được chi phí của một request bằng ví dụ số cụ thể.
  • Nhân lên cho toàn bộ lượng người dùng dự kiến trong một tháng.
  • Nhận ra bốn khoản phí token hay bị bỏ sót và cách chặn trước.

Input token và output token: hai đồng hồ chạy khác giá

Mỗi lần gọi AI API, nhà cung cấp đếm hai con số:

  • Input token: toàn bộ những gì bạn gửi lên, gồm system prompt, lịch sử hội thoại, tài liệu nhét vào context và câu hỏi của người dùng.
  • Output token: phần model sinh ra để trả lời.

Giá niêm yết luôn tính theo 1 triệu token (per 1M tokens), và output thường đắt hơn input khoảng 3 đến 5 lần, vì sinh token tốn compute hơn đọc token. Trong bài này mình dùng một bảng giá minh hoạ để dễ tính, bạn nhớ thay bằng giá thật trên trang pricing của model mình đang gọi:

Thành phần Giá minh hoạ
Input 1 USD / 1 triệu token
Output 3 USD / 1 triệu token

Công thức tính chi phí một request

$$ C = \frac{T_{in}}{10^6} \times P_{in} + \frac{T_{out}}{10^6} \times P_{out} $$

Nghĩa là: đếm token thật, chia cho 1 triệu, nhân với đơn giá, rồi cộng hai phần lại. Sai lầm phổ biến nhất là quên chia cho 1 triệu và ra con số to gấp triệu lần, hoặc chỉ tính input mà bỏ output.

Ví dụ 1: một request của chatbot support

Giả sử mỗi request gồm:

  • system prompt hướng dẫn giọng điệu: 400 token
  • lịch sử hội thoại gần nhất: 1.200 token
  • câu hỏi của khách: 200 token
  • model trả lời: 400 token
Thành phần Token Cách tính Chi phí
Input 1.800 1.800 / 1.000.000 × 1 USD 0,0018 USD
Output 400 400 / 1.000.000 × 3 USD 0,0012 USD
Tổng 0,003 USD

Ba phần nghìn đô một request. Nghe như không đáng kể, cho đến khi bạn nhân với số người dùng.

Nhân lên cho toàn bộ lượng người dùng dự kiến

Ví dụ 2: 1.000 người dùng, mỗi người 20 request mỗi tháng

  • Tổng request: 1.000 × 20 = 20.000 request
  • Chi phí gốc: 20.000 × 0,003 USD = 60 USD
  • Cộng 5% cho retry, timeout và lần gọi lại do người dùng bấm hai lần: 21.000 request → 63 USD/tháng

Con số 63 USD này là thứ bạn cần đưa vào budget alert, không phải con số 60 USD, vì phần dư 5% là phần gần như chắc chắn sẽ xảy ra.

Ví dụ 3: cái bẫy gửi lại toàn bộ lịch sử hội thoại

Vẫn bảng giá trên. Một người dùng chat 10 lượt. Mỗi lượt bạn gửi lại toàn bộ hội thoại, system prompt 400 token, câu hỏi 200 token, câu trả lời 300 token.

  • Lượt 1: input 600 token
  • Lượt 2: input 1.100 token (đã có câu hỏi và câu trả lời của lượt 1)
  • Lượt 3: input 1.600 token
  • ...
  • Lượt 10: input 5.100 token

Tổng input 10 lượt: (600 + 5.100) × 10 / 2 = 28.500 token. Output: 3.000 token.

Chi phí: 0,0285 + 0,009 = 0,0375 USD cho một cuộc hội thoại 10 lượt.

Nếu bạn ước lượng ngây thơ bằng lượt đầu (600 input, 300 output = 0,0015 USD) rồi nhân 10, bạn ra 0,015 USD, thiếu hơn một nửa. Đây là lý do hay gặp nhất khiến hoá đơn AI vượt dự toán: input phình ra theo từng lượt chứ không đứng yên.

Important: Với hội thoại nhiều lượt, chi phí input tăng gần như bậc hai theo số lượt. Ước lượng theo lượt đầu tiên luôn cho con số thấp hơn thực tế.

Bốn khoản phí token hay bị bỏ sót

  1. System prompt dài: 400 token nghe nhỏ, nhưng nó bị tính lại ở mọi request. Rút từ 400 xuống 200 token là giảm 11% tổng input trong ví dụ 1, miễn phí, không ảnh hưởng trải nghiệm.
  2. Output dài: output token thường đắt hơn input token 3 đến 5 lần. Đặt max_tokens và yêu cầu trả lời ngắn là đòn rẻ nhất.
  3. Retry và lần gọi lặp: mỗi lần retry vẫn là một request tính tiền, kể cả khi request đó timeout và người dùng không nhận được gì. Đừng retry vô hạn trong vòng lặp.
  4. Bước phụ trong pipeline: embedding để tìm kiếm, lần gọi thứ hai để tóm tắt, lần gọi thứ ba để kiểm tra nội dung. Mỗi bước là một dòng hoá đơn riêng, cộng lại mới ra chi phí thật của một lượt người dùng.

Quy trình ước lượng trong 5 bước

  1. Chốt một request mẫu đại diện, gồm cả system prompt và lịch sử trung bình.
  2. Đếm token thật bằng tokenizer của nhà cung cấp, đừng đếm từ rồi đoán: tiếng Việt tốn nhiều token hơn tiếng Anh cho cùng một ý.
  3. Nhân với đơn giá input và output, ra chi phí một request.
  4. Nhân với số request mỗi người dùng mỗi tháng, rồi nhân với số người dùng dự kiến.
  5. Cộng thêm 5 đến 10% cho retry và các bước phụ, ra con số đem đi đặt budget alert.

Mẹo để không bị sốc hoá đơn AI

  • Đo token trên prompt thật của bạn, không đo trên prompt mẫu ngắn gọn trong tài liệu.
  • Ước lượng theo kịch bản xấu nhất (người dùng chat dài, tài liệu nhét nhiều) chứ không theo kịch bản đẹp nhất.
  • Đặt max_tokens cho output ngay từ ngày đầu, và cắt lịch sử hội thoại về N lượt gần nhất.
  • Với khối lượng lớn hoặc phần prompt lặp lại, xem bảng giá có hạng mục batch hoặc prompt caching không; hai hạng mục này thường có đơn giá thấp hơn, nhưng phải đọc kỹ điều kiện áp dụng.
  • Ghi lại công thức và con số ước lượng vào cùng chỗ với tag chi phí, để tháng sau so hoá đơn thật với dự toán.

Chốt lại

  • Tiền AI tính theo token, gồm input và output, với output đắt hơn vài lần.
  • Công thức: token chia 1 triệu, nhân đơn giá, cộng hai phần.
  • Một request vài phần nghìn đô, nhưng nhân với số người dùng và số lượt thì thành hoá đơn thật.
  • Gửi lại lịch sử hội thoại làm input phình theo cấp số cộng, đây là khoản bị ước lượng thiếu nhiều nhất.

Bài tiếp theo sẽ nối con số này với hạ tầng: quy tắc tắt tài nguyên không dùng và cách tính cost per user để biết mỗi người dùng thực sự mang lại bao nhiêu so với chi phí bỏ ra.

Request gửi lên model được tính tiền theo _____, còn phần model trả về tính theo output token. Giá niêm yết theo đơn vị _____, nên phải chia số token thực tế cho 1.000.000 trước khi nhân đơn giá. Với cùng một lượng token, output token thường _____ input token. Nếu mỗi lượt chat đều gửi lại toàn bộ lịch sử hội thoại, chi phí input sẽ _____. Một lần retry do timeout vẫn _____.

Front: Một request AI API được tính tiền theo hai phần nào? Back: Input token (những gì gửi lên) và output token (những gì model sinh ra).

Front: Giá AI API thường được niêm yết theo đơn vị nào? Back: Theo 1 triệu token (per 1M tokens), phải chia token thực tế cho 1.000.000 trước khi nhân giá.

Front: Công thức chi phí một request là gì? Back: (input token / 1.000.000 × giá input) + (output token / 1.000.000 × giá output).

Front: Output token đắt hơn input token khoảng bao nhiêu lần? Back: Khoảng 3 đến 5 lần, vì sinh token tốn compute hơn đọc token.

Front: Vì sao gửi lại toàn bộ lịch sử hội thoại làm phí tăng nhanh? Back: Input của mỗi lượt chứa toàn bộ lượt trước, nên tổng input tăng gần như bậc hai theo số lượt.

Front: System prompt dài ảnh hưởng chi phí thế nào? Back: Bị tính lại như input token ở mọi request, nên rút ngắn là giảm phí trên toàn bộ lưu lượng.

Front: Retry do timeout có được miễn phí không? Back: Không. Mỗi lần gọi là một request tính tiền, kể cả khi người dùng không nhận được kết quả.

Front: Cách ước lượng token chính xác nhất là gì? Back: Đếm bằng tokenizer của nhà cung cấp trên prompt thật, không đếm từ rồi đoán.

Front: Vì sao không nên đếm số từ để suy ra token với tiếng Việt? Back: Tiếng Việt tốn nhiều token hơn tiếng Anh cho cùng một ý, nên đếm từ cho ra con số thấp hơn thực tế.

Front: Ba biến quyết định hoá đơn AI hằng tháng là gì? Back: Token mỗi request, số request mỗi tháng, và đơn giá của model.

Front: Hai cách giảm phí token mà gần như không giảm trải nghiệm? Back: Đặt max_tokens cho output và cắt bớt lịch sử hội thoại cùng system prompt.

Front: Vì sao phải cộng thêm 5 đến 10% khi ước lượng? Back: Để bù cho retry, timeout và các bước phụ trong pipeline, những khoản gần như chắc chắn xảy ra.

Front: Batch API và prompt caching giúp gì? Back: Thường có đơn giá thấp hơn cho khối lượng lớn hocho phần prompt lặp lại, nên hạ được phí mà gần như không đổi chất lượng.

Những chỗ người mới hay tính lệch

  • Nhầm đơn giá per 1K token với per 1M token: lệch đúng 1.000 lần. Đọc kỹ đơn vị trên trang giá trước khi nhân.
  • Chỉ tính một request mẫu rồi nhân với số người dùng, bỏ qua retry, timeout và các bước phụ trong pipeline. Một pipeline có 3 bước gọi model là 3 lần tính tiền, không phải 1.
  • Quên output token vì nó không nằm trong prompt bạn viết. Đây thường là khoản bị bỏ sót nhiều nhất.
  • Không đặt max_tokens, để model tự do sinh đến hết. Một câu trả lời dài gấp đôi là phí gấp đôi phần output.
  • Ước lượng bằng cách đếm từ. Với tiếng Việt, đếm từ luôn cho con số thấp hơn thực tế. Hãy đếm bằng tokenizer của nhà cung cấp.
  • Không tách metric theo từng feature. Nếu mọi request đều gắn cùng một tag, bạn biết tổng phí nhưng không biết phần nào đang đốt tiền.

Quy tắc của tôi: mọi con số ước lượng đều làm tròn lên, và luôn cộng thêm 5 đến 10% cho retry cùng các bước phụ. Thà dự toán cao hơn hoá đơn thật một chút còn hơn ngược lại.

Chốt lại và sang bài tính cost per user

  • Chi phí một request = (input token × giá input) + (output token × giá output), chia theo đơn vị 1K hoặc 1M token.
  • Ba biến quyết định hoá đơn: token mỗi request, số request mỗi tháng, đơn giá model.
  • Lịch sử hội thoại và system prompt bị tính lại ở mọi lượt, nên đây là hai chỗ rò rỉ phí lớn nhất.
  • Muốn giảm phí mà gần như không giảm trải nghiệm: đặt max_tokens, cắt lịch sử, chọn model nhỏ hơn cho tác vụ đơn giản.

Bài tiếp theo lấy con số bạn vừa tính được ở đây để chia cho số người dùng thật, kèm quy tắc tắt những tài nguyên không còn ai gọi.

Front: Công thức chi phí một request gọi AI API là gì? Back: Input token nhân giá input, cộng output token nhân giá output.

Front: Token là gì? Back: Đơn vị nhỏ hơn từ mà model đọc và sinh ra, dùng để tính tiền.

Front: Vì sao output token đắt hơn input token? Back: Sinh token tốn compute hơn đọc token, thường đắt gấp 3 đến 5 lần.

Front: Gửi lại toàn bộ lịch sử hội thoại ảnh hưởng chi phí thế nào? Back: Input mỗi lượt chứa toàn bộ lượt trước, nên tổng input tăng gần như bậc hai theo số lượt.

Front: System prompt dài ảnh hưởng chi phí ra sao? Back: Bị tính lại như input token ở mọi request, nên rút ngắn là giảm phí trên toàn bộ lưu lượng.

Front: Retry do timeout có được miễn phí không? Back: Không. Mỗi lần gọi là một request tính tiền, kể cả khi người dùng không nhận được kết quả.

Front: Cách ước lượng token chính xác nhất là gì? Back: Đếm bằng tokenizer của nhà cung cấp trên prompt thật.

Front: Vì sao không nên đếm số từ để suy ra token với tiếng Việt? Back: Tiếng Việt tốn nhiều token hơn tiếng Anh cho cùng một ý, nên đếm từ cho ra con số thấp hơn thực tế.

Front: Ba biến quyết định hoá đơn AI hằng tháng? Back: Token mỗi request, số request mỗi tháng, và đơn giá của model.

Front: Hai cách giảm phí token mà gần như không giảm trải nghiệm? Back: Đặt max_tokens cho output và cắt bớt lịch sử hội thoại cùng system prompt.

Front: Vì sao phải cộng thêm 5 đến 10% khi ước lượng? Back: Để bù cho retry, timeout và các bước phụ, những khoản gần như chắc chắn xảy ra.

Front: Batch API và prompt caching giúp gì? Back: Có đơn giá thấp hơn cho khối lượng lớn hoặc cho phần prompt lặp lại.

Front: Một pipeline có 3 bước gọi model thì tính phí thế nào? Back: Tính 3 request riêng biệt, không phải 1, vì mỗi bước đều là một lần gọi API.