AI・機械学習
中級
JSON Mode(LLM)(ジェイソンモード)
LLMに有効なJSON形式のみで出力させる動作モード。構造化データ抽出・API連携でパース失敗を防ぐ目的で使われる。
0 回閲覧
0 いいね
2026/6/7 更新
関連タグ
json-mode
structured-output
llm
openai
constrained-decoding
JSON Mode(LLM)
概要
JSON Mode(JSONモード)は、LLM(大規模言語モデル)の出力を必ず有効なJSON文字列に制約する動作オプションです。通常のテキスト生成では不完全なJSONやマークダウンコードブロックが混入する可能性がありますが、JSON Modeを有効にすることでJSON.parse()が確実に成功する出力が得られます。
OpenAI API での使用
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": "製品情報をJSON形式で返してください。"
},
{
"role": "user",
"content": "MacBook Pro M4 16インチの仕様を抽出して"
}
]
)
import json
data = json.loads(response.choices[0].message.content)
print(data) # 常に有効なJSONオブジェクト
対応モデル一覧
| プロバイダー | モデル | パラメータ |
|---|---|---|
| OpenAI | GPT-4o, GPT-4 Turbo, GPT-3.5 Turbo | response_format={"type":"json_object"} |
| Gemini 1.5 Pro/Flash | response_mime_type="application/json" | |
| Groq | Llama 3.1, Mixtral | response_format={"type":"json_object"} |
| Mistral | Mistral Large, Codestral | response_format={"type":"json_object"} |
| Ollama | ほぼ全モデル | format="json" |
実装方式の違い
ファインチューニング方式
OpenAIのJSON Modeは、モデルをJSONのみ出力するよう追加学習したと見られます。出力トークン生成時に有効なJSONを継続する確率を高めます。
Grammar-based Decoding(制約デコーディング)
Ollama・llama.cpp・Mistralが採用。各トークン生成時にJSON文法を満たすトークンのみを候補に残します。Outlines・XGrammar等のライブラリが実装に使われます。
# Ollama でのJSON Mode
import ollama
response = ollama.chat(
model="gemma4:12b",
format="json",
messages=[{"role": "user", "content": "PCスペックをJSONで返して"}]
)
data = json.loads(response["message"]["content"])
JSON Mode vs Structured Outputs
| 機能 | JSON Mode | Structured Outputs |
|---|---|---|
| 有効なJSON保証 | ✓ | ✓ |
| スキーマ準拠保証 | ✗ | ✓ |
| 必須フィールド保証 | ✗ | ✓ |
| 型安全性 | 低 | 高 |
| 設定の簡単さ | 高(1パラメータ) | 中(スキーマ定義必要) |
注意点
- systemプロンプトにJSON指示が必要: JSON Modeを有効にしていても、プロンプトでJSONを返すよう指示しないと無限ループや空出力が発生することがある
- スキーマ保証なし:
nameフィールドがstringではなくnullになる可能性がある - ネスト深度: 過度にネストされたJSONはトークン消費が大きい
- Structured Outputsへの移行推奨: スキーマ準拠が必要な本番環境ではStructured Outputsを使用する