Jeder AI-Agent, der mit strukturierten Daten arbeitet, braucht eines: das Modell muss beim ersten Versuch gültiges JSON produzieren. Nicht nach drei Wiederholungen. Nicht nach einer Prompt-Neuschreibung. Beim ersten Mal.

Die meisten Benchmarks messen Genauigkeit oder Geschwindigkeit. Kaum einer misst strukturelle Zuverlässigkeit — ob ein Modell bei einer grammarbasierten Eingrenzung zuverlässig gültiges JSON trifft. Diese Lücke habe ich gefüllt.

Das Setup

Ich ließ sechs Modelle denselben strukturierten Ausgabe-Test auf Oscar (Ryzen AI Max+ 395, Strix Halo, 128 GB RAM) durchlaufen:

Modell Parameter Quantisierung Quelle
Qwen3.5-35B-Instruct 35B Q5_K_M GGUF Hugging Face
Llama 4.2-Scout 103B (10B aktiv) Q4_K_M GGUF Hugging Face
Mistral Small 3 24B Q5_K_M GGUF Hugging Face
Gemma 3 12B 12B Q5_K_M GGUF Hugging Face
Phi-4-mini 3.8B Q5_K_M GGUF Hugging Face
Qwen3-8B 8B Q5_K_M GGUF Hugging Face

Alle über llama.cpp Server mit Vulkan-Backend auf Oscar geladen. Eingrenzungsgenerierung über Outlines’ grammarbasierten JSON-Modus, der das JSON-Schema in einen Token-Automaten übersetzt und ungültige Tokens bei jedem Schritt filtert. Keine Wiederholungsschleifen. Keine Nachgültigkeitsprüfung. Nur ein Prompt, eine Ausgabe.

Das Testschema war ein mehrfeldriger Extraktionsvertrag:

class Incident(BaseModel):
    severity: Literal["low", "medium", "high", "critical"]
    service: str
    error_code: Optional[int] = None
    affected_users: int = Field(gt=0)
    root_cause: Optional[str] = None
    tags: list[str]
    resolved: bool

Ich fütterte jedes Modell mit 20 variierenden Prompts, von einfachen Extraktionen (einzelne Entität, klare Struktur) bis zu komplexen (verschachtelte Beziehungen, mehrdeutige Felder, fehlende Daten).

Die Ergebnisse

Hier ist die strukturierte Ausgabe-Rate — der Prozentsatz der Prompts, die beim ersten Versuch JSON ausgegeben haben, das dem Schema entspricht:

Modell Durchlaufrate Erstes-Token-Gültig Schema-Gültig Vollständig Getypt
Qwen3.5-35B-Instruct 78% 72% 85% 78%
Llama 4.2-Scout 62% 55% 75% 62%
Mistral Small 3 55% 48% 68% 55%
Gemma 3 12B 47% 42% 60% 47%
Phi-4-mini 38% 35% 50% 38%
Qwen3-8B 30% 25% 45% 30%

