スキーマとルールのバリデーター
制約を適用します。
「スキーマとルールのバリデーター」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
バリデーターで契約を適用する
バリデーターとは、JSON Schema、ビジネスルールの集合、またはその両方で定義された明示的な仕様に対して、出力を検査するガードレールです。モデレーション分類器とは異なり、バリデーターは決定論的で完全に監査可能です。同じ入力からは常に同じ判定が得られます。
スキーマ検証レイヤー
最初のバリデーターでは、出力が構造上の契約に適合していることを確認します。修正のフィードバックを完全なものにするため、最初のエラーだけでなくすべてのエラーを収集します。
import jsonschema
def schema_errors(obj, schema):
v = jsonschema.Draft202012Validator(schema)
return [f"{list(e.path) or 'root'}: {e.message}"
for e in v.iter_errors(obj)]スキーマを超えて: ビジネスルール
スキーマですべてを表現できるわけではありません。たとえば、スキーマではdiscountが数値であることは指定できますが、小計を超えてはならないことまでは指定できません。ルールバリデーターは、このようなフィールド間の不変条件やドメイン固有の不変条件をコードで定義します。
RULES = [
('discount_le_subtotal', lambda o: o['discount'] <= o['subtotal']),
('total_consistent', lambda o: o['total'] == o['subtotal'] - o['discount']),
('currency_supported', lambda o: o['currency'] in SUPPORTED)
]
def rule_errors(o):
return [name for name, fn in RULES if not fn(o)]バリデーターとしての型付きモデル
型付きモデルライブラリ(Pydanticなど)は、スキーマジェネレーターとバリデーターを兼ねることができ、ルール用のカスタムバリデーターも備えられます。パースの失敗自体が判定になります。
from pydantic import BaseModel, field_validator
class Order(BaseModel):
subtotal: float
discount: float
total: float
@field_validator('discount')
@classmethod
def discount_ok(cls, v, info):
if v < 0:
raise ValueError('discount must be non-negative')
return vグラウンディングと引用のバリデーター
RAGの出力では、主張が提供されたコンテキストによって裏付けられていることを検証します。モデルにはソースIDを引用させ、引用された各IDが存在することと、引用された範囲が実際にソース内に現れることを確認します。存在しないソースや捏造されたソースを引用する回答は拒否します。
def citations_valid(answer, sources):
for cite in answer['citations']:
if cite['source_id'] not in sources:
return False
if cite['quote'] not in sources[cite['source_id']]:
return False
return True参照整合性とシステム間のチェック
外部参照が必要なルールもあります。参照された注文IDは存在するか、商品は在庫切れではないか、日付は有効な期間内か、といった確認です。これらのバリデーターはシステムに問い合わせます。応答処理の経路上で実行されるため、キャッシュやバッチ処理を使って高速に保ちます。
def order_exists(o):
return db.exists('SELECT 1 FROM orders WHERE id = %s', o['order_id'])重大度付きの判定
すべての違反が同じ重大度とは限りません。パイプラインが適切なアクションを選択できるよう、各ルールに重大度を付けます。重大な違反は完全にブロックし、品質上の問題では再生成し、軽微な違反では警告付きで通過させます。
RULE_SEVERITY = {
'discount_le_subtotal': 'critical',
'total_consistent': 'critical',
'tone_professional': 'warning'
}バリデーターを順番に組み合わせる
バリデーターはコストの低いものから実行し、重大な失敗があればショートサーキットします。スキーマ、インメモリのルール、外部参照、最後にモデルによる判定チェックという順序です。これにより、通常の拒否経路でのコストを最小限に抑えられます。
def validate_all(obj):
errs = schema_errors(obj, SCHEMA)
if errs: return Reject(errs, 'critical')
errs = rule_errors(obj)
if errs: return Reject(errs, max_severity(errs))
if not order_exists(obj): return Reject(['order_id'], 'critical')
return Accept()バリデーターで修正フィードバックを生成する
バリデーターのメッセージを修正ループに渡すと、その価値は大きく高まります。モデルが1回のやり取りで正確に修正できるよう、フィールドのパス、失敗したルール、問題の値を含む、機械的に処理可能なエラーを出力します。
{'errors': [
{'path': 'discount', 'rule': 'discount_le_subtotal',
'got': 120, 'limit': 100}
]}バリデーター自体をテストする
バグのあるバリデーターは、悪い出力を気付かないまま通過させたり、良い出力をブロックしたりします。各ルールを正常系と異常系のフィクスチャで単体テストし、数値の不変条件にはプロパティベーステストを追加します。バリデーターのテストスイートはスクリプトではなく、本番環境に不可欠なコードです。
def test_discount_rule():
assert rule_errors({'discount':10,'subtotal':100,'total':90}) == []
assert 'discount_le_subtotal' in rule_errors(
{'discount':120,'subtotal':100,'total':-20})バリデーターと制約付きデコーディング
制約付きデコーディングは生成時に構造上のエラーを防ぎますが、意味までは適用できません(ビジネスルールを認識していないためです)。バリデーターは生成後に意味上の違反を検出します。両方を使用します。形状にはデコーディング、意味にはバリデーター、整合性の回復には修正ループを使います。
クイックチェック
JSON Schemaでは、discountとsubtotalが数値であると定義されています。モデルがsubtotal 100に対してdiscount 120を返しました。どのレイヤーでこれを検出すべきですか。
まとめ
スキーマバリデーターとルールバリデーター:
- スキーマ検証は構造を扱い、ルールバリデーターは意味を扱います。
- 型付きモデルを使うと、スキーマの生成と検証を1か所で行えます。
- RAGやデータフローには、グラウンディング、引用、参照整合性のチェックを追加します。
- 重大度を付け、コストの低い順に組み合わせ、正確な修正エラーを渡します。
- バリデーターを本番環境に不可欠なコードとしてテストします。
次は、モデル自身が出力を検査する自己批評検証です。
よくある質問
「スキーマとルールのバリデーター」レッスンは無料ですか?
はい。「スキーマとルールのバリデーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「スキーマとルールのバリデーター」で何を学びますか?
制約を適用します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「スキーマとルールのバリデーター」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ガードレールとは
- 入力と出力のフィルタリング
- スキーマとルールのバリデーター
- Self-Critiqueによる検証