幻覚を減らし、検索を改善するAgenticRAGの方法

Agentic RAGを使えば、クエリーの再構築、結果の精査、より大規模な言語モデルの活用により、幻覚の減少と検索精度の向上が可能です。RAGアプリケーションでより包括的で関連性の高い回答を引き出すことができます。

2025年2月14日

party-gif

Agentsを使ってRetrievalAugmentedGeneration(RAG)の力を引き出しましょう。クエリを分析し、検索を洗練し、より正確で包括的な回答を生成する知的エージェントを導入することで、RAGパイプラインを強化し、幻覚を減らす方法を発見してください。このブログ記事では、エージェント型RAGの実装に関する実践的なガイドを提供し、自然言語処理アプリケーションを向上させるためのツールを紹介します。

RAGにおける幻覚の修正方法

情報検索ステップは、ユーザーがどのように質問するかに大きく依存します。クエリが適切に定式化されていない場合、ユーザーが探しているの情報がナレッジベースにある場合でも、情報の検索が困難になる可能性があります。従来のRAGでは、単一の短い検索結果しか得られませんが、エージェントベースのRAGを使えば、これを修正できます。

エージェントベースのRAGがどのように役立つかを理解するために、従来のRAGの検索設定を見てみましょう。ユーザークエリは、ナレッジベースの中で最も関連性の高いチャンクを探すためのセマンティックベースの類似性検索を通過します。しかし、質問自体が適切な方法で行われていない場合はどうなるでしょうか? その場合、RAGパイプラインはほとんど幻覚を見始め、つまり答えを作り出し始めるか、LLMはユーザーに情報が見つからなかったと伝えるでしょう。ナレッジベースに実際に情報が存在している場合でも。

これを修正するには、RAGパイプラインにエージェントを導入し、初期クエリの分析だけでなく、RAGパイプラインによって生成された応答の分析も可能にすることです。通常の流れは以下のようになります:

  1. 初期クエリがエージェントに渡される。
  2. エージェントが初期クエリを書き換える。
  3. 洗練されたクエリがナレッジベースに渡され、セマンティックベースの類似性検索が実行されて、最も関連性の高い文書が検索される。
  4. 関連文書をLLMに渡す前に、エージェントがそれらの文書やチャンクを再度分析し、検索された文書では質問に答えられないと判断した場合はクエリを洗練する。
  5. 洗練されたクエリに基づいて、エージェントが満足するまでプロセスが繰り返される。
  6. 最終的なコンテキストがLLMに渡され、答えが生成される。

この場合、エージェントは計画、分析、実行を行い、RAGパイプラインにエージェントループを実装することができます。Crew AI、AutoGPT、LangChainのLangGraphなどのフレームワークを使用するなど、いくつかのオプションがあります。このビデオでは、Transformers Agentsという、Transformersパッケージ内の比較的知られていないフィーチャーを使用して、独自のエージェントを作成します。

アジェンティックなRAGパイプラインの構築

情報検索ステップは、ユーザーがどのように質問するかに大きく依存します。クエリが適切に定式化されていない場合、ユーザーが探しているの情報がナレッジベースにある場合でも、情報の検索が困難になる可能性があります。従来のRAGでは、単一の短い検索結果しか得られませんが、エージェントベースのRAGを使えば、これを修正できます。

エージェントベースのRAGがどのように役立つかを理解するために、従来のRAGの検索設定を見てみましょう。ユーザークエリは、ナレッジベースの中で最も関連性の高いチャンクを探すためのセマンティックベースの類似性検索を通過します。しかし、質問自体が適切な方法で行われていない場合はどうなるでしょうか? その場合、RAGパイプラインはほとんど幻覚を見始め、つまり答えを作り出し始めるか、LLMはユーザーに情報が見つからなかったと伝えるでしょう。ナレッジベースに実際に情報が存在している場合でも。

これを修正するには、RAGパイプラインにエージェントを導入し、初期クエリの分析だけでなく、RAGパイプラインによって生成された応答の分析も可能にすることです。通常の流れは以下のようになります:

  1. 初期クエリがエージェントに渡される。
  2. エージェントが初期クエリを書き換える。
  3. 洗練されたクエリがナレッジベースに渡され、セマンティックベースの類似性検索が実行されて、最も関連性の高い文書が検索される。
  4. 関連文書をLLMに渡す前に、エージェントがそれらの文書やチャンクを再度分析し、検索された文書では質問に答えられないと判断した場合はクエリを洗練する。
  5. 洗練されたクエリに基づいて、エージェントが満足するまでプロセスが繰り返される。
  6. 最終的なコンテキストがLLMに渡され、答えが生成される。

RAGパイプラインにエージェントループを実装するには、Crew AI、Auto、LangChainのLangGraphなどのフレームワークを使用するなど、いくつかのオプションがあります。今回は、Transformers Agentsという、Transformersパッケージ内の比較的知られていないフィーチャーを使用して、独自のエージェントを作成します。

まず、必要なパッケージ、includeingpandas、LangChain、LangChain Communityパッケージ、Sentence Transformerパッケージ、Transformersパッケージをインストールする必要があります。次に、必要なモジュールをインポートし、データを設定します。これには、文書をチャンクに分割し、埋め込みを作成することが含まれます。

その次に、エージェントが使用できる検索ツールを定義します。また、OpenAIエンジンを使用してLLMを設定します。

最後に、検索ツールとLLMにアクセスできるエージェントを作成し、エージェントの行動を指示するシステムプロンプトを設定します。そして、サンプル質問に対してエージェントループを実行し、標準のRAGパイプラインと結果を比較します。

