重要なポイント
- RAG = 文書をアップロード + 検索 + ローカルLLMで回答。トレーニングは不要。
- 5つのステップ:(1)文書を読み込む、(2)500~1000トークンのピースに分割、(3)埋め込みを生成、(4)ベクターDBに保存、(5)クエリ時に検索。
- 最適な埋め込みモデル:nomic-embed-text(137M、ローカル実行、768次元ベクトル)。
- 最適なベクターDB:Chroma(シンプル、組み込み)<100万文書用;Qdrant(分散)本番環境用。
- 2026年4月現在、ローカルRAGはクラウドAPIより高速かつ安価です。品質は検索精度とプロンプトエンジニアリングに依存します。
RAGはどのように段階的に機能しますか?
- 1文書取り込み: PDFs、テキストファイル、またはウェブページを読み込みます。
- 2チャンキング: 文書を500~1000トークンのチャンクに分割します(コンテキストブレークを防ぐため20%オーバーラップ)。
- 3埋め込み: 各チャンクをローカル埋め込みモデルを使ってベクトル(768~1536次元)に変換します。
- 4保存: ベクトルをベクターデータベース(Chroma、Qdrant、Milvus)に保存し、メタデータ(文書名、ページ、タイムスタンプ)を含めます。
- 5クエリ時: ユーザーの質問を埋め込みに変換し、ベクターDBで類似チャンク上位K個を検索(k=5~10)。
- 6コンテキスト組み立て: 検索されたチャンクをLLM用の指示とともにプロンプトに統合します。
- 7生成: ローカルLLMが検索されたコンテキストに基づいて回答を生成します。
- 8帰属: 回答がどの文書から来たかを返します。
最適なチャンキング戦略とは何ですか?
チャンキング戦略は検索品質を決定します。 悪いチャンキング = 関連情報がチャンク間に分割される、検索失敗。
セマンティックチャンキング(推奨): 文や段落ごとに分割し、意味を保持します。例:各段落 = 1チャンク。
固定サイズチャンキング: チャンクあたり500トークン、20%オーバーラップ。シンプルですが文を分割する可能性があります。
再帰的チャンキング: 最初に段落で分割し、大きい場合は文で分割します。階層を保持します。
2026年4月現在、セマンティックチャンキングで500~1000トークンチャンクと20%オーバーラップがほとんどのユースケースで最適です。
# Python: セマンティックチャンキングの例
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200, # 20%オーバーラップ
separators=["\n\n", "\n", ".", " "] # 段落、文で分割
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")どのベクターデータベースを使うべきですか?
| データベース | タイプ | 容量 | セットアップの手間 | 推奨用途 |
|---|---|---|---|---|
| Chroma | 組み込み | <100万ドキュメント | pip install | プロトタイピング、小規模RAG |
| Qdrant | 分散 | 無制限 | Dockerまたはクラウド | 本番環境、スケーラブル |
| Milvus | 分散 | 無制限 | 複雑 | エンタープライズ、大規模 |
| Weaviate | グラフ+ベクトル | 無制限 | Docker | 複雑なクエリ、関係性 |
| Pinecone(クラウド) | マネージド | 無制限 | APIキー | サーバーレス、手放し |
どの埋め込みモデルを選ぶべきですか?
| モデル | ベクトル次元 | 速度 | 品質 | 推奨 |
|---|---|---|---|---|
| nomic-embed-text(ローカル) | — | 速い | 優秀 | ローカルRAGに最適 |
| bge-m3(ローカル) | — | 速い | 優秀 | 多言語対応 |
| OpenAI text-embedding-3(クラウド) | — | 非常に速い | 最高のクラス | ハイブリッドアプローチ |
| Cohere(クラウド) | — | 速い | 優秀 | 本番環境クラウドRAG |
検索品質をどのように最適化しますか?
検索品質 はRAG成功を決定します。良い検索 = 良い回答。悪い検索 = ハルシネーション。
検索品質を測定する3つの指標:(1)再現率(recall):実際に関連するチャンクの何%を見つけたか;(2)適合率(precision):見つけたチャンクの何%が実際に関連しているか;(3)NDCG:順位付けされたランキング品質。
チューニング手法:
- チャンクサイズ調整: 256~1000トークンを試す。小さすぎるとコンテキストが失われ、大きすぎるとノイズが増える。
- オーバーラップ調整: 10~50%を試す。
- 埋め込みモデル変更: ドメイン固有の埋め込みは一般的なモデルより優秀な場合があります。
- 検索パラメータ: K値(検索結果数)、スコアしきい値、再ランクアルゴリズムを調整。
最良のプラクティス:小規模なテストセット(10~20ユースケース)で検索品質を測定し、本番展開前に反復改善します。
評価と最適化:RAGシステムをテストする方法
主要指標:
- 回答品質スコア(0~10): 人間がアノテーション。正確さ、完全さ、関連性。
- 検索成功率(%): 返されたチャンクが質問に答えるのに十分か?
- レイテンシ(ミリ秒): ユーザーの質問から回答まで。目標:<2秒。
- コスト($): APIコストなし(ローカル)、またはクラウド埋め込み/再ランキング利用時のコスト。
テスト方法:
1. ハンドメイドテストセット: 10~50個の(質問、期待される答え、参照文書)の組。
2. ベースライン測定: 現在のシステムをテストします。
3. 1つのパラメータを調整: チャンクサイズ、埋め込みモデル、K値など。
4. メトリクスを再測定: 改善したか?
5. 本番環境で検証: 実ユーザーの満足度、フィードバック。
本番環境RAGの3つのパターン
パターン1:個人RAG(ローカル、単一ユーザー)
- セットアップ:Ollama + Chroma + nomic-embed-text
- スケール:1~100,000文書
- コスト:無料
- ケース:個人ナレッジベース、プライベートドキュメント
パターン2:チームRAG(ローカル、共有)
- セットアップ:LM StudioまたはVLLM + Qdrant + bge-m3
- スケール:100,000~1,000,000文書
- コスト:ローカル GPU, Qdrant サーバー
- ケース:社内文書検索、ナレッジシェアリング
パターン3:エンタープライズRAG(ハイブリッド)
- セットアップ:vLLM + Milvus + クラウド埋め込み(OpenAI or Cohere)
- スケール:1,000,000+文書
- コスト:Milvus ホスティング + 埋め込み API
- ケース:金融、医療、法務での規制対応RAG
よくある間違い
- 間違い1:チャンクサイズを考えずにランダムに選ぶ。 結果:検索がうまくいきません。 → 解決策:256~1000トークンを試し、テストセットで測定。
- 間違い2:最も高次元の埋め込みを選ぶ。 OpenAI text-embedding-3の3072次元は不要。 → 解決策:nomic-embed-text(768次元)で99%の品質を得て、速度を10倍にします。
- 間違い3:埋め込みモデルのドメイン不一致。 金融RAG = OpenAI埋め込み(一般)は最適ではない。 → 解決策:金融テキストでファインチューニングされたドメイン固有モデルを使用。
- 間違い4:ハルシネーションテスト不足。 検索されたチャンクが回答に実際に含まれているかチェックしない。 → 解決策:「この回答はこのチャンクから来ていますか?」を自動的にスコア。
- 間違い5:本番環境前に評価しない。 ローカルテストでは良好、本番ユーザーではうまくいきません。 → 解決策:本番前に10~20個の実ユースケースでテスト。
よくある質問
ローカルRAGはクラウド RAG(OpenAI、Cohere)より速いですか?
はい。ローカルRAGはネットワークレイテンシがなく、<1秒で検索 + 生成できます。クラウドRAGは2~5秒です(API呼び出し時間)。ただしクラウド埋め込みはより高精度(3072次元)で、小さなテストセットには適しています。
ローカルRAGとファインチューニング LLMの違いは何ですか?
ファインチューニング = LLM自体を再トレーニング(重い、時間がかかる)。RAG = 外部知識を検索してLLMに渡す(軽い、リアルタイム更新可)。RAGはドキュメントの追加/削除が簡単で、ハルシネーション率が低いです。
RAGはいくつのベクターデータベースをサポートしますか?
ほぼすべてです。Chroma、Qdrant、Milvus、Weaviate、Pinecone、Redis、Faiss。選択は規模による:<100万ドキュメント = Chroma(シンプル)、本番 = Qdrant(分散)、超大規模 = Milvus。
RAGに GPU は必須ですか?
不要。CPU + Chroma で動作します。ただし速度は遅くなります(埋め込み生成に数分)。GPU(RTX 4070+)を追加すると速度は 5~10倍になります。
ローカルRAGでプライバシーを保証されていますか?
はい。すべてのデータ(文書、埋め込み、クエリ、回答)がローカルに残り、インターネット経由で送信されません。GDPR、HIPAA、規制環境での完全なコンプライアンス。
参考資料
- LangChain ドキュメンテーション -- https://python.langchain.com/docs/use_cases/question_answering/
- RAG ベンチマーク -- https://github.com/explodinggradients/ragas
- Embedding モデル比較 -- https://huggingface.co/spaces/mteb/leaderboard
- Qdrant ドキュメンテーション -- https://qdrant.tech/documentation/