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/