AI Prompt Engineering · レッスン

予期しない出力を診断する

誤答、誤った形式、トピックからの逸脱、ハルシネーションなど、失敗モードを分類します。

レッスン 1/413 ステップ

「予期しない出力を診断する」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

プロンプトが失敗するとき

慎重に作成したプロンプトでも、誤った結果を生むことがあります。失敗を診断するには、どのような種類の失敗が発生したかを分類する分類体系が必要です。分類しなければ、デバッグは当てずっぽうになってしまいます。主な失敗カテゴリは、誤った回答、形式エラー、話題外の回答、ハルシネーションの4つです。

失敗タイプ1:誤った回答

誤った回答とは、事実に関する誤りです。モデルは正しい形式で、正しい話題について回答していますが、内容が誤っています。

例として、日付、統計、名前、ロジックバグを含むコードなどがあります。表面的には正しい出力に見えるため、自動検出が最も難しい失敗です。

  • 原因:学習データのカットオフ、まれな事実、または複数ステップの推論エラー
  • 検出:正解データとの比較、人によるレビュー、または検証用LLM呼び出し
# Example: wrong answer failure
prompt = 'What year was Python first released?'
response = 'Python was first released in 1994.'  # Wrong — it was 1991

# Ground truth check
GROUND_TRUTH = '1991'
correct = GROUND_TRUTH in response
print(f'Correct: {correct}')  # False

失敗タイプ2:形式エラー

形式エラーは、モデルが正しい質問に正しい情報で回答したものの、形式に関する指示を無視した場合に発生します。

例として、JSONを要求したのにプレーンテキストを返す、プレーンテキストが必要なのにMarkdownを追加する、単一の値を求めたのにリストを返す、といったケースがあります。

  • 原因:長いプロンプトの中に埋もれた形式指定、指示の競合、優先度の低い指示の無視
  • 検出:JSONの解析エラー、正規表現の不一致、スキーマ検証の失敗
import json

response_text = 'Sure! Here is the result: {"name": "Alice", "age": 30}'

try:
    data = json.loads(response_text)
    print('Format OK:', data)
except json.JSONDecodeError as e:
    print(f'FORMAT FAILURE: {e}')
    # 'Sure! Here is the result:' prefix broke JSON parsing

失敗タイプ3:話題外の回答

話題外の回答とは、モデルが質問された内容とは別の質問に回答する失敗です。回答は事実として正しく、形式も適切かもしれませんが、ユーザーの実際の意図には対応していません。

例として、Pythonの関数を求めたのにJavaScriptの関数が返される、1行の回答を求めたのに長い説明文が返される、バグの修正を求めたのに修正ではなくバグの説明が返される、といったケースがあります。

  • 原因:曖昧な指示、矛盾するコンテキスト、長い会話におけるタスクのずれ
# Off-topic example
prompt = 'Write a Python function that reverses a list.'
response = '''
In JavaScript, you can reverse an array like this:
const reversed = arr.reverse();
'''

# Detection: check that output contains the correct language keyword
def check_language(response, expected_lang='def '):
    if expected_lang not in response:
        print(f'OFF-TOPIC FAILURE: expected {expected_lang} in response')
        return False
    return True

check_language(response)  # False — no Python def

失敗タイプ4:ハルシネーション

ハルシネーションは最も危険な失敗です。モデルが実在しない事実を作り出します。もっともらしく、自信を持った表現になるため、発見が困難です。

例として、実在しそうな論文タイトルだが実際には存在しない捏造引用、架空のAPIエンドポイント、偽の統計、実在しない人物などがあります。

  • 原因:モデルが知識の不足を、パターンに基づくもっともらしいテキストで補うため
  • 検出:信頼できる情報源とのファクトチェック、引用の相互参照、API呼び出しのテスト
# Hallucination detection via external verification
import requests

def verify_doi(doi):
    url = f'https://doi.org/{doi}'
    resp = requests.head(url, allow_redirects=True, timeout=5)
    return resp.status_code == 200

# Model claimed this paper exists:
fabricated_doi = '10.1234/fake.paper.2023.99999'
if not verify_doi(fabricated_doi):
    print('HALLUCINATION DETECTED: DOI does not exist')

実践で使う失敗分類体系

失敗が見つかったら、修正を試みる前にまず分類します。失敗の種類によって、修正方法が決まります。

  • 誤った回答:コンテキストを追加する、検索を利用する、またはより高性能なモデルに切り替える
  • 形式エラー:形式の指示を強化する、出力例を追加する、構造化出力やfunction callingを使用する
  • 話題外の回答:より具体的になるよう指示を書き直す、プロンプトを簡潔にする
  • ハルシネーション:根拠となるコンテキストを追加する、「わかりません」と答えるよう指示する、引用を有効にする