エージェントベースのRAGアプローチにより、クエリの洗練と最も関連性の高い情報の検索が可能になるため、LLMからより質の高い応答を得ることができます。

リトリーバルツールの作成

エージェントベースのRAGパイプラインの検索ツールを作成するには、以下の構造を持つ RetrievalTool クラスを定義します:

class RetrievalTool:
    """Using semantic similarity, retrieves some documents from the knowledge base that have the closest embeddings to the input."""

    def __init__(self, vector_db):
        self.vector_db = vector_db

    def __call__(self, query: str) -> List[str]:
        """
        Retrieve up to 7 most similar chunks from the vector DB for the given query.
        
        Args:
            query (str): A query to perform retrieval on. This should be semantically close to the target documents.
        
        Returns:
            List[str]: A list of up to 7 most similar chunks from the vector DB.
        """
        results = self.vector_db.similarity_search(query, k=7)
        return [chunk.page_content for chunk in results]

RetrievalTool クラスは、ドキュメントの埋め込みを格納するベクトルストア (Faiss、Chroma、Pinecon など) を表す vector_db オブジェクトを入力として受け取ります。

__call__ メソッドは、query 文字列を入力として受け取り、ベクトルDBから最大7つの最も類似したチャンクのリストを返します。コサイン類似度に基づいて similarity_search メソッドを使用して、最も類似したチャンクを検索します。

この検索ツールは、エージェントがクエリを分析、洗練し、検索ツールに渡して、ナレッジベースから最も関連性の高いチャンクを取得するエージェントベースのRAGパイプラインの一部として使用できます。

言語モデルの統合

エージェントベースのRAGパイプラインにLLMを統合するには、エージェントとファイナルレスポンスの生成に使用するLLMを設定する必要があります。2つのオプションがあります:

  1. Hugging Face Engineの使用: これにより、Hugging Faceのサーバーレスアーキテクチャを通じて利用可能な様々なLLMのAPIエンドポイントを直接呼び出すことができます。Llama 38Bや70Bなどのモデルを使用できますが、通常はHugging Face Proのサブスクリプションが必要です。

  2. OpenAIの使用: この例では、OpenAIエンジンを使用します。プロセスは他のLLMを設定する場合にも適応できます。

OpenAIエンジンを設定するには、Transformer Agents LLMエンジンの message_rlegpt_generate_message_list 関数を使用する OpenAIEngine クラスを作成します。このクラスは、入力メッセージのクリーニングと、OpenAIのチャット補完エンドポイントを使用した応答の生成を処理します。

その次に、実際のエージェントを作成します。エージェントには、前に作成した検索ツール、使用するLLM (この場合は OpenAIEngine)、エージェントループを停止する前の最大反復回数にアクセスできます。

また、エージェントにシステムプロンプトを提供します。これは、ナレッジベースの情報を使ってユーザーの質問に包括的な答えを提供するようエージェントに指示します。プロンプトは、必要な情報が見つからない場合、エージェントにクエリを再試行するよう促します。

エージェントとLLMが設定できたら、ユーザーの質問に答えるためにエージェントループを実行できます。エージェントは、クエリを繰り返し洗練し、ナレッジベースから関連情報を検索し、LLMを使って最終的な応答を生成します。この方法により、標準のRAGパイプラインと比較して、より詳細で関連性の高い答えが得られます。

アジェンティックエージェントの実装

エージェントを実装するには、Transformersパッケージ内のTransformers Agentsフィーチャーを使用します。これにより、カスタムエージェントを作成するための、モジュール化された明確なアプローチが提供されます。

最初に、pandas、Langchain、Langchain Communityパッケージ、Sentence Transformers、Transformers Agentsなどの必要なパッケージをインストールする必要があります。

Next、必要なモジュールとパッケージをインポートします。ReactJsonAgentを使用し、エージェントのためのカスタムツールを構築し、言語モデルにはHugging Faceエンジンを活用します。

RAGパイプラインを構築するために、Hugging Faceのドキュメンテーションを含むデータセットから始めます。文書をチャンクに分割し、GTE-smallモデルを使って埋め込みを作成します。重複するチャンクを削除し、一意のチャンクをF-ベースのベクトルストアに保存します。

ここでエージェントを導入します。セマンティック類似性を使用して、ユーザークエリに基づいてナレッジベースから最も関連性の高いチャンクを検索する RetrievalTool を作成します。

また、OpenAIエンジンとGPT-4モデルを使ってLLMも設定します。

エージェントは、検索ツールとLLMにアクセスできるように作成されます。また、エージェントが問い合わせとリトリーブされたコンテキストを洗練するための最大反復回数も指定します。

エージェントには、ナレッジベースを使ってユーザーの質問に包括的な答えを提供するよう指示するシステムプロンプトが与えられます。エージェントは、クエリを繰り返し洗練し、より関連性の高い情報を検索するまで、反復プロセスを行います。

エージェントベースのRAGパイプラインは、標準のRAGパイプラインと比較されます。エージェントベースのアプローチにより、特にユーザーの初期クエリが適切に定式化されていない場合に、より詳細で関連性の高い答えが得られることが示されます。

標準的なRAGとアジェンティックRAGの比較

標準のRAGとエージェントベースのRAGの主な違いは以下の通りです:

  1. クエリの書き換え: 標準のRAGでは、ユーザークエリがそのままセマンティックベースの類似性検索に渡されます。一方、エージェントベースのRAGでは、エージェントが初期クエリを分析し、検索プロセスを改善するためにクエリを書き換えることができます。

  2. 反復的な洗練: エージェントベースのRAGでは、エージェントがクエ

FAQ