Quay lại blog

Tối ưu chi phíHướng dẫn

Đếm token trước khi gửi yêu cầu: tiktoken trong Python

Ước lượng số token của một prompt ngoại tuyến bằng tiktoken, kiểm tra với cửa sổ ngữ cảnh, định giá, và so sánh với trường usage của API.

Bởi CheapTokens TeamĐã xuất bản 6 phút đọc

Terminal hiển thị pip install tiktoken và số token đếm bằng một dòng lệnh
Trên trang này
  1. Năm dòng đếm token
  2. Prompt có vừa cửa sổ không?
  3. Sẽ tốn bao nhiêu?
  4. So sánh ước lượng với usage

Bạn có thể tự đếm token của một prompt ngay trên máy mình trước khi gửi đi: cài tiktoken, mã hoá văn bản, lấy len() của kết quả. tiktoken là tokeniser của OpenAI, nên với các model DeepSeek, GLM và MiniMax thì con số này chỉ là ước lượng. Con số thật sẽ trả về trong usage.prompt_tokens sau lần gọi đầu tiên, và so sánh hai con số chỉ tốn thêm một dòng.

Tại sao phải bận tâm? Vì cả hoá đơn lẫn lỗi đều bắt đầu từ kích thước đầu vào. Dán một hợp đồng dài vào script, và bạn chỉ biết nó quá lớn khi API trả về lỗi 400. Chạy một lô năm nghìn email, và bạn chỉ biết nó tốn bao nhiêu khi số dư đã giảm. Đếm trước biến cả hai bất ngờ đó thành một con số bạn đọc được từ trước.

Năm dòng đếm token#

tiktoken README (kiểm tra ngày 1 tháng 11 năm 2026) cho thấy toàn bộ ý tưởng: chọn một encoding, mã hoá văn bản, và độ dài của danh sách chính là số token.

bash
pip install tiktoken
python
import tiktoken

enc = tiktoken.get_encoding('o200k_base')
text = 'Hello world'
tokens = enc.encode(text)
print(len(tokens))  # how many tokens the text is
Năm dòng trong một file tên là estimate.py
Toàn bộ bộ đếm: get_encoding, encode, len.

enc.decode(tokens) trả lại văn bản gốc, một cách kiểm tra nhanh tiện lợi để chắc rằng bạn đang nhìn đúng văn bản mà model sẽ thấy. README cũng nhắc đến tiktoken.encoding_for_model('gpt-4o'), chọn tokeniser cho một model OpenAI cụ thể. Đó là điểm cần nhớ: tokeniser thuộc về từng họ model. Quy tắc ngón tay cái trong README là khoảng bốn byte văn bản mỗi token, và nó chỉ mô tả tokeniser của OpenAI.

Vậy với model DeepSeek thì sao? Dùng cùng cách đếm đó như một ước lượng tạm, rồi hiệu chỉnh, như trình bày bên dưới.

Đoán số

Một đoạn văn tiếng Anh 2.000 ký tự thì khoảng bao nhiêu token?

Hiện đáp án

Trả lời: 500

Khoảng 500. Với quy tắc ngón tay cái của README là bốn byte mỗi token, và văn bản tiếng Anh thông thường khoảng một byte mỗi ký tự, 2.000 ÷ 4 = 500. Các ngôn ngữ khác và emoji tốn nhiều byte hơn mỗi ký tự, nên cùng 2.000 ký tự thường nghĩa là nhiều token hơn theo quy tắc đó.

Prompt có vừa cửa sổ không?#

Mỗi model có một cửa sổ ngữ cảnh, và đầu vào cộng với câu trả lời bạn cho phép phải vừa trong đó. Cửa sổ của các model chúng tôi phục vụ: DeepSeek-V4-Flash 380K, GLM-5.3-Flash 390K, MiniMax-M2.7 180K token. Câu trả lời dài nhất là 32.768 token với DeepSeek-V4-Flash và 8.192 với hai model còn lại (danh sách model CheapTokens, 1 tháng 11 năm 2026).

Một bước kiểm tra trước khi gọi gồm bốn dòng:

python
CONTEXT = {
    'deepseek-ai/DeepSeek-V4-Flash-0731': 380_000,
    'zai-org/GLM-5.3-Flash': 390_000,
    'MiniMaxAI/MiniMax-M2.7': 180_000,
}

def fits(prompt_tokens, max_tokens, model):
    return prompt_tokens + max_tokens <= CONTEXT[model]

Giả sử bạn có một tài liệu 250.000 token. fits(250_000, 8_192, 'MiniMaxAI/MiniMax-M2.7') là False, nên bạn chuyển việc đó sang model có cửa sổ lớn hơn hoặc chia nhỏ tài liệu, và lỗi 400 không bao giờ xảy ra. fits(250_000, 8_192, 'deepseek-ai/DeepSeek-V4-Flash-0731') là True. Nếu bạn muốn biết đầy đủ lỗi trông như thế nào, request too long: 400 vs 413, context window and max_tokens đi qua từng bước.

Sẽ tốn bao nhiêu?#

