2.2 処理フロー
Processing Flow
基本的な処理フロー
Guardrails AIは、以下の流れでLLM出力の品質を担保する。
処理の流れ
1. プロンプト構築:スキーマ情報を含むプロンプトを生成
2. LLM呼び出し:構築したプロンプトでLLMを呼び出し
3. 出力パース:LLM出力を構造化データとして解析
4. バリデーション:各フィールドにValidatorを適用
5. 結果返却 / Reask:検証成功なら返却、失敗ならリトライ
各ステップの詳細
1. プロンプト構築
Guardはスキーマ情報をプロンプトに自動的に埋め込む。これにより、LLMは期待される出力形式を理解できる。
# 内部で生成されるプロンプトの例 """ 以下の形式でJSONを出力してください: { "name": string // ユーザー名 "age": integer // 年齢 (0-150) "email": string // メールアドレス } 入力: 田中太郎、30歳、tanaka@example.com """
2. LLM呼び出し
Guardは様々なLLM APIをサポートする。
import openai from guardrails import Guard guard = Guard.from_pydantic(UserProfile) # OpenAI result = guard( llm_api=openai.chat.completions.create, model="gpt-4", messages=[{"role": "user", "content": prompt}] ) # Anthropic import anthropic result = guard( llm_api=anthropic.Anthropic().messages.create, model="claude-3-opus-20240229", messages=[{"role": "user", "content": prompt}] )
3. 出力パース
LLMの生の出力からJSON部分を抽出し、Pythonオブジェクトに変換する。
# LLMの生出力例 """ はい、以下が抽出結果です。 ```json {"name": "田中太郎", "age": 30, "email": "tanaka@example.com"} ``` 他に質問がありますか? """ # Guardrailsが自動的にJSONを抽出 # → {"name": "田中太郎", "age": 30, "email": "tanaka@example.com"}
4. バリデーション
各フィールドに登録されたValidatorが順次実行される。
# バリデーション例 # name: ValidLength(min=1, max=100) → PASS # age: ValidRange(min=0, max=150) → PASS # email: RegexMatch(pattern) → PASS
5. 結果返却 / Reask
全てのバリデーションが成功すれば結果を返却。失敗があればReask(再質問)を実行。
# 検証成功時 result.validated_output # {'name': '田中太郎', 'age': 30, 'email': 'tanaka@example.com'} # 検証失敗時(Reask有効の場合) # → LLMに修正を依頼する追加プロンプトが送信される
Reask(再質問)の仕組み
検証に失敗した場合、Guardrailsは自動的にLLMへ修正を依頼する。
Reaskプロンプトの例
"""
前回の出力に問題がありました。
問題のあったフィールド:
- age: 値 "三十" は整数ではありません
以下の形式で再度出力してください:
{
"name": string,
"age": integer,
"email": string
}
"""
リトライ回数の制御
result = guard(
llm_api=openai.chat.completions.create,
model="gpt-4",
messages=[...],
num_reasks=3 # 最大3回までリトライ
)
リトライのコスト
Reaskは追加のAPI呼び出しを発生させる。コストと成功率のバランスを考慮し、適切なnum_reasks値を設定すること。
GuardResultオブジェクト
Guard呼び出しの結果はGuardResultオブジェクトで返される。
result = guard(...) # 主要なプロパティ result.validated_output # 検証済み出力(dict) result.raw_llm_output # LLMの生出力 result.validation_passed # 検証成功フラグ result.error # エラー情報 result.reask_attempts # リトライ回数
エラーハンドリング
result = guard(...) if result.validation_passed: print("成功:", result.validated_output) else: print("失敗:", result.error) print("リトライ回数:", result.reask_attempts)
参考文献
[1] Guardrails AI - How It Works - https://docs.guardrailsai.com/how_it_works/
[1] Guardrails AI - How It Works - https://docs.guardrailsai.com/how_it_works/