Conversations multi-tours
Claude est sans etat
Un point fondamental a comprendre : Claude n’a aucune memoire entre les requetes. Chaque appel a l’API est totalement independant. Si vous envoyez “Bonjour, je m’appelle Marie” puis “Comment je m’appelle ?”, Claude ne saura pas repondre — sauf si vous lui renvoyez l’historique complet.
Pour simuler une conversation, c’est a vous de maintenir et renvoyer tout l’historique a chaque requete.
Le principe
A chaque tour de conversation, vous envoyez la liste complete des messages precedents, plus le nouveau message de l’utilisateur. Claude repond en tenant compte de tout ce contexte.
Tour 1 : [user: "Bonjour"]
Tour 2 : [user: "Bonjour", assistant: "Bonjour !", user: "Ca va ?"]
Tour 3 : [user: "Bonjour", assistant: "Bonjour !", user: "Ca va ?", assistant: "Tres bien !", user: "Parle-moi de Python"]
Construire des fonctions utilitaires
Pour eviter de gerer manuellement l’historique, creons des fonctions :
from dotenv import load_dotenv
import anthropic
load_dotenv()
client = anthropic.Anthropic()
def add_user_message(conversation, text):
"""Ajoute un message utilisateur a la conversation."""
conversation.append({"role": "user", "content": text})
def add_assistant_message(conversation, text):
"""Ajoute un message assistant a la conversation."""
conversation.append({"role": "assistant", "content": text})
def chat(conversation, user_message, model="claude-sonnet-4-20250514", max_tokens=1024):
"""Envoie un message et retourne la reponse de Claude."""
add_user_message(conversation, user_message)
response = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=conversation
)
assistant_text = response.content[0].text
add_assistant_message(conversation, assistant_text)
return assistant_text
Exemple : une conversation complete
conversation = []
# Tour 1
reponse = chat(conversation, "Qu'est-ce que l'informatique quantique ?")
print(f"Claude : {reponse}\n")
# Tour 2 — Claude se souvient du contexte
reponse = chat(conversation, "Quels sont ses principaux avantages ?")
print(f"Claude : {reponse}\n")
# Tour 3 — Claude sait toujours qu'on parle d'informatique quantique
reponse = chat(conversation, "Et quels sont les defis actuels ?")
print(f"Claude : {reponse}\n")
Au tour 2, Claude comprend que “ses” fait reference a l’informatique quantique, parce qu’il voit tout l’historique.
Examiner l’historique
A tout moment, vous pouvez inspecter la conversation :
for msg in conversation:
role = "Vous" if msg["role"] == "user" else "Claude"
print(f"{role} : {msg['content'][:80]}...")
print()
Attention a la taille de la conversation
Chaque tour ajoute des tokens. Une longue conversation peut :
- Couter cher : tous les messages precedents sont recomptes a chaque requete
- Depasser la fenetre de contexte : il y a une limite au nombre total de tokens
Strategies pour gerer ca :
- Tronquer les messages les plus anciens
- Resumer periodiquement la conversation
- Utiliser le cache (que nous verrons plus tard)
Points a retenir
- Claude est sans etat : pas de memoire entre les requetes
- Vous devez envoyer l’historique complet a chaque fois
- Des fonctions utilitaires simplifient la gestion de la conversation
- Attention a la taille croissante de l’historique
Dans la prochaine lecon, vous mettrez tout ca en pratique en construisant un chatbot.