RAGのアーキテクチャとデータ登録・ユースケース

RAGのアーキテクチャとデータ登録・ユースケース

RAG(Retrieval-Augmented Generation)は、LLMに外部ナレッジを注入する技術として注目されている。しかし、実際のところ「いつRAGが必要で、いつ不要なのか」は意外と語られていない。

この記事では、RAGの基本的なアーキテクチャを説明しつつ、コーディングエージェントの検索機能との比較データ登録の実際の手間、そしてRAGの限界まで踏み込んで解説する。

関連する概念ノート

LLMの限界とRAGの登場

LLMは強力だが、以下の制約がある:

  1. 学習データの時点性:モデルの学習時点までの情報しか持たない
  2. 独自データへのアクセス不可:企業の内部文書、個人のメモは知らない
  3. コンテキストウィンドウの制約:一度に処理できる情報量に上限がある(Claude 3.5 Sonnetで約200kトークン)

RAGは、これらの制約を「外部データベースから情報を検索して、LLMに渡す」ことで解決しようとする技術だ。

ファインチューニングとの違い

RAGとよく比較されるのがファインチューニング(Fine-tuning)だ。

手法 仕組み 適したケース 更新コスト
ファインチューニング モデル自体を再学習 文体、出力形式の調整 高(再学習が必要)
RAG 検索結果をプロンプトに追加 知識の追加・更新 低(データ追加のみ)

ファインチューニングは「モデルの振る舞い」を変えるのに適しており、RAGは「知識の追加」に適している。両者は排他的ではなく、併用も可能だ。

RAGが本当に必要なのはどんな時か?

ここが最も重要なポイントだ。実は、RAGを使わなくても解決できるケースは多い

パターンA:コーディングエージェントで十分なケース

Claude CodeやCursorのようなコーディングエージェントは、以下のような検索を行う:

ユーザー:「認証機能のコードを教えて」
↓
1. Grepで "auth" "login" などをキーワード検索
2. 関連ファイル10個を発見
3. その10個を全文読み込み(数千〜数万トークン)
4. LLMが全体を見て回答を構築

この方式の利点:

限界:

発展形:階層的推論アプローチ(PageIndex等)

このエージェント方式の発展として、階層的インデックス + 推論ベース検索という新しいアプローチが登場している(例:PageIndex):

1. 事前に文書から階層的な「目次」構造を生成
2. LLMが階層を段階的に評価
3. 関連する部分だけを深く掘り下げる
4. 必要なセクションのみを読み込み

この方式は:

詳細はPageIndex - ベクトルレスRAGの新しいアプローチを参照。

パターンB:RAGが必要なケース

RAGが真価を発揮するのは以下の条件を満たす時:

1. セマンティック検索が必要

キーワードが分からない状態で探す場合:

例:

2. エンドユーザーが直接使う

コーディングエージェントのような段階的検索ができないケース:

3. 大規模データで全文読み込みが不可能

データ量がコンテキストウィンドウを超える場合:

この場合、Grepで全部読むことは物理的に不可能なので、RAGが唯一の選択肢になる。

使い分けの基準

条件 推奨手法
ファイル数〜300、エンジニアが使う Grep + 全文読み込み
ファイル数300〜、または非エンジニアが使う RAGを検討
ファイル数1000以上、または複数データソース横断 RAG必須

重要なのは、「とりあえずRAG」ではなく、まずシンプルな検索から始めることだ。

シンプルRAGのアーキテクチャ

RAGの最もシンプルな構成は、以下の4ステップで構成される。

1. データ準備とチャンキング

元データ(ドキュメント、コード、FAQ)を小さな単位(チャンク)に分割する。

チャンクサイズの例:

チャンクが小さすぎると文脈が失われ、大きすぎると検索精度が下がる。

2. 埋め込み(Embedding)生成

各チャンクを埋め込みモデルに通して、ベクトル(数値の配列)に変換する。

埋め込みモデルの例:

埋め込みは「意味の近さ」を数値で表現する。例えば:

3. ベクトルデータベースへの保存

生成した埋め込みベクトルデータベースに保存する。

ベクトルDBの例:

ベクトルデータベースは「類似ベクトル検索」に特化したデータベースで、通常のSQLデータベースとは異なる。

4. 検索と生成

ユーザーのクエリ(質問)が来たら:

  1. クエリを埋め込みモデルに通してベクトル化
  2. ベクトルデータベースで類似度が高いTop-K(例:5チャンク)を取得
  3. 取得したチャンクをプロンプトに埋め込んでLLMに渡す
  4. LLMが回答を生成
プロンプト例:

以下の情報を参考に、ユーザーの質問に答えてください。

## 参考情報
[チャンク1の内容]
[チャンク2の内容]
[チャンク3の内容]
...

## ユーザーの質問
認証機能の仕組みを教えて

データ登録と日々の運用

ここでは、管理者視点での「実際の手間」を見ていく。

初期構築(1回のみ)

  1. データソースの選定:Notion、Slack、GitHubなど
  2. データの取り込み:APIまたはエクスポート機能で取得
  3. クリーニング:不要な情報(ヘッダー、フッター、広告)を削除
  4. チャンキング設定:サイズと重複を決定
  5. 埋め込み生成:全データに対して実行(数時間〜数日)
  6. ベクトルDBセットアップ:インデックス作成

工数目安:1週間〜2週間(規模による)

日々の運用(継続的)

運用パターンは大きく3つに分かれる:

パターンA:バッチ更新型(自動化)

