Đếm token LLM và chia chunk API
Đếm token chính xác theo encoding OpenAI (o200k_base, cl100k_base), ước lượng cho model khác, cắt văn bản đúng N token và chia chunk cho RAG.
Đếm token bằng đúng bộ tách token của OpenAI: o200k_base (GPT-4o, GPT-4.1, GPT-5, o1 / o3 / o4) và cl100k_base (GPT-4, GPT-3.5, text-embedding-3), dùng bảng ranks của tiktoken qua thư viện gpt-tokenizer. Truyền model (ví dụ gpt-4o) để tự chọn encoding. Kết quả còn có số ký tự, số từ, số token mỗi từ, chi phí ước tính (price_per_million) và kiểm tra giới hạn (max_tokens). Với Claude, Gemini, Llama, Mistral, Qwen và DeepSeek, vốn không công bố hoặc không đóng gói được bộ tách token, API trả về con số ước lượng có ghi rõ và kèm khoảng sai số, không bao giờ coi là chính xác.
action=truncate cắt văn bản còn tối đa max_tokens token (giữ phần đầu, hoặc giữ phần cuối với keep=end) mà không làm vỡ ký tự. action=chunk chia văn bản dài để làm RAG: ưu tiên ranh giới heading Markdown, rồi đoạn văn, dòng, câu (xử lý đúng câu tiếng Việt với các chữ viết tắt như "TP.", "ThS."), rồi đến từ; gom các mảnh đến max_tokens và thêm phần overlap gồm các câu trọn vẹn. Mỗi chunk có vị trí ký tự start / end chính xác trong văn bản gốc. action=encode / decode chuyển qua lại giữa văn bản và mã token.
Với văn bản tiếng Việt, kết quả cho biết tốn hơn tiếng Anh bao nhiêu (vietnamese_vs_english, đo trên cùng một đoạn văn ở hai ngôn ngữ). Token đặc biệt như <|endoftext|> được tính như văn bản thường, trừ khi special=true. Giới hạn: 1 triệu ký tự (500.000 ký tự khi chia chunk). Văn bản chỉ được xử lý trong bộ nhớ, không lưu lại.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
text | body|query | string | có | Văn bản (tối đa 1.000.000 ký tự). Có thể gửi thẳng body text/plain. | |
action | body|query | string | không | count | count, truncate, chunk, encode hoặc decode. |
encoding | body|query | string | không | o200k_base, cl100k_base hoặc all (mặc định: cả hai khi đếm, o200k_base cho thao tác khác). | |
model | body|query | string | không | Tên model OpenAI (ví dụ gpt-4o, gpt-4) để chọn encoding. | |
max_tokens | body|query | number | không | Giới hạn khi cắt, kích thước chunk khi chia (mặc định 512), ngưỡng kiểm tra khi đếm. | |
overlap | body|query | number | không | 50 | Số token chồng lấn giữa các chunk (gồm câu trọn vẹn, tối đa một nửa max_tokens). |
keep | body|query | string | không | start | Khi cắt: giữ phần đầu (start) hay phần cuối (end). |
price_per_million | body|query | number | không | Giá USD cho 1 triệu token đầu vào, để tính estimated_cost_usd. | |
ids | body|query | array | không | Danh sách mã token cho action=decode (mảng hoặc phân tách bằng dấu phẩy). | |
special | body|query | boolean | không | false | Coi <|endoftext|> và tương tự là token đặc biệt. |
estimates | body|query | boolean | không | true | Kèm ước lượng cho các dòng model khác. |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/llm-tokens" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Xin chào! Hôm nay trời đẹp, chúng ta đi dạo nhé."}'const res = await fetch('https://apibox.io.vn/v1/llm-tokens', {
method: 'POST',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"text": "Xin chào! Hôm nay trời đẹp, chúng ta đi dạo nhé."
}),
});
const data = await res.json();
console.log(data);import requests
res = requests.post(
"https://apibox.io.vn/v1/llm-tokens",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"text": "Xin chào! Hôm nay trời đẹp, chúng ta đi dạo nhé."},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/llm-tokens');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => '{"text":"Xin chào! Hôm nay trời đẹp, chúng ta đi dạo nhé."}',
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"encoding": "o200k_base",
"tokens": 17,
"counts": {
"o200k_base": 17,
"cl100k_base": 28
},
"characters": 48,
"bytes_utf8": 60,
"words": 11,
"language": "vi",
"tokens_per_word": 1.55,
"chars_per_token": 2.82,
"vietnamese_vs_english": {
"reference": "the same paragraph in English and Vietnamese",
"english_tokens": 39,
"vietnamese_tokens": 45,
"ratio": 1.15,
"english_tokens_per_word": 1.08,
"vietnamese_tokens_per_syllable": 1.22,
"this_text_tokens_per_word": 1.55
},
"estimates": [
{
"family": "anthropic",
"models": "Claude",
"estimated_tokens": 35,
"range": [
28,
42
],
"estimate": true,
"basis": "cl100k_base × 1.25",
"note": "Claude tokenizer is not public; use the free Anthropic count_tokens API for exact numbers."
},
{
"family": "google",
"models": "Gemini, Gemma",
"estimated_tokens": 16,
"range": [
14,
18
],
"estimate": true,
"basis": "o200k_base × 0.95",
"note": "SentencePiece 256k vocabulary; exact counts via the Gemini countTokens API."
},
"…"
],
"estimates_note": "Estimates are heuristics (an exact OpenAI count × a factor per script), not real tokenizer output.",
"source": "gpt-tokenizer 4.1.2 (MIT), OpenAI tiktoken ranks"
}
Ứng dụng
- Kiểm tra prompt có vừa cửa sổ ngữ cảnh trước khi gọi API
- Chia tài liệu thành chunk theo token, kèm vị trí, để đưa vào chỉ mục RAG
- Ước tính chi phí token của một tác vụ hàng loạt
- Đếm token từ Apps Script, n8n, Make hay PHP, nơi không có tiktoken
Hỏi đáp
Số token của Claude và Gemini có chính xác không?
Không. Bộ tách token của các hãng này không công khai nên đó là con số ước lượng, tính từ số token chính xác của OpenAI nhân hệ số theo loại chữ, kèm khoảng sai số. Khi cần số chính xác hãy dùng API đếm token của chính hãng.
Vì sao tiếng Việt tốn token hơn tiếng Anh?
Bộ tách token được huấn luyện chủ yếu trên tiếng Anh nên âm tiết tiếng Việt có dấu bị tách thành nhiều mảnh hơn. Với o200k_base chênh lệch nhỏ (khoảng 1,15 lần trên đoạn văn mẫu); cl100k_base cũ hơn thì tốn hơn nhiều.
Chunk có cắt ngang câu không?
Chỉ khi một câu dài hơn max_tokens. Còn lại chunk luôn kết thúc ở ranh giới heading, đoạn, dòng hoặc câu, và vị trí start / end giúp ánh xạ chunk về văn bản gốc.
API liên quan
So sánh văn bản
So sánh hai đoạn văn bản theo dòng, từ, ký tự, câu hoặc JSON; nhận danh sách thay đổi, tỉ lệ giống nhau và bản diff dạng unified.
a-bTạo slug
Chuyển tiêu đề thành slug URL gọn gàng: bỏ dấu tiếng Việt (cả chữ đ), tuỳ chọn ký tự phân cách, giữ chữ hoa và giới hạn độ dài.
123Thống kê văn bản
Đếm số từ, ký tự, câu, đoạn và dòng; ước tính thời gian đọc và thời gian nói; liệt kê các từ xuất hiện nhiều nhất trong văn bản.