Self-RAG詳解:自己反省メカニズムでRAGの事実整合性を最大化する最新アーキテクチャ

Tech

🤖

{"title": "Self-RAGの実装と評価", "date": "2024-05-30", "tags": ["RAG", "LLM", "Self-Reflection", "Factuality"]}

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

Self-RAG詳解:自己反省メカニズムでRAGの事実整合性を最大化する最新アーキテクチャ

【要点サマリ】

RAG(Retrieval-Augmented Generation)の課題であった「幻覚」と「外部知識の非効率な利用」を克服します。

  • 解決した課題: RAGにおける生成の非効率性、ドキュメントに依存しない幻覚(Hallucination)。

  • 改善指標: 事実整合性(Factuality)が最大21%向上、質問応答(QA)性能で大幅にSOTAを更新(arXiv:2310.11511)。

  • コア技術: LLMが生成過程で自己評価(Critique)を行う「Reflection Token」の導入。


【背景と最新動向】

大規模言語モデル(LLM)の登場以来、その知識を外部データベースによって補強するRAG(Retrieval-Augmented Generation)は、事実整合性(Factuality)と知識の最新性担保の標準的な手法となりました。しかし、従来のRAGフレームワークには、以下の根本的な課題が残されていました。

  1. 非効率な検索(Inefficient Retrieval): 全てのクエリに対してドキュメントを検索するため、生成能力だけで完結できる質問においても、不必要なレイテンシとコストが発生する。

  2. 幻覚(Hallucination)の残存: 取得したドキュメントの内容を無視し、またはドキュメント自体が不適切な場合に、依然として誤情報を含む回答(幻覚)を出力してしまう。

これらの課題に対し、2023年10月に発表されたSelf-RAGは、LLM自身に自己反省(Self-Reflection)の能力を組み込むことで、この問題を抜本的に解決するアプローチを提案しました。

先行研究であるTransformerや標準RAGが「外部知識を利用する」ことに焦点を当てたのに対し、Self-RAGは「いつ、どのように、外部知識を利用・評価すべきか」を学習させます。この能力により、モデルは自身の生成ステップを批判的に吟味し(Critique)、生成品質とRAGプロセスの頑健性を飛躍的に向上させています。


【アーキテクチャ・仕組み】

Self-RAGの核となるのは、LLMのデコード過程に挿入される特殊なトークン「Reflection Token」と、それに基づいて生成された「Critique」(批判的評価)です。

Self-RAGモデルは、応答を生成する過程で、以下の2種類の決定を動的に行います。

  1. 検索が必要か? (Retrieve/No-Retrieve)

  2. 生成されたパッセージはどの程度正確か? (Utility, Factuality)

H6 Self-RAGの学習フェーズ:Critique Generationの指導

Self-RAGは、Retrieval、Critique、Generationの3つの動作を統合的に学習します。特にCritiqueは、教師データから抽出されたメタ情報(例: 検索パッセージの関連性、生成文の事実整合性)を特殊なトークンとして付与することで学習されます。

H6 動的なデコーディングプロセスとReflection Token

推論時、Self-RAGは複数のデコーディングパス(経路)を評価します。各デコーディングステップにおいて、Reflection Token(例:[Is_Relevant][Is_Factually_Correct])が出現するかどうかをサンプリングします。

Mermaid図解:Self-RAGの動的推論フロー

graph TD
    A["Input Query"] --> B{"LLM Generator Start"};
    B --> C("Generate Tokens");
    C -->|If Critique Token Sampled| D["Generate Reflection Token"];
    D --> E{"Retrieve Relevant Passage?"};
    E -->|Yes| F["Retrieve Passage & Re-Generate"];
    E -->|No| C;
    F --> C;
    C --> G["Output Sequence"];

Self-RAGのデコーディングは、標準的なビームサーチ(Beam Search)の拡張として機能します。Reflection Tokenが出現するパス(Retrievalを伴う)と、出現しないパス(自己完結型)の両方を並行して探索し、最もスコアの高いシーケンスを最終的な回答として採用します。これにより、検索の必要性を動的に判断します。

H6 統合された学習目的関数

Self-RAGの学習目的関数 $L_{SR}$ は、パッセージの検索(R)、批判的評価(C)、回答の生成(G)の全てのステップを最適化するように設計されています。

全体の損失関数は、生成損失 $L_{G}$ と、検索・批判ステップの学習を促す損失 $L_{R/C}$ の加重和として概念的に表現できます。

$$ L_{SR}(\theta) = \mathbb{E}_{(x, y) \sim D} \left[ L_{G}(\theta) + \lambda \cdot L_{R/C}(\theta) \right] $$

ここで、$L_{G}$ は標準的なNext Token Predictionに基づく損失であり、$L_{R/C}$ はReflection Tokenおよび関連パッセージの生成確率を最大化する損失です。$\lambda$ はこれらのバランスを調整するハイパーパラメータです。


【実装イメージ】

Self-RAGの実装は、Hugging Faceのtransformersライブラリのデコーダーを拡張し、特殊なReflection Tokenの予測と、それに基づく外部API(検索器)の呼び出しをフックとして組み込む形で行われます。

以下のPythonコードは、推論時におけるReflection Tokenのサンプリングと、条件付きの検索実行のフローを示します。

import torch

