Quark Tokenizer
Tokenizer BPE byte-level bilingue EN + IT sviluppato per la famiglia di modelli Quark di OvercastLab / ThingAI.
Caratteristiche
| Proprietà | Valore |
|---|---|
| Algoritmo | Byte-Level BPE |
| Vocab size | 65.536 (2¹⁶) |
| Lingue | Inglese + Italiano |
| Special tokens | 64 |
| Context length | 2048 (estendibile) |
| Compatibilità | 🤗 transformers, tokenizers |
Corpus di addestramento
Il tokenizer è stato addestrato su ~14M righe bilanciate EN/IT (50%/50%) provenienti da:
| Dataset | Lingua | Righe |
|---|---|---|
| Wikipedia EN | EN | 3.000.000 |
| Pile Uncopyrighted | EN | 2.000.000 |
| Falcon RefinedWeb | EN | 2.000.000 |
| Wikipedia IT | IT | 3.000.000 |
FineWeb-2 (ita_Latn) |
IT | 2.000.000 |
| MADLAD-400 IT | IT | 1.500.000 |
La parità EN/IT è una scelta deliberata: i tokenizer addestrati prevalentemente su inglese tendono a usare 2–3× più token per rappresentare testi italiani. Questo tokenizer è ottimizzato per entrambe le lingue.
Special Tokens
<unk> → unknown
<s> → inizio sequenza (BOS) — id: 1
</s> → fine sequenza (EOS) — id: 2
<pad> → padding
<|system|> → turno system
<|user|> → turno user
<|assistant|> → turno assistant
<|endofturn|> → fine turno esplicito
<|thinking|> → inizio ragionamento (chain-of-thought)
<|/thinking|> → fine ragionamento
<|reserved_0|> … <|reserved_53|> → slot riservati (tool use, multimodale, ecc.)
Totale: 64 special tokens
Chat Template
Il tokenizer include un chat template compatibile con apply_chat_template:
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("ThingAI/QuarkTokenizer")
messages = [
{"role": "system", "content": "Sei Quark, un assistente AI creato da OvercastLab."},
{"role": "user", "content": "Cos'è la derivata di una funzione?"},
{"role": "assistant", "content": "La derivata misura la variazione istantanea..."},
]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
print(text)
Uso base
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("ThingAI/quark-tokenizer")
# Encoding
text = "Il cielo è azzurro e il sole splende."
ids = tok.encode(text)
print(f"Token: {len(ids)}") # ~9 token
# Decoding
decoded = tok.decode(ids, skip_special_tokens=True)
print(decoded)
# Batch
batch = tok(["Hello world!", "Ciao mondo!"], padding=True, return_tensors="pt")
Integrazione con modelli Quark
from transformers import AutoTokenizer, AutoModelForCausalLM
tok = AutoTokenizer.from_pretrained("ThingAI/QuarkTokenizer")
model = AutoModelForCausalLM.from_pretrained("ThingAI/Quark-135M")
inputs = tok("La matematica è", return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=50)
print(tok.decode(output[0], skip_special_tokens=True))
Design Choices
Perché 65.536? È una potenza di 2 (2¹⁶), ottimale per operazioni hardware su GPU/TPU. Più grande di GPT-2 (50.257) e LLaMA-2 (32.000), ma più compatto di LLaMA-3 (128.256). Bilancia efficienza di rappresentazione e dimensione dell'embedding layer.
Perché Byte-Level BPE?
Garantisce copertura completa di qualsiasi sequenza UTF-8 senza token <unk>. Robustezza su emoji, caratteri accentati italiani (à, è, ì, ò, ù), simboli matematici e codice sorgente.
Perché 50% italiano? I tokenizer standard (GPT-2, LLaMA) sono addestrati su corpus predominantemente inglesi e penalizzano le lingue latine con un overhead di 2–3× nel numero di token. Il bilanciamento 50/50 elimina questa disparità per l'italiano mantenendo piena competenza in inglese.
Famiglia Quark
| Modello | Parametri | Token pretraining | Stato |
|---|---|---|---|
| Quark-135M v1 | 135M | 15B | ✅ Rilasciato |
| Quark-135M v2 | 135M | 65B | 🔄 In training |
Licenza
Apache 2.0 — uso libero anche commerciale.
Citazione
@misc{quark2025,
title = {Quark: A Bilingual EN/IT Language Model},
author = {OvercastLab / ThingAI},
year = {2025},
url = {https://huggingface.co/ThingAI/quark-tokenizer}
}
Sviluppato da OvercastLab · Made in Italy 🇮🇹