AI Agents · レッスン

不正な出力の修復ループ

JSONを解析できない場合は、エラーをモデルに返して出力を修正するよう求めます。

レッスン 3/415 ステップ

「不正な出力の修復ループ」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JSON ModeとTool-Call出力
  2. Pydanticスキーマ検証
  3. 不正な出力の修復ループ
  4. Instructor / Outlinesによる構造の保証
← AI Agentsに戻る