LLM Schema Validation(エルエルエム スキーマバリデーション)
LLM の構造化出力が事前定義した JSON Schema に準拠しているか検証するプロセス。Constrained Decoding によるモデル側制約と、アプリケーション側の後処理検証の 2 層で実現する。
LLM Schema Validation とは
LLM Schema Validation は、大規模言語モデルが生成した構造化出力が、事前に定義した JSON Schema の制約を満たしているか検証するプロセスです。LLM は確率的にテキストを生成するため、指定したスキーマから逸脱する出力を返す可能性があります。Schema Validation により、不正な出力をアプリケーションの下流処理に流す前に検出・修正できます。
バリデーションの 2 層アーキテクチャ
堅牢な LLM アプリケーションでは、バリデーションを 2 層で実装します。
第 1 層: モデル側制約 (Constrained Decoding)
トークン生成時に、JSON Schema に違反するトークンの選択を禁止します。OpenAI の Structured Outputs やローカル推論エンジンの Grammar 機能がこれにあたります。スキーマ準拠率はほぼ 100% ですが、対応プロバイダが限定されます。
第 2 層: アプリケーション側検証 (Post-validation)
モデル出力を受け取った後、アプリケーション側で JSON Schema バリデーションを実行します。Pydantic (Python) や Zod (TypeScript) などの型検証ライブラリを使います。
| 検証項目 | 第 1 層で検出 | 第 2 層で検出 |
|---|---|---|
| JSON 構文エラー | ○ | ○ |
| 必須フィールド欠落 | ○ | ○ |
| 型の不一致 | ○ | ○ |
| 値の範囲逸脱 | △ | ○ |
| ビジネスロジック違反 | × | ○ |
| クロスフィールド整合性 | × | ○ |
主要バリデーションライブラリ
Pydantic (Python)
Python のデファクトスタンダードの型検証ライブラリです。クラス定義でスキーマを表現し、LLM 出力を model_validate_json() でパース・検証します。バリデーションエラー時には詳細なエラーメッセージが得られます。
Zod (TypeScript)
TypeScript のスキーマ検証ライブラリです。z.object() でスキーマを定義し、.safeParse() で検証します。TypeScript の型システムと統合されており、コンパイル時と実行時の両方で型安全性を提供します。
Guardrails AI
LLM 出力専用のバリデーションフレームワークです。RAIL (Reliable AI Language) 仕様でバリデーションルールを宣言的に定義し、失敗時の自動リトライ・自動修正機能を内蔵しています。
リトライ戦略
Schema Validation に失敗した場合の対処戦略を紹介します。
シンプルリトライ: 同じプロンプトで再度生成を要求します。temperature を下げて(例: 0.0)再試行すると成功率が上がります。最大リトライ回数は 2-3 回が一般的です。
エラーフィードバックリトライ: バリデーションエラーの内容をプロンプトに含めて再生成します。「前回の出力では name フィールドが欠落していました。必ず含めてください」のような指示が効果的です。Instructor ライブラリはこの方式を自動化しています。
部分修復: 出力全体を再生成せず、エラーのあるフィールドだけを修正します。デフォルト値の挿入、型変換(文字列 "42" → 数値 42)、不要フィールドの除去などを自動処理します。
スキーマ緩和: 厳密なスキーマでの検証に繰り返し失敗する場合、スキーマを緩和(required を減らす、enum を広げる)して再試行し、後処理で補完する戦略もあります。
FAQ
Q: バリデーション失敗率はどの程度ですか?
Constrained Decoding(第 1 層)を使用する場合、JSON 構文レベルの失敗は事実上 0% です。Post-processing 方式(Instructor 等)では、シンプルなスキーマで 2-5%、複雑なスキーマで 10-20% の初回失敗率が報告されていますが、リトライにより最終的な成功率は 98-99% に達します。
Q: カスタムバリデーションルールは設定できますか?
はい、Pydantic の @field_validator、Zod の .refine()、Guardrails のカスタム Validator など、各ライブラリがカスタムバリデーション機能を提供しています。例えば「email フィールドが有効なメールアドレス形式か」「start_date が end_date より前か」といったビジネスルールを定義できます。
Q: ストリーミング出力でもバリデーションは可能ですか?
完全なストリーミング中のリアルタイムバリデーションは困難ですが、ストリーム完了後に全体をバリデーションする方式が一般的です。部分的なバリデーション(各フィールドの到着時に個別検証)を実装するライブラリも登場しています。