RAG(検索拡張生成)システムを構築したものの、「LLMが的外れな回答をする」「必要なドキュメントを検索できていない」という壁にぶつかることは少なくありません。
RAGの精度は「LLMの性能」以上に「検索(Retrieval)の精度」に大きく依存しています。
本記事では、検索の精度を劇的に引き上げるための4つのアプローチ(チャンク設計、埋め込みモデル選定、ベクトル空間の工夫、類似度演算の工夫)について、それぞれのメリット・デメリットを交えて実践的な観点から解説します。
- チャンク設計(Chunking Strategy)の工夫
テキストをどのように分割(チャンク化)するかは、検索ノイズを減らすための第一歩です。単純な文字数分割(Fixed-size chunking)から一歩踏み出す必要があります。
意味的チャンク分割(Semantic Chunking)
句読点や段落、改行などの「意味の区切り」で分割するアプローチです。LangChainの RecursiveCharacterTextSplitter などが代表的です。
メリット: 途中で文が途切れることを防ぎ、文脈の欠落を抑えられます。実装も比較的容易で、どんなテキストにも汎用的に使えます。
デメリット: 意味の区切りに依存するため、チャンクサイズ(文字数)が不均一になりやすいです。また、改行ルールが特殊なドキュメントではうまく機能しないことがあります。
構造化チャンク分割(Structural Chunking)
Markdownの見出し(#, ##)やHTMLのタグベースで分割します。
メリット: 章や節ごとにチャンク化されるため、「特定のトピックに関するまとまった情報」をそのままベクトル化でき、検索の意図ズレが劇的に減ります。
デメリット: 入力ドキュメントが事前に構造化(タグ付け・マークダウン化)されている必要があります。単なるOCRテキストや構造を持たないプレーンテキストには適用できません。
Parent Document Retriever (Small-to-Big アプローチ)
「検索には小さなチャンクを使い、LLMに渡す文脈は元の大きなドキュメント(親ドキュメント)を使う」という手法です。
メリット: 「ノイズが少なく高精度にマッチする(小チャンク)」と「文脈を失わない(大ドキュメント)」という、検索と生成のいいとこ取りができます。
デメリット: ベクトル検索用のDBと、親ドキュメントを保存するKey-Valueストア(Docstore)の2つを管理する必要があり、システム構成とデータ同期がやや複雑になります。
- 埋め込みモデル(Embedding Model)の選定
テキストをベクトル化するモデルの良し悪しが、そのまま意味検索の精度になります。
日本語(多言語)対応とMTEBランキングの活用
英語ベースのモデルでは日本語の意味を正しく捉えられません。OpenAI text-embedding-3 や、Cohere embed-multilingual-v3.0、オープンモデルの multilingual-e5-large などを選びます。
メリット: 言語の壁を越えた意味検索が可能になり、MTEB(Massive Text Embedding Benchmark)という評価指標を参考にすることで、客観的に性能の高いモデルを選べます。APIを使えばインフラ管理も不要です。
デメリット: API利用の場合はAPIコールごとの従量課金とデータ外部送信のセキュリティ確認が必要です。オープンモデルをローカルで動かす場合は、GPUなどのインフラ構築と保守の手間がかかります。
タスクに合わせたファインチューニング
Sentence-Transformersなどを用いて、自社データでEmbeddingモデル自体を学習(チューニング)させます。
メリット: 社内特有の専門用語、略語、特定の業界知識(医療や法務など)に対する類似度計算の精度が圧倒的に向上します。汎用モデルでは辿り着けない領域まで最適化可能です。
デメリット: 「クエリと正解ドキュメントのペア」といった学習用データセットを大量に作成する労力が必要です。また、機械学習モデルの学習に関する専門知識と計算リソースが求められます。
- ベクトル空間の工夫
ベクトルDB上のデータをどのように配置・フィルタリングするかの工夫です。
ハイブリッド検索(Hybrid Search)の導入
「ベクトル検索(意味検索)」と「キーワード検索(BM25などのスパース検索)」を組み合わせる手法です。
メリット: 「iPhone 15とiPhone 14」のような型番・固有名詞の完全一致(キーワード検索)と、表記揺れに強い(ベクトル検索)の両方をカバーでき、検索の死角がほぼなくなります。
デメリット: ベクトルとキーワードの両方のインデックスをDB上に構築・維持する必要があります。また、2つの検索結果を統合するアルゴリズム(RRF: Reciprocal Rank Fusionなど)の重み付け調整の手間が増えます。
メタデータ・フィルタリング
チャンクをDBに保存する際、テキストだけでなくメタデータ(作成日時、カテゴリ、作成者など)を付与しておきます。検索クエリから条件を判定し(Self-Queryingなど)、先にメタデータでベクトル空間を絞り込んでから類似度検索を行います。
メリット: 検索空間を物理的に絞るため検索スピードが向上し、無関係なノイズ(別部署の同名資料など)の混入を100%防ぐことができます。
デメリット: データ登録時にメタデータを正確に付与・抽出する前処理の仕組みづくり(データパイプライン構築)が大変です。クエリから条件を判定するSelf-Queryingを使う場合は、都度LLMのAPIコストがかかります。
- 類似度演算(Similarity Calculation)の工夫
計算方法や、検索結果の並び替え(リランキング)によって、最終的にLLMに渡す上位K件の質を高めます。
距離計算アルゴリズムの最適化
モデルによって、学習時に最適化されている距離関数が異なります。モデルの推奨設定に合わせることが必須です。
メリット: 設定ひとつでモデル本来の性能をフルに引き出せます。ベクトルが正規化されている場合、内積(Dot Product)を選ぶことでコサイン類似度と同等の結果を得つつ計算コストを大幅に下げられます。
デメリット: デメリットというより注意点として、Embeddingモデルを変更した際にDB側の距離関数設定も忘れずに合わせないと、全く見当違いな検索結果になるリスクがあります。
MMR(Maximal Marginal Relevance)による多様性の確保
通常の類似度検索では、上位に「全く同じ内容が書かれた別のドキュメント」ばかりが並ぶことがあります。MMRは「クエリとの類似度」と「既に選ばれたドキュメントとの非類似度(多様性)」のバランスを取って取得します。
メリット: 同じような内容が上位を独占するのを防ぎます。多角的な情報がLLMに渡るため、偏りのない包括的な回答が生成されやすくなります。
デメリット: 多様性を重視しすぎる(パラメータ調整ミス)と、関連性の低いドキュメントが上位に混入してしまい、かえってハルシネーション(嘘の回答)を誘発する恐れがあります。
リランカー(Cross-Encoder / Reranker)の導入【最重要】
検索精度を上げるための「最後の切り札」です。
まずベクトル検索で広めに候補を取得する(例: トップ20件)。
その20件とクエリのペアを、Cross-Encoder(Cohere Rerankやbge-rerankerなど) に入力し、関連度スコアを再計算(リランク)する。
再計算された上位5件をLLMに渡す。
メリット: クエリとドキュメントの文脈のつながりをより深く・緻密に解釈できるため、検索精度(上位K件の質)が劇的に跳ね上がります。既存のシステムに後付けしやすいのも強みです。
デメリット: Cross-Encoderの計算処理は重いため、検索ごとのレイテンシ(応答時間)が目に見えて増加します。また、CohereなどのRerank APIを利用する場合は追加のAPIコストが発生します。
まとめ
RAGの精度向上に「銀の弾丸」はありませんが、各アプローチのトレードオフを理解した上で以下のステップで改善を進めるのが王道です。
まずは実装コストに対して効果が高い チャンクの最適化(意味的分割など) と ハイブリッド検索 を導入する。
それでも上位検索にノイズが乗る場合は、レイテンシ増加を許容して リランカー(Reranker) を追加する。
特定の専門領域(ドメイン知識)で精度が出ない場合は、手間をかけて メタデータフィルタリング や Embeddingのファインチューニング に踏み込む。
これらを要件(応答スピード、予算、データ特性)に合わせて組み合わせることで、実戦投入に耐えうるRAGシステムに進化させることができるはずです。