LLM Response Format(エルエルエムレスポンスフォーマット)
LLM APIに送信するリクエストで出力形式を指定するパラメータの総称。text(自由テキスト)、json_object(JSON構文保証)、json_schema(スキーマ準拠JSON)の3段階があり、用途に応じて使い分ける。
LLM Response Formatとは
LLM Response Format(レスポンスフォーマット)は、LLM APIのリクエストパラメータとして出力形式を指定する仕組みの総称である。モデルの出力をアプリケーションが処理しやすい形式に制御するために使われ、自由テキストからスキーマ準拠JSONまで段階的な制約を設定できる。
フォーマットの3段階
Stage 1: text(デフォルト)
制約なしの自然言語テキスト。チャットボット、文章生成、翻訳などLLMの汎用的な利用に適する。出力をプログラムで処理する場合はパーシングが必要になる。
Stage 2: json_object(JSON Mode)
出力が構文的に有効なJSONであることを保証する。フィールド名や型の保証はないが、json.loads()で確実にパースできる。APIレスポンスの軽量な構造化に適する。
Stage 3: json_schema(Structured Output)
JSON Schemaに100%準拠した出力を保証する。フィールド名、型、必須項目、enum値まで制御できる。データベース投入やフォーム生成など厳密な型安全性が必要な用途に適する。
プロバイダ別パラメータ対応
| プロバイダ | パラメータ名 | text | json_object | json_schema |
|---|---|---|---|---|
| OpenAI | response_format | ○ | ○ | ○ (Structured Outputs) |
| Anthropic | - | ○ | Tool Use経由 | Tool Use経由 |
| Google Gemini | response_mime_type | ○ | ○ | ○ (controlled generation) |
| Mistral | response_format | ○ | ○ | △ (限定) |
| Cohere | response_format | ○ | ○ | △ |
| Groq | response_format | ○ | ○ | × |
OpenAI の実装詳細
OpenAIは3段階すべてをresponse_formatパラメータで提供する。
{"type": "text"}— デフォルト。自由テキスト{"type": "json_object"}— JSON Mode。構文保証のみ{"type": "json_schema", "json_schema": {...}}— Structured Outputs。スキーマ準拠保証
2024年8月のStructured Outputs導入により、OpenAIのresponse_formatは最も成熟した実装となった。
Anthropic の対応方針
AnthropicはClaude APIにresponse_formatパラメータを持たない。代わりにTool Use(Function Calling)機能を活用し、ツール定義のJSON Schemaで出力形式を制御する。この設計哲学はStructured Outputをツール呼び出しの一形態として統合するもので、別途のフォーマットパラメータを不要にしている。
選択ガイドライン
| ユースケース | 推奨フォーマット | 理由 |
|---|---|---|
| チャットボット・QA | text | 自然な会話に制約は不要 |
| API中間処理・ログ構造化 | json_object | 軽量で十分 |
| DBレコード生成 | json_schema | 型安全が必須 |
| UIフォーム自動入力 | json_schema | フィールド準拠が必須 |
| コード生成 | text | コードは自由テキスト |
| データ抽出(NER等) | json_schema | 抽出結果の構造化 |
マルチモーダル出力とフォーマット
テキスト以外のモダリティ(画像、音声、動画)を含む出力では、response_formatの適用範囲はテキスト部分に限定される。画像生成(DALL-E 3)や音声合成(TTS)のフォーマットは別のパラメータで制御する。
Gemini 2.0のマルチモーダル出力では、テキスト部分にjson_schemaを適用しつつ画像やコードの生成を同時に行えるが、JSON内に画像データを含める場合はBase64エンコードが必要になる。
よくある質問
Q: response_formatを使うとトークン消費量は増えますか?
A: JSON形式はテキスト形式より括弧・引用符・カンマなどの構造文字でトークンが増える傾向がある。一般的にJSON出力はテキスト出力より10〜30%多いトークンを消費する。ただしjson_schemaモードでは不要な説明テキストが省略されるため、実質的な増加は小さい。
Q: response_formatはシステムプロンプトの指示と矛盾しますか?
A: 矛盾しない。response_formatはモデルの出力形式を制約するもので、内容は影響しない。システムプロンプトで「JSONで返して」と指示しつつresponse_formatもjson_objectにするのは冗長だが害はない。逆にresponse_format: json_objectを指定しながらシステムプロンプトで「自然な文章で返して」と矛盾する指示を出すと、モデルはresponse_formatに従ってJSON形式で返す。
Q: ストリーミングとresponse_formatは併用できますか?
A: 併用できる。ストリーミング中はJSONが段階的にトークン単位で返されるため、ストリーム完了まで完全なJSONは得られない。リアルタイム表示が不要なバッチ処理では、非ストリーミングでresponse_formatを使う方がシンプルだ。