構造化された失敗ログ

すべての失敗を分類結果とともに記録します。時間が経つとパターンが見えてきます。たとえば、プロンプトの特定のセクションが形式エラーの大半を引き起こしていたり、特定の話題でハルシネーションが頻発していたりすることがあります。構造化されたログによって、データに基づくデバッグが可能になります。

import json
from datetime import datetime

def log_failure(prompt, response, failure_type, details=''):
    entry = {
        'timestamp': datetime.utcnow().isoformat(),
        'failure_type': failure_type,  # wrong_answer | wrong_format | off_topic | hallucination
        'prompt_hash': hash(prompt),
        'response_snippet': response[:200],
        'details': details
    }
    with open('prompt_failures.jsonl', 'a') as f:
        f.write(json.dumps(entry) + '\n')

log_failure(
    prompt=my_prompt,
    response=bad_response,
    failure_type='wrong_format',
    details='JSON prefix text broke parsing'
)

失敗の自動分類

大規模なテストでは、分類用LLM呼び出しを使って、各回答に失敗タイプを自動的に付与します。これにより、数百件のテストケースを一括評価できます。

def classify_failure(prompt, expected, actual):
    classification_prompt = (
        f'You are a QA evaluator for LLM outputs.\n'
        f'Prompt: {prompt}\n'
        f'Expected behavior: {expected}\n'
        f'Actual output: {actual}\n\n'
        'Classify the failure as one of: CORRECT, WRONG_ANSWER, WRONG_FORMAT, OFF_TOPIC, HALLUCINATION.\n'
        'Reply with only the label.'
    )
    resp = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': classification_prompt}]
    )
    return resp.choices[0].message.content.strip()

重大度マトリックス

すべての失敗が同じ影響を持つわけではありません。重大度マトリックスを使うと、修正の優先順位を付けられます。

  • 医療・法律のコンテキストでのハルシネーション:重大 — 直ちに修正する
  • 社内ツールでの形式エラー:高 — 後続の解析が壊れる
  • まれなエッジケースでの誤った回答:中 — 発生頻度を監視する
  • 曖昧な入力に対する話題外の回答:低 — 頻度が低ければ許容できる

タイプごとの失敗率を週単位で追跡します。いずれかのカテゴリで急増が見られた場合は、対応が必要なリグレッションの兆候です。

失敗ダッシュボードの構築

シンプルな失敗ダッシュボードでは、失敗ログを読み込み、タイプ別およびプロンプトのセクション別に件数を表示します。

import json
from collections import Counter

def failure_report(log_path='prompt_failures.jsonl'):
    entries = []
    with open(log_path) as f:
        for line in f:
            entries.append(json.loads(line))

    counts = Counter(e['failure_type'] for e in entries)
    total = len(entries)

    print(f'Total failures: {total}')
    for ftype, count in counts.most_common():
        pct = 100 * count / total
        print(f'  {ftype}: {count} ({pct:.1f}%)')

failure_report()

失敗の事前防止

各失敗タイプが発生する前に、発生を減らすための事前対策を講じます。

  • 誤った回答:プロンプトに参照テキストを含める(RAG)、モデルに出典を引用させる
  • 形式エラー:JSONモードまたはfunction callingを使用する、プロンプトに形式の例を含める
  • 話題外の回答:タスクを最初の文に記述する、意図を薄める長い前置きを避ける
  • ハルシネーション:「以下に示す情報だけを使用してください」と指示する、「不確かな場合は、わかりませんと答えてください」と追加する

理解度チェック

存在しない事実を作り出す失敗タイプはどれですか。たとえば、引用を捏造したり、存在しないAPIエンドポイントを作ったりするケースです。

まとめ:予期しない出力の診断

LLMの4つの失敗タイプと主な特徴です。

  • 誤った回答:形式は正しく、話題も正しいが、内容が誤っている — 正解データと照合してファクトチェックする
  • 形式エラー:内容は正しいが、形式の指示を無視している — スキーマ検証で検出できる
  • 話題外の回答:形式は正しいが、別の質問に回答している — 言語とタスクの一致を確認する
  • ハルシネーション:事実を作り出している — 外部の情報源と照合する

すべての失敗を記録して分類します。タイプ別の発生率を時間の経過に沿って追跡します。次のレッスンでは、プロンプトのどの部分が失敗を引き起こしたのかを特定する根本原因分析を扱います。

無料で開始

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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「予期しない出力を診断する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. 予期しない出力を診断する
  2. プロンプトの根本原因分析
  3. 体系的なデバッグアプローチ
  4. ログ記録とドキュメント化の戦略
← AI Prompt Engineeringに戻る