例:社内Wiki、GitHubリポジトリ

パターンB:半自動型(手動トリガー)

例:Notionデータベース、Google Drive

パターンC:手動登録型(品質重視)

例:法務文書、重要な社内規定

運用上の注意点

1. データの鮮度管理

2. データ品質の維持

RAGの精度は元データの品質に大きく依存する:

3. 削除データの扱い

4. 権限管理

具体的なユースケース

ここでは4つのユースケースを、RAGが必要かどうかの判断も含めて詳しく見ていく。

1. 社内ナレッジベース検索

シナリオ

データソース

RAGの必要性

条件 推奨手法
エンジニアチームのみ(〜300ページ) Grep + 全文読み込みで十分
全社利用(500ページ以上) RAG推奨
非エンジニアが検索 RAG推奨(セマンティック検索が必要)

運用の手間

落とし穴

2. カスタマーサポートボット

シナリオ

データソース

RAGの必要性

条件 推奨手法
FAQ 50件以下 プロンプトに直接書き込み
FAQ 100〜500件 RAG推奨
過去チケット1000件以上 RAG必須

運用の手間

落とし穴

3. コード検索・補完

シナリオ

データソース

RAGの必要性

条件 推奨手法
1リポジトリ、1万行以下 Grep + 全文読み込みで十分(Claude Codeなど)
複数リポジトリ、または3万行以上 RAG推奨
IDE統合(Copilot的な使い方) RAG有効

運用の手間

落とし穴

4. 個人のセカンドブレイン

シナリオ

データソース

RAGの必要性

条件 推奨手法
100ノート以下 Obsidian + Claude Codeで十分
300ノート以上 RAG検討
スマホから検索したい RAG推奨(WebアプリやSlack botで統合)

運用の手間

落とし穴

RAGの限界と課題

ここが最も重要なセクションだ。RAGは万能ではなく、いくつかの本質的な限界を抱えている。

1. ベクトル検索の取りこぼし問題

RAGの最大の問題は、Top-Kで切り捨てられた情報は見えないことだ。

Grep + 全文読み込みとの比較

Grep方式:

「認証機能を教えて」
→ Grepで "auth" "login" 関連ファイル10個を発見
→ その10個を全部読み込む(数万トークン)
→ LLMが全体を見て回答

利点:情報の取りこぼしがない
全てのファイルを読むので、重要な情報を見逃すことがない。

RAG方式:

「認証機能を教えて」
→ ベクトル検索でTop-5チャンクを取得
→ その5チャンクだけをLLMに渡す
→ 残りの情報は見ない

問題:重要な情報が漏れる可能性
もし重要な情報がTop-5に入らなければ、LLMはそれを知らないまま回答する。

なぜこの問題が起きるのか?

RAGはコンテキストウィンドウの節約のために設計されている。

対策:Advanced RAGのテクニック

  1. リランキング:初回検索で20件取得 → 関連度で再ソート → Top-5に絞る
  2. 複数回検索:初回の回答で足りなければ、追加で検索
  3. ハイブリッド検索:ベクトル検索とキーワード検索を併用

しかし、これらの手法も完璧ではない。「Grep + 全文読み込み」の方が正確なケースは多い。

2. チャンキングの難しさ

チャンクの切り方次第で、検索精度が大きく変わる。

悪いチャンキングの例

## ユーザー認証
当社のシステムは、JWTベースの認証を採用しています。

---(ここでチャンク分割)---

ユーザーがログインすると、サーバーはトークンを発行し...

この場合、「JWT」という重要なキーワードと、その説明が別のチャンクに分かれてしまう。

結果:

解決策:重複を持たせる

チャンク1:「当社のシステムは、JWTベースの認証を採用しています。ユーザーがログインすると...」
チャンク2:「JWTベースの認証を採用しています。ユーザーがログインすると、サーバーはトークンを発行し...」

このように、チャンク間で一部を重複させることで、文脈の断絶を防ぐ。

しかし、重複が多すぎると:

3. 埋め込みモデルの限界

埋め込みモデルは「意味の近さ」を数値化するが、完璧ではない。

問題例

対策

4. コストとレイテンシ

RAGは「検索」→「生成」の2ステップなので:

小規模データなら、RAG不要でLLMだけの方が速くて安い。

まとめ:RAGを使うべきか?

RAGは強力な技術だが、万能ではない。以下のチェックリストで判断すると良い。

RAGが必要なケース

RAG不要なケース

推奨アプローチ:3つの選択肢

アプローチ 適した用途 初期コスト 検索コスト 精度
Grep + 全文読み込み
(エージェント方式)
〜300ファイル、エンジニア向け なし 高い 高い(取りこぼしなし)
階層的推論
(PageIndex等)
長文専門文書、構造化文書 非常に高い 中程度 非常に高い
ベクトルRAG 大規模データ、非エンジニア向け 低い 低い 中程度(取りこぼしあり)

判断フロー:

  1. まずシンプルな方法から試す:Grep + 全文読み込み、プロンプトに直接書き込み
  2. 規模の限界を感じたら
    • 構造化された長文文書(金融、法律) → 階層的推論(PageIndex等)
    • 大量の非構造化データ → ベクトルRAG
  3. 小さく始める:最初はシンプルRAG、必要に応じてAdvanced RAGに進化

重要な洞察:
RAGは「データが大きくなったら自動的に必要」ではなく、「どう使うか」で判断する技術だ。

自分のユースケースに本当にRAGが必要か、この記事の基準で見極めてほしい。

抽出された概念