修復と検証のループ
不正な形式の出力を修正します。
「修復と検証のループ」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
修正ループが存在する理由
スキーマがあっても、トークン上限による不完全な JSON、幻覚による余分なフィールド、数値が必要な箇所に文字列が入る問題、ビジネスルール違反などによって、出力は失敗することがあります。修正ループは失敗を検出し、モデルにフィードバックして修正させます。
これは成功率98%を99.9%に引き上げる安全網です。
検証と修正のサイクル
標準的なループは、生成、検証、そして無効な場合は具体的なエラーを示して再プロンプトする、という流れです。試行回数には上限を設けます。
def generate_valid(prompt, schema, max_tries=3):
msgs = [{'role': 'user', 'content': prompt}]
for _ in range(max_tries):
out = call_model(msgs)
ok, err = validate(out, schema)
if ok:
return out
msgs.append({'role': 'assistant', 'content': out})
msgs.append({'role': 'user',
'content': 'Invalid. Fix this error and resend JSON only: ' + err})
raise ValueError('repair budget exhausted')一般的なエラーより具体的なエラーを使う
修正の品質は、フィードバックの精度に左右されます。「無効な JSON です」ではほとんど役に立ちませんが、「フィールド rating は1~5の整数である必要がありますが、7でした」なら、ほぼ必ず1回のターンで修正できます。
バリデーターの正確なエラーメッセージ(パスと理由)をモデルに返します。
def validate(obj, schema):
v = jsonschema.Draft202012Validator(schema)
errs = sorted(v.iter_errors(obj), key=lambda e: e.path)
if not errs:
return True, None
msg = '; '.join(f"{list(e.path)}: {e.message}" for e in errs)
return False, msg段階的な検証
検証には段階があります。まず、最も低コストなものから確認します。
- 構文 — JSONとして解析できますか。
- 構造 — スキーマに適合していますか。
- 意味 — 値はビジネスルールとフィールド間の不変条件を満たしていますか。
割引額が小計を超えることは、両方が有効な数値であっても許されません。これは意味の検証です。
def semantic_ok(o):
return o['discount'] <= o['subtotal'] and o['total'] == o['subtotal'] - o['discount']修正前の決定論的な処理
モデル呼び出しを行う前に、よくある不備に対して低コストな決定論的修正を試します。
- Markdownのコードフェンスを取り除きます。
- 周囲の説明文から最外部のJSONオブジェクトを抽出します。
- 末尾のカンマを削除します。
決定論的なクリーンアップに失敗した場合にのみ、モデルによる修正へ進みます。
def extract_json(text):
text = text.strip().removeprefix('json').strip()
start, end = text.find('{'), text.rfind('}')
if start != -1 and end != -1:
return text[start:end + 1]
return text不完全な出力への対処
finish_reason == 'length' の場合、JSONは途中で切れています。この断片を修正しても無駄です。代わりに max_tokens を増やす、要求するペイロードを小さくする、またはストリーミングして続きを要求します。不完全な出力と不正な形式の出力は区別してください。必要な対応が正反対だからです。
if resp.choices[0].finish_reason == 'length':
# do NOT feed truncated JSON back; regenerate with more room
return retry_with(max_tokens=resp_max * 2)ループに上限を設ける
無制限の修正はコストとレイテンシーの危険要因であり、停止したモデルが永遠にループする可能性もあります。必ず試行回数に上限を設け、リクエストごとの予算を設定し、フォールバック(機能を穏やかに縮退させる、人手による確認のキューに入れる、安全なデフォルト値を返すなど)を定義します。
try:
data = generate_valid(prompt, schema, max_tries=3)
except ValueError:
log_for_review(prompt)
data = SAFE_DEFAULTツール呼び出し内での修正
関数呼び出しでは、修正用のチャネルはツール結果です。構造化されたエラーを返せば、モデルは次のターンで自動的に修正します。別個のループは必要ありません。
msgs.append({'role': 'tool', 'tool_call_id': call.id,
'content': json.dumps({'error': 'amount must be positive', 'got': args['amount']})})
# next model turn will re-issue the call with a corrected argument冪等性と副作用
アクション(単なる生成ではない処理)を修正ループで囲む場合は、再試行が冪等になるようにします。冪等性キーを使用すれば、再発行された呼び出しによって二重請求やレコードの重複が発生することを防げます。副作用を確定する前に検証し、決して後で検証してはいけません。
修正率を監視する
修正率は、品質を先行して示す重要な指標です。修正率の上昇は、プロンプトのリグレッション、厳しすぎるスキーマ、またはモデルのドリフトを意味します。成功するまでの試行回数と主なエラーパスを記録し、それらが急増したときにアラートを出します。
metrics.histogram('llm.repair.attempts', tries)
metrics.increment('llm.repair.error', tags={'path': top_error_path})制約と修正を組み合わせる
最も強固なパイプラインは、複数の防御層を組み合わせます。制約付きデコーディングまたは厳格なスキーマモードで失敗を最小限に抑え、低コストな修正には決定論的なクリーンアップを使い、残ったまれな失敗には試行回数を制限したモデル修正ループを使います。単独で十分な層はありません。
クイックチェック
APIが finish_reason として length を返し、JSONが途中で切れていました。正しい対応は何ですか。
まとめ
堅牢な修正パイプライン:
- 構文、構造、意味の段階に分けて検証します。
- パスレベルの正確なエラーをモデルに返します。
- モデル呼び出しのコストをかける前に、決定論的なクリーンアップを試します。
- 不完全な出力を別途検出し、再生成します。
- 試行回数に上限を設け、冪等性を確保し、修正率を監視します。
構造化生成を完了しました。次のコースでは、ガードレールと出力検証を扱います。
AI チューターと学ぶ AI Prompt Engineering — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 53
- レッスン
- 199
よくある質問
「修復と検証のループ」レッスンは無料ですか?
はい。「修復と検証のループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「修復と検証のループ」で何を学びますか?
不正な形式の出力を修正します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「修復と検証のループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。