世界を動かす技術を、日本語で。

RAGはあなたが思っているよりも簡単です

概要

  • 多くのRAGスタックは 過剰設計 されがちで、ユーザーのニーズに合っていない場合が多い
  • 検索要件 ごとに最適な技術選択が重要
  • BM25や全文検索 は多くのケースで十分な効果
  • 埋め込み・ベクタDB は必要性を見極めて段階的に導入
  • クエリリライト・ハイブリッド検索 など柔軟なアプローチが有効

RAGスタック設計の原則と最適化

  • AI検索システム でも「適材適所」の原則が重要
  • まずは ユーザーの本当のニーズ (例:「パスワードリセット方法」)を把握
  • 過剰な技術導入 (埋め込み、ベクタDB、再ランキング等)は段階的に検討
  • 主要な判断軸は以下の5点
    • データ鮮度要件 :リアルタイム性・更新頻度による手法選択
    • コーパス特性 :ドキュメントの安定性・長尾分布の有無
    • クエリパターン :キーワード中心か、意味的・会話的か
    • スケール・性能 :1日あたりのクエリ数に応じた最適化
    • チームの技術力 :ML経験の有無で選択肢が変化

最初に試すべき全文検索(BM25等)

  • BM25/Elasticsearch/Postgres全文検索 は「埋め込み」以前から存在
  • キーワード型クエリ完全一致 が重要な場合に最適
  • ML不要・デバッグ容易・APIコストゼロ・高速 (10ms以下)
  • 専門用語や社内用語 にも強い
  • 同義語・意味的検索 は苦手だが、多くのユースケースをカバー
  • チャンク分割や評価・モデル更新リスク も不要

クエリリライトによる検索精度向上

  • LLMでユーザークエリをキーワード化 し、全文検索精度を向上
  • 語彙ミスマッチ社内用語 にも柔軟対応
  • APIコスト低 (例:GPT-4o-miniで1クエリ0.001ドル)
  • 同義語追加・用語変換・複雑クエリ分解 が容易
  • 埋め込みと違い、システムプロンプト調整だけで即時評価可能

ハイブリッド検索(BM25+埋め込み再ランキング)

  • BM25で候補抽出後、埋め込みで再ランキング
  • キーワードと意味的理解 の両立
  • データが安定・許容可能なレイテンシ(100-500ms) で有効
  • コスト・速度のトレードオフ に注意
  • チャンク分割戦略や再埋め込みの負担 が発生

オンザフライ埋め込み(高頻度更新・リアルタイム対応)

  • 高頻度更新やリアルタイム性重視 で有効
  • 全ドキュメント再埋め込み不要、API呼び出しのみでモデル切替可能
  • レイテンシ(200-500ms) が許容できる場合のみ推奨
  • ストレージコスト低・常に最新データ

ホット/コールドティア(アクセス頻度による分割)

  • アクセス頻度の高い文書のみ事前埋め込み(ホット)、それ以外はオンザフライ(コールド)
  • パレート分布 (20%が80%のトラフィック)に最適
  • 大規模・中規模コーパス で、コスト・レイテンシ・柔軟性のバランスが良い
  • モデル切替時の再埋め込みコストも最小化

フル事前埋め込み(大規模・安定コーパス向け)

  • 全ドキュメント事前埋め込み+ベクタDB
  • 10K/日以上の高クエリ数・50ms以下の超高速性
  • コーパスが安定・アクセス分布が均一 な場合のみ推奨
  • モデル切替・頻繁なデータ更新には不向き
  • 過剰設計になりやすいので注意

エージェント型RAG(複数意図のクエリ分解)

  • 「CSV読み込み・欠損値処理・グラフ化」など複数意図クエリ を分解
  • サブクエリごとに最適処理・並列実行・コスト最適化
  • エージェントが複雑な処理を自動選択
  • 高品質・低コスト・良UXの実現

最適なRAG構成の選び方

  • まずBM25など全文検索から開始
  • 2-4週間ユーザーフィードバックを収集し、課題を特定
  • 「見つからない」→クエリリライトをA/Bテスト
  • 「結果は悪くないが物足りない」→ハイブリッド検索をA/Bテスト
    • 頻繁更新→オンザフライ埋め込み
    • 明確なホットドキュメント→ホット/コールドティア
    • 安定・大規模→フル事前埋め込み
  • 「意味的理解が必要」→ハイブリッド検索を状況に合わせて選択
  • 最適化は段階的に、シンプルなアプローチから始めるのが鉄則

