6月26日、Java Code Geeksが「Improving RAG Retrieval with Contextual Embeddings and Hybrid Search」と題した記事を公開した。RAGの精度問題の本質は、チャンク分割によって文脈が断ち切られる「チャンク断片化」と、キーワード検索と意味検索それぞれが持つ盲点にある——この2つの欠陥をコンテキスト埋め込みとハイブリッド検索の組み合わせで同時に解消するアプローチを、パイプライン設計まで含めて詳述している。
RAGの「弱いリンク」は検索層にある
RAG(Retrieval-Augmented Generation)は、言語モデルが推論時に外部知識を参照できるようにするアーキテクチャだ。ハルシネーション(事実と異なる内容を生成する現象)を抑制し、ドメイン特化の知識を扱えるとして広く採用されている。
しかし本番環境でのRAGは、思ったほど動かないことが多い。AnthropicやLangChainをはじめとする各社が蓄積した知見でも、RAGの失敗パターンとして繰り返し言及されるのは、モデルの能力不足ではなく検索層(Retrieval Layer)の設計不足だ。検索が不完全・不正確な情報を返せば、モデルは誤った文脈から「自信を持って誤った回答」を生成する。これが特に厄介なのは、間違いが検出しにくいという点だ。
記事では、検索失敗の根本原因を3つに整理している。
- 語彙ミスマッチ(Lexical Mismatch):キーワード検索では、クエリと文書が異なる表現を使っていると意味が一致していても取得できない
- 意味的ドリフト(Semantic Drift):埋め込みベースの検索では概念的に近いが文脈的に不適切な文書を拾ってしまう(例:あるプログラミング言語の質問に対して別の言語の文書が返る)
- チャンク断片化(Fragmentation):長い文書を分割してインデックスする際、前後の文脈が失われ、取得したチャンクが不完全になる
コンテキスト埋め込みで「表現」を修正する
静的な埋め込み(Static Embedding)は、単語やフレーズに固定のベクトルを割り当てる。これに対してコンテキスト埋め込み(Contextual Embedding)は、周囲のテキストや意図に応じて意味を動的に調整する。
RAGのクエリは往々にして短く、曖昧で、意味が一意に定まらない。静的埋め込みはこの曖昧さを解消できないが、コンテキスト埋め込みは「テキストそのもの」ではなく「そのテキストがより広い意味環境の中で持つ意味」をエンコードする。BERTやその後継モデルが採用しているこのアプローチは、同じ単語でも文脈によって異なるベクトル表現を生成できる点が根本的な違いだ。
実装上は、クエリ拡張(Query Expansion)や文脈を考慮したチャンク分割との組み合わせが有効とされる。クエリ拡張は入力に関連概念を補完し、適切なチャンク設計は各検索単位が完結した情報を保持することを保証する。LangChainではチャンク分割にRecursiveCharacterTextSplitterが広く使われるが、単純な文字数による分割はチャンク断片化の温床になりやすい。意味的な区切りを意識した分割ロジックへの移行が、コンテキスト埋め込みの効果を最大化する前提条件となる。
ハイブリッド検索で「選択」を修正する
コンテキスト埋め込みだけでは、検索精度の問題は完全には解決しない。そこでハイブリッド検索(Hybrid Search)が必要になる。
ハイブリッド検索は以下の2方式を組み合わせる:
- スパース検索(Sparse Retrieval):BM25などのキーワードベース手法。完全一致に強く、技術識別子や固有名詞・APIメソッド名などの検索に特に適している
- デンス検索(Dense Retrieval):埋め込みベースの手法。言い換えや会話調のクエリ、同義語を含む自然言語検索に強い
両者はそれぞれ異なる盲点を持つ。意味検索が見逃したキーワード依存の文書はスパース検索が補い、語彙の表記ゆれでキーワード検索が失敗すればデンス検索が補う。再現率(Recall)と精度(Precision)の双方を改善できる点が最大の利点だ。
この組み合わせはベクトルデータベース側でもサポートが進んでいる。Weaviateはハイブリッド検索をネイティブに提供しており、pgvectorをPostgresで使用する場合もBM25の実装と組み合わせることで同等の構成が実現できる。スコアの統合にはRRF(Reciprocal Rank Fusion)が広く使われ、それぞれのランキング結果を重みづきで統合して最終的な順位を決定する。
パイプライン全体の設計
記事では、信頼性の高いRAGを実現するための検索パイプライン設計も示している。
- 文書前処理:生データのクリーニングと意味的に完結したチャンクへの分割
- デュアルインデックス構築:スパース・デンス両方でインデックスを作成
- クエリ処理:入力の意図を捉え、関連概念で拡張
- ハイブリッド取得と再ランキング:両インデックスから候補を取得し統合・再順位付け
- コンテキストウィンドウの組み立て:論理的な流れと完全性を持つ文脈を生成モデルに渡す
この設計思想のポイントは、検索を「単なる類似文書の発見」ではなく「生成に必要な文脈の構築」として捉え直すことにある。コンテキスト埋め込みが表現レベルで意味の精度を上げ、ハイブリッド検索が選択レベルで取りこぼしを防ぐ。この2層の組み合わせが、相互補完的に機能する。
なお、再ランキングのステップではCohere Rerankのようなクロスエンコーダーベースのモデルを用いることで、候補文書とクエリの適合度をより精密に評価できる。ハイブリッド取得で幅広く候補を集め、再ランキングで絞り込むという2段階構成が、現時点での実践的なベストプラクティスとして定着しつつある。
詳細はImproving RAG Retrieval with Contextual Embeddings and Hybrid Searchを参照していただきたい。




