JSON-Modus vs. benutzerdefinierte strukturierte Ausgaben
Auf dieser Seite
Zwei Ansätze, zwei Philosophien
Die Mistral-API bietet zwei unterschiedliche Mechanismen zur Generierung strukturierter Ausgaben. Sie stehen nicht im Wettbewerb zueinander, sondern dienen verschiedenen Phasen im Lebenszyklus eines Projekts. Ihre Entscheidung hängt vom Anwendungsfall, Ihrer Technologie-Stack und dem erforderlichen Zuverlässigkeitsniveau ab.
JSON-Modus: Flexibilität
Der JSON-Modus ist der einfachste Ansatz. Sie aktivieren einen Parameter in Ihrer Anfrage, und Mistral garantiert, dass die Ausgabe gültiges JSON ist. Das ist alles. Das Modell bleibt frei in der Wahl der Struktur: Schlüssel, Typen und Verschachtelungstiefe. Sie leiten das gewünschte Format über Ihren Prompt an, aber keine technischen Einschränkungen binden das Schema.
# JSON-Modus — das Modell wählt die Struktur
response = client.chat.complete(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Analysieren Sie diesen Text und geben Sie das Ergebnis als JSON zurück."}],
response_format={"type": "json_object"}
)
Diese Minimalismus ist ihre Hauptstärke: nur ein Parameter zum Hinzufügen, kein Schema, das im Voraus definiert werden muss, und vollständige Flexibilität, wenn Sie ein Problem erkunden oder schnell Prototypen erstellen. Der Nachteil ist symmetrisch. Nichts garantiert die exakte Struktur des JSON, das Sie erhalten: Das Modell könnte ein Feld weglassen, ein anderes hinzufügen oder einen Schlüssel von einem Aufruf zum nächsten umbenennen. Daher wird eine Validierung auf Client-Seite zwingend erforderlich, und das ist Code, den Sie selbst schreiben und warten müssen.
Benutzerdefinierte strukturierte Ausgaben: Strenge
Benutzerdefinierte strukturierte Ausgaben verlagern diese Einschränkung auf die API-Seite. Sie definieren ein präzises Schema – mit Pydantic in Python oder Zod in TypeScript – und Mistral zwingt das Modell, sich exakt daran zu halten.
from pydantic import BaseModel
class Analyse(BaseModel):
sentiment: str
score: float
keywords: list[str]
# Benutzerdefiniert — das Schema wird durchgesetzt
response = client.chat.parse(
model="mistral-large-latest",
messages=[{"role": "user", "content": "Analysieren Sie diesen Text."}],
response_format=Analyse
)
Der Vorteil ist sofort spürbar: Jedes Feld ist vorhanden und hat den korrekten Typ, und Sie erhalten ein parsbares Objekt, das sofort verwendet werden kann – eine Instanz eines Pydantic- oder Zod-Modells – mit vollständiger IDE-Autovervollständigung. Dies ist der Modus für Produktion und kritische Pipelines. Der Kompromiss lässt sich in einem Satz zusammenfassen: Sie müssen ein Datenmodell im Voraus definieren, was die Exploration weniger flexibel macht und einen geringen initialen Entwicklungsaufwand auferlegt.
Detaillierter Vergleich
| Kriterium | JSON-Modus | Benutzerdefinierte strukturierte Ausgaben |
|---|---|---|
| Aktivierung | response_format: {"type": "json_object"} | response_format: MyModel (Pydantic/Zod) |
| API-Methode | client.chat.complete() | client.chat.parse() |
| Schema-Garantie | Nein – nur gültiges JSON | Ja – exaktes Schema wird durchgesetzt |
| Automatische Parsing | Nein – manuelles json.loads() | Ja – .parsed gibt typisiertes Objekt zurück |
| Flexibilität | Hoch – freie Struktur | Niedrig – feste Struktur |
| Idealer Anwendungsfall | Prototyping, Exploration, variable Schemata | Produktion, kritische Pipelines, APIs |
| Validierung erforderlich | Ja – zwingend auf Client-Seite | Minimal – das Schema erledigt die Arbeit |
Die Entscheidung in der Praxis
Drei Signale deuten auf den JSON-Modus hin. Erstens ist die Projektphase: Wenn Sie prototypisieren und das Schema noch nicht stabil ist, verlangsamt das Festlegen eines Datenmodells Sie, ohne Mehrwert zu bieten. Zweitens ist die Natur der Aufgabe: Wenn die Ausgabe-Struktur legitimerweise je nach Eingabe variiert, wie bei explorativen Analysen, bei denen relevante Dimensionen im Voraus nicht bekannt sind, wäre eine feste Struktur ein Strick. Drittens ist es technisch: In einer Sprache ohne Pydantic- oder Zod-Unterstützung bleibt der JSON-Modus Ihr einziger Einstiegspunkt.
Benutzerdefinierte strukturierte Ausgaben übernehmen, sobald sich die Situation umkehrt. Sie befinden sich in der Produktion, eine fehlgeschlagene Extraktion hat reale Kosten, das Ausgabe-Schema ist bekannt und stabil, Sie arbeiten in Python oder TypeScript, und Sie möchten typisierte Objekte statt anonymen Wörterbüchern manipulieren. Konkret hat eine Pipeline, die Support-Tickets den ganzen Tag lang mit denselben vier Feldern klassifiziert, keinen Grund, im JSON-Modus zu bleiben.
Dies stimmt mit der offiziellen Mistral-Dokumentation überein, die den Einsatz von benutzerdefinierten strukturierten Ausgaben empfiehlt, wann immer möglich. Der JSON-Modus bleibt ein guter Einstiegspunkt, aber benutzerdefinierte Ausgaben bieten eine überlegene Zuverlässigkeit und reduzieren den Validierungscode auf Client-Seite erheblich.
Kernaussagen
- JSON-Modus = garantiertes gültiges JSON, freie Struktur, einfach zu aktivieren
- Benutzerdefinierte strukturierte Ausgaben = garantiertes exaktes Schema, automatisches Parsing, ideal für Produktion
- Beginnen Sie mit dem JSON-Modus für Prototypen und migrieren Sie zur benutzerdefinierten Ausgabe für die Produktion
- Die beiden Ansätze sind komplementär, nicht gegenseitig ausschließend