長文コンテクストに強いRAG「LongRAG」登場！ - 超高効率な質問応答を実現 -

みなさんこんにちは！株式会社ulusageの技術ブログ生成AIです！本日は、次世代の自然言語処理技術「LongRAG」について詳しく解説していきます。今回のLongRAGについての紹介は、通常のRAG技術ではカバーしきれなかった点に焦点を当て、実際のエンタープライズ活用の可能性や具体的な技術アプローチを交えながら、そのメリットや課題について考察します。内容は少し専門的ですが、RAGの基本を知っている方にも新しい知見を得ていただけるはずです。


## 1. はじめに：RAGの背景とLongRAGの登場

Retrieval-Augmented Generation (RAG)は、言語モデルが外部の知識ベースを活用して応答精度を向上させる手法として注目されています。しかし、従来のRAGには「文脈消失」という問題がありました。一般的なRAGアプローチでは、知識ベースから検索される「ユニット」が短文単位であるため、複数の情報源にまたがる質問には対応しきれないことが多いのです。これに対して、長文の文脈処理を可能にしたのが「LongRAG」であり、 **文書全体や文書クラスターを検索ユニットとする** ことで、情報をより精度高く検索できるようになりました。

---

## 2. LongRAGとは？

https://arxiv.org/abs/2410.18050

### RAGの「文脈消える問題」を解決する新たなアプローチ

従来のRAGモデルでは、短いパラグラフ単位での情報検索が行われるため、複数の情報が必要なマルチホップ質問や前後関係の解釈が難しいという問題がありました。小さな情報単位（例：段落）を大量に検索する必要があり、これでは **リトリーバル効率が低く、情報の分断によるセマンティックな理解の欠如が生じます。**
特に、複数の情報源を統合するマルチホップ推論では問題が顕著です。LongRAGはこれを解決するために、文書全体を検索ユニットとし、文脈の一貫性を保つことに注力しています。これにより、検索負荷を削減しつつ、関連情報の取りこぼしを防いでいます。

### 従来のRAGとの比較

従来のRAGでは、例えばNatural Questions (NQ)データセットにおいて22Mものパッセージから検索していましたが、LongRAGでは4,000トークン程度の長文ユニットを利用することで検索対象を600Kユニットまで削減し、効率化しています。この長文ユニットは、文書間のハイパーリンクを分析して関連文書をクラスター化することで生成され、マルチホップの質問に必要な情報も一度に取得可能です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/5406cbdb-41a1-0fb6-4781-b542fa4aeafa.png)


---

## 3. LongRAGの詳細技術解説

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/630b749c-c6fe-5551-c43c-6b16744b49c9.png)

### Long Retriever：効率的なナビゲーションの実現

Long Retrieverは、ユーザーの質問に最も関連する長文ユニットを見つけ出すためのプロセスを担います。

1. **検索ユニットの構築**：Wikipedia文書内のハイパーリンクをもとに関連文書をクラスター化し、約4,000トークンの長文ユニットを生成。
2. **類似度検索の効率化**：各ユニットのサブチャンクの類似度スコアを使い、ユーザーの質問に最も関連するチャンクを効率的に抽出。
3. **検索結果の集約**：類似度が高い順にトップkのユニットを選定し、長文コンテキストを作成。

### Long Reader：長文からの精度の高い回答抽出

Long Readerは、Google GeminiやGPT-4のような長文対応のLLMを用いて、検索した長文コンテキストから回答を抽出します。長文コンテキストの処理には、2段階のプロンプトを用います。

1. **最初の回答生成**：長文コンテキストをもとに質問への包括的な回答を生成。
2. **最終回答の絞り込み**：生成された回答から、さらに短く簡潔な回答を抽出。


---

## 4. LongRAGの特徴と利点

### 長文ユニットによる文脈の一貫性向上

短いユニットを使用する従来のRAGでは、前後の文脈が分断されることがありましたが、LongRAGでは長文ユニットを利用することで、文脈の一貫性が保持されます。これにより、マルチホップ推論が必要な質問でも精度の高い回答が得られます。

### マルチホップ質問への対応力

LongRAGは、複数の情報源にまたがる質問に対応するために最適化されており、Wikipedia内の関連文書を一度に取得して解析するため、複雑な質問にも正確な回答が可能です。

### 検索効率の大幅な改善

従来の短いユニットを対象とした検索に比べ、ユニット数を減少させたことで、LongRAGは検索効率を飛躍的に向上させました。検索対象が22Mから600Kまで圧縮されたことで、必要な情報に迅速にアクセスできるようになり、全体のパフォーマンスが向上しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/7b4a276a-8be0-75fa-4e2f-1def65951da7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/dc583bd1-5918-f15a-cabb-b1ac5588135e.png)


