Du texte aux jetons
- Leçon 1
- 40 min
- Module 1 : Le modèle mental d'un modèle de langage
Leçon 1 sur 16 · Les LLM : comment ils fonctionnent et comment en choisir unDu texte aux jetons
1. Le modèle mental d'un modèle de langage
2. Capacités et limites
3. Comment les modèles sont fournis
4. Évaluer pour votre tâche
5. Prendre une décision et la maintenir
Ce que vous saurez faire
Découvrez ce qu’un modèle de langage lit vraiment : des jetons, pas des mots. Vous pourrez expliquer pourquoi un même billet coûte plus, occupe plus d’espace et prend plus de temps selon la langue.
Carnet JupyterCompter les jetons dans un carnet Jupyter (facultatif)
Le carnet (notebook) Jupyter découpe les billets de ce cours en jetons avec les deux mêmes segmenteurs que l’explorateur. Il les compte ensuite. Vous n’en avez pas besoin pour suivre la leçon.
Le carnet est en anglais. Colab et Kaggle ouvrent votre propre copie. Il faut un compte Google ou Kaggle gratuit. Vous êtes bloqué ? Consultez le carnet de solution.
Avant de commencerCe qu’il faut savoir et avoir sous la main
Ce que vous devez savoir
- Lire un nombre et un rapport (« 1,3 fois plus »), comme dans Décrire un jeu de données, du cours Mathématiques et statistiques essentielles pour l’IA.
- Aucune connaissance des modèles de langage. C’est la première leçon du cours.
Ce qu’il vous faut
- Un navigateur. Le carnet facultatif s’ouvre dans Colab ou Kaggle et ne nécessite aucune clé d’API. (Une API permet à un programme de demander quelque chose à un autre programme, comme une réponse d’un modèle hébergé. Une clé d’API est un code secret fourni par un fournisseur pour vous identifier et vous facturer.)
Les modèles hébergés changent souvent : vos propres résultats seront différents.
Lire un long mot par morceaux
Section intitulée « Lire un long mot par morceaux »Une enfant qui apprend à lire rencontre le mot anglais « unbreakable » (incassable) pour la première fois. Elle ne le reconnaît pas comme un seul mot. Elle le lit donc par morceaux qu’elle connaît : « un », « break », « able ». Elle connaît chaque morceau grâce à d’autres mots, alors le nouveau mot ne pose pas de problème.
Un adulte fait la même chose avec un long mot dans une langue étrangère. Un modèle de langage lit tous les textes ainsi : par morceaux qu’il a vus de nombreuses fois.
Le problème : un modèle calcule seulement avec des nombres
Section intitulée « Le problème : un modèle calcule seulement avec des nombres »Larkfield, le magasin de produits pour la maison et le jardin, vend maintenant au Québec. Les billets de soutien arrivent en anglais et en français. Grace, la responsable du soutien, veut un assistant qui lit chaque billet et rédige une réponse. Le modèle derrière l’assistant est une grande fonction mathématique : des nombres entrent, et des nombres sortent. La première étape doit donc transformer le texte du client en une liste de nombres.
Première idée : un nombre pour chaque mot. Faites une liste de tous les mots et donnez un nombre à chacun. Cette approche échoue rapidement. Les billets contiennent des numéros de commande comme L-20431, des noms comme Larkfield et des fautes comme « arived ». Le français ajoute plusieurs formes d’un même mot : cassé, cassée, cassés, cassées. Le modèle ne peut pas lire un mot absent de la liste. Et une liste pour l’anglais et le français ne suffit pas si le magasin vend ensuite au Mexique.
Deuxième idée : un nombre pour chaque lettre. Maintenant, rien n’est inconnu, car tous les textes sont faits de lettres. Mais la liste de nombres devient très longue. La phrase de soutien de Larkfield ci-dessous contient 90 caractères, donc elle devient 90 nombres. Le modèle effectue beaucoup de travail pour chaque nombre qu’il lit ou écrit. Une liste plus longue est plus lente et coûte plus cher. Elle occupe aussi davantage de l’espace limité que le modèle peut lire d’un coup.
L’idée : des morceaux fréquents
Section intitulée « L’idée : des morceaux fréquents »La réponse se trouve entre les deux, comme pour les morceaux lus par l’enfant. Un mot courant forme un seul morceau : « refund » (remboursement), « order » (commande), « broken » (cassé). Un mot rare se découpe en morceaux courants : « Larkfield » devient « L » + « ark » + « field ». Rien n’est inconnu, car les plus petits morceaux sont des lettres seules, ou même des octets seuls. Et les textes courants restent courts.
Chaque morceau est un jeton (token). La liste fixe de tous les morceaux connus du modèle est son vocabulaire. Chaque jeton possède un nombre, sa position dans le vocabulaire : l’identifiant de jeton. Découper un texte en jetons s’appelle la segmentation en jetons, et le programme qui le fait est le segmenteur. Notez qu’un jeton commence souvent par une espace. « refund », avec son espace, est un jeton différent de « refund » au début d’une ligne.
Comment un segmenteur choisit-il ses morceaux? La plupart utilisent une méthode appelée encodage par paires d’octets (BPE). Elle commence avec des octets seuls : une lettre anglaise occupe un octet, et une lettre comme é ou un caractère hindi en occupe deux ou trois. Elle examine ensuite une très grande collection de textes. Elle trouve la paire de morceaux voisins la plus fréquente, par exemple « t » et « h ». Elle les réunit en un nouveau morceau, « th », et l’ajoute au vocabulaire. Elle répète cette opération, souvent 100 000 fois ou plus. Le nom décrit ce qu’elle fait : elle réunit des paires, encore et encore.
Cela a une conséquence importante pour Larkfield. Les morceaux proviennent de la collection de textes. Une langue très présente dans la collection obtient de nombreux jetons qui sont des mots entiers. Une langue moins présente reste découpée en plus petits morceaux. La même phrase nécessite donc plus de jetons.
Un petit exemple : huit mots, deux segmenteurs
Section intitulée « Un petit exemple : huit mots, deux segmenteurs »OpenAI publie deux de ses segmenteurs dans une bibliothèque à code source ouvert, tiktoken, pour vous permettre de voir chaque morceau. o200k_base contient 200 019 jetons et sert aux modèles plus récents comme GPT-4o. cl100k_base contient 100 277 jetons et sert aux modèles plus anciens comme GPT-4. D’autres fournisseurs, comme Anthropic et Google, ne publient pas leurs segmenteurs sous forme de bibliothèque. Ils indiquent toutefois le nombre de jetons de chaque requête. Voici huit mots, chacun précédé d’une espace, comme dans une phrase. Une barre verticale sépare les jetons.
| Mot | o200k_base | cl100k_base |
|---|---|---|
| refund (remboursement) | refund (1) |
refund (1) |
| remboursement | remboursement (1) |
rem | b | ourse | ment (4) |
| ceramic (céramique) | ceramic (1) |
ceramic (1) |
| céramique | c | ér | amique (3) |
cé | ram | ique (3) |
| broken (cassé) | broken (1) |
broken (1) |
| cassé | cass | é (2) |
cass | é (2) |
| Larkfield | L | ark | field (3) |
L | ark | field (3) |
| L-20431 | L | - | 204 | 31 (4) |
L | - | 204 | 31 (4) |
Les mots anglais forment chacun un jeton. Les mots français sont souvent découpés, davantage avec l’ancien segmenteur. « remboursement » forme un jeton dans o200k_base, mais quatre dans cl100k_base. Les nombres sont découpés en groupes d’au plus trois chiffres.
Les identifiants appartiennent à un seul vocabulaire. « refund » a l’identifiant de jeton 18 376 dans o200k_base et 21 639 dans cl100k_base. Un modèle apprend avec un segmenteur et doit toujours utiliser le même. Les identifiants d’un autre segmenteur ne signifient rien pour lui.
La phrase de Larkfield en huit langues
Section intitulée « La phrase de Larkfield en huit langues »Camille, la nouvelle agente de soutien bilingue de Larkfield à Montréal, lit les billets en français. Camille pose une question pertinente : « Un billet en français coûte-t-il autant qu’un billet en anglais? » Pour le savoir, prenez une phrase de soutien et ses traductions. La phrase et tous les billets de ce cours sont synthétiques : rédigés pour le cours, sans provenir de vrais clients. Les traductions autres que le français sont assistées par ordinateur; seule la traduction française a été vérifiée.
Explorer
Une phrase de soutien, huit langues, deux segmenteurs
Prédisez d’abord : La phrase anglaise compte 20 jetons avec o200k_base. La phrase française a le même sens. Nécessitera-t-elle moins de jetons, autant ou plus? Et qu'arrive-t-il au hindi avec l'ancien segmenteur, cl100k_base?
- Jetons
- 20
- Anglais, même segmenteur
- 20
- Par rapport à l’anglais
- 1,00 ×
- Caractères
- 90
Anglais : 20 jetons avec o200k_base. C’est la référence pour les autres langues.
- un jeton (· marque une espace; le nombre est l’ID du jeton)
- octets bruts : partie d’un caractère
My order arrived late and the ceramic pot was broken. Can I get a replacement or a refund?
- My5444
- ·order2569
- ·arrived18157
- ·late7844
- ·and326
- ·the290
- ·ceramic48698
- ·pot3208
- ·was673
- ·broken17162
- .13
- ·Can4101
- ·I357
- ·get717
- ·a261
- ·replacement19207
- ·or503
- ·a261
- ·refund18376
- ?30
Description textuelle de l’explorateur
L’explorateur affiche la phrase « My order arrived late and the ceramic pot was broken. Can I get a replacement or a refund? » et ses traductions, découpées en jetons. Elle signifie : « Ma commande est arrivée en retard et le pot en céramique était cassé. Puis-je obtenir un remplacement ou un remboursement? » Chaque jeton apparaît dans une pastille avec son identifiant; un point médian représente une espace. Une commande choisit la langue (anglais, français, espagnol, allemand, ourdou, arabe, hindi, chinois), et une autre le segmenteur (o200k_base ou cl100k_base). L’affichage indique le nombre de jetons, celui de l’anglais avec le même segmenteur et le rapport.
Avec o200k_base : anglais 20 jetons, français 26 (1,30 fois l’anglais), espagnol 26, allemand 28, ourdou 36, arabe 32, hindi 36 (1,80 fois) et chinois 21. Avec cl100k_base : anglais 20, français 34 (1,70 fois), espagnol 33, allemand 36, ourdou 91, arabe 66, hindi 111 (5,55 fois) et chinois 31. Certains jetons de cl100k_base sont des octets bruts : des parties d’un caractère, affichées en hexadécimal dans une pastille pointillée. Ils représentent 58 des 111 jetons hindi, 30 des 91 jetons ourdou, 8 des 66 jetons arabes et 15 des 31 jetons chinois. En français, les deux segmenteurs découpent « céramique » et « cassé » en morceaux.
Le graphique montre les mêmes nombres pour les huit langues, avec un troisième segmenteur : celui de Gemma 3 4B. Gemma 3 4B est un modèle ouvert que ce cours fait fonctionner sur un petit ordinateur. Tout le monde peut le télécharger et l’exécuter sur sa propre machine. (Le module Comment les modèles sont fournis appelle cela des poids ouverts.)
- o200k_base
- cl100k_base
- Gemma 3 4B
Description textuelle du graphique
Un graphique à barres avec une ligne par langue et trois barres par ligne : o200k_base, cl100k_base et Gemma 3 4B. Une ligne verticale pointillée marque 20 jetons, le nombre pour l’anglais. Anglais : 20, 20, 20. Français : 26, 34, 26. Espagnol : 26, 33, 24. Allemand : 28, 36, 28. Ourdou : 36, 91, 31. Arabe : 32, 66, 32. Hindi : 36, 111, 27. Chinois : 21, 31, 20. Les barres de cl100k_base sont les plus longues pour toutes les langues sauf l’anglais. Elles sont beaucoup plus longues pour l’ourdou, l’arabe et le hindi.
Quatre choses à observer :
- Le même sens, des nombres différents. Avec o200k_base, la phrase française nécessite 26 jetons : 1,3 fois le nombre de la phrase anglaise. Le hindi et l’ourdou en nécessitent 36 : 1,8 fois.
- Le segmenteur compte autant que la langue. L’ancien cl100k_base nécessite 34 jetons pour le français et 111 pour le hindi, soit 5,5 fois l’anglais. Il n’a aucun morceau pour la plupart des caractères hindi, alors il les représente octet par octet.
- Chaque famille de modèles a son propre segmenteur. Gemma 3 possède un vocabulaire de 262 144 jetons, tiré de nombreux textes dans plusieurs langues. Il nécessite seulement 27 jetons pour le hindi. Mistral 7B, un autre modèle ouvert, possède un vocabulaire de 32 768 jetons. Il en nécessite 38 pour le français et 121 pour le hindi.
- Les caractères ne permettent pas de prédire les jetons. La phrase chinoise ne contient que 26 caractères, mais 21 jetons avec o200k_base. La plupart des jetons chinois comptent un ou deux caractères.
Pourquoi le nombre compte
Section intitulée « Pourquoi le nombre compte »Trois choses se mesurent en jetons. Une langue qui nécessite plus de jetons en subit donc trois conséquences :
- Le coût. Les modèles hébergés facturent chaque jeton qui entre et chaque jeton qui sort. Le même billet français coûte plus cher que sa version anglaise.
- L’espace. Un modèle peut lire seulement un nombre fixe de jetons à la fois. Le module Capacités et limites appelle cela la fenêtre de contexte. La politique de soutien et un long billet français la remplissent plus vite que leurs versions anglaises.
- Le temps. Un modèle écrit sa réponse un jeton à la fois, comme le montre la leçon Prédire la suite. Plus de jetons dans la réponse signifie une attente plus longue pour le client.
Omar, le responsable du produit, pose la question du coût. « Le fournisseur A facture moins par jeton que le fournisseur B. Alors A coûte moins cher? » Pas nécessairement. Amira a envoyé la même requête à plusieurs modèles : les instructions de l’assistant, la politique et un billet. Claude a compté 796 jetons d’entrée, Gemini 560, et les modèles locaux entre 549 et 609. Un prix bas par jeton peut s’accompagner de plus de jetons par billet. Comparez donc le coût par billet : le nombre de jetons par billet multiplié par le prix par jeton. Le module Évaluer pour votre tâche le mesure pour chaque modèle.
Pour une première estimation, le texte anglais de Larkfield compte environ 1,3 jeton par mot. Les 275 mots de la politique de soutien représentent 349 jetons avec o200k_base. Les billets français en comptent environ 1,5. Utilisez une telle règle seulement pour une estimation approximative. Pour un budget, comptez avec le segmenteur du modèle que vous utiliserez.
Exemple détaillé : Amira compte deux billets
Section intitulée « Exemple détaillé : Amira compte deux billets »Amira, la développeuse de Larkfield, compare deux billets concernant des commandes en retard : S01 en anglais et S07 en français. Vous n’avez pas besoin d’exécuter ce code; il sert à vous montrer les étapes. (Il se trouve aussi dans le carnet.)
import tiktoken
enc = tiktoken.get_encoding("o200k_base")tickets = { "S01 (English)": "My order L-20431 was supposed to arrive last week. It is now 7 business days late. What can you do?", "S07 (French)": "Bonjour, ma commande L-20877 devait arriver il y a 8 jours ouvrables et je n'ai toujours rien reçu. Que pouvez-vous faire?",}for name, text in tickets.items(): ids = enc.encode(text) print(f"{name}: {len(text.split())} words, {len(ids)} tokens")
print(ids[:8])print([enc.decode([i]) for i in ids[:8]])encode (encoder) transforme le texte en identifiants de jetons, et decode (décoder) transforme un identifiant en son morceau. La sortie :
S01 (English): 20 words, 27 tokensS07 (French): 21 words, 31 tokens[45751, 11, 831, 53567, 451, 12, 20021, 3732]['Bonjour', ',', ' ma', ' commande', ' L', '-', '208', '77']Les deux billets ont presque le même nombre de mots, mais celui en français compte quatre jetons de plus. Les deux dernières lignes montrent ce que le modèle reçoit : pas « Bonjour, ma commande », mais les nombres 45 751, 11, 831 et 53 567. Le numéro de commande compte quatre jetons, découpés en « L », « - », « 208 » et « 77 ».
Exercice guidé : lire l’explorateur
Section intitulée « Exercice guidé : lire l’explorateur »Utilisez l’explorateur ci-dessus. Faites d’abord votre prédiction, puis suivez les étapes.
- Sélectionnez English (anglais) et o200k_base. Vous devriez voir 20 jetons. Chaque mot forme un jeton, et le point et le point d’interrogation sont aussi des jetons.
- Sélectionnez French (français). Vous devriez voir 26 jetons, soit 1,30 fois l’anglais. Trouvez les pastilles « c », « ér » et « amique ».
- Gardez le français et sélectionnez cl100k_base. Vous devriez voir 34 jetons. Trouvez « remboursement » : il occupe maintenant quatre pastilles.
- Sélectionnez Hindi (hindi). Vous devriez voir 111 jetons, soit 5,55 fois l’anglais. La plupart des pastilles sont pointillées : des octets bruts, des parties d’un caractère.
- Écrivez une phrase pour Camille qui répond à la question « Un billet français coûte-t-il autant qu’un billet anglais? »
Afficher un exemple de réponse
« Non. Avec un segmenteur récent, la même phrase française nécessite environ 1,3 fois le nombre de jetons de la phrase anglaise. Avec un ancien, elle en nécessite 1,7 fois. Un billet français coûte donc plus cher, occupe plus d’espace dans le modèle et prend un peu plus de temps. La différence dépend du modèle. Nous comptons donc les jetons avec le segmenteur du modèle choisi. »
À vous de jouer : une langue avec de longs mots
Section intitulée « À vous de jouer : une langue avec de longs mots »L’allemand réunit des mots pour former de longs mots composés. « Pot en céramique » est un seul mot, Keramiktopf. Avant de regarder, faites une prédiction. Avec o200k_base, la phrase allemande nécessite-t-elle plus ou moins de jetons que la française (26)? Vérifiez ensuite dans l’explorateur et trouvez les pastilles de Keramiktopf.
Afficher la réponse
L’allemand nécessite 28 jetons avec o200k_base, deux de plus que le français, et 36 avec cl100k_base. Keramiktopf n’est pas dans le vocabulaire, alors il devient quatre jetons : « Ker », « amik », « top » et « f ». Un long mot composé est rare dans son ensemble, même quand ses parties sont courantes. Il est donc découpé en morceaux, comme « Larkfield ».
Erreur courante
Un budget qui compte les mots anglais
Symptôme : Omar prépare le budget mensuel de l’assistant. Il prend dix billets anglais, compte environ 20 mots dans chacun et prévoit « 20 jetons par billet ». La facture du premier mois dépasse le budget prévu, et les billets français coûtent le plus cher.
Cause : deux erreurs. Un mot n’est pas un jeton : S01 contient 20 mots et 27 jetons avec o200k_base. Et les billets ne sont pas tous en anglais. S07, un billet français de 21 mots, contient 31 jetons avec o200k_base et 46 avec le segmenteur de Mistral 7B. Une estimation fondée sur les mots anglais était trop basse pour chaque billet, et beaucoup trop basse pour les billets français.
Solution : comptez les jetons, pas les mots, avec le segmenteur du modèle que vous prévoyez utiliser. Ou lisez le nombre de jetons indiqué par le fournisseur pour chaque requête. Utilisez un échantillon de billets dans chaque langue, dans les mêmes proportions que les requêtes réelles.
Ce que cela signifie pour un vrai service d’IA : chaque budget, limite et estimation de temps d’un modèle de langage s’exprime en jetons. Une équipe qui sert plusieurs langues doit mesurer chacune d’elles. Sinon, les clients qui écrivent dans une langue obtiennent un service plus lent et plus coûteux, sans que personne l’ait prévu.
Vérification des connaissances
Section intitulée « Vérification des connaissances »Vérifiez votre compréhension
Pourquoi les modèles de langage n'utilisent-ils pas un jeton par mot ou un jeton par lettre?
Afficher la réponse
Un jeton par mot ne convient pas aux mots absents de la liste : noms, numéros de commande, erreurs de frappe, nouveaux mots. Il y a aussi les nombreuses formes d’un mot en français ou en allemand. Un jeton par lettre permet de tout écrire, mais rend chaque texte très long. Le modèle effectue un travail pour chaque jeton. Un texte long est donc lent à traiter et coûteux. Les jetons offrent un compromis : les mots courants forment un seul jeton, et les mots rares sont découpés en parties courantes.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Faites une prédiction : un billet de soutien en hindi et un autre en anglais ont le même sens. Lequel utilise plus de jetons? La réponse dépend-elle du modèle?
Afficher la réponse
Le billet en hindi utilise presque toujours plus de jetons, mais l’écart dépend du tokenizer (l’outil qui découpe le texte en jetons). Pour la phrase de Larkfield : 1,8 fois le nombre anglais avec o200k_base, 5,55 fois avec cl100k_base. Avec Gemma 3, c’est seulement 1,35 fois (27 jetons contre 20). Un tokenizer apprend ses parties à partir de sa collection de textes. Si ces textes contiennent peu de hindi, le hindi reste découpé en petites parties. Mesurez donc avec le tokenizer du modèle que vous choisissez.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Vérifiez votre compréhension
Le jeton « refund » a l'identifiant 18 376 dans o200k_base et 21 639 dans cl100k_base. Un modèle a été entraîné avec o200k_base. Que se passe-t-il si un programme lui envoie les identifiants cl100k_base d'un billet?
Afficher la réponse
Le modèle lit les mauvaises parties. Pour lui, 21 639 désigne la partie à cette position dans son propre vocabulaire, et non « refund ». Le texte n’a plus de sens pour le modèle. Un identifiant de jeton n’a de sens que dans un vocabulaire donné. Un modèle utilise donc toujours le tokenizer avec lequel il a été entraîné.
Votre réponse contient-elle les points principaux de la nôtre ?
Connectez-vous et inscrivez-vous au cours pour enregistrer vos réponses. Chaque vérification compte pour le certificat.
Les études de cas de ce cours
Section intitulée « Les études de cas de ce cours »Le cours se termine par deux études de cas. Chacune présente une vraie décision de choix de modèle, de la question à la recommandation, avec de vraies exécutions de modèles. Vous devez en terminer au moins une pour obtenir le certificat.
Études de cas de ce cours
À la fin du cours, vous appliquez ce que vous avez appris à un projet réaliste, des données jusqu’à la recommandation. Terminez-en au moins une pour obtenir le certificat; les autres sont facultatives.
- Choisir un modèle pour des réponses gouvernementales bilinguesComparer des modèles hébergés et locaux sur de vraies questions en anglais et en français du gouvernement du Canada, avec une grille d'évaluation, le coût et la latence mesurés, et une note de décision.
- Choisir un modèle qui fonctionne sur votre propre matérielUne règle de confidentialité interdit d'envoyer le texte à un fournisseur : comparer des modèles à poids ouverts et des quantifications sur un portable, mesurer la mémoire, la vitesse et la qualité, et en recommander un.
Récapitulatif
- Un modèle de langage lit des jetons : les mots courants forment un seul jeton, et les mots rares sont découpés en parties courantes. Le vocabulaire est la liste fixe des parties, et chaque partie a un identifiant de jeton.
- La plupart des tokenizers apprennent leurs parties avec le codage par paires d’octets. Cette méthode réunit la paire de parties la plus fréquente dans une grande collection de textes, encore et encore.
- Une même phrase utilise des nombres de jetons différents selon la langue et le tokenizer. Pour la phrase de Larkfield avec o200k_base : 26 en français et 36 en hindi, contre 20 en anglais; 111 en hindi avec cl100k_base.
- Le coût, l’espace et le temps se mesurent tous en jetons. Comparez les modèles selon le coût par billet, et non selon le prix par jeton.
Voyez ensuite ce que le modèle fait avec les identifiants de jetons : il remplace chacun par une liste de nombres appris, un vecteur.
Leçon suivante : Des jetons aux vecteurs