# CORTEX — tokenizer Le tokenizer CORTEX est **réutilisé tel quel** depuis le dépôt distribué (`Frankenstein-Labs/Cortex-ai`), sous licence MIT. Il n'est ni reconstruit, ni modifié. | Fichier | Rôle | |---|---| | `../tokenizer.json` | tokenizer distribué, à la racine du dépôt (BPE, 129 280 identifiants) | | `cortex_tokenizer.py` | chargement et validation | ## Chiffres mesurés | Propriété | Valeur | |---|---| | Classe | `PreTrainedTokenizerFast` | | Modèle | BPE | | Vocabulaire de base | 128 000 | | Fusions | 127 741 | | Tokens ajoutés | 1 283 | | Identifiants uniques | **129 280** | | Identifiants en doublon | 3 (ids 0, 1, 2) | ## Le piège du décompte `128 000 + 1 283 = 129 283`, mais `config.json` déclare `vocab_size: 129280` et les embeddings ont 129 280 lignes. Ce n'est pas une incohérence : les identifiants 0, 1 et 2 (`bos`, `eos`, `pad`) apparaissent **à la fois** comme tokens spéciaux ajoutés et comme entrées du vocabulaire BPE. Le nombre d'identifiants **uniques** est bien 129 280. C'est pourquoi `assert_vocab_matches_config()` compare les identifiants uniques et jamais les compteurs bruts. Toute réutilisation de ce tokenizer doit faire de même. ## Exemple ```python from tokenizer.cortex_tokenizer import load_tokenizer, assert_vocab_matches_config tokenizer = load_tokenizer() assert_vocab_matches_config(tokenizer, 129280) print(tokenizer.decode(tokenizer.encode("def add(a, b):\n return a + b\n").ids)) ``` ## Si le fichier est absent `tokenizer.json` est versionné **à la racine** du dépôt, et le pipeline le charge depuis là : une seule copie existe, donc aucune divergence n'est possible entre le tokenizer du pipeline et celui du checkpoint distribué. S'il manque, le récupérer depuis la source : ```bash hf download Frankenstein-Labs/Cortex-ai tokenizer.json --local-dir . ```