Conversations multi-tours
Sur cette page
Jusqu’ici, chaque échange avec Claude était un aller-retour unique. Dans une vraie application, l’utilisateur pose des questions de suivi : après « Combien font 1+1 ? », il demande « Et 3 de plus ? », et Claude doit comprendre qu’il parle du résultat précédent. Cette leçon construit le mécanisme qui le permet, et qui servira dans tout le cours.
Aucun stockage de messages
Point fondamental : ni Bedrock ni Claude ne conservent vos messages. Chaque appel est indépendant, sans session ni identifiant de conversation côté service. C’est donc à votre code de tenir l’historique et de le renvoyer en entier à chaque requête.
Faites l’expérience : envoyez seulement « Et 3 de plus ? ». Claude ne sait pas de quoi vous parlez. Il répondra quand même, mais sur une supposition. Si les interfaces de chat que vous connaissez semblent avoir de la mémoire, c’est que leur code fait exactement ce que nous allons écrire.
Trois fonctions utilitaires
Pour garder le contexte, chaque requête contient tout l’historique : les messages de l’utilisateur et les réponses de Claude, dans l’ordre. Comme ces manipulations reviendront partout, isolons-les :
def add_user_message(messages, text):
messages.append({"role": "user", "content": [{"text": text}]})
def add_assistant_message(messages, text):
messages.append({"role": "assistant", "content": [{"text": text}]})
def chat(messages):
response = client.converse(modelId=model_id, messages=messages)
content = response["output"]["message"]["content"]
return "".join(block["text"] for block in content if "text" in block)
chat reprend la lecture de la leçon 4 : elle ne garde que les blocs de texte, ce qui la protège des blocs de réflexion de Haiku 5.5. Le cours officiel renvoie content[0]["text"], qui ne tient qu’avec un modèle qui ne réfléchit pas. Ces trois fonctions seront enrichies section après section, du prompt système aux outils.
Une conversation en quatre messages
messages = []
add_user_message(messages, "Combien font 1+1 ?")
answer = chat(messages)
add_assistant_message(messages, answer)
add_user_message(messages, "Et 3 de plus ?")
answer = chat(messages)
print(answer)
Suivez la liste messages : un message, puis deux, puis trois. Le second appel envoie donc l’échange complet, question, réponse et relance. Claude comprend le contexte et répond, par exemple : « En partant de 1+1 = 2, si on ajoute 3, on obtient 2 + 3 = 5. » L’étape la plus souvent oubliée est add_assistant_message : sans elle, Claude verrait deux questions d’affilée, sans sa propre réponse entre les deux.
L’ordre des rôles
Le cours officiel pose deux règles pour la liste de messages : elle commence par un message user, et les rôles alternent, user puis assistant puis user. L’API Converse refuse une liste qui ne respecte pas l’alternance avec une ValidationException : « A conversation must alternate between user and assistant roles ». Cette règle sert de garde-fou : une erreur d’alternance signale presque toujours un add_assistant_message oublié dans votre boucle.
Cette gestion manuelle peut sembler fastidieuse au début. C’est le prix d’une API sans état, qui en échange ne vous impose aucune infrastructure de session. Toute application conversationnelle avec Claude, du chatbot à l’agent, repose sur cette liste que votre code entretient.
À vous de jouer
La mémoire, c’est vous. Lancez la conversation de la leçon, puis recommencez en supprimant l’appel à add_assistant_message et observez ce que renvoie l’API. Écrivez ensuite une fonction check_roles(messages) qui vérifie, avant chaque appel, que la liste commence par user et que les rôles alternent.
Un petit chat en boucle. Écrivez une boucle while qui lit une question au clavier avec input(), appelle chat et ajoute chaque réponse à l’historique. Posez trois questions qui dépendent les unes des autres, puis affichez la longueur de messages.
Sources officielles : Multi-Turn conversations (Claude Academy) · Carry out a conversation with the Converse API operations et API Converse (documentation AWS)
Points clés à retenir
- Bedrock ne garde rien : chaque requête est indépendante, et l’historique est votre responsabilité.
- Renvoyez tout l’échange à chaque tour, questions et réponses de Claude.
add_user_message,add_assistant_messageetchatserviront tout le cours ;chatne lit que les blocs de texte.- La liste commence par un message
useret les rôles alternent ; une erreur d’alternance trahit un oubli dans la boucle.