Tokens, contexte et fenêtre de conversation
Tokens, contexte et fenêtre de conversation
Les tokens sont l’unité fondamentale de facturation et de fonctionnement des modèles de langage. Comprendre leur fonctionnement est essentiel pour optimiser vos coûts et la qualité de vos réponses.
Qu’est-ce qu’un token ?
Un token n’est pas un mot. C’est un fragment de texte que le modèle traite comme une unité. En français, un token représente en moyenne 0,7 mot :
from openai import OpenAI
client = OpenAI()
# Pour estimer les tokens, utilisez la bibliothèque tiktoken
import tiktoken
# GPT-5.3 et GPT-5.4 utilisent l'encodeur cl200k_base
enc = tiktoken.get_encoding("cl200k_base")
texte = "Bonjour, comment allez-vous aujourd'hui ?"
tokens = enc.encode(texte)
print(f"Texte : {texte}")
print(f"Nombre de tokens : {len(tokens)}")
print(f"Tokens : {tokens}")
print(f"Décodés : {[enc.decode([t]) for t in tokens]}")
# Résultat :
# Texte : Bonjour, comment allez-vous aujourd'hui ?
# Nombre de tokens : 9
# Tokens : [38025, 11, 4068, 67590, 5072, 76439, 30, ...]
# Décodés : ['Bonjour', ',', ' comment', ' allez', '-vous', " aujourd'hui", ' ?']
La fenêtre de contexte
Chaque modèle a une fenêtre de contexte maximale qui inclut l’input ET l’output :
# GPT-5.4 : 1 000 000 tokens de contexte
# GPT-5.3 : 200 000 tokens de contexte
# o3-pro : 200 000 tokens de contexte
# o4-mini : 200 000 tokens de contexte
# Exemple : si votre input fait 190 000 tokens avec GPT-5.3,
# il reste seulement 10 000 tokens pour la réponse
response = client.responses.create(
model="gpt-5.3",
input="Un très long texte...",
max_output_tokens=10000 # Limiter explicitement
)
Compter les tokens d’un appel
response = client.responses.create(
model="gpt-5.3",
input="Expliquez les tokens en trois phrases."
)
usage = response.usage
print(f"Tokens en entrée : {usage.input_tokens}")
print(f"Tokens en sortie : {usage.output_tokens}")
print(f"Total : {usage.total_tokens}")
# Résultat :
# Tokens en entrée : 12
# Tokens en sortie : 58
# Total : 70
Optimiser la consommation de tokens
1. Prompts concis
# MAUVAIS — prompt verbeux (35 tokens)
response = client.responses.create(
model="gpt-5.3",
input="Pourriez-vous s'il vous plaît me donner une liste "
"de trois fruits qui sont de couleur rouge, si cela "
"ne vous dérange pas bien entendu ?"
)
# BON — prompt concis (10 tokens)
response = client.responses.create(
model="gpt-5.3",
input="Listez 3 fruits rouges."
)
2. Limiter la sortie
# Sans limite — le modèle peut générer beaucoup de tokens
response = client.responses.create(
model="gpt-5.3",
input="Expliquez la photosynthèse."
)
# Avec limite — contrôle du coût
response = client.responses.create(
model="gpt-5.3",
input="Expliquez la photosynthèse en 2 phrases maximum.",
max_output_tokens=100
)
3. Estimer le coût avant l’appel
import tiktoken
def estimer_cout(texte: str, modele: str = "gpt-5.3") -> dict:
"""Estime le coût d'un appel API."""
enc = tiktoken.get_encoding("cl200k_base")
input_tokens = len(enc.encode(texte))
# Prix approximatifs par million de tokens (vérifiez les prix actuels)
prix = {
"gpt-5.3": {"input": 2.0, "output": 8.0},
"gpt-5.4": {"input": 10.0, "output": 30.0},
"o3-pro": {"input": 15.0, "output": 60.0},
"o4-mini": {"input": 0.5, "output": 2.0},
}
cout_input = (input_tokens / 1_000_000) * prix[modele]["input"]
return {
"input_tokens": input_tokens,
"cout_input_usd": round(cout_input, 6),
"modele": modele
}
print(estimer_cout("Expliquez la relativité en 3 phrases."))
# Résultat : {'input_tokens': 10, 'cout_input_usd': 0.00002, 'modele': 'gpt-5.3'}
Gestion de la fenêtre de conversation
Quand vous utilisez previous_response_id pour enchaîner les échanges, le contexte s’accumule :
# Tour 1 : 50 tokens
r1 = client.responses.create(
model="gpt-5.3",
input="Bonjour, je suis développeur Python."
)
# Tour 2 : 50 + 100 = 150 tokens (contexte cumulé)
r2 = client.responses.create(
model="gpt-5.3",
input="Quels frameworks web me conseillez-vous ?",
previous_response_id=r1.id
)
# Tour 10 : les tokens s'accumulent !
# Surveillez response.usage.input_tokens pour éviter les surprises
print(f"Tokens cumulés au tour 2 : {r2.usage.input_tokens}")
Stratégie de troncature
Pour les longues conversations, gérez activement le contexte :
def conversation_avec_limite(messages: list, limite_tokens: int = 50000):
"""Maintient la conversation sous une limite de tokens."""
enc = tiktoken.get_encoding("cl200k_base")
total = sum(len(enc.encode(m["content"])) for m in messages)
# Supprimer les messages les plus anciens si nécessaire
while total > limite_tokens and len(messages) > 2:
removed = messages.pop(1) # Garder le premier message (contexte)
total -= len(enc.encode(removed["content"]))
return messages
Points clés à retenir
- Un token vaut environ 0,7 mot en français
- La fenêtre de contexte inclut l’input ET l’output
- GPT-5.4 offre 1M tokens, les autres modèles 200K
- Utilisez
tiktokenpour compter les tokens avant l’appel - Surveillez
response.usagepour contrôler vos coûts - Gérez activement le contexte dans les longues conversations