LLMの出力を構文的に有効なJSONに限定するAPIオプション。OpenAI、Anthropic、Gemini、Mistralなど主要プロバイダが提供し、response_formatパラメータで有効化する。スキーマ準拠は保証しないが、json.loadsで確実にパースできる出力を得られる。
LLM JSON Mode(JSONモード)は、大規模言語モデルのAPI呼び出し時にオプションとして指定することで、モデルの出力を構文的に有効なJSONに限定する機能である。{"key": "value"}のような正しいJSON形式が保証されるため、プログラムでのパースが確実に成功する。
| プロバイダ | パラメータ | 設定値 | 備考 |
|---|---|---|---|
| OpenAI | response_format | {"type": "json_object"} | GPT-4o, GPT-3.5-turbo |
| Anthropic | - | Tool Use経由 | 直接のJSON Modeはなし |
| Google Gemini | response_mime_type | application/json | Gemini 1.5 Pro/Flash |
| Mistral | response_format | {"type": "json_object"} | Mistral Large 2 |
| Ollama | format | json | モデル依存 |
| Groq | response_format | {"type": "json_object"} | Llama 3系 |
response_format: {"type": "json_object"}を指定すると、出力が必ず有効なJSONオブジェクトになる。ただし2つの制約がある。
AnthropicのClaude APIには直接的なJSON Modeパラメータがない。代わりにTool Use機能で出力スキーマを定義し、ツール呼び出しを強制する方法でJSON出力を得る。この方法はJSON Modeより強力で、スキーマ準拠まで保証される。
Ollamaのformat: "json"オプションはJSON出力を試みるが、モデルの能力に依存する。Llama 3.1やQwen 2.5など命令追従性の高いモデルでは高精度だが、小型モデルでは失敗することがある。
JSON Modeが保証するのは「構文的に正しいJSON」であり、以下は保証されない。
これらの制約が必要な場合はStructured Output機能やInstructorなどの上位ツールを使う。
| 項目 | プロンプト指示 | JSON Mode | Structured Output |
|---|---|---|---|
| JSON構文保証 | × | ○ | ○ |
| スキーマ準拠 | × | × | ○ |
| 追加コスト | なし | なし | なし〜微増 |
| 対応プロバイダ | 全て | 主要6社 | 主要4社 |
| 実装の簡単さ | 最も簡単 | 簡単 | やや複雑 |
| 信頼性 | 低(90%前後) | 高(99%+) |
JSON Modeを有効にした上で、プロンプトで出力フォーマットを明示する。JSON Modeは構文を保証し、プロンプトがフォーマットの「ヒント」を与える。完璧ではないが、多くのユースケースで実用的だ。
JSON Modeでもmax_tokens到達時の不完全JSONや、稀にJSONの値内でのエスケープミスが発生する。json.loads()のtry-catchは必須だ。
JSON Modeはモデルの生成速度にほぼ影響しない。Structured Outputは制約付きデコードによりわずかに遅延が増えることがあるが、体感できるレベルではない。
A: 不要ではない。JSON Modeは構文保証のみで、フィールド名やデータ構造はプロンプトで指示する必要がある。「以下のJSONフォーマットで返してください: {"name": string, "score": number}」のようにフォーマット例を示すのが効果的だ。OpenAIの場合、プロンプトに「JSON」という語を含めないとAPIエラーになる。
A: JSON構文としては正しく出力される。ただしネストが深いほどモデルのフォーマット追従性が低下し、フィールド名の誤りや構造の変動が増える。3階層以上のネストではStructured Outputの使用を推奨する。
A: 使える。ただしストリーミング中はJSONが段階的に生成されるため、完全なJSONが得られるのはストリーム終了時だ。途中のチャンクをリアルタイムでパースしたい場合はijsonなどのインクリメンタルJSONパーサーを使うか、ストリーム完了後にまとめてパースする。
| 最高(100%) |