開発分析
構造化出力対応LLM APIを比較するには?JSONが返るだけでなくschema遵守を測る

目次
結論
JSONがparseできることと値が正しいことを分け、optional/enum/nested/異常入力を含む100-case 検証を設計し、schema違反とsemantic errorを別記録します。
このテーマでは、サービス名や流行語から先に結論を出すより、何を決める記事なのかを固定してから必要な事実を集める方が安全です。価格、plan、API、policy、求人、地域など変わる情報には観測日を付け、性能や収益のように環境依存の数字は自分のraw dataと分離します。
まず作るもの:optional・enum・nestedを含む100ケース評価票
100-case structured output 検証 design
| Case | Schema feature | Input risk | Parse valid | Schema valid | Semantic valid | Retry | Cost/latency |
|---|---|---|---|---|---|---|---|
| 001 | required/enum | normal | 未測定 | 未測定 | 未測定 | ||
| 002 | optional/nested | missing field | 未測定 | 未測定 | 未測定 | ||
| … | 100 cases |
Accepted contractは結果の捏造を要求しない。実装者がraw結果を追加するまで率は公開しない。
この表で重要なのは、空欄を埋めることではありません。一次情報で確認できない条件、まだ測っていない値、契約前にしか分からない条件は未確認のまま残すことです。空欄は次の問い合わせ・PoC・measurementの入口になります。
なぜ単純な「おすすめ順」で決めないのか
API比較ではmodel名より、課金単位、limit、data control、feature semantics、deprecationをcurrent docsで固定します。同じ『streaming』『structured output』『cache』でもproviderごとに条件が違います。
性能・品質はproviderの説明と自分のmeasurementを分けます。TTFT、WER、retrieval quality、schema errorのようなworkload依存値は実際の観測結果なしに比較表へ入れません。
本番設計ではcostとcapacityを同時に見ます。単価が安くてもrate limit、retry、batch window、cache invalidationがworkloadに合わなければ総原価が上がります。
そのため、候補を並べる順番は「有名」「安い」「新しい」ではなく、必須条件を満たすか→未確認riskは何か→総費用/運用負荷が見合うか、の順にします。
比較するときに最初に見る3項目
1. schema
schema はproviderのcurrent仕様とworkload依存の観測値を分離します。billing/limit/featureは公式docs、latency・quality・error率はraw observationsがある場合だけ数値化します。
2. invalid rate
invalid rate はproviderのcurrent仕様とworkload依存の観測値を分離します。billing/limit/featureは公式docs、latency・quality・error率はraw observationsがある場合だけ数値化します。
3. retry
retry はproviderのcurrent仕様とworkload依存の観測値を分離します。billing/limit/featureは公式docs、latency・quality・error率はraw observationsがある場合だけ数値化します。
4・5番目の軸も同じ証拠形式でそろえる
残る latency / cost も判断表へ同じ粒度で入れます。候補Aだけ細かく調べ、候補Bはmarketing pageの要約だけ、という比較は避けます。条件が揃わないセルは「不明」とし、その不明点が判断を左右するなら公開結論を弱めるか確認を待ちます。
実務での進め方
- この記事で決めたいことを1文にする。
LLM 構造化出力 API 比較で読者が最後に何を選ぶ・止めるのかを明確にします。 - 必須条件を先に固定する。 価格を見る前にsecurity、権利、地域、latency、運用責任者など外せない条件を決めます。
- 公式一次情報で変わり得る 項目を埋める。 plan、fee、limit、feature、policyはスクリーンショットや転載記事ではなくcurrent公式sourceへ戻ります。
- workload依存値は自分のdataへ分離する。 実測が必要な項目は検証 protocolを先に作り、結果がない段階では空欄にします。
- 除外条件を適用する。 必須条件を満たさない候補を先に外し、残った候補だけでTCOや工数を比べます。
- 確認日時を残す。 後日refreshするときに、何が変わったかを差分で確認できるようにします。
選ばない・進めない条件
数回成功したdemoだけで本番信頼性を断定しません。
「買わない」「契約しない」「公開しない」「本番化しない」という条件を持つと、比較記事が単なる紹介記事になりにくくなります。選択肢を増やすより、危険な前提を落とすことの方が読者の意思決定には有効です。
参考にした一次情報
- OpenAI Platform — Structured Outputs
- Google AI — Gemini API docs
- Anthropic — Rate limits
- OpenAI — API Pricing
- Google AI — Gemini API Pricing
まとめ
JSONがparseできることと値が正しいことを分け、optional/enum/nested/異常入力を含む100-case 検証を設計し、schema違反とsemantic errorを別記録します。
条件が変わりやすい領域ほど、結論そのものより再判定できる表を残すことに価値があります。次回更新では、判断表の変わったセルだけを公式sourceまたは実際の観測結果で更新し、同じ判断基準でもう一度判定してください。
まとめ
- JSONがparseできることと値が正しいことを分け、optional/enum/nested/異常入力を含む100-case 検証を設計し、schema違反とsemantic errorを別記録します。 条件が変わりやすい領域ほど、結論そのものより**再判定できる表**を残すことに価値があります。次回更新では、判断表の変わったセルだけを公式sourceまたは実際の観測結果で更新し、同じ判断基準でもう一度判定してください。