メインコンテンツへスキップ

Guides

Structured Outputとは — JSON Schemaで生成結果を受け取る設計

LLMのStructured Output、JSON mode、Function Callingの違いを整理し、Schema適合と業務上の正しさを分けて検証する方法を示します。

(更新日:)5分で読めます
#software-engineering#llm-inference#safety

Structured Outputは、LLMの出力を、あらかじめ定義した構造に沿って受け取る仕組みです。

LLMに「JSONで返して」と頼み、返ってきた文章を後から正規表現で切り出す。最初は動いても、出力が少し変わるだけで壊れます。

JSON Schemaなどで期待するField、型、必須項目、許容値を指定します。

機械処理はだいぶ楽になります。ただし、Schemaに合うことと、内容が事実・業務ルールに合うことは別です。

JSONであることとSchemaに合うことは違う

方法保証する範囲
Promptで「JSONを返して」と依頼モデルへの指示だけ
JSON mode構文上ValidなJSON
Structured OutputProviderが対応するSchemaへの適合
Application validation自社Schemaと追加制約への適合
Domain validationID存在、権限、状態遷移、整合性

JSON Schema Specificationは、JSON documentの構造とValidation keywordを定義します。ただし、Model APIのStructured OutputがJSON Schemaの全Keywordを支えるとは限りません。

OpenAI Structured OutputsClaude Structured OutputsはいずれもSchemaに沿った出力を提供しますが、対応Model、Keyword、制限、Refusal時の形はProviderごとに確認が必要です。

Schemaは業務契約として小さく作る

json
{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "enum": ["billing", "technical", "other"]
    },
    "summary": {
      "type": "string"
    },
    "needsHumanReview": {
      "type": "boolean"
    }
  },
  "required": ["category", "summary", "needsHumanReview"],
  "additionalProperties": false
}

自由なstringだけを返す巨大なSchemaでは、構造化の利点が減ります。Enum、必須項目、長さ、追加Propertyの可否を、利用するProviderの対応範囲で定義します。

一方で、業務ルールをすべてSchemaへ埋め込む必要はありません。顧客IDが現在の利用者に属するか、返金可能期間内か、残高が足りるかは実行時に確認します。

Structured OutputはTool callと用途が異なる

Structured Outputは、分類結果、抽出結果、画面表示用の構造などを返すために使えます。Function CallingとToolは、モデルが外部機能の利用を要求するために使います。

同じJSON Schemaを使う場合でも、後続処理が違います。

  • Structured Output: アプリケーションが出力データを利用する
  • Tool call: アプリケーションが引数を検証し、外部処理を実行する

Tool callの引数がSchemaに適合しても、その操作を許可してよいとは限りません。Authorizationを別に確認します。

Refusal、途中終了、未対応Schemaを扱う

Structured Outputを有効にしても、常に期待Objectが返るとは限りません。

  • Safety上のRefusal
  • 出力Token上限による途中終了
  • Request Schema自体の不備
  • Providerが未対応のKeyword
  • Model/API Versionの非対応
  • Network errorやRate Limit

成功ResponseとRefusal、API error、Validation errorを別の型として扱います。失敗時に空Objectで処理を続けると、後続のDefault値が誤った業務判断になります。

Web実装では境界で再検証する

ProviderがStrictなSchema適合を示していても、自社アプリケーションの境界でParseとValidationを行います。

  1. APIの終了理由を確認する
  2. RefusalやErrorを分ける
  3. JSONをParseする
  4. 自社SchemaでValidationする
  5. Domain ruleとAuthorizationを確認する
  6. 保存・Tool実行へ進む

Schema Versionも記録します。Field追加やEnum変更では、過去データ、Cache、再試行中Requestとの互換性を考えます。

よくある誤解

JSON modeなら指定したSchemaに一致する

JSON modeが保証するのはValid JSONまでの場合があります。必須FieldやEnumへの適合はStructured OutputまたはApplication validationで確認します。

Schemaに合えば内容も正しい

存在しない顧客IDや、根拠のない金額も型としてはValidです。事実性と業務整合性は別に確認します。

Structured OutputならPromptは不要になる

Schemaは出力形を伝えます。分類基準、判断条件、曖昧な場合の扱いはInstructionやExamplesで伝えます。

Provider間で同じJSON Schemaをそのまま使える

対応するDraftやKeyword、再帰、上限が異なります。共通部分を確認し、ProviderごとのValidationをCIで行います。

EastBraver Labsの判断基準

EastBraver Labsでは、後続コードが読む出力にStructured Outputを使います。自然言語から壊れやすいParseを行う構成は避けます。

ただし、Schema適合を安全性の完了条件にはしません。型のValidation、Domain validation、Authorizationを順番に通す。どこで拒否したかもTraceへ残します。

Schemaは広い万能Objectではなく、一つの用途に必要な最小単位へ絞ります。変更時に評価と互換性確認を行える大きさを保ちます。

関連記事