Blog • AWS / Bedrock

Claude-Structured Outputs auf Amazon Bedrock garantieren JSON-Form—warum brauchen Batch-Logs und kopierte Chats trotzdem eine lokale Drei-Schritte-Prüfung?

Am 19. Oktober 2026 kündigte AWS Structured Outputs für Claude auf Bedrock an: Constrained Decoding mit JSON Schema, Schema über output_config, strict tools, additionalProperties:false. Batch und Streaming eingeschlossen.

Ein vollständiger Vergleich der Structured-Output-Pfade steht in dem Structured-Output-Leitfaden 2026. Schema-gültig ersetzt keine Rechteprüfung—siehe den Artikel schema reicht nicht. Wie JSON Schema Tools und Antworten verbindet, steht in warum KI JSON Schema braucht. Dieser Artikel behandelt nur die drei lokalen Schritte nach Bedrock.

Die Entscheidung: Bedrock Structured Outputs sichern die API-Antwortform; Logs, Batch und kopierte Chats brauchen lokal Schema-Validate, Fence-Repair und JSONL-Zeilenprüfung.

Was fügte Bedrock am 19. Oktober für Claude hinzu?

AWS schreibt in dem offiziellen What's-New-Post: Claude auf Bedrock unterstützt Structured Outputs mit Constrained Decoding, strict tools, Batch und Streaming.

Technische Details stehen im AWS-Machine-Learning-Blog. Die API-Garantie ist nicht das Ende der Log-Pipeline.

Wie hängen Sie JSON Schema in output_config?

Bedrock setzt output_config.format.type auf json_schema und legt die Objektdefinition in schema. additionalProperties:false am Root. Das Beispiel nutzt ticket_id, priority (enum), summary.

Bedrock-Invoke-Snippet: JSON Schema in output_config.
{
  "anthropic_version": "bedrock-2023-05-31",
  "max_tokens": 1024,
  "messages": [
    {
      "role": "user",
      "content": "Return one support ticket as JSON."
    }
  ],
  "output_config": {
    "format": {
      "type": "json_schema",
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "required": ["ticket_id", "priority", "summary"],
        "properties": {
          "ticket_id": { "type": "string" },
          "priority": { "enum": ["low", "medium", "high"] },
          "summary": { "type": "string", "maxLength": 200 }
        }
      }
    }
  }
}

Batch landet oft als JSONL—eine Zeile pro Datensatz. Streaming-Antworten werden clientseitig zusammengefügt und eingefügt—ohne zweite Prüfung durch Bedrock.

Warum lokal validieren, wenn die API die Form garantiert?

Der Invoke-Body ist bei Bedrock schema-geformt, gespeicherte Artefakte verformen sich: Log-Präfixe, CloudWatch-Escapes, ```json-Fences, leere oder abgeschnittene Batch-Zeilen.

Schema-konforme Bedrock-Antwort (SAMPLE_OK).
{
  "ticket_id": "TCK-1042",
  "priority": "high",
  "summary": "Bedrock batch row passed constrained decoding"
}

Wird priority urgent oder owner taucht auf, feuern SLA-Regeln falsch. SAMPLE_BAD zeigt enum-Verletzung—mit demselben TICKET_SCHEMA stoppen.

Fehlschlag mit falschem enum (SAMPLE_BAD).
{
  "ticket_id": "TCK-1042",
  "priority": "urgent",
  "summary": "enum value not in schema"
}

Welches TICKET_SCHEMA lokal?

Nutzen Sie JSON Schema , um Felder und enums zu fixieren. priority nur low/medium/high; additionalProperties:false lehnt unbekannte Keys ab. Bestehen heißt nur gültige Form.

TICKET_SCHEMA passend zu Bedrock output_config.
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["ticket_id", "priority", "summary"],
  "properties": {
    "ticket_id": {
      "type": "string",
      "description": "Support ticket ID, e.g. TCK-1042"
    },
    "priority": {
      "enum": ["low", "medium", "high"]
    },
    "summary": {
      "type": "string",
      "maxLength": 200
    }
  }
}
Was Sie sehenSchemaLokal tun
priority ist urgentScheitert: enum ohne urgent.Ingest ablehnen oder manuell prüfen.
ticket_id ist ZahlScheitert: Typ string erwartet.Reparieren oder Batch-Zeile verwerfen.
zusätzliches owner-FeldScheitert: additionalProperties:false.Feld entfernen oder Datensatz ablehnen.

Was behebt jeder Schritt der lokalen Pipeline?

Bedrock ist Online-Decoder, JSONNote die Offline-QA. Reihenfolge: schema-konformes JSON, Fence-Repair, JSONL-Zeilen.

SchrittWas es bearbeitet
JSON Schema validateAPI-Samples, Log-Schnipsel, Strings nach Fence-Repair.
JSON repair (markdown-Fences)```json```-Blöcke aus Playground oder Chat.
JSONL-ZeilenprüfungBedrock-Batch: jede Zeile einzeln parse + schema.

Wie laufen die drei Schritte in JSONNote?

  1. 1
    Schritt 1: Schema validate

    Öffnen Sie JSON Schema. TICKET_SCHEMA ins erste Feld, SAMPLE_OK oder Log-JSON ins zweite.

  2. 2
    Schritt 2: Fence-Repair

    Öffnen Sie JSON Repair. Chat mit ```json-Fences einfügen, entfernen, erneut Schema prüfen.

  3. 3
    Schritt 3: JSONL-Zeilen

    Öffnen Sie JSONL-Tool. Bedrock-Batch hochladen, jede Zeile parse prüfen; TICKET_SCHEMA für enum vs. Abschnitt.

Häufige Fragen

Kann ich lokales Validate mit Bedrock Structured Outputs überspringen?

Nein. Die API garantiert nur den aktuellen Invoke-Body. Logs, Batch, Kopien und Caches brauchen dieselbe schema-Prüfung in der App.

Wie hängen strict tools und output_config schema zusammen?

Beide nutzen JSON Schema beim Decoding, aber verschiedene Schichten: Tool-Argumente vs. output_config. Schemas getrennt für lokale Checks speichern.

Muss ich den ganzen Batch neu laufen lassen, wenn eine JSONL-Zeile scheitert?

Nicht zwingend. JSONL-Tool für Zeilennummern, TICKET_SCHEMA für enum, Abschnitt oder Syntax. Nur Fehlzeilen erneut—günstiger als ganzer Batch.

Sollte das lokale Schema auch additionalProperties:false setzen?

Ja. Bedrock-Request-schema und lokales TICKET_SCHEMA angleichen—sonst widersprechen API und Ingest.

Brauchen Streaming-Antworten auch JSONL-Checks?

Streaming: eine Antwort zusammenfügen, dann Schema + Repair. JSONL nur bei mehrzeiligen Batch-Dateien.

Fazit

Bedrock Structured Outputs sperren Claude-API-Antworten in JSON Schema; Batch, Streaming, Logs und Paste verformen weiter.

Die Entscheidung: online Bedrock output_config; offline dasselbe TICKET_SCHEMA, Repair für Fences, JSONL für Batch-Zeilen.

Als Nächstes: Bedrock-Samples per Schema, kopierte Fences per Repair, Batch per JSONL.

Zurück zum Blog