AI・機械学習
中級

Structured Outputs(OpenAI)(ストラクチャードアウトプッツ)

OpenAIが2024年8月に導入したJSON Schema完全準拠の出力保証機能。JSON Modeより厳密で、スキーマ違反の出力は生成されない。

0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
structured-outputs
openai
json-schema
pydantic
llm

Structured Outputs(OpenAI)

概要

Structured Outputs(構造化出力)は、OpenAIが2024年8月に導入した、JSON Schemaに100%準拠した出力を保証する機能です。従来のJSON Modeは「有効なJSONを返す」だけでしたが、Structured Outputsは「定義したスキーマを完全に満たすJSONのみを返す」という点で本質的に異なります。

対応モデル: gpt-4o-2024-08-06以降、gpt-4o-mini-2024-07-18以降、o1シリーズ

Python SDK での使用(Pydantic連携)

from openai import OpenAI
from pydantic import BaseModel
from typing import Optional

client = OpenAI()

class PCSpec(BaseModel):
    name: str
    cpu: str
    ram_gb: int
    storage_type: str
    storage_gb: int
    price_yen: Optional[int] = None

response = client.beta.chat.completions.parse(
    model="gpt-4o-2024-08-06",
    messages=[
        {"role": "user", "content": "ゲーミングPC エントリーモデルの典型的なスペックを抽出して"}
    ],
    response_format=PCSpec
)

pc = response.choices[0].message.parsed  # PCSpec型のオブジェクト
print(pc.cpu)         # str が保証される
print(pc.ram_gb)      # int が保証される
print(pc.price_yen)   # Optional[int] なのでNoneの可能性あり

生の JSON Schema 使用

response = client.chat.completions.create(
    model="gpt-4o-2024-08-06",
    response_format={
        "type": "json_schema",
        "json_schema": {
            "name": "pc_spec",
            "strict": True,
            "schema": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "cpu": {"type": "string"},
                    "ram_gb": {"type": "integer"}
                },
                "required": ["name", "cpu", "ram_gb"],
                "additionalProperties": False
            }
        }
    },
    messages=[...]
)

Function Calling との統合(strict: true)

tools = [
    {
        "type": "function",
        "function": {
            "name": "save_pc_spec",
            "strict": True,  # ← これでStructured Outputs適用
            "parameters": {
                "type": "object",
                "properties": {
                    "name": {"type": "string"},
                    "price": {"type": "integer"}
                },
                "required": ["name", "price"],
                "additionalProperties": False
            }
        }
    }
]

JSON Mode との比較

保証内容JSON ModeStructured Outputs
有効なJSON✓✓
必須フィールド存在✗✓
型の正確性✗✓
追加フィールドなし✗✓(additionalProperties: false)
nullの制御✗✓

スキーマ設計のベストプラクティス

# 良い例: Optional フィールドはunionで明示
class GoodSpec(BaseModel):
    required_field: str
    optional_field: Optional[str] = None  # Union[str, None]と等価

# 注意: 再帰的スキーマはサポート外
# ネストは最大5段階まで推奨
# 1スキーマあたりのプロパティ数は100以下推奨

実装の仕組み

OpenAIはConstrained Decoding(制約デコーディング)を採用しています。各トークン生成時に、JSONスキーマを満たすトークンのみをマスクして選択肢を絞ることで、数学的にスキーマ違反を不可能にしています。初回リクエスト時にスキーマのコンパイルが発生しますが、同一スキーマは以降キャッシュされます。

この記事について
カテゴリーAI・機械学習
難易度中級
作成日2026/6/7