RAGの系譜について - サーベイ論文を読んで -
AI Agent流行ってますね。機械学習系のプロジェクトを推進している間に世の中がかなり進んでしまっていて、置いていかれそうなので慌ててキャッチアップしてます。
本記事は、RAGのサーベイ論文を読んだ備忘録です。この論文のまとめ記事は色々ありそうなんですが...自分でもちゃんと読んでおくかっていう...ね。
まずはどういう流れでRAGが提案されているかの流れを掴んでおきたいので、その部分をまとめました。
読んだ論文
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つに分類しています。
- Retrievalフェーズの精度(Precision/Recall)の問題
- 生成時にRetrievalしたコンテキストをサポートしない回答を生成する問題
- 複数のデータソースからコンテキストを取得した際に一貫性のない回答を生成する問題
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
新しいモジュールとして
- Search module
サーチエンジンなどで検索するモジュール - RAG Fuse
マルチクエリ戦略など、クエリを多様化させる方法 - Memory module
LLMのメモリを利用するモジュール - Routing module
複数のデータソースのうちどれを使って、どのように加工していくかを決めるモジュール - Predict module
RetrievalするコンテキストをLLMに生成させるモジュール - Task adapter module
後続タスクに合うように加工するモジュール
が紹介されています。
New Patterns
NaiveとAdvanced RAGではRetrieve and Readパターンだったが、Modular RAGではこのパターンも様々なパターンが提案されています。
- Rewrite-Retrieve-Read
クエリをLLMでRewriteしてからRetrieve-Readするパターン - Generate-Read
情報ソースをRetrieveするのではなく、LLMがコンテキストをGenerateするパターン - Recite-Read
LLM自身のメモリからコンテキストをRetrievalするパターン。 - Demonstrate-Search-Predict(DSP)
モジュールを組み合わせたパターン - iterative Retrieve-Read-Retrieve-Read
Retrieve-Readを繰り返すパターン
最後に
あらためて、数年でほんとにものすごい数の研究論文が発表されていると驚きました。2024年の論文なので、そこからさらに研究が進んでいるに違いないと思います。ちらっと見た記事だとAgentic RAGとかが出てきてるみたいですね。(Routing moduleがAgentなだけなのではと思ったり)
今回は大枠でしたが、Retrieval, Generation, Augmentationのステージごとの手法や評価方法などもまとめられてるので、そのあたりも読んでみようと思います。
Discussion