QT VI.3.5 UltraLingo (64K)
A 64,000-token multilingual byte-level BPE tokenizer covering 204 FLORES-200 languages losslessly. It is the flagship of the Quartz tokenizer line: built to beat the widely used 32K tokenizers on the world's major languages while keeping every other language strongly ahead of them, at a vocabulary size suited to 500M-1B parameter models.
Trained by JamesQuartz. Previous release: qt-VI.1.3-32k.
What it is
- 64,000 tokens, two-stage byte-level BPE (subword Stage 1 + BoundlessBPE sanity-superword Stage 2).
- Byte-level base: no UNK, lossless decode for any input, no script can hit zero coverage.
- 204 / 204 FLORES-200 languages represented with real subword inventories, not byte fallback.
- 86 special tokens at fixed IDs (padding, bos, endoftext, unk, sep, chat/tool/
code markers, and 72
<|lang:xx|>tags). - Digit grouping, Indic virama-aware segmentation, and dense-script chunking in the pre-tokenizer.
Why 64K, and who it is for
Optimal vocabulary size grows with model size (Tao et al., 2024). 64K is the right tier for 500M-1B parameter models: large enough to give the major languages whole-word coverage and the complex scripts a real subword inventory, without spending capacity that a sub-2B model would rather use on transformer layers. For smaller models the 32K qt-VI.1.3-32k remains the right choice.
Benchmarks
All numbers are from FLORES-200 devtest across 204 languages. The primary metric is bytes per token (BPT) - higher means more text compressed per token - which is well-defined for every script. Compared against Llama 2 and Mistral (both 32K).
Coverage and global compression
| Tokenizer | Languages covered | Global mean BPT |
|---|---|---|
| QT VI.3.5 (64K) | 204 / 204 | 3.35 |
| QT VI.1.3 (32K) | 204 / 204 | 3.03 |
| Llama 2 (32K) | 170 / 204 | 2.37 |
| Mistral (32K) | 170 / 204 | 2.34 |
Llama 2 and Mistral fail to cover 34 languages, falling back to raw bytes on entire scripts. QT VI.3.5 covers all 204 losslessly and compresses ~41% more per token on average than either.
Major languages (chars per token, higher is better)
| Language | QT VI.3.5 | Llama 2 | Mistral |
|---|---|---|---|
| English | 3.84 | 4.24 | 4.26 |
| German | 3.50 | 3.50 | 3.17 |
| French | 3.50 | 3.44 | 3.22 |
| Spanish | 3.79 | 3.48 | 3.26 |
| Italian | 3.52 | 3.42 | 3.16 |
| Portuguese | 3.57 | 3.26 | 3.02 |
| Dutch | 3.59 | 3.24 | 3.02 |
| Russian | 2.83 | 2.82 | 2.51 |
| Chinese | 1.16 | 0.70 | 0.88 |
| Japanese | 1.54 | 0.82 | 0.87 |
| Korean | 1.67 | 0.67 | 0.89 |
| Arabic | 2.47 | 1.09 | 1.11 |
| Hindi | 2.32 | 0.92 | 0.95 |
QT VI.3.5 beats both Llama 2 and Mistral on 11 of these 13 languages, often by 2-3x on CJK, Arabic and Hindi. It ties Llama 2 on German. English is the one language where a dedicated 32K English/European tokenizer still leads - see Honest limitations.
By script family (bytes per token, higher is better)
| Family | QT VI.3.5 | QT VI.1.3 | Llama 2 | Mistral |
|---|---|---|---|---|
| Latin / European | 3.57 | 3.24 | 3.43 | 3.21 |
| Cyrillic | 4.94 | 4.32 | 4.63 | 4.26 |
| CJK | 3.75 | 3.02 | 1.93 | 2.32 |
| Arabic | 4.67 | 3.96 | 1.85 | 1.90 |
| Indic | 5.70 | 5.34 | 1.78 | 1.88 |
| SE-Asian | 5.57 | 4.80 | 1.72 | 2.06 |
| Other scripts | 5.12 | 4.32 | 1.78 | 1.81 |
Versus the previous flagship
QT VI.3.5 improves compression over the 32K QT VI.1.3 on 198 of 204 languages. The only regression is English (marginal, and by design - see below).
Honest limitations
- English. A 64K tokenizer covering 204 languages cannot out-compress a 32K tokenizer that spends its entire vocabulary on English and a few European neighbours. QT VI.3.5 reaches English parity with the previous 32K flagship (3.84 vs 3.90 chars per token) but trails Llama 2's 4.24 by design. This is a structural property of broad coverage, not a defect: the budget that would push English further is spent giving 200+ other languages real representation. If your use case is English-only, a dedicated English tokenizer will compress English better.
- Deepest low-resource scripts. Languages with very little training data (e.g. Tibetan) improve but remain limited by corpus availability rather than vocabulary size. More data, not more vocabulary, is the fix.
- The tokenizer targets compression and coverage. Downstream model quality depends far more on model scale and training-data mix than on tokenizer choice.
Usage
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("JamesQuartz/qt-VI.3.5-64k")
ids = tok.encode("The committee recommended further investigation.")
print(tok.decode(ids))
Or with the tokenizers library directly:
from tokenizers import Tokenizer
tok = Tokenizer.from_file("tokenizer.json")
enc = tok.encode("中华人民共和国成立于一九四九年十月一日。")
print(enc.tokens)
Files
tokenizer.json- the complete tokenizer (model, pre-tokenizer, decoder, specials).vocab.json,merges.txt- vocabulary and merge rules.tokenizer_config.json,special_tokens_map.json- HuggingFace config.
License
Apache-2.0.
Citation
@misc{qt-vi35-ultralingo-2026,
title = {QT VI.3.5 UltraLingo: A 64K Multilingual Tokenizer for 204 Languages},
author = {JamesQuartz},
year = {2026},
howpublished = {\url{https://huggingface.co/JamesQuartz/qt-VI.3.5-64k}}
}