Exercices Prompt Engineering Limiter une conversation a un budget de tokens
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Limiter une conversation a un budget de tokens

Ton chatbot tourne depuis 20 minutes, l'historique fait 15 000 tokens, et chaque appel API coute de plus en plus cher. En production, tu dois tronquer la conversation pour rester dans un budget. L'astuce : garder le system prompt et les messages les plus recents, supprimer les plus anciens.

La stratégie la plus courante :
1. Toujours garder le message system (le premier)
2. Garder les messages les plus recents
3. Supprimer les messages les plus anciens (apres le system) si le total dépasse le budget

Écris une fonction tronquer_conversation(messages, budget_tokens, modèle='gpt-4o-mini') qui :
- Garde toujours le premier message (system)
- Garde les messages les plus recents en partant de la fin
- Retourne une liste de messages qui tient dans le budget de tokens
- Utilise la meme formule de comptage que l'exercice précédent (2 tokens de base + 4 par message + tokens du contenu)
- Si meme le message system seul dépasse le budget, retourne juste [messages[0]]

Exemple :
messages = [
{'role': 'system', 'content': 'Tu es un assistant.'},
{'role': 'user', 'content': 'Message ancien'},
{'role': 'assistant', 'content': 'Réponse ancienne'},
{'role': 'user', 'content': 'Message recent'},
]
tronquer_conversation(messages, 50) garde le system et les messages les plus recents qui tiennent dans 50 tokens

Tests (1/1)

Tests
import tiktoken

enc = tiktoken.encoding_for_model('gpt-4o-mini')

# Conversation courte qui tient dans le budget
msgs_court = [
    {'role': 'system', 'content': 'Ok'},
    {'role': 'user', 'content': 'Salut'},
]
result = tronquer_conversation(msgs_court, 1000)
assert len(result) == 2, 'Si tout tient dans le budget, on garde tout'
assert result[0]['role'] == 'system', 'Le system doit toujours etre en premier'

# Budget tres petit : juste le system
msgs_long = [
    {'role': 'system', 'content': 'Tu es un assistant.'},
    {'role': 'user', 'content': 'Un message qui prend beaucoup de tokens pour tester la troncature.'},
    {'role': 'assistant', 'content': 'Une réponse également longue pour bien dépasser le budget de tokens.'},
    {'role': 'user', 'content': 'Encore un message.'},
]
result2 = tronquer_conversation(msgs_long, 15)
assert result2[0]['role'] == 'system', 'Meme avec un petit budget, le system doit etre la'

# Le message system est toujours garde
result3 = tronquer_conversation(msgs_long, 15)
assert result3[0] == msgs_long[0], 'Le message system doit etre identique a l original'

# Les messages recents sont prioritaires
result4 = tronquer_conversation(msgs_long, 100)
if len(result4) > 1:
    assert result4[-1] == msgs_long[-1], 'Le dernier message doit etre le plus recent'

# Liste vide
assert tronquer_conversation([], 100) == [], 'Liste vide doit retourner liste vide'

Indices (3 disponibles)

solution.py
Non stockée