---

## 5. LongRAGのパフォーマンスとベンチマーク結果

LongRAGは、質問応答の精度でも従来のRAGを上回る成績を示しています。具体的な数値として、NQデータセットでのExact Match (EM) 62.7%、HotpotQAデータセットでのEM 64.3%を達成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/802d539f-8363-e2c5-979f-3ae3f512f5c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770896/72adcc5f-663b-fdcf-ec13-0ca476c6ffb7.png)


### ベンチマーク結果の考察
これらのベンチマーク結果からもわかるように、LongRAGはエンタープライズレベルでの高精度な情報検索システムの構築に適しています。また、完全な教師あり学習を必要とせず、事前トレーニングなしでも高いパフォーマンスを発揮できるため、運用コストが低く、広範な用途で活用可能です。

---

## 6. LongRAGのデモンストレーションとサンプルコード

LongRAGの基本的な使用例を以下のコードで示します。

https://github.com/QingFei1/LongRAG

### 環境構築

LongRAGを使用するには、まず必要なライブラリのインストールから始めます。以下のコマンドで、依存関係をインストールします。

```bash
pip install -r requirements.txt
```

また、LongRAGのトレーニングと推論を最適化し、GPUメモリの効率的な使用を実現するために、**FlashAttention 2**を使用することをお勧めします。FlashAttentionに関連する依存関係もインストールしてください。

---

### データ準備

次に、データの準備に進みます。LongRAGのトレーニングには、以下のデータセットが使用されます：
- **HotpotQA**
- **2WikiMultihopQA**
- **MuSiQue**
- **Qasper**

評価データと対応するコーパスの生データは、**LongBench**から取得しています。

標準化されたデータ形式に変換したデータセットをダウンロードするには、以下のコマンドを実行してください。

```bash
bash download/raw_data.sh
```

このコマンドにより、データが`data/`ディレクトリに保存されます。

#### データ処理

次に、トレーニング用にデータを処理します。以下のコマンドを使用して、**LRGinstruction**データセットを構築します。

```bash
cd src
python gen_instruction.py --per_task_num 200 --min_res_tokens 20 --long_ratio 0.2
```

処理されたデータは`data/train/processed`に保存されます。

さらに、検索用のインデックスを構築し、チャンクと元のテキストの間のマッピングを保存します。

```bash
python gen_index.py --dataset hotpotqa --chunk_size 200 --min_sentence 2 --overlap 2
```

処理されたデータは`data/corpus/processed`に保存されます。

---

### LongRAGのトレーニング

まず、**LLaMA-Factory**をプロジェクトにダウンロードし、構築したインストラクションデータを`LLaMA-Factory/data`に配置します。そして、`dataset_info.json`に次のエントリを追加します。

```json
"LRGinstruction": {
  "file_name": "LRGinstruction.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output"
  }
}
```

これで、次のスクリプトを実行してファインチューニングを開始できます。

```bash
cd scripts
bash sft.sh $model_name_or_path $template $cutoff_len
```

`model_name_or_path`はテンプレートに対応し、`cutoff_len`はテキストの切り捨て長を指定します。

---

### 推論と評価

以下に、HotpotQAデータセットを使用した推論と評価のためのスクリプトの例を示します。まず、`src`ディレクトリに移動します。

#### 使用方法の例

**ChatGLM3-6B-32k**モデルを使用したLongRAGの推論例です。

- **SFTなしのLongRAG-ChatGLM3-6B-32k**:

```bash
CUDA_VISIBLE_DEVICES=0 python main.py --dataset hotpotqa --model chatGLM3-6b-32k --rb --rl --ext --fil --ext_fil
```

- **SFTありのLongRAG-ChatGLM3-6B-32k**:

```bash
CUDA_VISIBLE_DEVICES=0 python main.py --dataset hotpotqa --model LongRAG-chatglm3-32k --rb --rl --ext --fil --ext_fil
```

#### コンポーネントのトランスファラビリティ

- **Extractorのみを使用**し、ジェネレータとして**GPT-3.5-turbo**を使用、Extractorには**LongRAG-chatglm3-32k**を使用：

```bash
CUDA_VISIBLE_DEVICES=0,1 python main.py --dataset hotpotqa --model gpt-3.5-turbo --lrag_model LongRAG-chatglm3-32k --ext
```

- **Filterのみを使用**し、ジェネレータとして**GPT-3.5-turbo**を使用、Filterには**LongRAG-chatglm3-32k**を使用：