Giờ đến ngân sách. Lấy một mục điển hình, đếm nó, rồi nhân lên. Giả sử bạn phân loại 5.000 email đơn hàng. Bạn đếm một email đại diện và được khoảng 800 token đầu vào, và bạn giới hạn nhãn cùng một lý do ngắn ở 200 token đầu ra. Tổng cộng: 5.000 × 800 = 4.000.000 token đầu vào và 5.000 × 200 = 1.000.000 token đầu ra.

Bảng dưới đây định giá đúng khối lượng công việc đó theo giá hiện hành, tính gộp cả đầu vào và đầu ra:

Mô hình Mỗi yêu cầu 5.000 yêu cầu OpenRouter, 5.000 yêu cầu
GLM-5.3-Flash $0.000024 $0.12 $0.217
DeepSeek-V4-Flash $0.000032 $0.16 $0.42
MiniMax-M2.7 $0.00007 $0.35 $4.20

800 token đầu vào và 200 token đầu ra mỗi yêu cầu. Giá trên 1 triệu token là giá hiện hành và thay đổi cùng với biểu phí của chúng tôi; cột OpenRouter hiển thị giá tham chiếu cho cùng khối lượng công việc.

Tổng cộng, khi tính gộp cả đầu vào và đầu ra, cột CheapTokens rẻ hơn OpenRouter với các model này. Đổi ba con số thành số đếm của bạn là bạn có ngân sách trước yêu cầu đầu tiên. Về sự khác biệt giữa hai phía của hoá đơn, xem input vs output tokens: what an AI API bills you for, và để có ví dụ đo thực tế xem how many tokens an API request uses. Giá hiện tại luôn có trên trang giá.

Luồng ước lượng từ văn bản đến số usage thật
Ước lượng ngoại tuyến, kiểm tra cửa sổ, gửi, rồi so với usage.

So sánh ước lượng với usage#

Ước lượng là phỏng đoán về tokeniser của người khác, nên hãy đối chiếu một lần với đáp án. Mỗi phản hồi đều mang trường usage, và usage.prompt_tokens là con số API đếm cho đầu vào của bạn. Đặt hai con số cạnh nhau và chia.

Từng bước một

Chạy phép so sánh

Thiết lập

Cài các gói và đặt key vào một biến môi trường. Không bao giờ dán nó vào script.

bash
pip install tiktoken openai
export CHEAPTOKENS_API_KEY='your-key-here'

Chạy script

Lưu đoạn này thành compare.py. Nó đếm cục bộ, gửi yêu cầu đến https://api.cheaptokens.dev/v1, và in cả hai con số. Model id là id đầy đủ từ danh sách model CheapTokens, vì tên rút gọn không được chấp nhận.

python
import os
import tiktoken
from openai import OpenAI

MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
enc = tiktoken.get_encoding('o200k_base')
messages = [{'role': 'user',
             'content': 'Classify this email as order, refund or other: Hi, my parcel from last Tuesday has not arrived yet.'}]

estimate = sum(len(enc.encode(m['content'])) for m in messages)

client = OpenAI(base_url='https://api.cheaptokens.dev/v1',
                api_key=os.environ['CHEAPTOKENS_API_KEY'])
r = client.chat.completions.create(model=MODEL, messages=messages, max_tokens=200)

real = r.usage.prompt_tokens
print(f'estimate {estimate}, usage.prompt_tokens {real}, ratio {real / estimate:.2f}')

Đọc khoảng chênh

Dòng cuối in ba con số. Giả sử nó hiện estimate 24, usage.prompt_tokens 31, ratio 1.29. Khi đó hãy nhân các ước lượng tương lai của bạn với tỷ lệ đó trước khi lập ngân sách. Một prompt thật còn được bọc trong định dạng chat, nên số đếm thật có thể cao hơn một chút so với ước lượng văn bản thuần. Hãy chạy trên vài prompt điển hình, không chỉ một, và dùng tỷ lệ trung bình.

Từ đó quy trình là: ước lượng cục bộ, kiểm tra cửa sổ, áp tỷ lệ của bạn vào ngân sách, và để usage trong mỗi phản hồi giữ bạn trung thực. Nếu bạn cũng muốn tổng cộng dồn cho cả một công việc, track AI agent token cost in Python xây dựng điều đó trên cùng trường này. Mới làm quen với kết nối? Your first API request with CheapTokens bao quát phần đó, và tài liệu có phần còn lại.

Ghép cặp

Ghép mỗi tên với điều nó cho bạn biết

  • len(enc.encode(text))Ước lượng cục bộ của bạn về kích thước đầu vào
  • usage.prompt_tokensKích thước đầu vào theo cách API đếm
  • usage.completion_tokensKích thước câu trả lời, được tính giá ở phía đầu ra
  • max_tokensGiới hạn độ dài câu trả lời mà bạn dành chỗ trong bước kiểm tra cửa sổ

Đếm rất rẻ, chạy cục bộ và chỉ mất vài giây. Hãy làm trước lần gọi tốn tiền.