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 Mode | Structured 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スキーマを満たすトークンのみをマスクして選択肢を絞ることで、数学的にスキーマ違反を不可能にしています。初回リクエスト時にスキーマのコンパイルが発生しますが、同一スキーマは以降キャッシュされます。