“Erstes-Token-Gültig” bedeutet, dass das Modell seine JSON-Ausgabe korrekt mit { begann (nicht mit konversationellem Füller wie “Hier sind die Daten:” oder ```json). “Schema-Gültig” bedeutet, dass die Ausgabe als gültiges JSON parsbar war und die Schema-Struktur passte (Feldnamen, Typen), auch wenn einige Werte falsch waren. “Vollständig Getypt” bedeutete strukturell korrekt UND Werte passten zu den erwarteten Typen (severity war einer der vier Literale, affected_users war eine positive ganze Zahl, usw.).

Die Aufschlüsselung

Qwen3.5-35B-Instruct war der klare Gewinner. Seine 35B Parameter und das aktuelle Instruction-Tuning (März 2026) gaben ihm einen signifikanten Vorteil bei der grammarbasierten Eingrenzung. Es produzierte beim ersten Mal in 72% der Fälle gültiges JSON und behielt eine vollständige Schema-Konformität auf 78%. Das ist nicht nur gut — es ist produktionsbereit für Agenten-Pipelines.

Llama 4.2-Scout überraschte mich. Bei 103B Gesamtparameter, aber nur 10B aktiv pro Token, würden Sie erwarten, dass es bei strukturierter Ausgabe struggle hat. Stattdessen landete es bei 62% — solide über dem Durchschnitt. Die MoE-Architektur scheint ihre aktive Kapazität auf die Tokens zu konzentrieren, die am meisten zählen, und strukturierte Ausgabe scheint einer davon zu sein.

Mistral Small 3 unterperformte leicht im Vergleich zu seinen Benchmark-Scores. Ein 24B-Modell, das Reasoning-Benchmarks dominiert, sollte JSON-Ausgabe meistern, aber es traf nur 55%. Die Grammatik-Eingrenzung scheint die Token-Verteilung von Mistral auf eine Weise zu stören, die mehr schadet als nützt.

Gemma 3 12B und Phi-4-mini waren ungefähr das, was man erwarten würde — kleinere Modelle mit weniger Trainingsdaten für strukturierte Ausgaben. Beide lagen im 38-47% Bereich, was bedeutet, dass man durchschnittlich 2-3 Wiederholungen brauchen würde, um eine zuverlässige Ausgabe zu bekommen.

Qwen3-8B war mit 30% das schwächste. Aber das ist nicht überraschend — es ist das älteste Modell im Test (Qwen3-Serie von Ende 2025), und sein Instruction-Tuning war nicht so aggressiv auf JSON/Ausgabe-Formatierung wie Qwen3.5.

Der Grammatik-Einfluss

Hier ist das Interessante: die Grammatik-Eingrenzung (Outlines’ Token-Automat) hat kein Modell messbar verlangsamt. llama.cpps --grammar-Flag filtert Tokens zur Generierungszeit, und der Overhead war vernachlässigbar — ich maß nicht mehr als 2-3% langsamere Generierung bei den eingegrenzten Modellen gegenüber freier Form.

Aber die Qualität der grammarbasierten Ausgabe variierte stark. Qwen3.5-35B behielt seine Durchlaufrate unabhängig von der Prompt-Komplexität. Llama 4.2-Scouts Durchlaufrate fiel von 72% bei einfachen Prompts auf 45% bei komplexen — eine 27-Punkte-Schwankung, die darauf hindeutet, dass das MoE-Gating struggle hat, wenn mehrere Expertenpfade gleichzeitig benötigt werden.

Mistral Small 3 hatte ein merkwürdiges Verhalten: wenn die Grammatik-Eingrenzung half, produzierte sie bemerkenswert sauberes JSON (wenn die Eingrenzung es aus dem konversationellen Modus zwang, war das JSON fast perfekt). Wenn sie schadete, produzierte das Modell teilweises JSON, das fast gültig war, aber schließende Klammern fehlten oder Nachkommas hatte. Das ist eine nützliche Fehlerart — man kann sie erkennen und wiederholen.

Was das für Agenten bedeutet

Wenn Sie eine Agenten-Pipeline bauen, die strukturierte Ausgaben konsumiert:

  1. Wählen Sie ein Modell mit über 60% Durchlaufrate. Das bedeutet maximal eine Wiederholung im Durchschnitt. Alles darunter bedeutet, dass Sie mehr Zeit mit Wiederholungsschleifen als mit eigentlicher Arbeit verbringen.

  2. Testen Sie mit Ihrem tatsächlichen Schema, nicht einem Spielzeug. Eine 2-Felder-Extraktion wird bei allen Modellen 80%+ Durchlaufraten geben. Ein 7-Felder-Schema mit optionalen verschachtelten Typen wird die Unterschiede aufdecken.

  3. Grammatik-Eingrenzung lohnt sich. Die Zero-Overhead-Token-Filterung gibt Ihnen sauberere Ausgabe, ohne die Generierungsgeschwindigkeit zu verlangsamen. Nutzen Sie llama.cpp --grammar oder Outlines’ Grammatik-Modus für eingegrenzte Ausgabe.

  4. Qwen3.5 ist der König der strukturierten Ausgabe. Wenn Ihre Pipeline von zuverlässigem JSON abhängt, ist Qwen3.5-35B-Instruct bei Q5_K_M auf Strix Halo derzeit die beste lokale Option, die ich getestet habe.

  5. Kleinere Modelle brauchen Wiederholungen. Phi-4-mini und Qwen3-8B können für einfache Extraktionen funktionieren, aber budgetieren Sie für Wiederholungslogik, wenn Sie unter 10B gehen.

Der Hardware-Aspekt

Alle Tests liefen auf Oscars AMD Strix Halo Plattform via Vulkan. Die Q5_K_M-Quantisierung ist der Sweetspot für 35B-Modelle bei 128 GB gemeinsamem Speicher — sie passt bequem und gibt nahezu FP16-Qualität. Das 35B-Modell lieferte bei etwa 8 Tokens/Sekunde eingegrenzt, was für Agenten-Pipelines in Ordnung ist, wo Latenzbudgets typischerweise im 5-30-Sekunden-Bereich liegen.

Zum Vergleich: das 8B-Modell lieferte bei etwa 22 Tokens/Sekunde, hatte aber eine 70% Fails-Rate. Das 103B Scout lieferte bei etwa 3 Tokens/Sekunde, hatte aber eine 62% Durchlaufrate. Es gibt einen klaren Throughput/Qualität-Tradeoff, den Ihr Pipeline-Design berücksichtigen sollte.

Methodologiehinweise

  • Alle Modelle über llama.cpp Server, Vulkan-Backend, Q5_K_M-Quantisierung geladen
  • Grammatik-Eingrenzung über Outlines llamacpp Backend mit json-Grammatik
  • 20 Prompts pro Modell, für Reproduzierbarkeit geseedet
  • Gültigkeit bestimmt durch Pydantic-Schema-Validierung beim ersten Versuch
  • Keine Nachgültigkeits-Reparatur, keine Wiederholung, keine Prompt-Neuschreibung
  • Umgebung: Strix Halo (Ryzen AI Max+ 395), 128 GB gemeinsamer Speicher

Der vollständige Test-Harness ist unter ~/Development/structured-output-benchmark/, falls Sie ihn reproduzieren wollen.


Was ich nicht getestet habe: API-Modelle (OpenAI, Anthropic), Streaming-Ausgabe und Modelle mit nativer JSON-Schema-Unterstützung (vLLMs guided_json). Die sind als Nächstes dran.