AI・機械学習
初級

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

LLMの出力を構文的に有効なJSONに限定するAPIオプション。OpenAI、Anthropic、Gemini、Mistralなど主要プロバイダが提供し、response_formatパラメータで有効化する。スキーマ準拠は保証しないが、json.loadsで確実にパースできる出力を得られる。

0 回閲覧
0 いいね

LLM JSON Modeとは

LLM JSON Mode(JSONモード)は、大規模言語モデルのAPI呼び出し時にオプションとして指定することで、モデルの出力を構文的に有効なJSONに限定する機能である。{"key": "value"}のような正しいJSON形式が保証されるため、プログラムでのパースが確実に成功する。

各プロバイダの対応状況

プロバイダパラメータ設定値備考
OpenAIresponse_format{"type": "json_object"}GPT-4o, GPT-3.5-turbo
Anthropic-Tool Use経由直接のJSON Modeはなし
Google Geminiresponse_mime_typeapplication/jsonGemini 1.5 Pro/Flash
Mistralresponse_format{"type": "json_object"}Mistral Large 2
Ollamaformatjsonモデル依存
Groqresponse_format{"type": "json_object"}Llama 3系

OpenAI の実装

response_format: {"type": "json_object"}を指定すると、出力が必ず有効なJSONオブジェクトになる。ただし2つの制約がある。

  1. プロンプトに「JSON」という単語を含める必要がある。含めないとAPIエラーが発生する
  2. max_tokensに達すると不完全なJSONが返る可能性がある。finish_reasonが"length"の場合はパースに失敗し得る

Anthropic の対応

AnthropicのClaude APIには直接的なJSON Modeパラメータがない。代わりにTool Use機能で出力スキーマを定義し、ツール呼び出しを強制する方法でJSON出力を得る。この方法はJSON Modeより強力で、スキーマ準拠まで保証される。

ローカルモデル(Ollama)

Ollamaのformat: "json"オプションはJSON出力を試みるが、モデルの能力に依存する。Llama 3.1やQwen 2.5など命令追従性の高いモデルでは高精度だが、小型モデルでは失敗することがある。

JSON Modeの限界

JSON Modeが保証するのは「構文的に正しいJSON」であり、以下は保証されない。

  • フィールド名: 指定したキー名で出力される保証なし
  • データ型: 数値が文字列で返されることがある
  • 必須フィールド: 指定したフィールドが欠落する可能性
  • 配列の要素数: 「3つ返して」と指示しても2つや5つになる
  • 値の範囲: enumや数値範囲の制約は効かない

これらの制約が必要な場合はStructured Output機能やInstructorなどの上位ツールを使う。

JSON Mode vs Structured Output vs プロンプト指示

項目プロンプト指示JSON ModeStructured Output
JSON構文保証×○○
スキーマ準拠××○
追加コストなしなしなし〜微増
対応プロバイダ全て主要6社主要4社
実装の簡単さ最も簡単簡単やや複雑
信頼性低(90%前後)高(99%+)最高(100%)

実用的な使い方

基本パターン

JSON Modeを有効にした上で、プロンプトで出力フォーマットを明示する。JSON Modeは構文を保証し、プロンプトがフォーマットの「ヒント」を与える。完璧ではないが、多くのユースケースで実用的だ。

エラーハンドリング

JSON Modeでもmax_tokens到達時の不完全JSONや、稀にJSONの値内でのエスケープミスが発生する。json.loads()のtry-catchは必須だ。

パフォーマンス

JSON Modeはモデルの生成速度にほぼ影響しない。Structured Outputは制約付きデコードによりわずかに遅延が増えることがあるが、体感できるレベルではない。

よくある質問

Q: JSON Modeを使えばプロンプトでJSON指示は不要ですか?

A: 不要ではない。JSON Modeは構文保証のみで、フィールド名やデータ構造はプロンプトで指示する必要がある。「以下のJSONフォーマットで返してください: {"name": string, "score": number}」のようにフォーマット例を示すのが効果的だ。OpenAIの場合、プロンプトに「JSON」という語を含めないとAPIエラーになる。

Q: JSON Modeでネストしたオブジェクトは正しく出力されますか?

A: JSON構文としては正しく出力される。ただしネストが深いほどモデルのフォーマット追従性が低下し、フィールド名の誤りや構造の変動が増える。3階層以上のネストではStructured Outputの使用を推奨する。

Q: ストリーミング時にJSON Modeは使えますか?

A: 使える。ただしストリーミング中はJSONが段階的に生成されるため、完全なJSONが得られるのはストリーム終了時だ。途中のチャンクをリアルタイムでパースしたい場合はijsonなどのインクリメンタルJSONパーサーを使うか、ストリーム完了後にまとめてパースする。