まとめ

  • 全文検索+クエリリライト は多くのユースケースで十分
  • 埋め込みやベクタDB は必要性を見極めて導入
  • 過剰設計を避け、段階的な最適化 が成功の鍵
  • ユーザー視点・実データ・現実的な運用コスト を常に意識

Hackerたちの意見

ここ数年、こういうブログはたくさんあったよね。確かに、埋め込みは計算負荷が高いけど、全然難しくないし、めっちゃメリットがあるんだ。ドキュメントベースのRAGプロジェクトの90%は、埋め込みを使ったセマンティックサーチを主要な手法として考えるべきだよ。すごく強力で、実装も簡単だから、パフォーマンスが問題になるかどうかを予測するよりも、試してみる方がいいと思う。

埋め込みは割とシンプルだけど、そこにたどり着くまでの道のりは大変で、僕が書いた犬に関する詳しい説明が誇りなんだ:https://sgnt.ai/p/embeddings-explainer/

略語を初めて使うときにちゃんと説明しない記事には特にイライラするんだよね。だから、ここ見てみて:https://en.wikipedia.org/wiki/Retrieval-augmented_generation

BM25をレッド・アンバー・グリーンする必要があるときに。

この文章の読者はすでにRAGに詳しいから、例えばOLEDスクリーンについての記事で略語の説明をされるのは嫌なんだ。そんなのは、記事が自分のレベルに全然達してないってことのサインだから。

もっとシンプルな考え方もあるよ:最初に全部埋め込んで、変更されたものを追跡するだけ。安いモデルを使って、ドキュメントやチャットを要約したり整理したりするのがいいよ。全ての本を埋め込むわけじゃなければ、APIコールは数百ドルで済むはず。そしたら、全部BigQueryに放り込んで。ベクトル関連の処理はネイティブで対応してるし、全知全能で魔法のように見えるエージェントボットのUIを上に乗せればいい。Google以外の他のベンダーも似たような使いやすいアプローチがあると思うよ。

そうそう、最初からどこかのベンダーにロックインするのはいいアイデアだね!

すべてを最初に埋め込むのが前提だね。これって、テキストが小さい場合の話だけど。PDFレポートを埋め込もうとしたら、運が悪いことになるよ。ほとんどの埋め込みには収まらないだろうね。書籍やニュース記事、医療レポート、保険請求書など、もっと例はたくさんあるけど、どれも「一度に全部インデックス化する」には大きすぎるよ。

大規模なRAGシステムに関わったことがあるけど、みんなフルテキスト検索を過小評価して、埋め込みを過大評価してると思う。FTSは本当に簡単で、ポータブルでスケーラブルだから、かなりのところまで行けるんだ。80/20の法則が当てはまるよ。埋め込みはいい感じに見えるけど、実際にやってみると、セマンティックな類似性は思ったほど良くないし、みんなが満足するわけでもない。より正確な埋め込み検索に対応するために、テキストの一部を再埋め込みしなきゃいけなくなることが必ずあるから、その時点で最後のマイルを進んで再ランク付けとかしなきゃいけなくなる。そうすると、500個のキーワードを使った検索クエリを作る羽目になって、確かに痛いけど、それがうまく機能するし、全てのユースケースに対応できて、スケールもするし、全体的にメンテナンスも楽なんだよね。

テキスト検索が最初に試すべきことだと思ってたんだけど、その次はファジー検索、最後にRAGに行く感じじゃない?

もう少し詳しく教えてくれる?うちには異なる言語で検索している技術者がいるんだ。それに、知識ベースもいろんな言語で構成されてる。フルテキスト検索がどう機能するのか、全然想像できないんだけど?ウィキみたいな問題空間では、みんなが何を検索すべきか分かってるから、うまくいくのかな?

LLMがクエリを実行する時に、完全なテキスト検索の必要性を過大評価してる人もいると思う。もし基盤となるデータが顧客データベースのような構造化されたレコードなら、人間は電話番号で検索したい時に、連絡先テーブルからユーザーテーブルに結合して、まず電話番号を正規化する必要があるって理解する時間やスキルがないかもしれない。でもエージェントは、正しいスキルとスキーマ情報があれば、特定のフィールドに一致するレコードを見つけるためのSQLを手作業で作るのが得意なんだ。あいまいな検索を正確なDB検索に変えるのは、LLMがユーザーをサポートする素晴らしい方法だよ。(もちろん、実際のリッチなドキュメントデータの検索には当てはまらないけどね。その場合は、テキスト検索や埋め込みに全力を注ぐべきだよ。)

Hacker Newsで議論の続きを見る