ブログ AI / Structured Output

2026 AI Structured Output とは?JSON Schema で ChatGPT・Gemini の JSON 出力を安定させる

You're wiring ChatGPT or Gemini APIs and the docs mention response_format.json_schema and Google's responseSchema—both promise structured JSON output, but the guarantees and setup differ.

Structured Output is a core 2026 LLM API capability: before generation you attach JSON Schema (2020-12) declaring required fields and types—turning model output from "JSON-like" into machine-verifiable contract data.

This article covers:

Keep this in mind: Outputting JSON and outputting schema-conformant JSON are two different things. JSON Mode solves the former; Structured Output + Strict Schema solves the latter. Below we walk through concept → instability → Schema mechanics → ChatGPT → Gemini → path comparison → writing schemas → validation.

What is Structured Output

Structured Output is an LLM API feature: you attach JSON Schema in the request and the model is constrained during final answer generation so output conforms to declared fields, types, and required items.

In 2026, major vendors promote it as production-ready:

Official docs: OpenAI Structured Outputs, Gemini JSON Mode.

Why LLM JSON output is unstable

If you only write "return JSON" in the prompt, common failure modes include:

Failure mode Typical symptom Root cause
Syntax errors Missing quotes, trailing commas, single quotes Model generates like natural language—no token sequence constraint
Field drift Same prompt, different field names twice No schema contract—model improvises
Type errors Numbers become strings, arrays become objects Vague prompt description, no hard type constraint
Extra fields Keys not declared in schema appear No additionalProperties: false

These issues can be masked by retries or second-pass parsing in demos—but in production Agents, data pipelines, and automation they crash downstream systems. Structured Output aims to eliminate this uncertainty at the API layer.

How JSON Schema constrains model output

JSON Schema describes JSON data structures. In Structured Output it acts as the output contract:

  1. 1
    Declare field names and types

    Each key in properties maps to an output field; type specifies string / integer / array, etc.

  2. 2
    Limit required fields and enums

    The required array lists mandatory fields; enum restricts allowed values—preventing "creative" fills.

  3. 3
    Hard constraint at inference

    In Strict Schema mode, token generation is schema-guided—not validate-after-generate, but generate-only-conformant JSON.

More schema locations in the Agent stack (Tool Calling, MCP) in AI Agents and JSON Schema Explained.

ChatGPT / OpenAI: Strict Schema in practice

OpenAI officially supports Structured Outputs from gpt-4o-2024-08-06. Core config is in gpt-4o and later models' response_format field:

OpenAI Strict Structured Output request
{
  "model": "gpt-4o-2024-08-06",
  "messages": [
    { "role": "user", "content": "Extract product info from this review text." }
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "product_review",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "product_name": { "type": "string" },
          "rating": { "type": "integer", "minimum": 1, "maximum": 5 },
          "pros": { "type": "array", "items": { "type": "string" } },
          "cons": { "type": "array", "items": { "type": "string" } }
        },
        "required": ["product_name", "rating", "pros", "cons"],
        "additionalProperties": false
      }
    }
  }
}

Key parameters: strict: true enables hard inference constraints; additionalProperties: false prevents undeclared fields.

OpenAI-compatible APIs like DeepSeek support the same format—see DeepSeek V4-Pro guide.

Google Gemini: responseSchema in practice

Gemini 2.0 series (e.g. gemini-2.0-flash) uses responseSchema for structured output:

Gemini Python SDK — responseSchema
from google import genai
from google.genai import types

client = genai.Client()
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents="Summarize this customer ticket into structured fields.",
    config=types.GenerateContentConfig(
        response_mime_type="application/json",
        response_schema={
            "type": "object",
            "properties": {
                "category": {
                    "type": "string",
                    "enum": ["billing", "technical", "account", "other"]
                },
                "priority": {
                    "type": "string",
                    "enum": ["low", "medium", "high"]
                },
                "summary": { "type": "string" }
            },
            "required": ["category", "priority", "summary"]
        }
    )
)
print(response.text)

Gemini's response_mime_type: application/json declares JSON MIME type; responseSchema passes a JSON Schema object (similar structure to OpenAI's schema field).

