AIの構造化出力で、JSONの形式と内容を分けて確認する
AIの応答をアプリに渡すなら、JSONとして読めるか、決めた項目と型に合うか、元の情報に合うかを分けて確かめます。構造化出力でJSONの形をそろえても、その内容が原文に合っているかは別に確認します。
この記事は、AIから受け取るJSONを検索結果やデータ登録に使いたい開発者向けです。公式資料の説明と、自作データによるローカル検証を分けて紹介します。モデルへ問い合わせて生成精度を測った記事ではありません。
JSONとして読めることと、項目が合うことを分ける
OpenAIの説明では、JSON modeが扱うJSON形式と、Structured Outputsが扱う指定スキーマへの適合を区別しています。JSONとして読み込めても、必要な項目がない、数値のつもりが文字列になっている、といった違いは残り得ます。
JSON Schemaでは、必要な項目や値の型などを記述します。Anthropicの資料も、応答形式を指定するJSON outputsと、ツールの引数を検証するstrict tool useを区別しています。ここで扱うのは、アプリが受け取るJSONの検証です。
スキーマに合うJSONでも、値は原文と照合する
架空の本を記した「タイトル:波の庭。著者:青木ミナ。」から、書名と著者名を取り出す例を考えます。次のローカル検証用スキーマは、titleとauthorの両方を文字列で受け取り、ほかの項目を認めない指定です。著者名の正解はスキーマに含めていません。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"author": {
"type": "string"
}
},
"required": [
"title",
"author"
],
"additionalProperties": false
}
次のJSONは両方の値が文字列なので、このスキーマに適合します。しかし、著者名は原文と食い違います。これは説明用に自作した誤りで、モデルが実際に返した結果ではありません。
{
"title": "波の庭",
"author": "白井ユウ"
}
Googleの資料も、構文が正しいJSONでも値をアプリで検証し、スキーマには合うが意味が誤っている出力を扱うよう説明しています。この例では、型の検証だけでは「白井ユウ」という著者名の誤りを判定できません。原文に対応させた正解データとの比較を別に行いました。
同じスキーマで、構文が崩れたJSON、著者が数値のJSON、著者名が異なるJSON、原文と一致するJSONの4例を検証しました。まずjson.loadsで読み込み、次にDraft202012Validatorでスキーマを検証し、通過したデータだけを正解データと比較しています。
| 自作した例 | JSONの読込み | スキーマ検証 | 原文との照合 |
|---|---|---|---|
| 項目間のカンマがない | 不可 | 未実施 | 未実施 |
| authorが数値の17 | 可 | 不適合 | 未実施 |
| 著者名が白井ユウ | 可 | 適合 | 不一致 |
| 原文と一致する書名と著者名 | 可 | 適合 | 一致 |
表の「未実施」は前の検査で止めた項目です。空欄や成功には置き換えていません。また、最後の照合で確認したのは、この架空の原文との一致です。現実の書誌情報の正しさを調べた検証ではありません。
生成されたJSONを読み込む前に、拒否や途中切れを確認する
実際のAPIでは、期待するJSONが最後まで返るとは限りません。OpenAIの資料は、拒否を表すrefusalや、出力上限による不完全な応答を扱うよう説明しています。本文のJSONを読む処理とは別に、応答の状態を確認する必要があります。
Anthropicの資料では、stop_reasonがrefusalならHTTP 200でも出力がスキーマに合わない場合があり、max_tokensなら途中で切れている可能性があると説明しています。HTTPの成功だけでは、期待したデータが完成したとは判断できません。
アプリ側では、正常なデータ、生成の拒否や中断、項目や値の検証失敗を分けて扱う方針が考えられます。拒否や中断を空のデータに置き換えると、「元の資料に情報がなかった」という結果と区別しにくくなるためです。これは資料と今回の例を踏まえた実装上の提案で、各APIで動作を検証した結果ではありません。
確認した範囲と、アプリへ組み込むときの判断
ローカル検証は2026年10月28日、Windows、Python 3.13.9、jsonschema 4.26.0で実行しました。同版の検証資料を参照し、JSON Schema Draft 2020-12として確認しています。既存の検証用ライブラリーを使い、新しいパッケージの導入や外部APIの呼び出しは行っていません。
3社の資料は同日に確認しました。使えるスキーマの機能や対応モデルには各社の制限があります。ここに示したスキーマはローカル検証用で、各APIへ同じ形で渡せることは確認していません。生成精度、失敗率、速度、拒否時の実際の応答も未検証です。
アプリへ組み込むときは、JSONの読込み、項目や型の検証、元データとの照合、APIの終了状態を別々の確認として設計すると、どこで処理を止めたかを判断できます。モデルに処理の実行を要求させる用途については、関数呼び出しの役割分担で説明しています。