Downloads · 30 days
0
JamesQuartz/qt-VI.6.4-49k
qt-VI.6.4-49k is a machine learning model from JamesQuartz. Use it for the machine learning task on the model card, and read the license before you ship it in a product. It is set up for tokenizers. The card lists the license as apache-2.0.
QT VI.6.4 is a 49,152-token byte-level BPE tokenizer built for broad multilingual coverage with a strong low-resource tail. It covers all 204 FLORES-200 languages, carries a full agentic / Fill-in-the-Middle control-t…
Downloads · 30 days
0
Access
Public
Updated Aug 15, 2026
Repo size
—
Likes
0
Public
Click a slice to open those files.
.json4.7 MB · 89%
From the Hugging Face model README
QT VI.6.4 is a 49,152-token byte-level BPE tokenizer built for broad multilingual coverage with a strong low-resource tail. It covers all 204 FLORES-200 languages, carries a full agentic / Fill-in-the-Middle control-token layout, and is designed as the shared backbone for an English-first, community-extensible model family: pretrain concentrated on English and code, then fine-tune downstream into other languages without hitting byte-fallback.
lm_head
projection aligned to Tensor-Core tile sizes) - under 40% the vocabulary size of
the tokenizers it is compared against (Llama 3.2: 128,256; DeepSeek V4: 129,280 as
measured here). A smaller vocabulary means a smaller embedding matrix, which is the
point: it keeps the embedding footprint low on a small model.decode(encode(x)) == x for any input,
including code, emoji, and mixed scripts.Tokenizer efficiency should be read against vocabulary size, because a larger vocabulary buys compression at the cost of a larger embedding matrix.
| Tokenizer | Vocab size | English (chars/token) | Real coverage (of 204) |
|---|---|---|---|
| QT VI.6.4 | 49,152 | 4.63 | 200 |
| Llama 3.2 | 128,256 | 4.68 | 179 |
| DeepSeek V4 | 129,280 | 4.88 | 193 |
QT VI.6.4 reaches essentially the same English density as Llama 3.2 and covers more languages, using roughly a third of the vocabulary. On a small model that difference is paid straight back into the non-embedding parameter budget. (Llama 3.2's 128,256 is from its published config; the DeepSeek V4 figure is as measured in this benchmark run.)
Measured on FLORES-200 devtest. The primary metric is bytes per token (higher is better: more source text encoded per token). Global mean across 204 languages: 3.07 bytes/token.
| Language | Script | QT VI.6.4 | Llama 3.2 | DeepSeek V4 |
|---|---|---|---|---|
| Tibetan | Tibetan | 6.70 | 1.44 | 2.65 |
| Tamil | Tamil | 6.18 | 2.02 | 5.08 |
| Burmese | Myanmar | 6.07 | 1.47 | 3.25 |
| Hindi | Devanagari | 5.70 | 4.85 | 4.46 |
| Malayalam | Malayalam | 5.73 | 1.69 | 3.45 |
| Telugu | Telugu | 5.21 | 1.56 | 3.50 |
| Thai | Thai | 5.03 | - | - |
On Tibetan, Burmese, Malayalam, and Telugu the gain over Llama 3.2 is roughly four to five times, because those scripts fall to near byte-level in general-purpose tokenizers and VI.6.4 gives them real subword inventories.
| Language | QT VI.6.4 | Llama 3.2 | DeepSeek V4 |
|---|---|---|---|
| English | 4.63 | 4.68 | 4.88 |
| German | 3.11 | 3.50 | 3.75 |
| Russian | 2.26 | 3.16 | 3.32 |
| Chinese | 1.12 | 1.21 | 1.70 |
| Arabic | 1.91 | 2.53 | 2.66 |
On the high-resource majors, Llama 3.2 and DeepSeek V4 are more efficient. VI.6.4 trades some major-language density for its much broader coverage and its low-resource strength - a deliberate choice for a backbone meant to be fine-tuned across many languages. English stays competitive.
| Comparison | Vocab sizes | VI.6.4 wins |
|---|---|---|
| vs Llama 3.2 (190 shared languages) | 49K vs 128K | 47 (25%) |
| vs DeepSeek V4 (203 shared languages) | 49K vs 129K | 41 (20%) |
The wins concentrate in the low-resource tail; the losses concentrate in the high-resource majors. Both competitors carry roughly 2.6x the vocabulary, so their major-language edge is bought with a substantially larger embedding matrix.
The control region is a fixed 160-token block. IDs 0-22 are frozen and must not be reordered - downstream chat, tool-use, and infill fine-tunes depend on these exact positions. The remaining slots are reserved for future use and can be renamed in place without shifting any existing ID or changing the vocabulary size.
| ID | Token | Purpose |
|---|---|---|
| 0 | <|padding|> | padding |
| 1 | <|bos|> | begin of sequence |
| 2 | <|endoftext|> | document / sequence boundary |
| 3 | <|unk|> | unused (byte-level fallback means no true UNK) |
| 4 | <|sep|> | separator |
| 5-6 | <|im_start|> <|im_end|> | chat turn boundaries (ends a turn, not the sequence) |
| 7-9 | <|system|> <|user|> <|assistant|> | chat roles |
| 10-13 | <|tool_call|> <|/tool_call|> <|tool_result|> <|/tool_result|> | tool use |
| 14-15 | <|thinking|> <|/thinking|> | reasoning spans |
| 16-17 | <|code|> <|/code|> | code spans |
| 18 | <|lang:en|> | language tag |
| 19-22 | <|fim_prefix|> <|fim_suffix|> <|fim_middle|> <|fim_pad|> | Fill-in-the-Middle (code infill) |
Fill-in-the-Middle tokens are included at the tokenizer level because infill is a train-time capability: a model can only learn to place these tokens if they exist in the vocabulary during pretraining.
from tokenizers import Tokenizer
tok = Tokenizer.from_file("tokenizer.json")
ids = tok.encode("The committee recommended further investigation.").ids
print(len(ids), tok.decode(ids))
# lossless on mixed scripts and code
s = "def f(x): return x 中文 العربية 🌍"
assert tok.decode(tok.encode(s).ids) == s
tokenizer.json - the tokenizer (HuggingFace tokenizers format)vocab.json, merges.txt - vocabulary and merge table@misc{qt_vi_6_4_2026,
title = {QT VI.6.4: A 49K Multilingual Tokenizer with Low-Resource Emphasis},
author = {James (JamesQuartz)},
year = {2026},
howpublished = {\url{https://huggingface.co/JamesQuartz/qt-VI.6.4-49k}}
}
Apache-2.0.