Zum Hauptinhalt springen
Lektion 5 von 12 · Strukturierte Ausgabe: JSON und Schemata

Praktische Beispiele für JSON-Modus

Lektion 5 von 12 Aktualisiert am 3. November 2026 Entwickler
Auf dieser Seite
  1. JSON-Modus in die Praxis umgesetzt
  2. Extraktion von Entitäten aus unstrukturiertem Text
  3. Klassifizierung von Support-Tickets
  4. Umwandlung einer Beschreibung in ein Produktdatenblatt
  5. Verarbeitung mehrerer Elemente in einem Aufruf
  6. Wichtige Kernaussagen

Aktualisiert am 3. November 2026: Das TypeScript-Beispiel importierte zuvor Mistral als Standardexport, doch das SDK bietet nur einen benannten Export (import { Mistral } from "@mistralai/mistralai"). Zudem wurde der API-Schlüssel fest codiert und der Typ von content mit ! erzwungen, was unzureichend ist, da das Feld auch eine Liste von Chunks sein kann. Geprüft durch Kompilierung mit SDK 3.5.0 und TypeScript 7.0.2. Quelle: Mistral TypeScript SDK.

JSON-Modus in die Praxis umgesetzt

Sie wissen bereits, wie Sie den JSON-Modus aktivieren; nun betrachten wir durchgearbeitete Beispiele. Drei Szenarien tauchen in realen Projekten ständig auf, und jedes illustriert eine andere Möglichkeit, den Modus zu nutzen. Der Code wird in Python bereitgestellt, mit TypeScript-Äquivalenten, wo die Übersetzung nicht unmittelbar ist.

Extraktion von Entitäten aus unstrukturiertem Text

Die Entitätsextraktion ist der häufigste und kosteneffektivste Anwendungsfall: Eine Verkaufsmail enthält vollständige Kontaktdaten, doch diese sind in einer Unterschrift und Höflichkeitsfloskeln versteckt. Die entscheidende Anweisung im folgenden Beispiel ist die letzte Zeile des System-Prompts – die Anforderung von null für fehlende Informationen verhindert, dass das Modell eine Telefonnummer erfindet, nur um das Feld zu füllen.

from mistralai.client import Mistral
import json

client = Mistral(api_key="your-api-key")

email_text = """
Hallo,
Ich bin Marie Dupont, Vertriebsleiterin bei TechVision SAS.
Sie erreichen mich unter 06 12 34 56 78 oder per E-Mail unter [email protected].
Unser Hauptsitz befindet sich in 42 rue de la Paix, 75002 Paris.
Mit freundlichen Grüßen,
Marie
"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Extrahieren Sie Kontaktinformationen aus dem bereitgestellten Text.
Geben Sie ein JSON zurück mit den Schlüsseln: name, title, company, phone, email, address.
Wenn Informationen fehlen, verwenden Sie null."""
        },
        {"role": "user", "content": email_text}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

contact = json.loads(response.choices[0].message.content)
print(f"Name: {contact['name']}")
print(f"Unternehmen: {contact['company']}")
print(f"Telefon: {contact['phone']}")

Erwartete Ausgabe:

{
  "name": "Marie Dupont",
  "title": "Vertriebsleiterin",
  "company": "TechVision SAS",
  "phone": "06 12 34 56 78",
  "email": "[email protected]",
  "address": "42 rue de la Paix, 75002 Paris"
}

Klassifizierung von Support-Tickets

Die Klassifizierung erfordert einen anderen Ansatz: Anstatt das Modell selbst Werte wählen zu lassen, listen Sie im Prompt die erlaubten Werte für jedes Feld auf. Dies macht Ergebnisse von einem Ticket zum nächsten vergleichbar und direkt nutzbar für die Weiterleitung. Beachten Sie den Wechsel zu mistral-small-latest – die Triage von Tickets rechtfertigt nicht den Einsatz des leistungsstärksten Modells.

tickets = [
    "Meine Zahlung wurde doppelt abgebucht, ich fordere eine sofortige Rückerstattung!",
    "Wie kann ich mein Passwort ändern?",
    "Ihre App stürzt ab, jedes Mal, wenn ich den Einstellungen-Tab öffne."
]

for ticket in tickets:
    response = client.chat.complete(
        model="mistral-small-latest",
        messages=[
            {
                "role": "system",
                "content": """Klassifizieren Sie das Support-Ticket.
Geben Sie ein JSON zurück mit:
- category: "billing", "account", "technical", "feature_request" oder "other"
- priority: "low", "medium", "high" oder "critical"
- sentiment: "positive", "neutral" oder "negative"
- summary: eine einzeilige Zusammenfassung"""
            },
            {"role": "user", "content": ticket}
        ],
        response_format={"type": "json_object"},
        temperature=0
    )

    result = json.loads(response.choices[0].message.content)
    print(f"Kategorie: {result['category']} | Priorität: {result['priority']} | Stimmung: {result['sentiment']}")

Hier ist derselbe Klassifizierer in TypeScript. Die Prüfung vor JSON.parse erinnert uns daran, dass das SDK content als optional und als string | ContentChunk[] typisiert: Nur ein String kann analysiert werden.