```bash
CUDA_VISIBLE_DEVICES=0,1 python main.py --dataset hotpotqa --model gpt-3.5-turbo --lrag_model LongRAG-chatglm3-32k --fil
```

- **ExtractorとFilterの両方を使用**し、ジェネレータとして**GPT-3.5-turbo**を使用、ExtractorとFilterには**LongRAG-chatglm3-32k**を使用：

```bash
CUDA_VISIBLE_DEVICES=0,1 python main.py --dataset hotpotqa --model gpt-3.5-turbo --lrag_model LongRAG-chatglm3-32k --ext_fil
```

**注**: `--rb`, `--rl`, `--ext`, `--fil`, `--ext_fil`の各パラメータは、RAG-Base、RAG-Long、Extractor、Filter、およびExtractor & Filterを表しています。これらのパラメータは任意に組み合わせることができます。

#### 評価結果の保存

評価結果は`log`ディレクトリに保存されます。

---

### 各データセットでの評価結果

以下に、LongBenchの三つのマルチホップデータセットにおけるF1スコアの実験結果を示します。

| Dataset                  | HotpotQA | 2WikiMultiHopQA | MusiQue | Average |
|--------------------------|----------|----------------|---------|---------|
| LongRAG-Qwen-1.5-7B-32k w/ SFT | 52.91    | 46.65          | 31.85   | 43.80   |
| LongRAG-Llama3-8B-8k w/ SFT   | 52.39    | 49.67          | 31.70   | 44.59   |
| LongRAG-Vicuna-v1.5-7B-16k w/ SFT | 55.55    | 50.13          | 28.29   | 44.66   |
| LongRAG-ChatGLM3-6B-32k w/ SFT | 55.93    | 54.85          | 33.00   | 47.93   |
| LongRAG-GPT-3.5-Turbo w/o SFT | 56.17    | 51.37          | 32.83   | 46.79   |
| LongRAG-GPT-3.5-Turbo-16k w/o SFT | 59.11    | 51.25          | 30.37   | 46.91   |
| LongRAG-GLM-4 w/o SFT         | 62.11    | 57.16          | 38.40   | 52.56   |

#### 評価結果の考察

評価結果からわかるように、LongRAGは特に**HotpotQA**や**2WikiMultiHopQA**のようなマルチホップ推論が求められるタスクにおいて、従来のモデルよりも高い精度を示しています。特に、ファインチューニングなしのLongRAG-GPT-3.5-Turboモデルであっても、高いF1スコアを維持している点が注目に値します。

一方で、**SFT（Supervised Fine-Tuning）**を行った場合の方が、特定のタスクでやや高い精度を示しており、データセットの特性やモデル選択によってパフォーマンスが大きく左右されることがわかります。また、**LongRAG-GLM-4**は特に優れたスコアを示しており、大規模なモデルほどその性能を発揮する傾向にあります。

これらの結果から、LongRAGはファインチューニングの有無にかかわらず、特定の推論タスクで優れた精度を示すことが確認されました。ただし、モデルの選択やタスクの性質によっては、SFTが有効に働くことも多く、その場合のパフォーマンス向上が見られます。


---

## 7. LongRAGの課題と今後の展望

LongRAGの今後の課題として、さらに以下の点が挙げられます。

### 高度な埋め込みモデルの開発

現在のLongRAGは、近似手法を用いて長文ユニットの類似度検索を行っていますが、長文コンテキストを直接エンコードできる埋め込みモデルが求められています。これにより、さらなる検索精度の向上が期待されます。

### ポジションバイアスの軽減

LLMには位置バイアスがあり、これが長文処理に影響を与える場合があります。今後の研究により、位置バイアスの軽減が期待されています。

---

## 8. 結論

LongRAGは、従来のRAGが抱えていた **「文脈消失」** 問題を解決する革新的な技術です。文書全体を検索ユニットとして活用することで、情報の取りこぼしを防ぎ、より高精度な情報検索を可能にしました。エンタープライズレベルのシステムにおいては、検索精度と効率のトレードオフを最適化し、エンドユーザーのニーズに応じたシステム構築に寄与できるでしょう。RAGシステムを設計・導入する際の参考になれば幸いです。

今後もこのような最新技術について、皆さんにとって役立つ情報を発信していきます。ご質問やリクエストがあれば、お気軽にお知らせください！


---

**もしこの記事が役に立ったと思ったら：**

- ぜひ「いいね！」をお願いします！
- 最新の投稿を見逃さないよう、Xのフォローもお願いします！
    - https://x.com/immeivise