RAG精度向上のための6つのポイント

## はじめに
　LLM（Large Language Model）には、以下の4つの課題があります。RAG（Retrieval-Augmented Generation）は、これらを解決する有効なソリューションです。LLMと異なるのは、外部データで質問を拡張する点です。

### 1. ハルシネーション（幻覚）
　RAGは、モデルが外部の信頼できる知識ベースやデータベースから情報をリアルタイムで取得できるため、ファクトチェックが容易になり、モデルの独自生成による不正確な情報を減らせます。

### 2. 最新情報への対応
　RAGを利用することで、外部データベースに最新情報を追加することで、常に最新の知識を基にした応答が可能です。これにより、モデルがトレーニングデータに基づく古い情報に頼ることを防ぎます。

### 3. ドメイン知識の不足
　RAGは特定の分野に特化したデータベースを利用できるため、専門的なドメイン知識の応答品質を向上させます。

### 4. 応答の説明可能性
　RAGは、外部データを参照するため、出典や情報源を明示しやすくなります。これにより、応答に対する説明責任が向上し、ユーザーにとって信頼性の高い情報を提供できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/96776d3c-3f25-5b95-35d8-6fd9d66efd5d.png)
引用：https://www.idnet.co.jp/column/page_308.html

## RAG精度向上のための6つのポイント
　Rag From Scratch では、RAGの精度向上のための手法が、以下図のように大きく6つのカテゴリに分類されて紹介されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/eaef5f1b-5296-762d-c1fc-d1a8960dc174.png)
引用：Rag From Scratch

### 概要一覧

| 手法名           | 概要                                                                                              |
|------------------|---------------------------------------------------------------------------------------------------|
| クエリ翻訳（Query Translation） | 質問をより検索しやすい形式に翻訳するプロセス                                                  |
| ルーティング（Routing）         | 質問に対して最適なデータベースやプロンプトを選択し、効率的に検索を行うプロセス                       |
| クエリ構築（Query Construction） | 質問を特定のデータベース形式に変換するプロセス                                                |
| インデックス化（Indexing）       | 文書を検索しやすい単位に変換しインデックスを作成するプロセス                                   |
| リトリーバル（Retrieval）       | 質問に基づき関連文書を検索し、フィルタリングや再検索を行うプロセス                               |
| 生成（Generation）              | 検索結果を基に生成の質を向上させるプロセス                                                    |

### 1. クエリ翻訳（Query Translation）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/ade79a7c-159d-2912-8b19-cc7353741c0e.png)

   - 説明：質問をより検索しやすい形式に翻訳するプロセス
   - 具体例：
       - 複雑な質問の言い換えや分解
       - 検索用の仮想ドキュメントの作成
   - 手法例：
       - Multi-query
       - RAG-Fusion
       - Decomposition
       - HyDE

### 2. ルーティング（Routing）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/5a6486bd-b8e1-9185-a7a6-eb9549a34345.png)

   - 説明：質問に対して最適なルーティングを行うプロセス
   - 具体例：
       - 質問に応じて検索対象のDBを切り替え
       - 質問に応じてプロンプトを切り替え
   - 手法例：
       - Logical Routing
       - Semantic Routing

### 3. クエリ構築（Query Construction）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/6ee0ddbb-4baa-b714-fafa-4852285463be.png)

   - 説明：質問形式を検索対象に合わせて変換するプロセス
   - 具体例：質問を以下のようなデータベース固有のクエリ形式に変換
       -　SQL
       -　Cypher
       -　ベクトルDBの検索用に変換 
   - 手法例：
       - Text-to-SQL
       - Text-to-Cypher
       - Self-query Retriever

### 4. インデックス化（Indexing）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/b84b384b-d1e7-7db2-77b5-5a1a69e44b8d.png)

   - **説明**：文書を効率的に検索できるよう、適切な単位や構造に変換してインデックス化するプロセス
   - **具体例**：
       - 文字、セクション、セマンティック区切りを基に文書を分割し、テキストサイズを最適化
       - 検索効率を向上のため文書を要約などのコンパクトな検索単位に変換
       - 検索精度を向上のためドメイン特化型や高度な埋め込みモデルを利用
       - 検索精度を向上のため文書の階層的な要約を様々な抽象レベルでインデックス化
   - **手法例**：
       - Chunk Optimization（Semantic Splitter）
       - Multi-representation Indexing（Parent Document、Dense X）
       - Specialized Embeddings（Fine-tuning、ColBERT）
       - Hierarchical Indexing（RAPTOR）

### 5. リトリーバル（Retrieval）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/2a4fe540-1c27-063b-5213-836929b00346.png)

   - **説明**：質問に基づいて関連性の高いドキュメントを検索し、必要に応じてさらにフィルタリングや再検索を行うプロセス
   - **具体例**：
       - 関連性に基づいて、文書をランク付けしたり、フィルタリング/圧縮したり
       - ランク付けされた文書やフィルタリングされた文書をより精度の高いものにする
       - 検索された文書に関連性がない場合、再検索や新しいデータソース（ウェブなど）からの検索を実施
   - **手法例**：
       - Ranking（Re-Rank, RankGPT, RAG-Fusion）
       - Refinement（CRAG）
       - Active Retrieval（CRAG）

### 6. 生成（Generation）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631481/4612b340-ecff-94c0-f681-4616d0803abf.png)

   - **説明**：リトリーバル結果に基づいて、生成の質を向上させるためのプロセス
   - **具体例**：
       - 最初に生成された結果を基に再検索
       - 生成の質をフィードバックして最適化
   - **手法例**：
       - Active Retrieval（Self-RAG、RRR）

## さいごに
　本記事では、RAGの6つのカテゴリに分類された精度向上の手法を簡潔に紹介しました。もっと詳細を知りたい方は、@FukuharaYoheiさんの「RAG入門: 精度改善のための手法28選」が参考になると思います。
　RAGの進化により、より信頼性が高く、説明可能な生成モデルの開発が進みそうですね。今後は、GitHubに公開されている実装例を参考にしながら、これらの手法を実際に試して、効果を検証していきたいです。

## 参考
- RAG From Scratch (YouTube)

https://www.youtube.com/playlist?list=PLfaIDFEXuae2LXbO1_PKyVJiQ23ZztA0x

- RAG From Scratch (GitHub)

https://github.com/langchain-ai/rag-from-scratch

- RAG入門: 精度改善のための手法28選

https://qiita.com/FukuharaYohei/items/0949aaac17f7b0a4c807

- 生成AIのトレンド「LLM+RAG」を解説

https://www.idnet.co.jp/column/page_308.html