AI・機械学習
中級

JSON Mode(LLM)(ジェイソンモード)

JSON Modeとは、LLMの出力をJSON形式に制約する機能で、OpenAIのresponse_format指定やAnthropicのTool Use経由、GeminiのresponseMimeTypeなど各社が独自実装を提供し、APIレスポンスの確実なパースを可能にする。

0 回閲覧
0 いいね

JSON Mode(LLM)とは

JSON Mode は、大規模言語モデル(LLM)の出力を有効なJSON形式に制約する機能である。通常のLLM出力は自然言語テキストであり、JSONを要求しても説明文が混入したり、括弧の対応が崩れたりする問題があった。JSON Modeを有効にすることで、モデルは常にパース可能なJSONのみを出力する。2024年にOpenAIがGPT-4 Turboで初めて正式サポートし、その後Anthropic・Google・Mistralなど主要プロバイダが追随した。

各プロバイダのJSON Mode実装

OpenAI(GPT-4o / o3)

OpenAIのJSON Modeはresponse_formatパラメータで制御する。

  • Basic JSON Mode: response_format: {type: "json_object"}を指定。出力が有効なJSONであることを保証するが、スキーマ準拠は保証しない
  • Strict Mode(Structured Outputs): response_format: {type: "json_schema", json_schema: {...}}を指定。JSON Schemaに100%準拠する出力を保証。2024年8月にGPT-4oで導入
  • 制約事項: Strict ModeではすべてのプロパティがrequiredかつadditionalProperties: falseである必要がある。anyOfは使用可能だが、再帰的スキーマには深度制限(5レベル)がある

Anthropic(Claude 4)

AnthropicはJSON Mode専用のパラメータを持たず、Tool Use機能を活用してJSON出力を実現する。

  • Tool Use経由: tool_choice: {type: "any"}でツール呼び出しを強制し、input_schemaで出力スキーマを定義。モデルはツールの引数としてJSON構造を返す
  • Prefill活用: Assistantメッセージのprefillに{を設定し、JSON出力を誘導する手法も併用可能
  • Claude 4の改善点: ネスト構造の精度向上、union型(discriminated union)への対応、配列内オブジェクトの型安全性が改善された

Google(Gemini 2.5)

GeminiはgenerationConfigでJSON出力を制御する。

  • response_mime_type: "application/json"を指定してJSON出力を有効化
  • responseSchema: OpenAPI 3.0形式のスキーマオブジェクトで出力構造を定義。enum制約やネスト構造をサポート
  • 制約: $refによる参照やcircular referenceは非対応。最大プロパティ数は実質100程度
プロバイダパラメータスキーマ定義形式Strict保証ストリーミング対応
OpenAIresponse_formatJSON Schema○○ (parsed)
Anthropictool_choice + input_schemaJSON Schema○○
Geminiresponse_mime_type + responseSchemaOpenAPI 3.0○○
Mistralresponse_formatJSON Schema△○
Cohereresponse_formatJSON Schema△○

JSON Modeの実装パターン

TypeScript / JavaScript での利用

TypeScript環境では、Zodスキーマを定義してJSON Schemaに変換し、APIに渡すパターンが主流である。

  • zod-to-json-schemaライブラリでZodスキーマをJSON Schemaに変換
  • OpenAI SDK v4.x以降ではzodResponseFormat()ヘルパーが組み込み
  • Anthropic SDK v0.30+ではtool定義にJSON Schemaを直接記述
  • Vercel AI SDKではgenerateObject()関数でZodスキーマから自動変換

Python での利用

Python環境では、Pydantic BaseModelを定義してJSON Schemaに変換する。

  • pydantic.BaseModel.model_json_schema()でスキーマ生成
  • Instructorライブラリ: OpenAI/Anthropic/Geminiを統一インターフェースでラップし、Pydanticモデルを直接指定可能
  • LangChainのwith_structured_output()メソッド: チェーン内で構造化出力を簡潔に指定

JSON Modeの設計ベストプラクティス

  • フラットなスキーマを優先: ネスト深度は3層以下に抑える。深いネストは生成精度とパフォーマンスの両方を悪化させる
  • enum制約の活用: カテゴリ・ステータスなど取りうる値が限定されるフィールドにはenumを指定し、不正値を防止
  • description フィールドの記述: 各プロパティにdescriptionを付与すると、モデルがフィールドの意味を正確に理解し、精度が向上する
  • nullable の明示: オプショナルなフィールドはnullable: trueを明示し、データが存在しない場合の挙動を制御
  • 配列サイズの制約: minItems/maxItemsで配列サイズを制限し、過大な出力を防止

よくある質問(FAQ)

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非対応のモデルでのみプロンプト指示を使用する。

まとめ

  • JSON ModeはLLM出力をJSON形式に制約する機能で、各社が独自実装を提供
  • OpenAI Strict Mode(JSON Schema 100%準拠)が最も厳密な保証を提供
  • Anthropic はTool Use経由、GeminiはresponseMimeType + responseSchemaで実現
  • TypeScriptではZod、PythonではPydanticとの連携が主流
  • フラットなスキーマ設計とenum制約の活用がベストプラクティス