JSON Modeとは、LLMの出力をJSON形式に制約する機能で、OpenAIのresponse_format指定やAnthropicのTool Use経由、GeminiのresponseMimeTypeなど各社が独自実装を提供し、APIレスポンスの確実なパースを可能にする。
JSON Mode は、大規模言語モデル(LLM)の出力を有効なJSON形式に制約する機能である。通常のLLM出力は自然言語テキストであり、JSONを要求しても説明文が混入したり、括弧の対応が崩れたりする問題があった。JSON Modeを有効にすることで、モデルは常にパース可能なJSONのみを出力する。2024年にOpenAIがGPT-4 Turboで初めて正式サポートし、その後Anthropic・Google・Mistralなど主要プロバイダが追随した。
OpenAIのJSON Modeはresponse_formatパラメータで制御する。
response_format: {type: "json_object"}を指定。出力が有効なJSONであることを保証するが、スキーマ準拠は保証しないresponse_format: {type: "json_schema", json_schema: {...}}を指定。JSON Schemaに100%準拠する出力を保証。2024年8月にGPT-4oで導入requiredかつadditionalProperties: falseである必要がある。anyOfは使用可能だが、再帰的スキーマには深度制限(5レベル)があるAnthropicはJSON Mode専用のパラメータを持たず、Tool Use機能を活用してJSON出力を実現する。
tool_choice: {type: "any"}でツール呼び出しを強制し、input_schemaで出力スキーマを定義。モデルはツールの引数としてJSON構造を返す{を設定し、JSON出力を誘導する手法も併用可能GeminiはgenerationConfigでJSON出力を制御する。
"application/json"を指定してJSON出力を有効化enum制約やネスト構造をサポート$refによる参照やcircular referenceは非対応。最大プロパティ数は実質100程度| プロバイダ | パラメータ | スキーマ定義形式 | Strict保証 | ストリーミング対応 |
|---|---|---|---|---|
| OpenAI | response_format | JSON Schema | ○ | ○ (parsed) |
| Anthropic | tool_choice + input_schema | JSON Schema | ○ | ○ |
| Gemini | response_mime_type + responseSchema | OpenAPI 3.0 | ○ | ○ |
| Mistral | response_format | JSON Schema | △ | ○ |
| Cohere | response_format | JSON Schema | △ | ○ |
TypeScript環境では、Zodスキーマを定義してJSON Schemaに変換し、APIに渡すパターンが主流である。
zod-to-json-schemaライブラリでZodスキーマをJSON Schemaに変換zodResponseFormat()ヘルパーが組み込みtool定義にJSON Schemaを直接記述generateObject()関数でZodスキーマから自動変換Python環境では、Pydantic BaseModelを定義してJSON Schemaに変換する。
pydantic.BaseModel.model_json_schema()でスキーマ生成with_structured_output()メソッド: チェーン内で構造化出力を簡潔に指定enumを指定し、不正値を防止descriptionを付与すると、モデルがフィールドの意味を正確に理解し、精度が向上するnullable: trueを明示し、データが存在しない場合の挙動を制御minItems/maxItemsで配列サイズを制限し、過大な出力を防止Q1: JSON Modeでスキーマに合わないデータが返ってくることはありますか?
A: OpenAI Strict Modeを使用する場合、JSON Schemaに100%準拠することが保証される。ただし、Basic JSON Mode(type: "json_object"のみ)ではスキーマ準拠は保証されないため、別途バリデーションが必要。AnthropicのTool UseもスキーマDefinitionに高い準拠率を示すが、極端に複雑なスキーマでは逸脱が発生しうる。
Q2: JSON Modeはトークンコストに影響しますか? A: JSON構造のブラケットやキー名が出力トークンに含まれるため、同等の情報量を自然言語で返す場合と比較して10〜30%程度出力トークンが増加する傾向がある。Strict Modeでは内部的な制約処理のオーバーヘッドも加わるが、APIの課金体系上は出力トークン数のみがコストに影響する。
Q3: JSON ModeとプロンプトでのJSON指示はどう使い分けますか? A: プロダクション環境ではJSON Modeの使用を強く推奨する。プロンプトのみの指示ではJSONフォーマットの保証がなく、説明文の混入やブラケットの不一致が発生するリスクがある。プロトタイピングやJSON Mode非対応のモデルでのみプロンプト指示を使用する。