不正な出力の修復ループ
JSONを解析できない場合は、エラーをモデルに返して出力を修正するよう求めます。
「不正な出力の修復ループ」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Strict モードでも失敗することがある
古いモデル、エッジケース、Strict でないプロバイダーでは、まれに不正な JSON が返されます。堅牢なエージェントは、モデルに出力の修復を依頼して復旧します。
Basic Repair Loop
from pydantic import ValidationError
import json
def call_with_repair(messages, schema, max_attempts=3):
for attempt in range(max_attempts):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
response_format={'type': 'json_object'}
)
raw = response.choices[0].message.content
try:
return schema.model_validate_json(raw)
except (json.JSONDecodeError, ValidationError) as e:
messages.append({'role': 'assistant', 'content': raw})
messages.append({
'role': 'user',
'content': f'That output failed to validate: {e}.\nReturn ONLY valid JSON that matches the schema. No prose, no markdown fences.'
})
raise RuntimeError('Could not get valid output after repair attempts.')なぜ機能するのか
モデルはエラーメッセージを確認し、通常は次のターンで修正します。明示的な指示も追加してください:
- "文章を含めない"
- "Markdown のフェンスを含めない"
- "この正確な構造に一致させる:..."
Markdown のフェンスを削除する
モデルは JSON を ```json ... ``` で囲むことがよくあります。パースする前に削除してください:
import re
def extract_json(text):
m = re.search(r'```(?:json)?\s*(.*?)```', text, re.S)
if m:
return m.group(1).strip()
return text.strip()
sample = '```json\n{"name": "Alice"}\n```'
print(extract_json(sample))
最初と最後のブラケットで切り出す
余分な文章がある場合は、最初の { から、対応する最後の } までを切り出します:
def find_json_slice(text):
start = text.find('{')
if start == -1:
return None
depth = 0
for i, c in enumerate(text[start:], start):
if c == '{': depth += 1
if c == '}':
depth -= 1
if depth == 0:
return text[start:i+1]
return None
sample = 'Here is your answer: {"name": "Alice", "age": 30} - hope that helps!'
print(find_json_slice(sample))
これを代わりに行うツール
- Instructor — Pydantic、修復ループ、リトライをまとめて提供します
- Outlines — ガイド付きデコーディングによる保証付きの構造化出力を提供します
- jsonformer — トークン単位で JSON を強制します(HF モデル)
効果的な修復プロンプト
具体的なエラーメッセージと、形式を簡単に再確認する説明を含めてください:
repair_prompt = f'''
Your previous output had this error: {error}
Fix the output. Requirements:
- Valid JSON only
- Match this schema: {json.dumps(schema)}
- No prose, no markdown fences
'''修復ループのコスト
修復するたびに、別の LLM 呼び出しが発生します。リトライ回数を制限してください(2~3 回で十分です。それを超えると、モデルが復旧できる可能性は低くなります)。また、品質指標として修復率を記録してください。
品質シグナルとしての修復
修復率が 5% を超えている場合は、何か問題があります。プロンプトが不明確、スキーマが複雑すぎる、またはモデルが小さすぎる可能性があります。調査してください。
代替案:制約付きデコーディング
オープンソースモデルは文法制約付きデコーディングに対応しており、モデルが無効な出力をまったく生成できないようにできます。Outlines、jsonformer、llama.cpp の文法機能がこれを実現します。
代替案:スキーマではなく関数を使う
Strict モードでツール呼び出しを強制する方法は、JSON モードと修復を組み合わせるよりもすっきりした代替案です。プロバイダーが対応している場合は、常にこちらを使用してください。
不正な出力をログに記録する
パターンを分析できるよう、修復した出力はすべてログに記録してください:
log.warning('Repaired output', extra={'raw': raw, 'error': str(e), 'attempt': attempt})諦めるタイミング
N 回修復を試みても出力が無効なままなら、フォールバックをでっち上げず、ユーザーにエラーを返してください。黙ってデータを破損させるより、正直に失敗するほうが優れています。
修復ループのパターン
修復ループで最初に行う最も簡単なステップは何ですか?
まとめ
パースエラーを検出し、それをツールメッセージまたはユーザーメッセージとして追加して、モデルに修復を依頼します。リトライ回数を制限してください。必要性そのものをなくすため、Strict モードのツール呼び出しを優先してください。
AI チューターと学ぶ AI Agents — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 60
- レッスン
- 239
よくある質問
「不正な出力の修復ループ」レッスンは無料ですか?
はい。「不正な出力の修復ループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「不正な出力の修復ループ」で何を学びますか?
JSONを解析できない場合は、エラーをモデルに返して出力を修正するよう求めます。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「不正な出力の修復ループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。