Max Tokens : comprendre les limites de longueur des LLM
Le paramètre max_tokens définit le nombre maximal de tokens que le modèle peut générer dans sa réponse. C’est un plafond de sortie, pas la taille de la fenêtre de contexte. Il est distinct de la limite de contexte totale du modèle, qui inclut à la fois l’entrée (prompt) et la sortie. Bien comprendre ces distinctions est essentiel pour maîtriser les coûts, éviter les réponses tronquées et exploiter pleinement les capacités des LLM.
- Définition
- Nombre maximal de tokens que le modèle peut générer en sortie
- À ne pas confondre avec
- Fenêtre de contexte (context window) = entrée + sortie combinées
- Valeurs typiques
- 100-4096 tokens selon la tâche
- Si atteint
- La réponse est tronquée (finish_reason = « length »)
- Relation avec le coût
- Facturation par token généré. max_tokens plafonne la dépense par requête
- Équivalence approximative
- 1 token ≈ 0,75 mot en anglais, ≈ 0,5-0,6 mot en français
Trois concepts à distinguer
La confusion entre ces trois termes est la source d’erreur la plus fréquente chez les développeurs qui débutent avec les API de LLM :
1. Fenêtre de contexte (context window)
C’est la capacité totale du modèle : le nombre maximum de tokens qu’il peut traiter en une seule requête, entrée et sortie combinées. Par exemple, si un modèle a une fenêtre de contexte de 128K tokens, la somme de votre prompt et de sa réponse ne peut pas dépasser 128 000 tokens.
La fenêtre de contexte est une caractéristique du modèle, fixée lors de l’entraînement (puis éventuellement étendue). Vous ne pouvez pas l’augmenter via un paramètre d’API.
2. Limite de sortie (max output tokens)
C’est le nombre maximal de tokens que le modèle peut générer en une seule réponse. Ce plafond est souvent inférieur à la fenêtre de contexte. Par exemple, GPT-4o a une fenêtre de 128K tokens mais une limite de sortie de 16K tokens. Même si votre prompt ne fait que 100 tokens, la réponse ne peut pas dépasser 16K tokens.
3. Le paramètre max_tokens
C’est le paramètre que vous configurez dans votre appel API pour plafonner la longueur de la réponse. Il doit être inférieur ou égal à la limite de sortie du modèle. Si vous le fixez à 500, la réponse ne dépassera pas 500 tokens, même si le modèle pourrait en générer 16 000.
Résumé des relations :
Fenêtre de contexte = tokens d'entrée + tokens de sortie
Limite de sortie ≤ fenêtre de contexte
max_tokens (votre paramètre) ≤ limite de sortie du modèle
Exemple concret :
Modèle : GPT-4o (fenêtre 128K, limite sortie 16K)
Votre prompt : 2 000 tokens
max_tokens configuré : 500
→ Le modèle génère au maximum 500 tokens
→ Espace inutilisé dans la fenêtre : 128K - 2K - 0.5K = ~125.5K
→ Espace inutilisé dans la limite de sortie : 16K - 0.5K = 15.5K
Fenêtres de contexte et limites de sortie des principaux modèles
| Modèle | Fenêtre de contexte | Limite de sortie |
|---|---|---|
| GPT-5.4 (OpenAI) | ~1M tokens | ~32K tokens |
| GPT-4o (OpenAI) | 128K tokens | 16K tokens |
| Claude Opus 4.6 (Anthropic) | 1M tokens | ~128K tokens |
| Claude Sonnet 4.6 (Anthropic) | 1M tokens | ~64K tokens |
| Gemini 2.5 Pro (Google) | 1M tokens | ~64K tokens |
| LLaMA 3.3 70B (Meta) | 128K tokens | Variable selon le serving |
| Mistral Large (Mistral) | 128K tokens | Variable |
| DeepSeek-V3 | 128K tokens | ~32K tokens |
Qu’est-ce qu’un token ?
Un token n’est pas un mot. C’est l’unité de base du tokenizer du modèle, qui peut être un mot complet, une partie de mot, un signe de ponctuation, ou un espace. Les règles de conversion varient selon la langue et le tokenizer :
Anglais : ~1 token = 0,75 mot. « Hello world » = 2 tokens. « Unbelievable » = 3 tokens (« Un », « believ », « able »).
Français : ~1 token = 0,5 à 0,6 mot. Le français utilise plus de tokens par mot car les accents, la conjugaison complexe et les caractères spéciaux créent des sous-mots supplémentaires.
Code : très variable. Les identifiants longs (noms de variables, imports) consomment plusieurs tokens. Un fichier Python de 100 lignes peut facilement consommer 500 à 1000 tokens.
Langues non latines : le japonais, le chinois, le coréen, l’arabe et d’autres langues non latines utilisent significativement plus de tokens par mot (souvent 2 à 7× plus que l’anglais). C’est un facteur important pour le calcul des coûts dans les applications multilingues.
transformers. Anthropic et Google documentent leurs tokenizers dans leurs API.
Impact sur les coûts
Les LLM facturent par token, avec des prix différents pour l’entrée et la sortie (la sortie est généralement 3 à 5× plus chère que l’entrée). Le paramètre max_tokens est votre principal levier de contrôle des coûts de sortie :
Exemple de calcul de coût (Claude Sonnet 4.6) :
Prix : $3 / 1M tokens input, $15 / 1M tokens output
Requête avec prompt de 1 000 tokens, réponse de 500 tokens :
Coût = (1000 × $3/1M) + (500 × $15/1M)
= $0.003 + $0.0075
= $0.0105 par requête
1 000 requêtes/jour = $10.50/jour
Si max_tokens=200 au lieu de 500 (réponses plus courtes) :
Coût = (1000 × $3/1M) + (200 × $15/1M) = $0.006
1 000 requêtes/jour = $6/jour → économie de 43%
Configurer max_tokens au juste nécessaire (pas trop bas pour éviter les troncatures, pas trop haut pour éviter les coûts inutiles) est un exercice d’optimisation propre à chaque cas d’usage.
Que se passe-t-il quand max_tokens est atteint ?
Quand le modèle atteint la limite de max_tokens, la génération s’arrête brutalement, même au milieu d’un mot ou d’une phrase. L’API retourne finish_reason: "length" pour signaler que la réponse est potentiellement incomplète.
Comment gérer ce cas dans votre application :
Détecter : vérifiez systématiquement le finish_reason. Si c’est "length", la réponse est probablement tronquée.
Continuer : relancez une requête avec le texte généré comme contexte pour obtenir la suite. Certaines applications implémentent une boucle de continuation automatique.
Prévenir : ajustez max_tokens en fonction de la tâche. Pour une question factuelle courte, 200 tokens suffisent. Pour un article de blog, 2000 à 4000 tokens sont nécessaires. Pour une analyse complète d’un document, la limite de sortie du modèle peut être atteinte.
Combiner avec une stop sequence : une stop sequence bien choisie arrête la génération proprement (à un point logique) avant que max_tokens ne la coupe brutalement.
Le problème du « lost in the middle »
Avoir une grande fenêtre de contexte ne signifie pas que le modèle utilise toutes les informations de manière uniforme. Des recherches (dont « Context Rot » de Chroma Research, 2025) ont montré que les LLM traitent mieux les informations placées au début et à la fin du contexte, et tendent à « oublier » celles placées au milieu.
Les implications pratiques :
Placez les informations critiques en début de prompt : le système prompt, les instructions clés, et les documents les plus importants doivent être en premier.
Répétez les instructions clés en fin de prompt : un rappel des consignes juste avant la question améliore la conformité.
N’utilisez pas tout le contexte par réflexe : un contexte de 50K tokens ciblé (via RAG) est souvent meilleur qu’un contexte de 500K tokens qui noie l’information pertinente.
Max tokens et context engineering
Le « context engineering » est l’art de gérer efficacement l’espace disponible dans la fenêtre de contexte. Le paramètre max_tokens en est un levier clé :
Budget de contexte : pour chaque requête, calculez le budget disponible. Si votre fenêtre est de 128K tokens, votre system prompt fait 500 tokens, votre historique de conversation fait 3 000 tokens, et vous fixez max_tokens à 2 000, il vous reste 128K – 500 – 3000 – 2000 = ~122 500 tokens pour les documents RAG ou le contexte additionnel.
Conversation multi-tour : dans un chatbot, l’historique de conversation consomme du contexte à chaque tour. Avec un historique de 20 messages (environ 5 000 à 10 000 tokens), l’espace disponible pour la sortie diminue. Des stratégies comme la compaction (résumé automatique de l’historique) ou la fenêtre glissante (ne garder que les N derniers messages) permettent de maintenir un espace suffisant pour max_tokens.
Streaming et max_tokens : en mode streaming, les tokens sont envoyés au fur et à mesure de la génération. Le paramètre max_tokens contrôle le nombre total de tokens streamés. Si vous streamez une réponse longue avec max_tokens=4000, l’utilisateur voit le texte apparaître progressivement pendant plusieurs secondes. Ajustez max_tokens pour que le temps de streaming reste acceptable pour votre expérience utilisateur.
Max tokens pour les modèles locaux
Quand vous déployez un LLM localement (via Ollama, vLLM, llama.cpp ou LM Studio), la fenêtre de contexte et max_tokens ont un impact direct sur la consommation de VRAM :
Cache KV : chaque token dans le contexte consomme de la mémoire pour stocker les clés et valeurs d’attention (le cache KV). Pour un modèle 8B en FP16, augmenter le contexte de 4K à 32K tokens peut ajouter 4 à 6 Go de VRAM au-delà des poids du modèle. En quantification 4-bit, l’overhead est réduit mais reste significatif.
Valeurs par défaut souvent basses : Ollama configure par défaut un contexte de 2048 tokens, bien en dessous de la capacité réelle de la plupart des modèles. Si vos réponses sont tronquées avec un modèle local, vérifiez d’abord la configuration du contexte avant de blâmer le modèle.
Flash Attention : activez Flash Attention (disponible dans vLLM, llama.cpp, Ollama) pour réduire significativement la consommation mémoire du cache KV, permettant des fenêtres de contexte plus larges avec le même matériel.
Guide de réglage par cas d’usage
| Cas d’usage | max_tokens recommandé | Justification |
|---|---|---|
| Classification (oui/non/catégorie) | 5-20 | La réponse est un seul mot ou une courte phrase |
| Extraction d’entités (JSON) | 200-500 | Structure JSON compacte |
| Q&A factuel | 200-500 | Réponse concise avec justification |
| Résumé de texte | 500-1000 | Dépend de la longueur souhaitée du résumé |
| Rédaction d’email | 300-800 | Emails courts à moyens |
| Article de blog | 2000-4000 | Article complet de 1500-3000 mots |
| Génération de code (fonction) | 500-2000 | Variable selon la complexité |
| Analyse de document | 2000-8000 | Analyse détaillée avec citations |
| Génération longue (rapport) | 8000-16000 | Contenu structuré avec sections |
Implémentation dans les principales API
# OpenAI
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Résume ce texte en 3 phrases."}],
max_tokens=200, # plafond de sortie
)
print(response.usage)
# CompletionUsage(prompt_tokens=15, completion_tokens=87, total_tokens=102)
# Anthropic (Claude)
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024, # obligatoire dans l'API Anthropic
messages=[{"role": "user", "content": "Explique le concept de tokenisation."}]
)
print(message.usage)
# Usage(input_tokens=12, output_tokens=234)
# Hugging Face Transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1")
inputs = tokenizer("Explique la tokenisation :", return_tensors="pt")
output = model.generate(
**inputs,
max_new_tokens=200, # HF utilise "max_new_tokens" (sortie seule)
# vs max_length qui inclut l'entrée + la sortie
)
max_new_tokens contrôle le nombre de tokens générés (sortie uniquement). max_length contrôle la longueur totale (entrée + sortie). Utilisez max_new_tokens pour un comportement cohérent avec les API commerciales. Si vous utilisez max_length, n’oubliez pas de soustraire la longueur de l’entrée pour obtenir la longueur de sortie effective.
Questions fréquentes sur max tokens
Quelle est la différence entre max_tokens et la fenêtre de contexte ?
La fenêtre de contexte est la capacité totale du modèle (entrée + sortie combinées). C’est une caractéristique du modèle que vous ne pouvez pas modifier. Le paramètre max_tokens est un plafond que vous fixez sur la sortie uniquement. Par exemple, Claude Opus 4.6 a une fenêtre de contexte d’1M de tokens, mais vous pouvez fixer max_tokens à 500 pour obtenir une réponse courte. La relation est : tokens d’entrée + max_tokens ≤ fenêtre de contexte.
Que se passe-t-il si je ne fixe pas max_tokens ?
Le comportement varie selon l’API. Chez Anthropic (Claude), max_tokens est obligatoire : vous devez le spécifier explicitement. Chez OpenAI, si vous ne le spécifiez pas, le modèle utilise la limite de sortie par défaut du modèle (jusqu’à 16K tokens pour GPT-4o). En pratique, fixez toujours max_tokens explicitement pour contrôler les coûts et la longueur de la réponse.
Pourquoi la réponse est-elle plus courte que max_tokens ?
Le paramètre max_tokens est un plafond, pas un objectif. Si le modèle estime que sa réponse est complète (et génère un token EOS ou atteint une stop sequence), il s’arrête avant max_tokens. C’est le comportement normal et souhaitable. Si vous avez besoin de réponses plus longues, augmentez max_tokens et reformulez votre prompt pour encourager des réponses détaillées.
Le français consomme-t-il plus de tokens que l’anglais ?
Oui, en général. Les tokenizers des LLM (BPE, SentencePiece) sont principalement entraînés sur du texte anglais. Le français, avec ses accents, conjugaisons et mots plus longs, nécessite typiquement 30 à 80 % plus de tokens que l’équivalent anglais. Les langues non latines (chinois, arabe, japonais) peuvent nécessiter 2 à 7× plus de tokens. C’est un facteur important pour le calcul des coûts et le dimensionnement de la fenêtre de contexte dans les applications multilingues.
Comment estimer le max_tokens nécessaire pour une tâche ?
Lancez quelques requêtes de test sans contrainte de max_tokens (ou avec une valeur généreuse) et observez la longueur des réponses via le champ usage de l’API. Prenez la longueur moyenne et ajoutez 20 à 30 % de marge. Par exemple, si vos résumés font en moyenne 180 tokens, fixez max_tokens à 250. Pour les tâches à sortie variable (génération créative, code), utilisez une marge plus large ou implémentez une logique de continuation automatique.