Aller au contenu principal

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.