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:
| Ebene | Ansatz | Was Sie kontrollieren | Typischer Fehler |
|---|---|---|---|
| L0 | Nur Eingabeaufforderung: „Ausgabe JSON“ | Weiche Einschränkung | ```json fences, prose, single quotes, trailing commas |
| L1 | Eingabeaufforderung + JSON-Beispiele mit wenigen Aufnahmen | Gestalten Sie durch Vorbild, keine strengen Regeln | Feldnamendrift, fehlende Felder, gemischte Typen |
| L2 | JSON Mode⟧ (response_format: json_object, etc.) | Die Ausgabe muss gültiges JSON sein | Parses, but price may be a string |
| L3 | Strukturierte Ausgabe+ JSON Schema⟧ | Felder, Typen, Enumeration, erforderlich | Semantische 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äufer | JSON-Modus⟧ | Strukturierte Ausgabe / Schema | Notizen |
|---|---|---|---|
| OpenAI | response_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 Gemini | responseMimeType: "application/json" | Above + responseJsonSchema or SDK response_schema | SehenGemini-Leitfaden |
| Anthropisch | Eingabeaufforderung + Analyse | output_format (Claude structured output) or schema in Messages API | Felder 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:
- Generate: call model with Schema; log prompt, Schema version, raw
content. - Parse:
JSON.parse(or SDKparsed); on failure, retry whole response — no half-parse. - Schema validate: run same JSON Schema⟧ via AJV /
jsonschema/ Pydantic; retry or degrade on failure. - 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 Ausgabe | Werkzeugaufruf / MCP | |
|---|---|---|
| Einschränkungen | Letzte JSON-Antwort an den Benutzer | Tool argument JSON (inputSchema) |
| Nebenwirkungen | Keine – nur Daten | Host / MCP Server wird ausgeführt |
| Typische Verwendung | Extrahieren, klassifizieren, Formulare ausfüllen, Agentenübergabe | Inventar, Dateien, externe APIs |
| Beim Scheitern | Versuchen Sie es noch einmal oder menschlich | Fehler 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.