2024年末時点でのRAG情報整理
本記事の目的
基本的な RAG の話は、2023年にLLMがブレークしてすぐに一般的なものとなった。
その後、 RAG の基本は変わっていないようでありつつ、 Graph RAG のような話題も出てきている。
現時点での RAG の最新情報を収集・整理し、2024年の1年間で RAG 周りの新たの情報(差分)を棚卸ししておく。
素敵なRAGの資料
ここによくまとまっている。
RAG の基本
AWS をベースにした話にはなっているが、ここ👇️で紹介されているスライドは RAG についてわかりやすくまとめられている。
上記👆️では、あくまでも以下のような「2023年以前の基本知識」をベースにして不足のない考え方をベースに説明されている
ナレッジとして蓄積したい情報をベクトルDBに事前に保存しておく
ナレッジに対して検索処理を行う
その結果に対してLLMでまとめさせる(一つのまとまった文章という形でアウトプットする)
※本記事では、基本の基本として、RAGは以下👇️のような仕組みであるものとする。
RAG = 質問 → 検索 → 生成 → 回答
ナレッジベース・ベクトルDBといった領域を構築するにあたって、AWSのサービスを用いる場合はどういった選択肢があるか、が上記では少し細かく説明されている。
下記👇️では、ナレッジベース(ベクトルDB)に対して検索処理を行う際の「検索クエリの生成」の手順なども含め、ハンズオンとして例示してくれている。
単純にナレッジベースに問い合わせのため文章を投げ込むのではなく、その問い合わせ内容文章から必要なキーワードを抽出・配列化してこれをナレッジベースに渡しているようである。
RAGはベクトルDB構築を前提としない
別にナレッジベースとしてベクトルDBを構築することはRAGの前提ではない。
Web上からキーワードで検索をかけたり、TeamsやSlackのような社内チャットに対して検索をかけてその結果を返してもいい。
という例を示してくれたのが下記👇️
下記👇️では、Difyのエージェント機能を用い、Wikipediaをキーワード検索したり、SerpAPIを用いてGoogle検索する形で、それらをナレッジとして用いて、最終的に回答を生成している。
RAGの分類
改めて本記事の本題。
最近は RAG と言ってもいろんな RAG がある、というか、「XXX RAG」みたいな用語がたくさんあってややこしい。いつの間にか RAG から取り残されているのでは、と不安になる。ので、棚卸しをする。
まずは3つ。下記👇️記事によれば、RAGは大きく3つに分類される
以下の3つの分類となる
Document RAG(ドキュメントRAG)
SQL RAG
Graph RAG
それぞれ、
Document RAG → ベクトルDBやWeb上の記事、チャットログ
SQL RAG → RDB
Graph RAG → グラフ DB
といった形でバックエンドに構えるDBが異なるデータ構造のものになっている。
ベクトル DB がベクトルで関連情報を紐づける一方で、グラフ DB はグラフ構造によって関連情報を紐づけている感じ。
SQL RAG は毛色が異なるというか、SQLを用いたデータ収集に際して「自然言語→SQL」の翻訳をLLMに頼っている、という感じ。
Document RAG
前述までの基本的な RAG。
SQL RAG
「プロンプトを下にLLMがSQLを生成→DBに対してクエリを実行・結果取得→その結果をLLMが処理」といった流れ。
Graph RAG
グラフ DB(Graph DB、ナレッジグラフ)をナレッジベースとして用いている。
次は複合技。
Hybrid RAG
ベクトルDB検索の弱点をナレッジグラフを用いた検索(GraphRAG)で補うハイブリッドなしくみ。
ここでいう弱点は以下のように例示されている
ニッチな用語の場合、単語間の距離をベクトルで適切に整理できない、ということかな?
文章を切り刻んだものをナレッジベースに保存しており、その切り刻まれた文章の断片を検索・取得しているので、文脈が捉えられないのは確かにそう。
手法は以下の通り説明されている。
(文書からナレッジグラフを構築するプロセスって普通にしんどいのでは…?)
Hybrid RAG を説明した前述の記事では、昨今のRAGへの期待と、それがDocument RAG のみでは解決が難しい天、 その対策として期待されている Graph RAG の課題感について言及したうえで、それらを解決する方法論の一つとして Hybrid RAG を説明している。
(個人的には、今後LLMの純粋な性能が向上して、一気に大量のテキストを高速にインプットできるようになり、そのうえで質問すればいい感じに回答してくれるようになる、と思っていたりする。
本当はファインチューニングでやりたい「専門知識の注入」なんかが、実はファインチューニングではうまくいかない現状がある。
少量のテキストを専門知識として注入するだけなら、インコンテキストラーニングでよく、大容量の場合はRAGに頼っている、という状況である。
RAGはLLMの成長の過程で一時的に必要になっている急場しのぎの対処法、という印象を持っている。ので本当はRAGに時間をかけたいと思わない。)
他にも、以下で Adaptive-RAG や Self-RAG という言葉が説明されている
ユーザーからの問い合わせ(プロンプト)に対して、まず「内容を分類する」といったステップを噛ませて後続処理を切り替える、というものである。専用のファインチューニングされたモデルを用いることを想定した記載ではありつつ、考え方は簡単に取り入れることは可能そう。
Adaptive-RAG
Self-RAG
より抽象的な包括的な用語として エージェンチック RAG という言葉のも最近はあるらしい。
エージェンティック RAG
RAG が持つ課題点を解決するための手法、らしい。
エージェンティック RAG のキーとなる要素は以下の通り。
メモリ機能、プランニング機能、外部ツールへのアクセス機能などによる高度な情報処理
「Thought(思考)」→「Action(行動)」→「Observation(観察)」の一連のプロセスを自己完結で実現
上記により、より正確で信頼性の高い回答を生成できるものを指す言葉らしい。
ざっくり、「最近のRAGでやってること」「Difyでやれるやつ」くらいのイメージ。
その他、RAGをまとめている記事
2024年を振り返りつつ、RAG・AIの今後をまとめてくれている記事
以上
表面的な用語や動向のまとめはある程度できたけど、 Graph RAG についてはもっと具体的なイメージを持てる必要がありそう。
「イメージできないものは実現できない」と一級魔法使いたちも言っている。
次の記事では Graph RAG を深堀って実際に手を動かして整理したいと思う。