AI・機械学習
初級

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

LLM構造化出力とは、大規模言語モデルの応答をJSON・XML・特定スキーマなどの決まった形式で出力させる技術の総称で、アプリケーション統合やデータパイプラインの自動化において不可欠な機能である。

0 回閲覧
0 いいね

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%+)低いクラウドAPIOpenAI, Anthropic
Function Calling高い(スキーマ準拠)低いクラウドAPIOpenAI Functions, Claude Tool Use
Grammar制約100%保証やや高いローカル推論llama.cpp GBNF, vLLM, Outlines
後処理バリデーションリトライ依存高い(失敗時)全環境Instructor, Pydantic

主要プロバイダの対応状況(2026年)

各LLMプロバイダの構造化出力サポート状況は以下の通りである。

プロバイダJSON ModeStrict JSONFunction 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統合など幅広いユースケースで活用される
  • スキーマ複雑度の管理とエラーハンドリングが実装上の重要ポイント