RAGの検索精度に関する対策について質問を受けましたので、調査してまとめてみます。
もくじ
- RAG って何? ざっくり 3 行で
- 失敗しがちなポイント
- 今日から使える7つの改善策
- サンプルコード(LangChain 版)
- 結論
1. RAG って何? ざっくり 3 行で
役割 | たとえ |
---|---|
Retrieve: 関連資料を探す | Google 検索 |
Augment: 見つけた資料を LLM に渡す | 資料を横に置いて説明 |
Generate: LLM が回答を書く | 人がレポートをまとめる |
つまり 「検索エンジン+ChatGPT」= RAG。検索がズレると答えもズレる ――ここが改善ポイントです。
Hallucination(幻覚)低減や最新情報の活用が期待できる一方、検索精度が低いと結局は誤情報を拡大再生産してしまうという課題があります
2. 失敗しがちなポイント
-
チャンク/chunk(文書分割)が大きすぎ/小さすぎ
→ 例:マニュアルを1ページ丸ごと検索したら、欲しい情報が埋もれる。 -
固有名詞・数字を取りこぼす(ベクトル検索だけだと弱い)
→ 例:「2024年度予算」が「予算」だけで検索されてしまう。 -
検索結果が多すぎて LLM が迷子
→ 例:100件の資料が返ってきて、AIが的外れな回答を生成。 - そもそも、RAGの良し悪しをどうやって測ればいいかわからない
3. 今日から使える7つの改善策
失敗を防ぐ、初心者でもすぐ試せるコツを紹介します。たとえ:RAGを「図書館で本を探してレポートを書く」作業に例えるとわかりやすいよ!
① 文書は「300~500語」くらいで分割+少し重なりを
図書館で本を「1ページ単位」だと細かすぎ、「1冊丸ごと」だと大雑把すぎ。300~500語(トークン)で文書を切り、隣のチャンクと100語くらい重なるようにすると、検索が安定します(Mediumの調査より)。例:マニュアルの「休暇申請」の章を、3~4パラグラフずつに分ける。
② 高性能な「埋め込みモデル」を選ぶ
埋め込みモデルは、文章を「検索しやすい数字」に変換する道具。初心者におすすめは OpenAIのtext-embedding-3-large や Hugging Faceのe5-large-v2。例:これを使うと「休暇申請」と「バケーションルール」が同じ意味だとAIが理解してくれる。
③ 「ハイブリッド検索」で固有名詞や数字もカバー
普通の検索(ベクトル検索)だけだと「2024」や「SaaS」みたいな固有名詞を見逃しがち。ハイブリッド検索(ベクトル+キーワード検索)をONにすると解決!例:Qdrantというツールなら、1行でハイブリッド検索に切り替え可能。
④ 「再ランキング」で大事な資料だけ厳選
検索で50件出てきた資料を、CohereのRerank APIで「本当に役立つ10件」に絞る。例:図書館で本を50冊借りても読めないよね? 10冊に絞ればAIも集中できる。
⑤ 「クエリ拡張」で質問を賢くリライト
質問をAIに「別の言い方で3~5パターン作って」と頼むと、検索漏れが減る。例:「休暇申請のルール」→「バケーション申請」「休みを取る手順」も検索対象に。これを RAG-Fusion と言い、5~10%精度が上がる(論文より)。
⑥ メタデータで「古い資料」を除外
資料に「作成日」や「カテゴリ」をタグ付けして、検索を絞り込む。例:{"year": 2024, "lang": "ja"}とタグ付けすれば、2023年の古いマニュアルを無視。
⑦ 評価ツール「RAGAS」で改善をチェック
RAGの回答が「正確か」「質問に合ってるか」を RAGAS というツールで自動評価。例:毎日スコアをチェックして、検索のチューニングが効いてるか確認。
4. サンプルコード(LangChain 版)
from langchain.chat_models import ChatOpenAI
from langchain.retrievers import MultiQueryRetriever
from langchain.retrievers.document_compressors import CohereRerank
llm = ChatOpenAI(model_name="gpt-4o-mini")
# 1) ハイブリッド検索 + Multi-Query (RAG-Fusion)
hybrid_retriever = qdrant.as_retriever(search_type="hybrid", alpha=0.3)
multi_query = MultiQueryRetriever.from_llm(
retriever=hybrid_retriever, llm=llm, batch_size=3
)
# 2) 再ランキング
rerank = CohereRerank(model="rerank-english-v2", top_n=10)
# 3) チェイン
def answer(question):
docs = multi_query.get_relevant_documents(question)
top = rerank.compress_documents(docs, query=question)
return llm.predict_messages(
[{"role": "system", "content": "あなたは有能な社内アドバイザーです。"},
{"role": "user", "content": f"{question}\n\n参考資料:\n{top}"}]
)
print(answer("社内SaaSの最新版リリース日は?"))
5. 結論
- 検索精度=RAG 成功の 8 割
- ハイブリッド検索 → 再ランキング → クエリ拡張 が “効く3点セット”
- RAGAS で自動評価し、改善を回し続ける
これだけでも多くのプロジェクトが “検索ズレ→幻覚” を大幅に減らせます。