幻覚とは

大規模モデルの幻覚(Hallucination)とは、モデルが生成した内容が一見もっともらしいが、実際には事実と一致しない現象を指します。それは、存在しない事実を捏造する、既知の情報を歪める、論理的に矛盾する内容を生成するなどの形で現れる可能性があります。幻覚はAIアプリケーションの信頼性に深刻な影響を与えます。

幻覚の根本原因

  • トレーニングデータのバイアス:トレーニングデータには誤った情報、古い情報、不完全な情報が含まれる可能性があります
  • 確率的生成の本質:LLMは本質的に次のトークンの確率を予測するものであり、「理解」しているわけではありません
  • 知識のカットオフ:モデルはトレーニング完了後に新しい情報を取得できません
  • 過度な一般化:モデルはトレーニングデータのパターンを、一致しないシナリオに過度に一般化します
  • コンテキストによる誤誘導:ユーザーのプロンプト内の誤った情報がモデルに採用される可能性があります

緩和戦略1:RAG拡張

RAGは幻覚を緩和する最も効果的な方法の1つであり、外部知識ベースを検索してモデルの出力を制約します:

def rag_verify_response(question, llm_response, vectorstore):
    """RAGを使用してモデルの回答の事実性を検証する"""
    # 1. 回答を事実の主張に分解する
    facts = extract_factual_claims(llm_response)

    verified_facts = []
    for fact in facts:
        # 2. 関連する証拠を検索する
        evidence = vectorstore.similarity_search(fact, k=3)

        # 3. LLMを使用して事実と証拠の整合性を検証する
        verification = verify_fact_with_evidence(fact, evidence)

        if verification["supported"]:
            verified_facts.append((fact, "supported", verification["source"]))
        else:
            verified_facts.append((fact, "unsupported", None))

    return verified_facts

緩和戦略2:自己整合性

複数回のサンプリングと投票により信頼性を向上させます:

def self_consistency_check(prompt, llm, n_samples=5):
    """複数回生成し、最も整合性の高い回答を見つける"""
    responses = []

    for _ in range(n_samples):
        response = llm.generate(
            prompt,
            temperature=0.7  # 多様性を高めるために高い温度を使用
        )
        responses.append(response)

    # 最も整合性の高い回答を見つける
    # 意味的類似性クラスタリングや投票を使用できる
    consensus = find_consensus(responses)

    if consensus["confidence"] < 0.6:
        return {
            "answer": "答えを確定できません",
            "confidence": consensus["confidence"]
        }

    return consensus

緩和戦略3:引用トレーサビリティ

モデルに各事実の主張に対して引用元を提供するよう要求します:

def request_citation_response(question, context_docs):
    prompt = f"""以下の参考資料に基づいて質問に答えてください。

参考資料:
{format_docs(context_docs)}

質問:{question}

要件:
1. 各事実の主張には引用元を明記すること(例:[1]、[2])
2. 参考資料に関連情報がない場合は、「参考資料に記載なし」と明記すること
3. 参考資料にない事実を捏造しないこと

回答してください:"""

    response = llm.generate(prompt)

    # 引用が実際に対応する事実を支持しているか検証する
    verified = verify_citations(response, context_docs)

    return verified

緩和戦略4:不確実性の定量化

モデルに自身の不確実性を表現させ、ユーザーが信頼性を判断するのに役立てます:

def uncertainty_aware_response(question):
    prompt = f"""以下の質問に答え、回答の確実性を評価してください。

質問:{question}

以下の形式で回答してください:
【確実性】高/中/低
【回答】回答内容
【不確実性の説明】不確実な場合は、その理由を説明してください

確実性が「低」の場合は、より正確な情報を得る方法をユーザーに提案してください。"""

    return llm.generate(prompt)

幻覚を検出する指標

  • 事実の整合性:回答内の事実が信頼できる情報源と一致しているか
  • 論理の整合性:回答内に論理的な矛盾がないか
  • 引用の正確性:明記された引用が実際に対応する事実を支持しているか
  • 拒否率:モデルが不確実な場合に回答を拒否するか
  • ユーザーフィードバック:回答の正確性に関するユーザーの評価を収集する

まとめ

幻覚は完全に排除することはできませんが、大幅に削減することは可能です。最善のプラクティスは、RAG + 引用トレーサビリティ + 不確実性の定量化の組み合わせ戦略です。高リスクのシナリオ(医療、金融など)では、人間によるレビューを導入することを推奨します。