Self-RAGは最近非常に話題となっている最新RAG技術です。
日本語で調べるとなかなか相関記事がないので、今日はSelf-RAGの中身を共有したいと思います。
特徴としては、モデルがRAGする前に、RAGの必要性を判断してからRAGする/しないということです。
RAGをよく使うと気づくと思いますが、2つ大きな問題点があります。
一つはどんな質問に対しても強制的に検索することです。
極端的な例でいうと、例えば「こんにちは」とか非常にシンプルな内容をモデルに投げても、モデルが「こんにちは」をvectorstoreで検索していくつかの情報を持ってくるですね。
それらの情報を「こんにちは」と合わせてモデルに再inputすると、「こんにちは」すらもうまく回答できない時もあります。
もう一つはRAGで検索してきた情報はモデルのoutputに有益かどうかがわからないことです。
RAGで返した内容は、モデルのoutputに本当に有益なのか中身見れないので、実はoutputの生成に全然役に立たない、むしろoutputの質を悪くなってしまう可能性もあると思います。
Self-RAGは⇧の2つ問題点をある程度解決できてます。
コアになっているのは、RAGを評価するための小さなモデルC(Critic model)をトレニンーグしました。(chatgpt4を使って)
そのモデルをRAGとLLMの間に内装します。
イメージとしは:Vectorstore-Critic model-LLMみたいな感じです。
まずCはすべてのdecoderに対して、検索マークを付けて、RAGが必要かどうかを判断します。
RAGが必要ではないと判断した場合は、RAGなしでモデルがそのまま回答をoutputします。
RAGが必要と判断した場合は、複数個のRAG結果を並行で探して、それぞれプロンプトと合わせてLLMに渡します。
それでLLMが複数個の回答をoutputしますので、その中から一番良いRAG結果を決めて、最終的なoutputはこれにします。
Self-RAGを提出した方はSelfRAGでトレニンーグしたllama2もhuggingfaceに公開しています。
私も試して見たですが、処理時間が少し長くなったですが、RAGの精度が高くなったことは実感できます。
SelfRAG-llama-7bにつて:
github:
論文: