😎

RAGの系譜について - サーベイ論文を読んで -

に公開

AI Agent流行ってますね。機械学習系のプロジェクトを推進している間に世の中がかなり進んでしまっていて、置いていかれそうなので慌ててキャッチアップしてます。
本記事は、RAGのサーベイ論文を読んだ備忘録です。この論文のまとめ記事は色々ありそうなんですが...自分でもちゃんと読んでおくかっていう...ね。
まずはどういう流れでRAGが提案されているかの流れを掴んでおきたいので、その部分をまとめました。

読んだ論文

https://arxiv.org/abs/2312.10997

RAGとは

LLMを使う上で避けて通れないのがハルシネーションの問題で、ハルシネーションの中でもLLMのPre-training時点で得られなかった知識に関する間違いを解決するための手法です。ユーザのプロンプトをLLMに入力する前に外部データソースからプロンプトに関連のデータを取得して入力に付与することで実現されます。

論文Fig.2よりRAGの典型的なアプリケーション例

また、RAGはRetrieval, Generation, Augmentationの3つのステージで構成されると書かれています。論文の章立てもこの通りになってます。

RAGの系譜

RAGはNaive RAG -> Advanced RAG -> Modular RAGと進化を遂げていると書かれています。基本的にはNaive RAGで明らかになった課題を解決するために様々な研究がなされており、それをAdvanced RAGとModular RAGにまとめているようでした。


3つのRAGの図

Naive RAG

Naive RAGは基本的なRAGの流れが説明されていました。図の通りですが、予めのドキュメントなどの外部データソースをIndexingして保管しているデータソースから、ユーザのクエリを基にRetrievalして、ユーザのクエリとRetrievalした情報からLLMにGenerationさせる。

課題

論文ではNaive RAGの課題を3つに分類しています。

  1. Retrievalフェーズの精度(Precision/Recall)の問題
  2. 生成時にRetrievalしたコンテキストをサポートしない回答を生成する問題
  3. 複数のデータソースからコンテキストを取得した際に一貫性のない回答を生成する問題

Advanced RAG

Advanced RAGはRetrievalの性能を高める工夫がなされています。図ではRetreivalの前と後にPre-retrievalとPost-retrievalが追加されています。

Pre-retrieval

Pre-retrievalは、Indexing構造とオリジナルのクエリを最適化する手法です。(Indexing構造の最適化はUser Queryから矢印が出てるプロセスではないのでは?というツッコミはありますが...笑)
Indexing構造の最適化はSliding Window導入など、ドキュメントなどの外部データソースをどのようにチャンク化するかという話になります。
オリジナルのクエリの最適化は、ユーザのクエリをRetrievalに適した形式に加工する手法のことを指しており、Query rewriting, Query transformation, Query expansionなどの手法があるそうです。

Post-retrieval

Post-retrievalは、Retrievalされた関連コンテキストをクエリにどのように組み込むかの工夫になります。主な手法はRerank chunksやContext compresingになります。Re-rankingのコンセプトはLlamaIndexやLangChainなどのフレームワークで採用されています。

Modular RAG

最後にModular RAGなんですが、Modularと書かれている通り、色々な機能をモジュール化して、それらを組み合わせてRAGの性能を上げようというアプローチになります。RAGを実現するために必要な機能としては変わっていないが、より精度を上げるために新しいモジュールの導入(New Modules)や新しいパターン(New Patterns)が提案されているというまとめ方がされています。

New Modules

新しいモジュールとして

  1. Search module
    サーチエンジンなどで検索するモジュール
  2. RAG Fuse
    マルチクエリ戦略など、クエリを多様化させる方法
  3. Memory module
    LLMのメモリを利用するモジュール
  4. Routing module
    複数のデータソースのうちどれを使って、どのように加工していくかを決めるモジュール
  5. Predict module
    RetrievalするコンテキストをLLMに生成させるモジュール
  6. Task adapter module
    後続タスクに合うように加工するモジュール

が紹介されています。

New Patterns

NaiveとAdvanced RAGではRetrieve and Readパターンだったが、Modular RAGではこのパターンも様々なパターンが提案されています。

  1. Rewrite-Retrieve-Read
    クエリをLLMでRewriteしてからRetrieve-Readするパターン
  2. Generate-Read
    情報ソースをRetrieveするのではなく、LLMがコンテキストをGenerateするパターン
  3. Recite-Read
    LLM自身のメモリからコンテキストをRetrievalするパターン。
  4. Demonstrate-Search-Predict(DSP)
    モジュールを組み合わせたパターン
  5. iterative Retrieve-Read-Retrieve-Read
    Retrieve-Readを繰り返すパターン

最後に

あらためて、数年でほんとにものすごい数の研究論文が発表されていると驚きました。2024年の論文なので、そこからさらに研究が進んでいるに違いないと思います。ちらっと見た記事だとAgentic RAGとかが出てきてるみたいですね。(Routing moduleがAgentなだけなのではと思ったり)
今回は大枠でしたが、Retrieval, Generation, Augmentationのステージごとの手法や評価方法などもまとめられてるので、そのあたりも読んでみようと思います。

Discussion