Der Code, den wir bisher geschrieben haben, simuliert einen sehr einfachen Austausch mit Claude. Aber was passiert, wenn du eine Konversation fortsetzen möchtest? Wenn du eine Folgefrage wie „Und 3 mehr?" stellst, nachdem du „Was ist 1+1?" gefragt hast, erwartest du vielleicht, dass Claude versteht, dass du danach fragst, 3 zum vorherigen Ergebnis von 2 hinzuzufügen.

Es gibt jedoch etwas Entscheidendes, das du über die Bedrock-API und Claude selbst verstehen musst.
Keine Nachrichtenspeicherung
Bedrock und Claude speichern keine Nachrichten. Keine der Nachrichten, die du sendest, wird gespeichert, und auch keine der Antworten, die du erhältst, wird gespeichert. Jeder API-Aufruf ist vollständig unabhängig.

Um eine Konversation mit mehreren Nachrichten zu führen, die den Kontext beibehält, musst du:
- Manuell eine Liste aller Nachrichten in deinem Code pflegen
- Diese gesamte Liste von Nachrichten bei jeder Folgeanfrage bereitstellen
Warum der Kontext wichtig ist
Schauen wir uns an, was ohne den richtigen Kontext passiert. Wenn du nur „Und 3 mehr?" als eigenständige Nachricht sendest, hat Claude keine Ahnung, worauf du dich beziehst. Claude wird sein Bestes tun, um zu antworten, aber die Antwort wird keinen Sinn ergeben, da ihr der Kontext deiner vorherigen Konversation fehlt.

Wenn du nur die Folgefrage sendest, sieht Claude nur diese isolierte Nachricht und versucht zu antworten, ohne etwas über den vorherigen Austausch „Was ist 1+1?" zu wissen.

Aufbau des Konversationskontexts
Um den Kontext beizubehalten, musst du den vollständigen Konversationsverlauf in jede Anfrage einbeziehen. So funktioniert es:

Deine Nachrichtenliste sollte alle vorherigen Austausche enthalten - sowohl Benutzernachrichten als auch Assistentenantworten. Wenn du diesen vollständigen Kontext sendest, kann Claude verstehen, dass sich „Und 3 mehr?" darauf bezieht, 3 zum vorherigen Ergebnis von 2 hinzuzufügen.
Hilfsfunktionen für die Nachrichtenverwaltung
Um die Konversationsverwaltung zu erleichtern, kannst du Hilfsfunktionen erstellen:
def add_user_message(messages, text):
user_message = {
"role": "user",
"content": [
{"text": text}
]
}
messages.append(user_message)
def add_assistant_message(messages, text):
assistant_message = {
"role": "assistant",
"content": [
{"text": text}
]
}
messages.append(assistant_message)
def chat(messages):
response = client.converse(
modelId=model_id,
messages=messages
)
return response["output"]["message"]["content"][0]["text"]Implementierung von Multi-Turn-Konversationen
So baust du eine Konversation Schritt für Schritt auf:
# Erstelle eine Startliste von Nachrichten
messages = []
# Füge die ursprüngliche Nutzerfrage „What's 1+1?“ hinzu
add_user_message(messages, "What's 1+1?")
# Übergib die Nachrichtenliste an chat, um eine Antwort zu erhalten
answer = chat(messages)
# Nimm die Antwort und füge sie als Assistant-Nachricht zu unserer Liste hinzu
add_assistant_message(messages, answer)
# Füge die Folgefrage des Nutzers hinzu
add_user_message(messages, "And 3 more added to that?")
# Rufe chat erneut mit der Nachrichtenliste auf, um eine finale Antwort zu erhalten
answer = chat(messages)
print(answer)Dieser Ansatz stellt sicher, dass Claude den vollständigen Kontext hat und angemessen antworten kann: „Ausgehend vom Ergebnis von 1+1 = 2, wenn wir dazu 3 weitere hinzufügen, erhalten wir: 2 + 3 = 5"
Abwechslung der Nachrichtenrollen
Beim Aufbau deiner Nachrichtenliste musst du immer sicherstellen, dass sich die Nachrichtenrollen ordnungsgemäß abwechseln:

Deine Konversation sollte dem Muster folgen: Benutzer → Assistent → Benutzer → Assistent. Habe niemals zwei Benutzernachrichten hintereinander oder zwei Assistentennachrichten hintereinander. Dieses abwechselnde Muster wird von der API vorausgesetzt und spiegelt den natürlichen Konversationsfluss wider.
Auch wenn diese manuelle Nachrichtenverwaltung zunächst mühsam erscheinen mag, wirst du dich schnell daran gewöhnen. Dieses Muster ist grundlegend für den Aufbau jeder Anwendung, die den Konversationskontext mit Claude beibehalten muss.