AI・機械学習
中級

LLM構造化出力パーシング(エルエルエムコウゾウカシュツリョクパーシング)

LLMの応答をJSON・XML・YAML等の構造化フォーマットで出力させ、プログラムから型安全に利用可能にする技術。OpenAIのStructured Outputs、AnthropicのTool Use、GoogleのControlled Generationなど各プロバイダが独自の実装を提供している。

0 回閲覧
0 いいね

LLM構造化出力パーシングとは

LLM構造化出力パーシングとは、大規模言語モデルの出力を自由文テキストではなくJSON等の構造化フォーマットに制約し、アプリケーションから確実にパース・利用できるようにする技術である。2024年8月にOpenAIがStructured Outputsを正式リリースして以降、Anthropic(Tool Use / JSON Mode)、Google(Controlled Generation)、Mistral(JSON Mode)など主要プロバイダが相次いで対応し、2026年現在はLLMアプリケーション開発の標準手法となった。

各プロバイダの実装比較

プロバイダ機能名JSON Schema対応出力保証対応モデル
OpenAIStructured Outputs完全対応100%保証GPT-4o, GPT-4o mini, o1, o3
OpenAIJSON Mode非対応JSON形式のみ保証GPT-3.5 Turbo以降全モデル
OpenAIFunction Calling完全対応パラメータのみ保証GPT-3.5 Turbo以降全モデル
AnthropicTool Use完全対応入力スキーマ準拠Claude 3/3.5/4全モデル
AnthropicJSON Mode (beta)部分対応ベストエフォートClaude 3.5 Sonnet以降
GoogleControlled Generation完全対応100%保証Gemini 1.5 Pro/Flash, 2.0
GoogleFunction Calling完全対応パラメータ保証Gemini 全モデル
MistralJSON 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)
instructorPythonPydantic統合、リトライ機能、全主要LLM対応9,200+
outlinesPython文法制約デコーディング、ローカルLLM対応8,500+
guidancePythonテンプレートベース、Microsoft Research開発19,000+
zod-to-json-schemaTypeScriptZodスキーマ→JSON Schema変換1,200+
LangChain OutputParsersPython/TS多形式対応(JSON/XML/CSV/Pydantic)-
MarvinPython型ヒントから自動抽出、関数デコレータ方式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でのデファクトスタンダード