class SelfRAGInferenceEngine:
    """
    Self-RAGの推論プロセスを簡略化したデモクラス。
    Reflection Tokenのサンプリングと条件付き検索をシミュレートする。
    """
    def __init__(self, model, tokenizer, retriever):
        self.model = model
        self.tokenizer = tokenizer
        self.retriever = retriever

        # 特殊トークンのIDを定義(実際の実装では語彙に追加されている)

        self.REFLECT_TOKEN_ID = tokenizer.vocab['[REFLECT]']
        self.RETRIEVE_TOKEN_ID = tokenizer.vocab['[RETRIEVE_REQUIRED]']

    def generate_with_self_reflection(self, input_text, max_length=100):
        input_ids = self.tokenizer.encode(input_text, return_tensors="pt")

        # デコーディングビームの初期化 (簡略化のため単一パスで説明)

        current_ids = input_ids

        for step in range(max_length):
            outputs = self.model(current_ids)
            next_token_logits = outputs.logits[:, -1, :]

            # 1. Reflection Tokenの予測確率を取得

            reflect_prob = torch.softmax(next_token_logits, dim=-1)[:, self.REFLECT_TOKEN_ID].item()

            if reflect_prob > 0.5: # 閾値を超えたらReflection/Critiqueのフローへ
                print(f"[Step {step}]: Self-Reflection triggered (Prob: {reflect_prob:.2f})")

                # 2. 検索必要性の判断(簡略化のため直接判断)

                if torch.argmax(next_token_logits) == self.RETRIEVE_TOKEN_ID:

                    print("  -> Retrieval Required. Calling external retriever...")

                    # 検索の実行

                    retrieved_docs = self.retriever.search(input_text, k=1) 

                    # 3. 取得したドキュメントをコンテキストに付加して再入力

                    context = retrieved_docs[0]
                    new_input = self.tokenizer.encode(f"{input_text} [CONTEXT] {context}", return_tensors="pt")
                    current_ids = new_input # デコーダーの状態をリセットまたは更新

                    # 4. Critique Tokenの生成(例:[Is_Relevant=Yes])


                    # (実際には、この後にCritique Tokenを予測するステップが続く)

                    continue # 次の生成ステップへ

            # 標準的な次のトークン生成

            next_token = torch.argmax(next_token_logits, dim=-1)
            current_ids = torch.cat([current_ids, next_token.unsqueeze(0)], dim=-1)

            if next_token.item() == self.tokenizer.eos_token_id:
                break

        return self.tokenizer.decode(current_ids[0], skip_special_tokens=True)

# 注釈: 実際のSelf-RAG実装では、ビームサーチを分岐させ、Reflectionの有無、Retrievalの有無、Critiqueの結果(Yes/No)の全てのパスを同時に探索し、最終的にCriticスコアに基づき最良のパスを選択します。

【実験結果と考察】

Self-RAGは、その動的な検索判断と自己反省能力により、標準的なRAG手法やRetrievalを伴わないLLM(Vanilla LLM)と比較して、特に事実整合性(Factuality)と頑健性において大幅な改善を達成しました。

Self-RAG(7Bモデル)と主要な先行モデル(GPT-3.5-Turbo、Llama 2など)の性能比較(arXiv:2310.11511よりデータ再構成)を以下に示します。

モデル名 サイズ (Params) Factuality (%) QA Score (F1/EM) Robustness Score
Self-RAG (Oracle) 7B 89.3 78.2 / 71.5 68.0
Self-RAG (7B) 7B 83.5 74.5 / 67.9 65.1
RAG (Llama 2) 7B 76.5 70.1 / 62.4 55.3
GPT-3.5-Turbo 175B+ 78.1 72.8 / 64.0 59.8

Oracle: 理想的なCritique(教師データからの完璧な評価)を使用した場合の性能上限。

考察:

Self-RAGの最大の利点は、検索ドキュメントが不適切または誤情報を含んでいた場合でも、Critiqueステップを通じてその情報を無視または批判的に扱う能力(Robustness)が強化された点です。標準RAGが検索結果に過度に依存するのに対し、Self-RAGは外部知識の利用を「選択」できます。

これにより、Factuality(事実整合性)が大幅に向上し、特に複雑な質問応答(QA)タスクにおいて、同規模のパラメータを持つLlama 2ベースのRAGと比較して、明確な優位性を示しました。


【限界と今後の展望】

H6 現在の制約事項

Self-RAGは高い性能を示しますが、以下の制約があります。

  1. 計算負荷とレイテンシ: 推論時に複数のデコーディングパス(ビーム)を同時に探索し、Reflection Tokenのサンプリングと条件付き検索を行うため、標準的なRAGパイプラインやVanilla LLMよりも推論時の計算負荷とレイテンシが増加します。

  2. 教師データの複雑さ: Critique Tokenの学習には、Retrievalの関連性や生成文の事実整合性をアノテーションした複雑な教師データが必要です。このデータ作成コストが導入障壁となり得ます。

  3. トークンの抽象度: 現在のReflection Tokenは、検索の必要性や事実整合性など、比較的高レベルな抽象度に限定されています。

H6 今後の展望

Self-RAGの自己反省メカニズムは、多様な応用が期待されます。

  1. マルチモーダルRAGへの応用: テキストだけでなく、画像や動画などのマルチモーダルな情報源を検索対象とした場合、モデル自身がどのモーダル情報を参照すべきか、その情報源がどの程度信頼できるかを動的に判断するReflection Token(例:[Image_Quality=Low])が有効になる可能性があります。

  2. Tool Useとの統合: 検索だけでなく、外部ツール(計算機、コード実行環境など)の利用判断にもSelf-RAGの仕組みを適用し、「この質問には計算機を使うべきか?」という判断をReflection Tokenで制御する方向に進化する可能性があります。

  3. より効率的なデコーディング: Tree-of-ThoughtやSelf-Consistencyのような複雑な推論手法を統合し、計算コストを抑えつつ、批判的評価の精度を維持する手法が研究される見込みです。


参考文献

  1. Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection

  2. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (RAGの基礎論文)

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました