LLM構造化出力(エルエルエムコウゾウカシュツリョク)
LLM構造化出力とは、大規模言語モデルの応答をJSON・XML・特定スキーマなどの決まった形式で出力させる技術の総称で、アプリケーション統合やデータパイプラインの自動化において不可欠な機能である。
LLM構造化出力とは
LLM構造化出力(Structured Output)とは、大規模言語モデル(LLM)が生成するテキストを、JSON・XML・YAML・CSV などの機械可読な形式に制約して出力させる技術群の総称である。従来のLLMは自然言語テキストを自由形式で生成するが、構造化出力技術を用いることで、プログラムが直接パースできるデータ構造を確実に得られる。2025〜2026年にかけて、OpenAI・Anthropic・Google の主要3社がいずれもネイティブ対応を強化し、LLMアプリケーション開発の標準的なプラクティスとなった。
構造化出力の主要アプローチ
LLMの出力を構造化する手法は大きく4つに分類される。
- JSON Mode: モデルレベルでJSON形式の出力を保証する。OpenAIの
response_format: {type: "json_object"}やAnthropicのTool Useが代表例 - Function Calling / Tool Use: モデルが関数呼び出しの形式で構造化データを返す。OpenAI Functions API、Claude Tool Use、Gemini Function Callingなど
- Grammar制約(Guided Decoding): トークン生成時にCFG(文脈自由文法)やGBNF、正規表現で出力トークンを制約する。llama.cppのGBNF、vLLMのGuided Decoding、Outlinesなど
- 後処理バリデーション: 生成後にPydantic・Zod・JSON Schemaなどでバリデーションし、不正な場合はリトライする
| アプローチ | 保証レベル | レイテンシ影響 | 対応環境 | 代表ツール |
|---|---|---|---|---|
| JSON Mode | モデル依存(99%+) | 低い | クラウドAPI | OpenAI, Anthropic |
| Function Calling | 高い(スキーマ準拠) | 低い | クラウドAPI | OpenAI Functions, Claude Tool Use |
| Grammar制約 | 100%保証 | やや高い | ローカル推論 | llama.cpp GBNF, vLLM, Outlines |
| 後処理バリデーション | リトライ依存 | 高い(失敗時) | 全環境 | Instructor, Pydantic |
主要プロバイダの対応状況(2026年)
各LLMプロバイダの構造化出力サポート状況は以下の通りである。
| プロバイダ | JSON Mode | Strict JSON | Function Calling | 並列呼び出し | スキーマ制約 |
|---|---|---|---|---|---|
| OpenAI (GPT-4o/o3) | ○ response_format | ○ Strict Mode | ○ functions/tools | ○ parallel | ○ JSON Schema |
| Anthropic (Claude 4) | ○ Tool Use経由 | ○ tool_choice=any | ○ Tool Use | ○ 並列Tool | ○ input_schema |
| Google (Gemini 2.5) | ○ response_mime_type | ○ responseSchema | ○ Function Calling | ○ parallel | ○ Schema定義 |
| Meta (Llama 4) | △ プロンプト指示 | × | △ llama.cppで対応 | × | ○ GBNF |
| Mistral (Large 2) | ○ JSON Mode | × | ○ Function Calling | ○ parallel | △ 部分対応 |
- OpenAI Strict Mode: 2024年8月導入。JSON Schemaに100%準拠する出力を保証。
strict: trueパラメータで有効化。GPT-4o以降で対応 - Anthropic Tool Use: Claude 3以降でTool Use(旧Function Calling)をサポート。
tool_choice: {type: "any"}でJSON出力を強制可能。Claude 4ではネスト構造やunion型にも対応 - Gemini responseSchema:
response_mime_type: "application/json"とresponseSchemaの組み合わせでスキーマ準拠出力を実現
構造化出力のユースケース
構造化出力は以下のような場面で特に有効である。
- データ抽出: 非構造化テキスト(メール・議事録・契約書)からの情報抽出。抽出結果をJSON形式で返すことで後続のDBインサートやAPI連携が容易になる
- エージェント開発: LLMエージェントがツールを呼び出す際に、引数を構造化データとして出力する。ReAct・Plan-and-Execute パターンの実装に必須
- 分類・ラベリング: テキストのカテゴリ分類・感情分析・タグ付けの結果を固定スキーマで返す
- コード生成: 特定の言語やフレームワークの文法に沿ったコードを生成する際に、構文制約を適用
- APIレスポンス生成: LLMをバックエンドに持つAPIで、フロントエンドが期待するJSON形式を保証する
構造化出力の課題と注意点
- スキーマ複雑度とパフォーマンス: 深くネストしたスキーマや多数のプロパティを持つスキーマは、生成速度の低下やエラー率の増加を招く。実用上はネスト深度3〜4層、プロパティ数20以下が推奨
- Optional/Nullable フィールド: 必須フィールドとオプショナルフィールドの扱いはプロバイダごとに異なる。OpenAI Strict Modeでは全フィールドがrequiredかつnullableで設計する必要がある
- ストリーミング対応: 構造化出力をストリーミングで受信する場合、部分的なJSONの処理が必要。OpenAIは
parsedフィールドでパース済み部分JSONを提供 - コスト考慮: Strict ModeやGrammar制約は内部的に追加のトークン消費や計算コストが発生する場合がある。vLLMのGuided Decodingでは最大10〜15%のスループット低下が報告されている
よくある質問(FAQ)
Q1: JSON ModeとFunction Callingの違いは何ですか? A: JSON Modeはモデルの出力全体をJSON形式に制約する機能で、スキーマは任意。Function Callingは事前定義した関数のシグネチャ(引数スキーマ)に沿った構造化データを返す機能で、より厳密なスキーマ制約が可能。用途に応じて使い分ける。
Q2: ローカルLLMで構造化出力を得るにはどうすればよいですか? A: llama.cppのGBNF Grammar、vLLMのGuided Decoding、Outlines(Python)などを使用する。GBNFはBNF形式で文法を定義し、トークン生成時に制約を適用する方式で、100%のスキーマ準拠を保証できる。
Q3: 構造化出力でエラーが発生した場合の対処法は? A: Instructor(Python)やzod-to-json-schema(TypeScript)などのライブラリを使い、バリデーション失敗時に自動リトライする仕組みを組み込む。最大リトライ回数は3回程度が実用的で、エラーメッセージをフィードバックとしてモデルに渡すと成功率が向上する。
まとめ
- LLM構造化出力は、モデルの応答をJSON・XMLなどの機械可読な形式で得る技術群
- JSON Mode、Function Calling、Grammar制約、後処理バリデーションの4アプローチがある
- OpenAI Strict Mode、Claude Tool Use、Gemini responseSchemaが2026年の主流
- エージェント開発・データ抽出・API統合など幅広いユースケースで活用される
- スキーマ複雑度の管理とエラーハンドリングが実装上の重要ポイント