AI・機械学習
上級

LLM Schema Validation(エルエルエム スキーマバリデーション)

LLM の構造化出力が事前定義した JSON Schema に準拠しているか検証するプロセス。Constrained Decoding によるモデル側制約と、アプリケーション側の後処理検証の 2 層で実現する。

0 回閲覧
0 いいね

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: ストリーミング出力でもバリデーションは可能ですか?

完全なストリーミング中のリアルタイムバリデーションは困難ですが、ストリーム完了後に全体をバリデーションする方式が一般的です。部分的なバリデーション(各フィールドの到着時に個別検証)を実装するライブラリも登場しています。