Wie KI JSON erzeugt, das JSON Schema entspricht: Von Prompt zu Structured Output

Von Prompt-only JSON und JSON Mode bis Structured Outputs — JSON Schema als Constraint, OpenAI / Gemini / Anthropic im Vergleich, Validierungspipeline und Abgrenzung zu Tool Calling.

Frühere Beiträge dieser Serie wurden behandeltWarum Agenten JSON benötigen(Tool-Aufruf zum MCP-Datenfluss),Warum JSON Schema⟧ zur Infrastruktur wurde(Schema, Funktionsaufruf und MCP-Entwicklung), UndGemini-spezifische Structured Output-Konfiguration(Gemini API-Anleitung).

Dieser Artikel wird verkleinert:Unabhängig davon, welches API-Modell Sie verwenden, wie kommen Sie von „Bitte antworten Sie in JSON“ zu „Ausgabe muss mit diesem JSON-Schema⟧ übereinstimmen“?? Anbieter haben sich in den Jahren 2024–2026 unter Namen wie Structured Outputs⟧ / JSON Schema⟧-Modus darauf geeinigt – gleiche Idee, leicht unterschiedliche Feldnamen, Schema-Teilmengen und Grenzen mit Tool Calling.

Vier Stufen, jede „strenger“ als die andere

Teams verwenden normalerweise vier Ansätze, um JSON aus einem Modell zu erhalten – die Zuverlässigkeit unterscheidet sich um eine Größenordnung:

