Rollen und Nachrichten
Auf dieser Seite
Das Herzstück des Gesprächsprotokolls
Die Chat-Completions-API akzeptiert keinen rohen Text. Sie erwartet ein Array strukturierter Nachrichten, jeder Nachricht ist dabei eine spezifische Rolle zugeordnet. Dieses Rollensystem ermöglicht es dem Modell, zu unterscheiden, wer spricht, welcher Kontext herrscht und wie es antworten soll. Dieselben Worte – „Antworten Sie immer in JSON” – tragen unterschiedliches Gewicht, je nachdem, ob sie als Entwickleranweisung oder als Benutzereingabe eintreffen. Das Beherrschen dieser Struktur unterscheidet einen kohärenten Chatbot von einem System, das nach drei Austauschschritten vom Thema abdriftet.
Die vier Rollen
Die API von Mistral erkennt vier eindeutige Rollen, die jede eine präzise Funktion im Gespräch erfüllen.
Die system-Rolle
Die Systemnachricht definiert das allgemeine Verhalten des Modells. Sie wird an erster Stelle platziert und vor jedem Austausch gelesen. Hier legen Sie den Ton, die Einschränkungen und den Kontext für Ihre Anwendung fest. Stellen Sie sich einen Assistenten vor, der für eine Anwaltskanzlei entwickelt wurde; die Systemnachricht entspricht dem Briefing, das Sie einem neuen Associate vor seinem ersten Fall überreichen würden.
messages = [
{
"role": "system",
"content": "Sie sind ein juristischer Assistent, der sich auf das französische Recht spezialisiert hat. "
"Antworten Sie präzise und zitieren Sie relevante Rechtsartikel. "
"Wenn Sie unsicher sind, stellen Sie dies ausdrücklich fest."
}
]
Der Entwickler verwaltet diese Nachricht; der Endbenutzer tut dies nie, und sie erscheint niemals in der Benutzeroberfläche Ihrer Anwendung.
Die user-Rolle
Als Nächstes folgt die Nachricht des menschlichen Benutzers: die Frage, die Anweisung oder der zu verarbeitende Text. Dies ist der einzige Teil des Gesprächs, den Ihre Benutzer direkt steuern.
messages.append({
"role": "user",
"content": "Was sind die Verjährungsfristen im Zivilrecht?"
})
Die assistant-Rolle
Diese Rolle enthält die vorherigen Antworten des Modells. Sie wird essenziell, sobald das Gespräch mehr als einen einzigen Turn überschreitet. Ohne sie würde ein Benutzer, der fragt „Was ist bei geschäftlichen Schulden?”, eine vom Thema ablenkende Antwort erhalten, da das Modell nicht wissen würde, worüber gesprochen wird.
messages.append({
"role": "assistant",
"content": "Im französischen Zivilrecht beträgt die Standardverjährungsfrist 5 Jahre..."
})
Die tool-Rolle
Die letzte Rolle kommt während des Funktionaufrufs (function calling) zum Einsatz. Wenn das Modell die Ausführung einer externen Funktion anfordert – beispielsweise eine Abfrage einer Wetter-API –, führen Sie diese Funktion auf Ihrer Seite aus und geben das Ergebnis unter dieser Rolle zurück, wobei Sie die ID des spezifischen Aufrufs referenzieren:
messages.append({
"role": "tool",
"content": '{"temperature": 22, "city": "Paris"}',
"tool_call_id": "call_abc123"
})
Die vollständige Struktur eines mehrstufigen Austauschs
Lassen Sie uns diese Rollen in Aktion sehen während eines echten Gesprächs, in dem der Benutzer seine Anfrage nach einer ersten Antwort verfeinert:
from mistralai.client import Mistral
import os
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
conversation = [
{
"role": "system",
"content": "Sie sind ein französischer Koch. Vorschlagen Sie einfache und leckere Rezepte."
},
{
"role": "user",
"content": "Ich möchte ein Dessert mit Äpfeln zubereiten."
}
]
# Erster Turn
response = client.chat.complete(
model="mistral-large-latest",
messages=conversation
)
assistant_reply = response.choices[0].message.content
print(assistant_reply)
# Antwort zur Historie hinzufügen
conversation.append({"role": "assistant", "content": assistant_reply})
# Zweiter Turn
conversation.append({
"role": "user",
"content": "Können Sie dieses Rezept für 8 Personen anpassen?"
})
response = client.chat.complete(
model="mistral-large-latest",
messages=conversation
)
print(response.choices[0].message.content)
Beachten Sie, was dieser Code tatsächlich tut: Bei jedem Turn sendet er die gesamte Historie zurück. Das Modell verfügt über kein persistierendes Gedächtnis zwischen den Anfragen. Der Begriff „dieses Rezept” macht nur dann Sinn, weil die vorherige Antwort noch im Array enthalten ist. Sie tragen die alleinige Verantwortung für die Verwaltung des Gesprächszustands.
Strukturierte Inhalte
Das Feld content akzeptiert zwei Formen. Die häufigste ist ein einfacher String. Sobald Sie jedoch etwas anderes als Text übertragen – beispielsweise ein Bild zur Beschreibung – wechseln Sie zu einer Liste von typisierten Blöcken:
# Einfacher Inhalt (Text)
{"role": "user", "content": "Beschreiben Sie dieses Bild."}
# Strukturierte Inhalte (multimodal)
{"role": "user", "content": [
{"type": "text", "text": "Beschreiben Sie dieses Bild."},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]}
Die Prefix-Flagge
Mistral bietet eine einzigartige Funktion: die Prefix-Flagge. Sie schreiben den Anfang der Antwort des Assistenten selbst, und das Modell wird gezwungen, von dort aus fortzufahren. Dies ist unglaublich effektiv, wenn Sie die Ausgabe mit einem Nulltoleranzbereich für Fehler parsen müssen.
response = client.chat.complete(
model="mistral-large-latest",
messages=[
{"role": "system", "content": "Sie antworten immer in JSON."},
{"role": "user", "content": "Listen Sie 3 europäische Hauptstädte auf."},
{"role": "assistant", "content": '{"capitals": [', "prefix": True}
]
)
Das Modell setzt die Generierung nach {"capitals": [ fort und eliminiert sofort das Risiko, dass vor dem öffnenden geschweiften Klammer „Gerne, hier ist Ihr JSON:” erscheint. In der Produktion ist diese Formatgarantie oft wertvoller als eine Anweisung, die dreimal in der Systemnachricht wiederholt wird.
Adoptieren Sie zwei Gewohnheiten sofort. Halten Sie die Systemnachricht kurz: Ein gut geschriebener Absatz liefert bessere Ergebnisse als zwei Seiten voller Regeln, von denen das Modell einige schließlich ignorieren wird. Und erfinden Sie niemals gefälschte Antworten des Assistenten, um das Modell zu lenken, mit einer Ausnahme – Few-Shot-Learning, das wir in Lektion 10 behandeln werden. Bei langen Gesprächen senden Sie die vollständige Historie, überwachen Sie jedoch das Kontextfenster und kürzen Sie die ältesten Turns, bevor Sie es überschreiten.
Kernaussagen
- Vier Rollen:
system(Verhalten),user(Anfrage),assistant(Antwort),tool(Funktionsergebnis) - Die Systemnachricht geht an erster Stelle und definiert den Anwendungsrahmen
- Das Modell verfügt über kein Gedächtnis: Senden Sie bei jeder Anfrage die vollständige Historie
- Die Prefix-Flagge erzwingt den Beginn der Antwort, um das Ausgabeformat zu steuern