RAGとは何か
RAGは2020年にMeta AI(当時Facebook AI Research)の研究者Patrick Lewisらが発表した手法だ。LLMの知識は学習データに依存するため、最新情報や社内固有の情報には対応できない。RAGはこの制約を「検索」で補う。
RAGの基本フロー
ユーザーの質問
│
▼
[1] 検索(Retrieval)
質問をベクトル化し、類似ドキュメントを検索
│
▼
[2] 拡張(Augmentation)
検索結果をプロンプトに注入
│
▼
[3] 生成(Generation)
LLMが検索結果を根拠に回答を生成
│
▼
回答(ソース付き)
| 手法 | 最新情報 | 社内データ | ハルシネーション | コスト |
|---|---|---|---|---|
| LLM単体 | 学習データまで | 対応不可 | 高い | 低い |
| ファインチューニング | 追加学習データまで | 対応可能 | 中程度 | 高い(再学習コスト) |
| RAG | リアルタイム対応 | 対応可能 | 低い(ソース付き) | 中程度(検索コスト) |
RAGの実装:5つのステップ
RAGシステムの構築は、以下の5つのステップで構成される。
Step 1: ドキュメントの準備とチャンキング
まず、検索対象のドキュメントを適切なサイズのチャンク(断片)に分割する。チャンクのサイズは検索精度と生成品質に直結する。
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # 1チャンクのトークン数
chunk_overlap=50, # チャンク間の重複
separators=["
", "
", "。", ".", " "]
)
chunks = splitter.split_documents(documents)
| チャンクサイズ | 検索精度 | 文脈の豊かさ | 適した用途 |
|---|---|---|---|
| 128トークン | 高い | 低い | FAQ、定義の検索 |
| 256トークン | 高い | 中程度 | 一般的な質問応答 |
| 512トークン | 中程度 | 高い | 技術文書、論文 |
| 1024トークン | 低い | 非常に高い | 複雑な推論が必要な場合 |
Step 2: エンベディング(ベクトル化)
チャンクをベクトル(数値の配列)に変換する。意味的に近い文章は、ベクトル空間上でも近い位置に配置される。
from openai import OpenAI
client = OpenAI()
def embed(text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-large",
input=text
)
return response.data[0].embedding
# 全チャンクをベクトル化
vectors = [embed(chunk.page_content) for chunk in chunks]
Step 3: ベクトルDBへの格納
ベクトルをベクトルデータベースに格納する。類似検索に最適化されたインデックスが構築される。
from supabase import create_client
supabase = create_client(url, key)
for chunk, vector in zip(chunks, vectors):
supabase.table("documents").insert({
"content": chunk.page_content,
"metadata": chunk.metadata,
"embedding": vector
}).execute()
主要なベクトルDBの比較は以下の通りだ。
| ベクトルDB | 種類 | 特徴 |
|---|---|---|
| Supabase (pgvector) | 拡張機能 | PostgreSQLに統合。既存DBに追加可能 |
| Pinecone | マネージド | サーバーレス。スケーラビリティが高い |
| Weaviate | オープンソース | マルチモーダル対応 |
| Qdrant | オープンソース | Rust製。高速 |
| Chroma | オープンソース | Python特化。プロトタイプに最適 |
Step 4: 検索(リトリーバル)
ユーザーの質問をベクトル化し、ベクトルDB内の類似チャンクを検索する。
-- Supabase (pgvector) での類似検索
SELECT content, metadata,
1 - (embedding <=> query_embedding) AS similarity
FROM documents
WHERE 1 - (embedding <=> query_embedding) > 0.7
ORDER BY embedding <=> query_embedding
LIMIT 5;
Step 5: プロンプト構築と生成
検索結果をプロンプトに注入し、LLMに回答を生成させる。
def generate_answer(query: str, contexts: list[str]) -> str:
context_text = "
---
".join(contexts)
response = client.chat.completions.create(
model="gpt-5.4",
messages=[
{
"role": "system",
"content": f"""以下のコンテキストに基づいて質問に回答してください。
コンテキストに含まれない情報は「情報がありません」と回答してください。
コンテキスト:
{context_text}"""
},
{"role": "user", "content": query}
]
)
return response.choices[0].message.content
RAGの評価指標
RAGシステムの品質を測定するための主要な評価指標を整理する。
| 指標 | 測定対象 | 説明 |
|---|---|---|
| Context Precision | 検索 | 検索結果のうち、質問に関連するものの割合 |
| Context Recall | 検索 | 正解に必要な情報のうち、検索できた割合 |
| Faithfulness | 生成 | 回答がコンテキストの情報に忠実かどうか |
| Answer Relevancy | 生成 | 回答が質問に対して的確かどうか |
| Answer Correctness | 全体 | 回答が事実として正しいかどうか |
これらの指標はRAGAS(Retrieval Augmented Generation Assessment)フレームワークで自動的に測定できる。
from ragas import evaluate
from ragas.metrics import (
context_precision,
context_recall,
faithfulness,
answer_relevancy
)
result = evaluate(
dataset=eval_dataset,
metrics=[
context_precision,
context_recall,
faithfulness,
answer_relevancy
]
)
print(result)
Advanced RAG:検索精度を高める技法
基本的なRAGでは不十分な場合、以下のAdvanced RAGテクニックで検索精度を向上できる。
ハイブリッド検索
ベクトル検索(意味的類似性)とキーワード検索(BM25)を組み合わせる。固有名詞や専門用語の検索精度が向上する。
ハイブリッド検索の仕組み
ユーザーの質問
│
├── ベクトル検索(意味的類似性)
│ 結果: [Doc A: 0.92, Doc C: 0.87, Doc E: 0.81]
│
└── キーワード検索(BM25)
結果: [Doc B: 12.5, Doc A: 10.2, Doc D: 8.7]
│
▼
Reciprocal Rank Fusion(スコア統合)
結果: [Doc A: 0.95, Doc B: 0.82, Doc C: 0.78]
リランキング
初回検索の結果を、より高精度なモデルで再評価し、順位を並び替える。Cohere Rerank、Jina Rerankなどの専用モデルが利用可能だ。
クエリ変換
ユーザーの質問を検索に最適化された形式に変換する。あいまいな質問を複数の具体的なサブクエリに分解するHyDE(Hypothetical Document Embeddings)などの手法がある。
Agentic RAG:2026年の最前線
2026年に入り、RAGは「エージェント化」という新たな進化段階を迎えている。Agentic RAGでは、AIエージェントが検索・判断・実行を自律的に行う。
Basic RAG vs Agentic RAG
Basic RAG:
質問 → 検索 → 生成 → 回答
(一方通行、1回の検索で完結)
Agentic RAG:
質問 → エージェントが計画
→ 必要な情報源を判断
→ 複数DBを横断検索
→ 検索結果を評価
→ 不足があれば追加検索
→ 複数の情報を統合
→ 回答を生成
→ 回答の品質を自己評価
→ 必要なら修正して再生成
| 観点 | Basic RAG | Agentic RAG |
|---|---|---|
| 検索回数 | 1回 | 必要に応じて複数回 |
| 情報源 | 1つのベクトルDB | 複数DB + API + Web検索 |
| 判断力 | なし(機械的に検索) | あり(何を検索すべきか判断) |
| 自己修正 | なし | あり(回答品質を自己評価) |
| 適した用途 | 単純なQ&A | 複雑な調査・分析 |
Agentic RAGは、LangGraphやCrewAIなどのエージェントフレームワークと組み合わせて実装されることが多い。
まとめ:RAGはAIシステムの「知識基盤」
RAGは、LLMを実用的なシステムに変えるための最も重要な技術の一つだ。ハルシネーションの抑制、最新情報への対応、社内データの活用──これらすべてをRAGが可能にする。
2026年のAI開発において、RAGの理解と実装力は、エンジニアの必須スキルとなっている。まずは小さなドキュメントセットでBasic RAGを実装し、精度と使い勝手を体感することから始めてほしい。