EbeneAnsatzWas Sie kontrollierenTypischer Fehler
L0Nur Eingabeaufforderung: „Ausgabe JSON“Weiche Einschränkung```json fences, prose, single quotes, trailing commas
L1Eingabeaufforderung + JSON-Beispiele mit wenigen AufnahmenGestalten Sie durch Vorbild, keine strengen RegelnFeldnamendrift, fehlende Felder, gemischte Typen
L2JSON Mode⟧ (response_format: json_object, etc.)Die Ausgabe muss gültiges JSON seinParses, but price may be a string
L3Strukturierte Ausgabe+ JSON Schema⟧Felder, Typen, Enumeration, erforderlichSemantische Halluzination, Kürzung, ignorierte Schlüsselwörter

For production extraction, classification, or form filling, aim for L3. L0–L1 suit exploration; L2 when shape varies and you only need JSON.parse. L3 is the contract programs can consume directly.

Was JSON Schema⟧ steuert – und was nicht

JSON Schema⟧beschreibt die Dokumentstruktur: Felder, Typen, erforderliche Schlüssel, Aufzählungen, Bereiche, Array-Elementform. Anbieter-Structured Outputs⟧ kompilieren dieses Schema zur Generierung – und fügen es nicht einfach in die Eingabeaufforderung ein.

Schema can enforce: syntax shape (object / array / string / integer), required, enum, minimum / maximum, additionalProperties: false, nested objects and arrays.

Schema cannot enforce business correctness. Example: “total_cents must equal sum of line items” — assert that in code after Schema validation. Schema also does not fact-check: a well-typed fabricated invoice number is still hallucination.

Tool inputSchema uses the same language; Structured Output constrains the final reply, Tool Calling constrains tool arguments. See Leitfaden zum Datenfluss.

Eingeschränkte Dekodierung: Warum Schema Prompt übertrifft

Aufforderungen erhöhen lediglich die Wahrscheinlichkeit der Einhaltung. Strukturierte Ausgabe verwendeteingeschränkte Dekodierung: Bei jedem Token unterdrückt der Decoder Token, die die JSON-Syntax verletzen oder das Schema verletzen würden.

Normalerweise erhalten Sie analysierbares, formkorrektes JSON ohne Regex-Stripping-Markdown-Zäune. Die Implementierungen unterscheiden sich (FSM, Grammatik, Logit-Masken), aber der Entwicklervertrag ist derselbe:Übergeben Sie Schema an die API, nicht nur an die Eingabeaufforderung.

Eingeschränkte DekodierungsgarantienStruktur, nichtSemantik. Führen Sie immer eine erneute Validierung mit demselben Schema durch und fügen Sie Geschäftsregeln in der Produktion hinzu.

OpenAI, Gemini, Anthropic Vergleich

Gleiches Konzept, unterschiedliche Feldnamen. Beispiel: Extrahieren Sie ein Rechnungsobjekt.

VerkäuferJSON-Modus⟧Strukturierte Ausgabe / SchemaNotizen
OpenAIresponse_format: { type: "json_object" }response_format: { type: "json_schema", json_schema: { name, schema, strict: true } }strict: true rejects undeclared fields; works with Pydantic model_json_schema()
Google GeminiresponseMimeType: "application/json"Above + responseJsonSchema or SDK response_schemaSehenGemini-Leitfaden
AnthropischEingabeaufforderung + Analyseoutput_format (Claude structured output) or schema in Messages APIFelder entwickeln sich mit SDK; Halten Sie das Schema flach

When migrating vendors, keep the Schema itself standard JSON Schema⟧ (type, properties, required, enum); SDKs only wrap the request. Do not mix OpenAPI 3.0 uppercase types (OBJECT) with JSON Schema⟧ lowercase (object).

Ein gutes Schema schreiben: von „Pydantic“ bis zur Produktion

Recommended flow: define types in Pydantic / Zod → export JSON Schema⟧ → tune → send to API. Put semantics in description — it enters model context and disambiguates “qty = pieces vs boxes”; type: integer alone cannot.

from pydantic import BaseModel, Field


class LineItem(BaseModel):
    name: str = Field(description="Product name")
    qty: int = Field(description="Quantity, positive integer", ge=1)
    unit_price_cents: int = Field(description="Unit price in cents", ge=0)


class Invoice(BaseModel):
    vendor: str
    currency: str = Field(description="ISO 4217, e.g. CNY")
    items: list[LineItem]
    total_cents: int

schema = Invoice.model_json_schema()
# In production add additionalProperties: false

Praktische Regeln:

  • Prefer object root over root-level array; { "items": [...] } is more stable on some APIs.
  • Start with type / properties / required / enum, then add additionalProperties, min/max; do not dump full Draft 2020-12 — some keywords are ignored.
  • Nisten Sie weiterhin flach; Zirkuläre Verweise werden abgelehnt – reduzieren Sie das Schema.
  • Geteiltes Schema vs. Eingabeaufforderung: Schema = Form; Eingabeaufforderung = Semantik („Rechnung aus Text unten extrahieren…“).

OpenAI Structured Outputs⟧ Beispiel

Chat Completions supports json_schema response format since 2024. With strict: true, output should only contain Schema fields:

from openai import OpenAI
from pydantic import BaseModel

client = OpenAI()

class Invoice(BaseModel):
    vendor: str
    total_cents: int

response = client.chat.completions.create(
    model="gpt-4o-2024-08-06",
    messages=[
        {"role": "user", "content": "Extract invoice: Acme sold 2 keyboards for 398 CNY."}
    ],
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "invoice",
            "strict": True,
            "schema": Invoice.model_json_schema(),
        },
    },
)

data = response.choices[0].message.content  # JSON string
import json
invoice = json.loads(data)

Gemini uses response_mime_type + response_json_schema — see the Gemini article. For Anthropic, check current SDK structured output docs — same idea, official field names.

Produktionspipeline: generieren → analysieren → validieren → erneut versuchen

Strukturierte Ausgabe ist nicht „ein API-Aufruf und fertig“. Beheben Sie diese vier Schritte:

  1. Generate: call model with Schema; log prompt, Schema version, raw content.
  2. Parse: JSON.parse (or SDK parsed); on failure, retry whole response — no half-parse.
  3. Schema validate: run same JSON Schema⟧ via AJV / jsonschema / Pydantic; retry or degrade on failure.
  4. Geschäftsvalidierung: benutzerdefinierte Behauptungen (Summen, Fremdschlüssel); Mensch oder Regelmotor bei Fehler.

Speichern Sie in der Entwicklung Schema plus 2–3 positive/negative Proben im Repo; Verwenden Sie JSON Toolbox⟧ lokal für Struktur und Diff – gleiche Denkweise wie REST-Vertragstests, Verbraucher ist der LLM.

Häufige Fallstricke: Nach „Erklären Sie dann JSON“ fragen, während der JSON-Modus⟧ aktiviert ist; Kürzung (maximale Anzahl an Token erhöhen oder Aufgaben aufteilen); API-Schlüssel in Frontend-Demos; Abweichung der Schemaversion von der Eingabeaufforderung.

Der Unterschied zum Tool Calling

Strukturierte AusgabeWerkzeugaufruf / MCP
EinschränkungenLetzte JSON-Antwort an den BenutzerTool argument JSON (inputSchema)
NebenwirkungenKeine – nur DatenHost / MCP Server wird ausgeführt
Typische VerwendungExtrahieren, klassifizieren, Formulare ausfüllen, AgentenübergabeInventar, Dateien, externe APIs
Beim ScheiternVersuchen Sie es noch einmal oder menschlichFehler in der Werkzeugmeldung → Modell erneut fragen

Eine vollständige Agentenschleife sieht oft so aus:Strukturierte Ausgabe extrahiert die Absicht → Tool-Aufruf handelt → Strukturierte Ausgabe oder fasst den Benutzer in Prosa zusammen. Verwenden Sie Structured Output nicht, um so zu tun, als ob „die Zahlungs-API aufgerufen wurde“ – das Modell hat sie nicht aufgerufen.

FAQ

Reicht „Bitte geben Sie JSON aus“ in der Eingabeaufforderung aus?

Nein. Eingabeaufforderungen erhöhen nur die Compliance-Chancen – Abschlagszäune, nachgestellte Kommas und Feldabweichungen kommen immer noch vor. Aktivieren Sie in der Produktion mindestens den JSON-Modus⟧; Leiten Sie JSON Schema⟧ idealerweise über den API Structured Output-Kanal weiter, damit durch die Dekodierung illegale Token ausgeschlossen werden.

Was ist der Unterschied zwischen JSON-Modus⟧ und Strukturierter Ausgabe?

Der JSON-Modus⟧ garantiert nur gültigen JSON-Text, keine Feldnamen, Typen oder erforderlichen Schlüssel. Structured Output fügt JSON Schema⟧ hinzu und filtert Token während der Generierung – die Form stabilisiert sich, sodass Sie sie direkt speichern oder an den nächsten Hop übergeben können.

Sind die Konfigurationsfelder OpenAI, Gemini und Anthropic gleich?

Gleiches Konzept, andere Namen. OpenAI: Antwortformat mit json_schema und strict; Gemini: responseMimeType + responseJsonSchema; Anthropic: output_format oder strukturierte Ausgabe in Tools. Schema-Standard beibehalten; SDKs verpacken Anfragen.

Kann Structured Output Tool Calling ersetzen?

Nein. Strukturierte Ausgabe schränkt die endgültige JSON-Antwort ein; Tool Calling schränkt das Tool-Argument JSON ein und erfordert, dass der Host Tools ausführt. Verwenden Sie Ersteres zum Extrahieren/Klassifizieren/Füllen; Letzteres für Inventar, Dateien, MCP. Vollständige Agentenketten verwenden häufig beides.

Muss ich die Modellausgabe noch validieren?

Ja. Durch die eingeschränkte Dekodierung werden Syntaxfehler und Typdrift reduziert, nicht jedoch die semantische Korrektheit (gültige Typen, erfundene Werte). Führen Sie dasselbe JSON-Schema⟧ in der Produktion erneut aus; Bei Fehlern erneut versuchen, herabstufen oder überprüfen.

Wie validiere ich die Schema- und Beispielausgabe lokal?

Speichern Sie das JSON-Schema⟧ und einige Modellausgabebeispiele als JSON-Dateien. Verwenden Sie die JSON Toolbox⟧ im Browser für Syntax- und Strukturprüfungen – es wird nichts hochgeladen.

Zusammenfassung

Um JSON zu erhalten, das mit JSON Schema⟧ von AI übereinstimmt, ist die Reihenfolge wichtig:Definieren Sie zuerst das Schema, aktivieren Sie den JSON-Modus⟧ / Strukturierte Ausgabe und schreiben Sie dann die Eingabeaufforderung. Prompt = Semantik; Schema = Form; Pydantic / Zod sind autorenfreundliche Fronten; Anbieter-APIs stellen Schemakanäle bereit.

Führen Sie eine echte Rechnung oder ein Support-Transkript durchgängig aus: Schema → API-Aufruf → Ausgabe in einen Validator einfügen. Wenn es übereinstimmt, vernetzen Sie die Datenbank oder den nächsten Agenten. Tool-Argumente durchlaufen weiterhin Tool Calling / MCP – werden nicht in einer API zusammengeführt.