12個の大型言語モデル(LLM)APIを対象とした新しいベンチマークにより、ほぼすべてのサービスが要求されたスキーマに一致するJSONを返しているものの、かなりの割合で事実とは異なる値を吐き出していることが判明しました。同じスキーマであっても、トークンコストは数十トークンから5,000トークン近くまで大きく変動します。抽出パイプラインやデータ駆動型エージェントを構築している開発者は、もはや「スキーマが有効であること」を「内容が正しいこと」の代用として信頼することはできません。
なぜこのテストが重要なのか
APIプロバイダーは、パースエラーを排除する方法として「構造化出力(structured output)」を推奨してきました。その約束は単純です。モデルにJSONスキーマを与えれば、脆弱な後処理コードを書くことなくフィールドを埋めてくれるというものです。実際、多くの本番システムは、クラッシュを回避し、ダウンストリームの分析パイプラインをクリーンに保つために、すでにこの保証に依存しています。この保証が半分しか成立しない場合、バグが静かに忍び込み、トークン使用量に基づくコスト計算が大きく狂うことになります。
朗報:スキーマはほぼ強制されている
- テストスイート内のほとんどのモデルは、厳格なバリデーターを通過するJSONを生成しました。
- 制約付きデコーディング(Constrained decoding) – デコーダーをスキーマに固定するモデルは、余計な文字を出力できないため、不正な形式のペイロードは事実上絶滅しています。
- パースエラー率 – 開発者は、JSONの構文エラーに対して、すべての呼び出しをtry-catchブロックで囲む必要がなくなりました。
悪報:有効性 ≠ 正確性
形状(シェイプ)が正しいことは、値が正しいことを保証しません。12モデルのうち4つ(DeepSeek V4、Qwen、GLM-5.2。後者2つはレポート内で2つの異なる名前で登場)は、「思考(thinking)」または「思考の連鎖(chain-of-thought)」モードがオンになっているとき、完璧な形式のJSONを生成しながらも、誤った数値を返しました。
- Qwenモデルでは、単純な算術抽出において、推論を有効にすると16問中1問正解だったものが、推論を無効にすると8問中8問正解になりました。
- DeepSeek V4 Proも同様の変動を示しました。モデルが手順の説明をやめると、抽出精度は1/8から7/8に上昇しました。
余分な推論ステップが制約付きデコーダーを妨害し、外側の括弧は守りつつも、モデルがハルシネーション(幻覚)に陥る原因となっています。
厄介な側面:トークンコストの驚きと無視されるパラメータ
- Claudeのレスポンス形式 – OpenAI互換のエンドポイント経由でアクセスした場合、Claudeは
response_formatフラグを完全に無視し、スキーマに準拠した出力を**0%**しか返しませんでした。このモデルは構造化呼び出しをサポートしていますが、それはAnthropic独自のツール呼び出し(tool-call)インターフェース経由のみです。 - スキーマによるトークン増大 – 控えめな12KBのスキーマは、DeepSeekでは30トークンで済みますが、Claudeでは同じペイロードが4,959トークンも消費しました。
- 請求の不一致 – プロバイダーによってはスキーマをプロンプトの一部としてカウントし、消費されるすべてのトークンに対して課金するものもあれば、無料のオーバーレイとして扱うものもあります。大規模な運用では、スキーマによる請求額がモデルの生成コンテンツのコストを上回る可能性があります。
開発者が今すべきこと
- 形状だけでなく、値を検証する – スキーマバリデーターは、期待される型に一致していれば、誤った数値回答を検知できません。ドメイン固有のチェック(範囲、単位、フィールド間の整合性)を追加してください。
- 信頼性の高いフィールド入力が必要な場合は、DeepSeek、Qwen、GLMにおいて抽出時の思考の連鎖(chain-of-thought)をオフにする。余分な推論ステップはオプションであり、正確性のために必須ではありません。
- トークン使用量を監査する – スキーマ部分を含め、各リクエストが何トークン消費するかをログに記録し、大規模なデプロイを決定する前にベンダー間で請求額を比較してください。
- 移植性をテストする – OpenAIで動作するスキーマが、GeminiやClaudeでは黙って無視される可能性があります。コードをリリースする前に、各ターゲットプラットフォームで簡単なサニティチェックを行ってください。
ベンダー側からの反論
一部のプロバイダーは、「思考」モードは、説明の重要性が生の抽出精度を上回るタスク向けに、開発者が選択するものだと主張しています。Claudeは response_format フラグを無視し、代わりにAnthropic独自のツール呼び出しを使用することを推奨しています。これらの説明は技術的には正しいですが、どのモードを選択すべきか、また隠れたトークン料金をどのように予算化すべきかを判断するという負担を開発者に押し付けています。
結論
JSONスキーマはもはや安全網ではありません。単なる「形状」に過ぎません。内部のデータが現実と一致していることを確認し、隠れたトークンコストに注意を払い、モデルの「思考」が、一見最もクリーンに見える出力さえも汚染する可能性があることを忘れないでください。
