【RAG】Self-RAGの論文解説

# はじめに
OpenAIのGPT-4やMetaのLLaMAのような大規模言語モデル(LLM)を個別タスクに適応させる方法として、パラメータチューニングがあります。しかし、パラメータチューニングは至難の業です。大量のデータセットが必要だったり、高性能なGPUが必要だったり...と個人では到底不可能です。さらに、チューニングできたとしてもLLMが指示を聞いてくれなくなるなど、多くの壁に直面します。そこで、パラメータをチューニングする以外の方法としてRetrieval-Augmented Generation(RAG)があります。RAGは、LLMが持つ内部知識を補うために外部知識を活用するというフレームワークです。RAGでは外部知識を活用することにより、LLMでは答えることができなかった質問にも答えることができるようになります。
今回は、RAGの派生形であるSelf-RAGについて解説します。Self-RAGの原論文である[Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection](https://arxiv.org/abs/2310.11511)をベースに解説していきます。

![RAGの概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/17cdecf8-f038-f513-ef6a-279b9311155a.png)
<font color="#808080">*RAGの概要*</font>

# 目次
1. [論文解説](#論文解説)
    - [要約](#要約)
    - [モチベーション](#モチベーション)
    - [モデルのポイント](#モデルのポイント)
    - [手法](#手法)
    - [結果](#結果)
2. [まとめと所感](#まとめと所感)

# 論文解説
### 要約
LLMは内部知識のみに依存するため、事実誤認を含む応答をすることがよくあります。この問題を軽減する方法としてRAGが提案されています。しかし、検索の必要性や取得した文章の関連性にかかわらず、一定数の検索結果を無差別にプロンプトに組み込むことは、LLMの汎用性を損なったり、不適切な応答生成につながったりする可能性があります。
この研究では、新しいフレームワークである「Self-Reflective Retrieval-Augmented Generation（SELF-RAG）」を提案しています。Self-RAGのポイントは以下の4つです。
- On-Demand RetrievalとSelf-Reflectionを通じてLLMの応答の質と事実性を向上
- Reflection Tokensを用いて取得した文章の評価と生成した応答の評価を行う
- 検索頻度や引用頻度などをカスタマイズすることが可能
- 6つの全てタスクにおいて最先端のLLMや検索強化モデルを大幅に上回った


### モチベーション
最先端のLLMは、モデル規模やデータ規模が増加しているにも関わらず、依然として事実誤認に苦しんでおり、RAGを活用することでこの問題を軽減することができます。一方で、RAGには
- 無差別に検索結果を取得するため、LLMの汎用性を損なう
- 不要または無関係な文章を組み込んでしまい、応答の品質を低下させる
- 検索結果を明示的に利用するよう訓練されていないため、検索結果と一致しない出力が生成される

といった可能性があります。
そこで、これらの課題を解決するためにSelf-RAGを提案しています。

### モデルのポイント
1. 検索するか否かはLLMが判断します
1. Reflection Tokensには検索トークンと批評トークンの２種類あります。さらに批評トークンには検索結果の関連性を示すISREL、LLMで検索結果がどの程度使われたを示すISSUP、応答結果全体を評価するISUSEの３種類あります
1. 検索頻度や引用頻度などをカスタマイズすることが可能なため、LLMを制御できます

![Token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/a9df53ea-a129-04e6-f7eb-6e53474391fa.png)
<font color="#808080">*Akari Asai et al.(2023) Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection*</font>

### 手法
![手法概要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/89d0f4f2-b8e2-237f-8a8d-5a6cbe792ea2.png)
<font color="#808080">*Akari Asai et al.(2023) Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection*</font>

Self-RAGは次の3つのSTEPで行われます。
1. **オンデマンド検索：** 入力プロンプトと先行生成結果に基づき、検索を利用するかどうかを判断し、検索トークン(`yes`,`no`,`continue`)を生成します
1. **生成：** 検索しない場合、モデルは通常のLMと同様に次の出力セグメントを予測します。
検索した場合、
    1. 上位*K*件の文章を取得し、各文章に対して関連性を評価する批評トークン生成(`relevant`, `irrelevant`)
    1. 最も関連性のある文章を用いて応答セグメントの生成
    1. 関連性があった場合、応答セグメント内の情報が検索結果で使われているかを評価する批評トークン生成(`fully supporte`, `partially supported`, `no support`)

    の3つをこの順で生成します。
1. **批評：** 応答全体の有用性を5段階で評価する批評トークンを生成します

![Algorithm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/3a0a941a-f96b-ee8d-1cb2-91a5015fc818.png)
<font color="#808080">*Akari Asai et al.(2023) Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection*</font>


また、Self-RAGではReflection Tokensを使用するため、推論段階での制御が可能となり、多様なタスク要件に応じて挙動を調整できます。この研究では、推論プロセス中に異なる目標を達成するための制御手法としては2つ紹介されていました。

##### 閾値を用いた適応的検索
Self-RAGでは検索結果を取得するタイミングを動的に決定します。具体的には、「Retrieve=Yes」トークンがすべての出力トークンにおける正規化確率を超える場合、取得が実行されます。したがって、事実性が重要視されるタスクではこの閾値を低く設定し、創造性が重要視されるタスクでは、この閾値を高く設定することで、検索頻度を調整することが可能となります。

##### 批評トークンを用いたTree-decoding
各Reflection Tokensの生成確率に関わるパラメータ(重み)を変えることで、多様なタスク要件に応じた挙動を調整することが可能になります。具体的には、以下のように行います。
まず、セグメント$y_t$のスコアは以下の式で計算されます。

```math
\displaylines{
f(y_t, d, Critique) = p(y_t|x, d, y < t) + S(Critique),\quad where\\
S(Critique) = \sum_{G \in \mathcal{G}} w^G{s_t}^G \quad for \quad \mathcal{G} = \lbrace ISREL, ISSUP, ISUSE \rbrace
}
```
このとき、${s_t}^G$は各批評トークンタイプ$G$における最も望ましいReflection Tokensの生成確率を表し、$w^G$はその重みです。また、$w^G$は推論時にカスタマイズ可能なハイパーパラメータです。したがって、結果$y$が証拠に基づくようにするためには、`ISSUP`に対する重みを高く設定し、他の側面の重みを相対的に低くすることで実現できます。一方、不適切な批評トークン(例: `ISSUP = No support`)が生成された場合、そのセグメントを明示的に除外するようなハード制約を適用することも可能です。

# 結果
### 実験設定
- モデル
    - 生成モデルはLlama2 7Bおよび13Bを使用
    - 批評モデルはLlama2 7Bを使用
    - 検索モデルにはContriever-MS MARCOを使用し、各入力につき最大10文書を取得
- パラメータ設定
    - 重み付け項ISREL、ISSUP、ISUSEの値をそれぞれ1.0、1.0、0.5に設定
    - 検索閾値を0.2に設定し、ALCEでは引用要件のために0に設定
    - セグメントレベルごとにビーム幅2を採用し、トークンレベル生成には貪欲デコーディングを使用
### タスク
SelfーRAGと多様なベースラインモデルを全体的な正確性、事実性、流暢さについてゼロショットで評価していました。
- **クローズドセットタスク：** PubHealth(公衆衛生に関する事実検証データセット)、(ARC-Challenge(科学試験から作成された選択問題のデータセット)
- **短文生成タスク：** PopQA(WikidataエンティティID、Wikipediaページビュー、関係タイプ情報を含むデータセット)、TriviaQA-unfiltered(一般的なトリビアに基づいた質問のデータセット)
- **長文生成タスク：** 伝記生成に関するデータセット、ALCE-ASQA(Wikipediaをもとにした引用評価用のデータセット)
### 評価
![結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/749a3f28-e02d-dcfc-cf10-346ef4e0ec8a.png)
<font color="#808080">*Akari Asai et al.(2023) Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection*</font>
##### 検索を伴わないベースラインとの比較
- すべてのタスクで大幅に上回る性能を示し、PubHealth、PopQA、伝記生成、およびASQA（RougeとMAUVEの指標）ではChatGPTさえも上回った

##### 検索依存のベースラインとの比較
- 既存のRAGを多くのタスクで上回り、すべてのタスクにおいて非独占的なLLMの中で最高の性能を達成しました(ASQAの完全一致率(em)以外？)
- PopQAや伝記生成では、指示調整型LLM（例: Llama2-chat、Alpaca）は検索を伴わない場合と比較して大幅に向上しました
- しかし、指示調整型LLMは、取得した文章の部分文字列を単純にコピーまたは抽出できないタスクには限定的な解決策しか提供できないことが分かりました
- PubHealthやARC-Challengeでは、検索を伴うベースラインは検索を伴わない場合と比較して性能の向上が見られませんでした
- 検索を伴うベースラインの多くが引用精度の向上に苦労していることが観察されました


![Ablation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967909/e0f5af77-0b8f-bebd-f95d-5450ad314f3b.png)
<font color="#808080">*Akari Asai et al.(2023) Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection*</font>

##### アブレーション結果
PopQA、PubHealth、およびASQAの3つのデータセットで実施しています。
- SELF-RAGと「No Retriever」「No Critic」の間には大きな性能差があり、これらのモデルでLLMを訓練することが性能向上に大きく寄与していることが示されました
- 関連性に関係なく、top 1を使用する(Retrieve top 1)場合、PopQAとASQAで性能低下が見られました
- ビームサーチ中にISSUPを除外する(Remove ISSUP)場合はASQAの性能を悪化させました

つまり、関連性のみやLLMが検索結果を支持しているかのみに依存するのではなく、複数の基準に基づいて生成することが精度向上には重要であることが示唆されています。

##### ハイパーパラメータのカスタマイズ
ISSUPと検索の閾値を変化させたときの精度を検証しています。
- ISSUPの重みを増加させると、モデル生成が証拠によって支持されているかどうかにより重点が置かれるため、引用精度が向上しました。一方で、生成が長く流暢になると、引用で完全には支持されない主張が増えてしまいMAUVEスコアが低下しました
- 検索閾値が大きくする(頻度を減らす)につれてモデルの取得頻度がPubHealthおよびPopQAで劇的に変化しました。一方で、取得頻度を減らした際の性能低下は、PubHealthでは小さく、PopQAでは大きいことがわかりました

# まとめと所感
この研究では、RAGの課題であった「無差別に検索結果を取得し、LLMの汎用性を損なう」「不要または無関係な文章を組み込んでしまう」「検索結果と一致しない出力が生成される」に対処するため、 **検索精度の向上** と **生成結果の評価** の仕組みを取り入れました。具体的には、検索精度では「検索の必要性の検討」「検索結果の関連性」を評価の仕組みを導入して精度向上を実現しました。生成結果の評価では「LLMが検索結果を支持したか」「応答全体の有用性」を評価する仕組みを導入して精度向上を実現しました。また、アブレーションスタディを通じて、これらすべての要素が十分機能していることが示されました。(ISUSEの評価はされてなさそうだが...)

Self-RAGはRAGの事実性を向上させることで回答精度を向上させていました。そのため、外部知識にかなり依存しているように感じています。LLMへのプロンプトを工夫するなどして内部知識を上手に引き出す方法を模索すれば更なる精度向上が期待できそうです。ただ、外部知識を活用し引用先を明確にすることは、医療分野のような正確性が問われる分野では有効な手段であるため、このフレームワークは非常に有用なものだと感じています。また、RAG界隈でみるとデータベース構築方法や検索方法からのアプローチも見られるため、今後はそれらについても理解を深めようと思います。

# 参考文献
- [Akari Asai and Zeqiu Wu and Yizhong Wang and Avirup Sil and Hannaneh Hajishirzi. Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection. 2023](https://arxiv.org/abs/2310.11511)