コンテンツにスキップ

【比較】Rerankerとベクトル検索の違い

概要

RAG(検索拡張生成)の検索パートを設計すると、必ず出てくるのが ベクトル検索(vector search) と Reranker(リランカー、再ランク付け) です。どちらも「クエリに関連する文書を上位に出す」役割なので競合に見えますが、実際は 同じパイプラインの別ステージ で、競合ではなく補完関係です。

ベクトル検索は bi-encoder(バイエンコーダ) で文書とクエリを 別々に 埋め込み、その近さを ANN(近似最近傍)で高速に探す 第1段(first-stage retrieval) です。大量の文書から候補を素早く絞れる代わりに、関連度はやや粗くなります。Reranker は cross-encoder(クロスエンコーダ) でクエリと文書を 一緒に モデルへ入れて関連度スコアを出す 第2段 で、第1段が返した上位 k 件だけを対象に精緻に並べ替えます。精度は高いが、事前計算した埋め込みが使えず計算が重いので全件には掛けられません。この「検索 → 再ランク(retrieve-and-rerank)」の二段構成が定石です。なお埋め込み・ベクトルそのものの違いは トークン・埋め込み・ベクトルの違い で扱っており、本記事はそれを前提に 検索の2ステージ を比べる補完テーマです。

例えるなら:大きな図書館で資料を探す

  • ベクトル検索 … 司書が請求記号(事前に振った索引=埋め込み)を見て、関連しそうな本を書架から手早く 100 冊ピックアップする。速いが、棚の分類だけなので “惜しいけど違う本” も混ざる。
  • Reranker … その 100 冊を、司書が 1 冊ずつ実際に質問と読み比べて「この質問にどれだけ答えているか」で並べ替える。精読するので的確だが、全蔵書には到底できない。だから「まず索引で 100 冊→精読で並べ替え」と二段で行う。

詳細比較

比較軸 ベクトル検索(vector search) Reranker(再ランク付け)
パイプライン上の役割 第1段:大量文書から候補を高速抽出(retrieval) 第2段:候補上位 k を精緻に並べ替え(rerank)
モデル構造 bi-encoder(クエリと文書を別々に埋め込み) cross-encoder(クエリと文書を一緒に入力)
スコアの作り方 事前計算した埋め込み同士の類似度(コサイン等) クエリ×文書ペアをモデルが直接採点
埋め込みの事前計算 可能(文書側を前もってインデックス化) 不可(ペアごとに都度推論が必要)
速度・スケール 高速・大規模向き(ANN で近似探索) 低速・重い。全件不可、上位 k のみ対象
関連度の精度 粗め(独立埋め込みゆえの取りこぼし・ノイズ) 高い(クエリと文書を突き合わせて評価)
探索の性質 近似(ANN は厳密 1 位を保証しない) 与えられた候補集合内での精緻な順位付け
典型ツール ベクトルDB+埋め込みモデル(bi-encoder) Cohere Rerank / cross-encoder モデル等
関係 Reranker への候補供給元 ベクトル検索の結果を磨く後段

定石は二段構成:bi-encoder で top-100 などを高速に取得 → cross-encoder でその 100 件だけを再ランク(Sentence-Transformers の retrieve-and-rerank)。

よくある誤解

  • 誤解1:「Reranker はベクトル検索の置き換え(どちらか一方を選ぶ)」 — 置き換えではなく補完です。Sentence-Transformers は「効率的な bi-encoder でクエリの上位 100 件を取得し、その 100 件を cross-encoder で再ランクする」と二段構成を明示しています。Reranker は第1段が返した候補集合に対して働くので、候補を供給するベクトル検索(や全文検索)が前段に必要です。
  • 誤解2:「Reranker の方が精度が高いなら、最初から全文書に Reranker を掛ければよい」 — 現実的に不可能です。cross-encoder はクエリと文書をペアで毎回モデルに通すため埋め込みを事前計算できず、Sentence-Transformers も「クラスタリングに cross-encoder を使うと約 5000 万回比較で約 65 時間、bi-encoder なら埋め込み 5 秒」という規模差を挙げています。だから「広く速く絞る bi-encoder → 上位だけ精密な cross-encoder」と分担します。
  • 誤解3:「ベクトル検索は意味で探すから、常に最も関連する文書が 1 位に来る」 — 来るとは限りません。ベクトル検索はクエリと文書を独立に埋め込んだ近さで測り、しかも ANN は近似探索なので、関連はするが最適ではない文書が上位に紛れます。Pinecone も再ランクを「RAG の品質を上げる最も簡単な方法の一つ」と位置づけ、初期結果を採点し直して「より正確な新しい順位」を返すと説明しています。第1段の順位は“完璧な正解順”ではありません。
  • 誤解4:「Reranker は文書を新たに検索してくる」 — 検索はしません。Cohere の説明どおり Rerank は「クエリと文書リストを受け取り、関連度の高い順に並べ替える」もので、入力された候補集合の並べ替えに徹します。新しい文書を母集合から引いてくるのは前段(ベクトル検索や全文検索)の仕事です。

実務での選び分け

  • 大規模コーパスから候補を高速に絞る土台が要る → ベクトル検索(bi-encoder+ベクトルDB)。まずここで recall(取りこぼさず広く拾う)を確保。
  • 「関連しそうな文書は取れているのに、上位の並びが今ひとつ/無関係が上に来る」 → Reranker を後段に追加。top-50〜100 を cross-encoder で精緻化し、最終的に LLM へ渡す件数を絞る。
  • レイテンシ・コストが厳しい → Reranker に渡す候補 k を小さく(例:top-100→top-20)して採点回数を抑える。全件には掛けない。
  • 品質と速度の切り分け → 「関連文書がそもそも候補に入っていない=第1段(埋め込みモデル選定・チャンク設計)の問題」「候補には入っているが順位が悪い=第2段(Reranker 導入・k 調整)の問題」とステージで分ける。
  • 前提知識の整理 → 埋め込み・ベクトルの語が曖昧なら先に トークン・埋め込み・ベクトルの違い を押さえると、bi-encoder/cross-encoder の違いが腑に落ちる。

ひとことまとめ

ベクトル検索は「bi-encoder で別々に埋め込み、ANN で大量文書から候補を高速・近似抽出する第1段」、Reranker は「cross-encoder でクエリと文書を一緒に採点し、上位候補だけを精緻に並べ替える第2段」。競合ではなく「検索 → 再ランク」の二段で組み合わせるのが定石で、速くて粗い前段と、重くて正確な後段の役割分担と捉えると混同しません。

出典・参考

  • Sentence-Transformers「Cross-Encoders」(bi-encoder は文を独立に埋め込み高速比較/cross-encoder はペアを同時入力して関連度を採点。bi-encoder で top-k 取得→cross-encoder で再ランクする retrieve-and-rerank、規模差の具体例): https://www.sbert.net/examples/applications/cross-encoder/README.html
  • Pinecone Docs「Rerank results」(インデックスで関連結果を取得→クエリと結果を再ランクモデルへ送り、意味的関連度で採点し直してより正確な新しい順位を返す二段検索。RAG 品質改善の簡単な手段): https://docs.pinecone.io/guides/search/rerank-results
  • Cohere Docs「Rerank overview」(query と documents を受け取り、最も意味的に関連する順に文書を並べ替える=候補集合の再順位付け): https://docs.cohere.com/docs/rerank-overview