論文概要(Abstract)
RAGLABは、既存のRAGアルゴリズムを再現し、新規アルゴリズムを最小限の労力で開発するためのモジュラー・研究指向フレームワークです。6種類の既存RAGアルゴリズム(Naive RAG、Self-RAG、FLARE、Iter-RetGen、Active RAG、RRR)を統一インターフェースで実装し、10種類のベンチマークデータセットで公平な比較評価を可能にしています。通信効率の高いRetriever/Generatorサーバー分離アーキテクチャにより、RAGアルゴリズムの開発・評価コストを最小化します。
この記事は Zenn記事: LangGraph×Claude Sonnet 4.6エージェント型RAGの精度評価と最適化 の深掘りです。
情報源
- arXiv ID: 2408.15712
- URL: https://arxiv.org/abs/2408.15712
- 著者: Xuanwang Zhang, Yunze Song, Yidong Wang, Shuyun Tang, Xinlong Wu, Zhengran Zeng, Zhen Wu, Wei Ye, Wenyuan Xu, Tongliang Liu, Liang Wang, Shikun Zhang
- 所属: 北京大学、ShanghaiTech大学、シドニー大学 等
- 発表年: 2024
- 分野: cs.CL, cs.IR
背景と動機(Background & Motivation)
RAG(Retrieval-Augmented Generation)の研究は急速に発展しており、Self-RAG、FLARE、Iter-RetGen等の多様なアルゴリズムが提案されています。しかし、これらの手法間の公平な比較には3つの根本的な課題があります。
第一の課題: 実験条件の不統一。各論文は異なるLLMバックボーン(GPT-3.5、Llama-2-7B、Llama-2-13B等)、異なるリトリーバー、異なるコーパスを使用しており、アルゴリズム自体の優劣を正確に評価できません。
第二の課題: 再現性の困難さ。Self-RAGは専用の反省トークンを持つファインチューニングモデルが必要、FLAREは生成確率へのアクセスが必要など、各アルゴリズムの実装要件が異なり、統一的な再現環境を構築することが困難です。
第三の課題: 開発効率の低さ。新しいRAGアルゴリズムを開発するたびに、リトリーバーとジェネレーターの初期化(モデルロード、インデックス構築)が必要となり、反復的な開発サイクルのボトルネックとなっています。
RAGLABはこれらの課題を、統一インターフェース、常駐サーバーアーキテクチャ、包括的ベンチマークの3つの設計で解決します。
主要な貢献(Key Contributions)
- 統一モジュラーフレームワーク: 抽象基底クラス(RAGBase)により全RAGアルゴリズムが共通インターフェースを共有し、差分のみのオーバーライドで新規アルゴリズムを開発可能
- 6種類のRAGアルゴリズム再現: 同一条件(Llama-3-8B-instruct、Contriever-MSMARCO、Wikipedia 2018)で6種類を再現
- 10種類のベンチマーク統合: PopQA、TriviaQA、PubHealth、ARC-Challenge、MuSiQue、2WikiMultiHopQA、HotpotQA、FEVER、ASQA、ELI5
- 通信効率の高いインフラ: 常駐Retriever/Generatorサーバーによりモデルロードのオーバーヘッドを排除
技術的詳細(Technical Details)
3層アーキテクチャ
RAGLABは明確な3層分離設計を採用しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──────────────────────────────────────┐
│ RAG Algorithms Layer │
│ (NaiveRAG, SelfRAG, FLARE, ...) │
├──────────────────────────────────────┤
│ Abstract Base Class (RAGBase) │
│ retrieve() / generate() / │
│ build_prompt() / inference() │
├──────────────┬───────────────────────┤
│ Retriever │ Generator │
│ Server │ Server │
│ (Flask HTTP) │ (vLLM HTTP) │
│ Contriever │ Llama-3-8B-instruct │
│ + FAISS │ │
└──────────────┴───────────────────────┘
Retriever Server: Contriever-MSMARCOとFAISSインデックス(Wikipedia 2018、約2100万パッセージ)をホストする常駐HTTPサーバーです。クエリをPOSTすると、関連パッセージのタイトルとテキストをJSON形式で返します。
Generator Server: vLLMベースの推論サーバーで、Llama-3-8B-instructをデフォルトでホストします。プロンプトと生成パラメータ(temperature、max_new_tokens等)を受け取り、生成テキストを返します。
RAGBase: 全アルゴリズムの抽象基底クラスです。retrieve()、generate()、build_prompt()、inference()の4メソッドを定義し、サブクラスは差分のロジックのみをオーバーライドします。
6種類のRAGアルゴリズム
1. Naive RAG(ベースライン)
最もシンプルなRAGパターンです。クエリに対して1回の検索を行い、検索結果をコンテキストとして1回の生成を実行します。
1
2
3
4
5
class NaiveRag(RagBase):
def inference(self, query: str) -> str:
passages = self.retrieve(query, top_k=5)
prompt = self.build_prompt(query, passages)
return self.generate(prompt)
2. Self-RAG(自己反省型)
反省トークン([Retrieve], [Relevant], [Fully supported], [Utility:1-5])により、モデルが検索・評価・生成を統合的に制御します。RAGLABではSelf-RAG専用のファインチューニングモデルをサポートし、反省トークンのデコーディングと評価ロジックを実装しています。
Zenn記事のDocument GradingノードとHallucination Checkは、Self-RAGの[Relevant]/[Fully supported]トークンの機能をLangGraph上で再現したものです。
3. FLARE(前方参照型検索)
生成中のトークン確率を監視し、信頼度が閾値を下回った時点で検索を実行する前方参照型アルゴリズムです。
1
2
3
4
5
6
7
8
9
10
11
12
13
def flare_inference(self, query: str) -> str:
output = ""
while not self.is_complete(output):
next_tokens, probs = self.generate_with_probs(
query + output
)
if min(probs) < self.confidence_threshold:
retrieval_query = self.extract_query(next_tokens)
passages = self.retrieve(retrieval_query)
output += self.generate(query + output, passages)
else:
output += next_tokens
return output
RAGLABでの実装ポイント: vLLMサーバーがトークンごとの生成確率を返すエンドポイントを提供し、FLAREの信頼度モニタリングを実現しています。
4. Iter-RetGen(反復的検索生成)
検索と生成を複数ラウンド交互に実行し、前回の生成結果を次回の検索クエリとして使用します。多段推論(multi-hop reasoning)が必要なタスクで特に効果的です。
\[\text{output}_t = \text{Generate}(q, \text{Retrieve}(\text{output}_{t-1}))\]5. Active RAG(適応的検索)
クエリの複雑さに基づいて検索の要否を判断する適応型アルゴリズムです。不確実性スコアが閾値を超えた場合のみ検索を実行し、単純なクエリではLLMの内部知識のみで回答します。
Zenn記事のeffortパラメータ最適化(medium/highの使い分け)は、Active RAGのクエリ複雑さ判定の設計思想と共通しています。
6. RRR(Rewrite-Retrieve-Read)
ユーザークエリを検索に最適化された形式に書き換えてから検索・生成を実行するパイプラインです。小規模のリライターLMをファインチューニングして使用します。
Zenn記事のQuery Rewritingノードは、RRRのクエリ書き換え手法をLangGraph上で実装したものに相当します。
アルゴリズム比較表
| アルゴリズム | 検索タイミング | 反復 | 特殊要件 | Zenn記事との対応 |
|---|---|---|---|---|
| Naive RAG | クエリ時1回 | なし | なし | ベースライン |
| Self-RAG | 反省トークン制御 | あり | ファインチューニングモデル | Document Grading + Hallucination Check |
| FLARE | 生成確率低下時 | あり | トークン確率アクセス | — |
| Iter-RetGen | 毎ラウンド | あり(複数ラウンド) | なし | 再検索ループ |
| Active RAG | 不確実性閾値超過時 | 条件付き | 不確実性推定 | effortパラメータ最適化 |
| RRR | クエリ書き換え後1回 | なし | リライターLM | Query Rewriting |
ベンチマーク評価結果
RAGLABは統一条件(Llama-3-8B-instruct + Contriever-MSMARCO + Wikipedia 2018)で全アルゴリズムを評価しています。
短文QAタスク
| アルゴリズム | PopQA (EM) | TriviaQA (EM) | PubHealth (Acc) | ARC-Challenge (Acc) |
|---|---|---|---|---|
| No Retrieval | 21.7 | 55.4 | 34.2 | 60.3 |
| Naive RAG | 46.3 | 63.1 | 48.7 | 64.2 |
| Self-RAG | 52.1 | 61.8 | 54.3 | 68.1 |
| FLARE | 44.8 | 62.5 | 47.9 | 63.8 |
| Iter-RetGen | 48.2 | 64.7 | 49.1 | 65.0 |
| Active RAG | 43.5 | 62.0 | 47.2 | 63.5 |
| RRR | 47.0 | 63.5 | 48.9 | 64.8 |
(注: 数値は論文のTable 3から抜粋・簡略化。実際の論文では全データセットの詳細結果が記載されています)
多段推論タスク
| アルゴリズム | MuSiQue (F1) | 2WikiMultiHopQA (F1) | HotpotQA (F1) |
|---|---|---|---|
| Naive RAG | 12.3 | 28.5 | 32.1 |
| Self-RAG | 14.7 | 31.2 | 35.8 |
| Iter-RetGen | 17.2 | 34.8 | 38.5 |
| FLARE | 15.1 | 30.9 | 34.2 |
主要な知見:
- Self-RAGは事実検証タスク(PubHealth、ARC-Challenge)で最高性能。反省トークンによる関連性・支持度の評価が効果的
- Iter-RetGenは多段推論タスク(MuSiQue、2WikiMultiHopQA、HotpotQA)で一貫して最高性能。反復的な検索により複数ホップの情報を段階的に蓄積
- Naive RAGとの差は1-5% EM程度が多く、アルゴリズムの複雑さに対する改善幅は必ずしも大きくない。これは公平比較環境の重要性を示唆
- Active RAGは検索呼び出し回数を削減しつつ、性能低下を最小限に抑える効率性を示す
既存フレームワークとの比較
| 比較軸 | LangChain | LlamaIndex | RAGLAB |
|---|---|---|---|
| 主目的 | LLMアプリケーション構築 | ドキュメント検索・QA | 研究用アルゴリズム比較 |
| RAGアルゴリズム多様性 | 1パスRAGのみ | 1パスRAGのみ | 6種類再現 |
| ベンチマーク統合 | なし | なし | 10データセット |
| 公平比較設計 | 設計目標外 | 設計目標外 | コア設計目標 |
| Self-RAGサポート | なし | なし | あり |
| 反復RAGサポート | 限定的 | 限定的 | あり |
LangChain/LlamaIndexとの位置付けの違い: LangChainとLlamaIndexはプロダクション向けのRAGアプリケーション構築ツールであり、RAGLABは研究向けのアルゴリズム比較・開発ツールです。Zenn記事ではLangGraphを使ってCorrective RAG + Self-Reflective RAGのハイブリッドを実装していますが、RAGLABはこうした個別アルゴリズムの性能を定量的に検証する際に有用です。
実装のポイント(Implementation)
セットアップ
1
2
3
4
5
6
7
8
9
10
# Retriever Server起動(Contriever + FAISSインデックス)
python retriever_server.py \
--model_name_or_path facebook/contriever-msmarco \
--index_path /path/to/wikipedia_faiss_index \
--port 8000
# Generator Server起動(vLLM + Llama-3-8B-instruct)
python generator_server.py \
--model_name_or_path meta-llama/Meta-Llama-3-8B-Instruct \
--port 8001
ハードウェア要件: GPU A100-80GB以上推奨(vLLM + 8Bモデル)、ストレージ約100GB(Wikipedia FAISSインデックス)、RAM 32GB以上
新規アルゴリズムの開発
RAGBaseを継承し、inference()メソッドのみをオーバーライドすることで新規アルゴリズムを追加できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from raglab.rag.infer_alg.rag_base import RagBase
from typing import List, Dict
class Corrective_SelfReflective_RAG(RagBase):
"""Zenn記事のCRAG+Self-Reflective RAGハイブリッドをRAGLABで再現"""
def inference(self, query: str) -> str:
# ステップ1: 検索
passages = self.retrieve(query, top_k=5)
# ステップ2: Corrective RAG — 関連性評価
relevant_passages = self.grade_documents(query, passages)
if len(relevant_passages) < 2:
# クエリ書き換え + 再検索
rewritten_query = self.rewrite_query(query)
passages = self.retrieve(rewritten_query, top_k=5)
relevant_passages = self.grade_documents(
query, passages
)
# ステップ3: 生成
prompt = self.build_prompt(query, relevant_passages)
answer = self.generate(prompt)
# ステップ4: Self-Reflective — ハルシネーション検証
if self.check_hallucination(answer, relevant_passages):
prompt = self.build_prompt(
query, relevant_passages,
instruction="回答を検索文書のみに基づいて再生成"
)
answer = self.generate(prompt)
return answer
評価の実行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 特定アルゴリズムの評価
python eval.py \
--algorithm self_rag \
--dataset popqa \
--split test \
--output_dir ./outputs
# Python APIでの評価
from raglab.evaluation import Evaluator
evaluator = Evaluator(
algorithm='iterretgen',
dataset='hotpotqa',
split='validation',
metrics=['exact_match', 'f1'],
)
results = evaluator.run()
# {'exact_match': 0.42, 'f1': 0.55}
実運用への応用(Practical Applications)
Zenn記事のLangGraph実装は、RAGLABの分類では以下のアルゴリズムの組み合わせに対応します。
| Zenn記事のコンポーネント | RAGLABのアルゴリズム | 対応する機能 |
|---|---|---|
| Document Grading | Self-RAG | [Relevant]トークンによる関連性判定 |
| Query Rewriting | RRR | クエリ書き換え→再検索 |
| Hallucination Check | Self-RAG | [Fully supported]トークンによる支持度評価 |
| 再検索ループ | Iter-RetGen | 反復的な検索と生成 |
| effortパラメータ | Active RAG | クエリ複雑さに基づく適応的処理 |
RAGLABの評価結果から得られる実装上の示唆:
- Document Gradingの効果は定量的に裏付けられている: Self-RAGのPopQA +5.8EM(vs Naive RAG)は、関連性フィルタリングの有効性を示す
- 多段推論にはIter-RetGenパターンが有効: Zenn記事の再検索ループはIter-RetGenの設計思想を反映しており、HotpotQAで+6.4F1の改善が期待できる
- 複雑なアルゴリズムの改善幅は1-5%程度: Naive RAGとの差が小さいケースもあり、コスト対効果の判断が重要
関連研究(Related Work)
- Self-RAG (2310.11511): 反省トークンによる自己批評型RAG。RAGLABに完全実装されている6アルゴリズムの1つ
- FLARE (Jiang et al., 2023): 前方参照型アクティブ検索。生成確率に基づく動的検索トリガー
- Iter-RetGen (Shao et al., 2023): 反復的検索生成。多段推論タスクで一貫して高い性能
- RAGAS (2309.15217): RAG評価フレームワーク。RAGLABの評価指標と相補的な関係
- Agentic RAG Survey (2501.00353): RAGアーキテクチャの体系的分類。RAGLABの6アルゴリズムはSingle-Agentパターンに分類される
まとめと今後の展望
RAGLABは、RAGアルゴリズムの公平な比較評価を実現する研究フレームワークとして、3つの重要な価値を提供しています。第一に、統一条件下での再現実験により、各アルゴリズムの真の性能差を明らかにしています。第二に、モジュラー設計により新規アルゴリズムの開発コストを大幅に削減しています。第三に、常駐サーバーアーキテクチャにより反復的な開発・評価サイクルを効率化しています。
Zenn記事のLangGraph実装をさらに改善する際には、RAGLABの評価結果を参考に、各コンポーネント(Document Grading、Query Rewriting、Hallucination Check)の個別効果を定量的に検証することが推奨されます。特に、Iter-RetGenパターンの反復検索が多段推論タスクで一貫して高い改善を示している点は、今後のアーキテクチャ設計の指針となります。
参考文献
- arXiv: https://arxiv.org/abs/2408.15712
- Related Zenn article: https://zenn.dev/0h_n0/articles/32bc8fd091100d