LLM構造化出力パーシング(エルエルエムコウゾウカシュツリョクパーシング)
LLMの応答をJSON・XML・YAML等の構造化フォーマットで出力させ、プログラムから型安全に利用可能にする技術。OpenAIのStructured Outputs、AnthropicのTool Use、GoogleのControlled Generationなど各プロバイダが独自の実装を提供している。
LLM構造化出力パーシングとは
LLM構造化出力パーシングとは、大規模言語モデルの出力を自由文テキストではなくJSON等の構造化フォーマットに制約し、アプリケーションから確実にパース・利用できるようにする技術である。2024年8月にOpenAIがStructured Outputsを正式リリースして以降、Anthropic(Tool Use / JSON Mode)、Google(Controlled Generation)、Mistral(JSON Mode)など主要プロバイダが相次いで対応し、2026年現在はLLMアプリケーション開発の標準手法となった。
各プロバイダの実装比較
| プロバイダ | 機能名 | JSON Schema対応 | 出力保証 | 対応モデル |
|---|---|---|---|---|
| OpenAI | Structured Outputs | 完全対応 | 100%保証 | GPT-4o, GPT-4o mini, o1, o3 |
| OpenAI | JSON Mode | 非対応 | JSON形式のみ保証 | GPT-3.5 Turbo以降全モデル |
| OpenAI | Function Calling | 完全対応 | パラメータのみ保証 | GPT-3.5 Turbo以降全モデル |
| Anthropic | Tool Use | 完全対応 | 入力スキーマ準拠 | Claude 3/3.5/4全モデル |
| Anthropic | JSON Mode (beta) | 部分対応 | ベストエフォート | Claude 3.5 Sonnet以降 |
| Controlled Generation | 完全対応 | 100%保証 | Gemini 1.5 Pro/Flash, 2.0 | |
| Function Calling | 完全対応 | パラメータ保証 | Gemini 全モデル | |
| Mistral | JSON Mode | 部分対応 | JSON形式のみ | Mistral Large, Medium |
OpenAI Structured Outputs の仕組み
OpenAIのStructured Outputsは、JSON Schemaを事前にコンパイルして文脈自由文法(CFG)に変換し、トークン生成時に文法に違反するトークンの出力確率をゼロにすることで100%のスキーマ準拠を実現する。主な特徴は以下の通り:
- Constrained Decoding: 生成時にスキーマに違反するトークンをマスクする制約付きデコーディング
- 初回コンパイル遅延: 新しいスキーマの初回使用時に約10-30秒のコンパイル時間が発生(キャッシュ後は不要)
- additionalProperties: false 必須: スキーマ定義で追加プロパティを禁止する制約が必須
- null許容の明示: オプショナルフィールドはunion型(例:
{"type": ["string", "null"]})で定義 - 再帰型対応: 自己参照するスキーマ(ツリー構造等)にも対応
- ストリーミング対応: パーシャルJSONのストリーミング出力が可能
Anthropic Tool Use の特徴
AnthropicのTool Use(旧Function Calling)はClaudeモデルファミリーで利用可能で、以下の特徴を持つ:
- input_schema: JSON Schemaでツール入力の型を定義。Claudeが推論結果を
tool_useブロックとして返す - 複数ツール同時呼び出し: 1回の応答で複数のツールを並列呼び出し可能
- ストリーミング:
content_block_deltaイベントでJSON断片を逐次受信 - キャッシュ対応: Prompt Cachingでツール定義をキャッシュし、繰り返し呼び出しのコスト削減
- 型の厳密性: required指定フィールドは必ず出力されるが、値の内容はベストエフォート
- コスト: ツール定義はシステムプロンプトの一部としてカウントされる
Google Controlled Generation
GoogleのControlled Generation(responseSchema)はGemini APIで提供される構造化出力機能:
- OpenAPI Schema準拠: JSON Schema互換のOpenAPIスキーマで出力形式を定義
- enum制約: 出力値を列挙型に制約可能(分類タスクに最適)
- 配列出力: 複数レコードの一括抽出に対応
- Vertex AI統合: Google Cloud Vertex AIのパイプラインに直接組み込み可能
- 無料枠: Gemini 2.0 Flashは15 RPM/1M TPDの無料枠で利用可能
パーシングライブラリ比較
| ライブラリ | 言語 | 特徴 | スター数(2026) |
|---|---|---|---|
| instructor | Python | Pydantic統合、リトライ機能、全主要LLM対応 | 9,200+ |
| outlines | Python | 文法制約デコーディング、ローカルLLM対応 | 8,500+ |
| guidance | Python | テンプレートベース、Microsoft Research開発 | 19,000+ |
| zod-to-json-schema | TypeScript | Zodスキーマ→JSON Schema変換 | 1,200+ |
| LangChain OutputParsers | Python/TS | 多形式対応(JSON/XML/CSV/Pydantic) | - |
| Marvin | Python | 型ヒントから自動抽出、関数デコレータ方式 | 5,000+ |
エラーハンドリングとリトライ
構造化出力でも以下のエラーが発生しうる:
- スキーマ違反: Structured Outputs非対応モデルでの型不一致。instructorのリトライ機能で自動修正
- 長大出力の切断: max_tokensに達した場合のJSON不完全化。finish_reason確認が必須
- ハルシネーション: スキーマに準拠するが内容が不正確。後処理でのバリデーションが必要
- レート制限: 大量リクエスト時の429エラー。指数バックオフで対応
- タイムアウト: 複雑なスキーマでの推論時間超過。スキーマの簡素化で改善
よくある質問(FAQ)
Q1: Structured OutputsとFunction Callingの違いは何ですか? A: Structured Outputsはレスポンス本体を直接JSON化する機能、Function Callingはモデルが「関数を呼びたい」という意図とパラメータを返す機能である。データ抽出にはStructured Outputsが直接的、ツール連携にはFunction Callingが適する。
Q2: ローカルLLMでも構造化出力は可能ですか? A: outlinesライブラリを使えばHugging Face Transformers/vLLM/llama.cppで文法制約デコーディングが可能。GGUF量子化モデルでもJSON Schema準拠の出力を実現できる。
Q3: スキーマが複雑な場合のパフォーマンスへの影響は? A: OpenAI Structured Outputsでは初回スキーマコンパイルに10-30秒かかるが、キャッシュ後は通常の推論速度と同等。プロパティ数が50を超えると推論速度が10-20%低下する傾向がある。
Q4: Nested Object(入れ子オブジェクト)には対応していますか? A: OpenAI・Google・Anthropic全プロバイダで入れ子オブジェクト・配列の入れ子に対応。再帰的構造(木構造等)もOpenAI Structured Outputsで対応済み。
まとめ
- LLM構造化出力は2026年のアプリケーション開発で必須技術
- OpenAI Structured Outputs は100%スキーマ保証で最も成熟
- Anthropic Tool Use は柔軟なマルチツール呼び出しに強み
- Google Controlled Generation は無料枠とVertex AI統合が魅力
- instructorライブラリがPythonでのデファクトスタンダード