Three structured output paths compared

When integrating LLMs in 2026, three common structured output paths:

Path API config Guarantees Best for
Prompt only No special config No format guarantee Quick prototypes, human reading
JSON Mode response_format: json_object Valid JSON object Simple extraction, loose structure
Structured Output json_schema + strict: true Strict schema conformance Production, complex nested structures
Function Calling tools[].parameters arguments roughly match parameters schema Agent tool calls (not final answer)

2026 industry trends in AI Conference 2026 roundup.

Production schema writing tips

Structured Output success depends heavily on schema quality:

  1. 1
    Write description on every property

    Models read descriptions to fill values. "City name, e.g. Beijing" beats bare field names.

  2. 2
    Use enum, not description hints

    "Optional low/medium/high" is less reliable than enum.

  3. 3
    Set additionalProperties: false

    OpenAI Strict mode usually requires this; Gemini also recommends additionalProperties: false on the root object.

  4. 4
    Don't nest too deep

    Beyond 3 nesting levels or many oneOf combinations increases error rates. Splitting complex structures into multiple API calls is often more stable.

Validation workflow: API to business layer

Recommended multi-layer defense: API Strict Schema → business parse + validate → monitor schema violation rates.

Python validation example
import json
from jsonschema import validate, ValidationError

SCHEMA = {
    "type": "object",
    "properties": {
        "category": {"type": "string", "enum": ["billing", "technical", "account", "other"]},
        "priority": {"type": "string", "enum": ["low", "medium", "high"]},
        "summary": {"type": "string"}
    },
    "required": ["category", "priority", "summary"],
    "additionalProperties": False
}

def parse_llm_json(raw: str) -> dict:
    try:
        data = json.loads(raw)
    except json.JSONDecodeError as e:
        raise ValueError(f"Invalid JSON: {e}") from e
    try:
        validate(instance=data, schema=SCHEMA)
    except ValidationError as e:
        raise ValueError(f"Schema mismatch: {e.message}") from e
    return data

Whether data comes from ChatGPT, Gemini, or DeepSeek—same parse → validate → business logic. Paste schema and output into JSONNote during development for faster debugging than print().

Debug Structured Output with JSONNote

The slowest part of Structured Output development is debugging model JSON. JSONNote runs locally in the browser:

  1. 1
    Validate schema vs output

    Paste API JSON and your schema into the JSON Schema page—see contract violations instantly.

  2. 2
    Format API responses

    Use JSON Formatter to spot syntax errors and indentation issues.

  3. 3
    Compare prompt iterations

    Use JSON Diff to diff structured output across calls for regression checks.

よくある質問

What is the difference between Structured Output and JSON Mode?

JSON Mode (response_format.type=json_object) only guarantees valid JSON objects—not fields or types. Structured Output (json_schema + strict:true or Gemini responseSchema) hard-constrains output structure at inference. Use JSON Mode for simple extraction; Structured Output for complex production structures.

How do ChatGPT and Gemini configs differ?

OpenAI uses response_format.type=json_schema with schema nested in json_schema.schema plus strict:true. Gemini uses response_mime_type=application/json with responseSchema passed flat. Both use JSON Schema underneath but SDK syntax differs.

Do I still need manual validation with Strict Schema?

Yes. API constraints don't replace business-layer validate. Models may return empty content, truncated responses, or edge cases—try/except parse + JSON Schema validate is production standard.

Which JSON Schema version?

2026 LLM APIs and MCP tool contracts standardize on JSON Schema 2020-12—supporting type, properties, required, enum, items, additionalProperties, and other core keywords.

Function Calling vs Structured Output—when to use which?

Function Calling constrains tool_calls.arguments (model picks tools); Structured Output constrains the model's final answer JSON. Agent scenarios often combine both: tools for external actions, Structured Output for final structured results.

Summary

The core 2026 LLM integration shift:

Structured Output is standard; JSON Schema is the universal contract language.

ChatGPT uses json_schema + strict; Gemini uses responseSchema—different config, same principle. Write good schemas, add business-layer validate, debug locally with JSONNote—from demo to production.

← ブログに戻る