import { Mistral } from "@mistralai/mistralai";

const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY });

const ticket = "Meine Zahlung wurde doppelt abgebucht!";

const response = await client.chat.complete({
  model: "mistral-small-latest",
  messages: [
    {
      role: "system",
      content: `Klassifizieren Sie das Support-Ticket.
Geben Sie ein JSON zurück mit: category, priority, sentiment, summary.`,
    },
    { role: "user", content: ticket },
  ],
  responseFormat: { type: "json_object" },
  temperature: 0,
});

const contenu = response.choices[0]?.message?.content;
if (typeof contenu !== "string") {
  throw new Error("Die Antwort enthält keinen JSON-Text.");
}
const result = JSON.parse(contenu);
console.log(`Kategorie: ${result.category}`);
console.log(`Priorität: ${result.priority}`);

Umwandlung einer Beschreibung in ein Produktdatenblatt

Drittes Szenario: Umwandlung von Marketingtext in einen Datensatz, der für eine Datenbank bereit ist. Diese Übung ist schwieriger, da Typen eine Rolle spielen – ein Preis muss als Zahl ankommen, eine Lieferdauer als zwei Ganzzahlen und kostenloser Versand als Boolean. Daher die präzisen Annotationen im Prompt.

product_text = """
Das 16-Zoll MacBook Pro mit M4 Pro Chip ist ab €2.799 erhältlich.
Es verfügt über 24 GB einheitlichen Arbeitsspeicher, eine 512 GB SSD und einen Liquid Retina XDR-Display.
Verfügbar in Space Black und Silber. Kostenloser Versand innerhalb von 3-5 Tagen.
"""

response = client.chat.complete(
    model="mistral-large-latest",
    messages=[
        {
            "role": "system",
            "content": """Konvertieren Sie die Produktdeskription in ein strukturiertes Datenblatt.
JSON mit: name, brand, price_eur (Zahl), specs (Objekt mit ram_gb, storage_gb, screen),
colors (Liste), delivery_days_min, delivery_days_max, free_shipping (Boolean)."""
        },
        {"role": "user", "content": product_text}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

product = json.loads(response.choices[0].message.content)
print(json.dumps(product, indent=2, ensure_ascii=False))

Ergebnis:

{
  "name": "MacBook Pro 16-Zoll",
  "brand": "Apple",
  "price_eur": 2799,
  "specs": {
    "ram_gb": 24,
    "storage_gb": 512,
    "screen": "Liquid Retina XDR"
  },
  "colors": ["Space Black", "Silver"],
  "delivery_days_min": 3,
  "delivery_days_max": 5,
  "free_shipping": true
}

Beachten Sie, dass die Marke, Apple, im Quelltext nirgends erscheint: Das Modell schloss sie aus dem Produktnamen ab. Dies ist ein Vorteil für die Anreicherung, aber ein Risiko, das überwacht werden muss, wenn Sie eine strikt wörtliche Extraktion erfordern.

Verarbeitung mehrerer Elemente in einem Aufruf

Es besteht keine Notwendigkeit, für jedes Element einen separaten Aufruf zu tätigen. Indem Sie das Modell um eine Liste unter einem einzigen Schlüssel bitten, reduzieren Sie die Anzahl der Anfragen – und damit die kumulierte Latenz – für kurze Aufgaben wie die Analyse von Bewertungen. Die hier angeforderte Bewertungsskala reicht von -1,0 bis 1,0, eine nützliche Konvention für die spätere Aggregation von Ergebnissen.

texts = [
    "Ausgezeichnetes Produkt, ich empfehle es!",
    "Späte Lieferung, beschädigtes Produkt.",
    "Angemessen für den Preis, nichts Außergewöhnliches."
]

response = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {
            "role": "system",
            "content": "Analysieren Sie die Stimmung jeder Bewertung. Geben Sie ein JSON zurück mit einem Schlüssel 'reviews', der eine Liste von Objekten {text, sentiment, score} enthält. Die Bewertungsskala reicht von -1,0 (sehr negativ) bis 1,0 (sehr positiv)."
        },
        {"role": "user", "content": "\n---\n".join(texts)}
    ],
    response_format={"type": "json_object"},
    temperature=0
)

reviews = json.loads(response.choices[0].message.content)["reviews"]
for r in reviews:
    print(f"[{r['score']:+.1f}] {r['sentiment']} — {r['text'][:40]}...")

Ein Detail, das allen diesen Beispielen gemeinsam ist, verdient besondere Betonung: temperature=0 ist hier systematisch. Bei Extraktions- und Klassifizierungsaufgaben fügt Kreativität nichts hinzu und kostet die Reproduzierbarkeit.

Wichtige Kernaussagen

  • Der JSON-Modus eignet sich hervorragend für Datenerfassung, Klassifizierung und Umwandlung
  • Verwenden Sie den System-Prompt, um die erwartete Struktur und Typen zu definieren
  • temperature=0 gewährleistet reproduzierbare Ergebnisse
  • Batch-Verarbeitung in einer einzigen Anfrage ist möglich, indem Sie eine JSON-Liste anfordern
  • Analysieren Sie die Antwort immer mit json.loads() / JSON.parse() vor dem Zugriff auf die Daten