RAG検索の3択+融合 — Dense/BM25/SPLADE を RRF で混ぜて JMTEB 11タスクで検証¶
作成日: 2026-06-29 出典 / きっかけ: TAIMO「RAGの検索、結局どれが強い?Dense/BM25/SPLADE を RRF で混ぜて11タスクで検証した結果」(Zenn, 2026-04-19, https://zenn.dev/taimo/articles/28a1d0eccbc199) を起点に、SPLADE原典・JMTEB・モデルを一次資料で裏取りして体系化 関連: rag_hybrid_search_bm25_embedding_rrf_整理(BM25+Embedding+RRFの概念編。本ノートはその実測検証編)、vectordb_recommendation_整理
0. 要点(3行)¶
- 検索手法は 3系統 ある — Dense(埋め込み・意味)/Lexical(BM25・完全一致)/Sparse-learned(SPLADE・学習した疎ベクトル)。SPLADEは「BM25の語彙一致」と「埋め込みの語拡張・重み学習」の中間に位置する第3の選択肢。
- JMTEB 11タスク(NDCG@10)で7パターンを比較した結果、3-way(D+L+S)が総合1位。ただし強さの正体は「尖りではなく転びにくさ」=どのデータセットでも4位以下に落ちない安定性。個別タスクではほぼ単体手法に負ける(3-wayが単独首位はTitleAbsの1タスクのみ)。
- 教訓: クエリ分布が読めない汎用RAG → ハイブリッド(保険)、クエリ傾向が既知のドメイン特化 → 単体手法を最適化。「混ぜれば最強」ではなく「混ぜると事故らない」が正しい理解。
1. 検索手法は3系統ある(Dense / Lexical / Sparse-learned)¶
rag_hybrid_search_bm25_embedding_rrf_整理 では Dense と BM25 の2系統で説明したが、実際には学習した疎ベクトル(SPLADE) という第3系統がある。
| 系統 | 代表 | 何で引くか | 得意 | インデックス |
|---|---|---|---|---|
| Dense(密ベクトル) | text-embedding-3-large 等 | 意味の近さ(コサイン類似度・ANN) | 言い換え・類義語・文脈 | ベクトル(HNSW等) |
| Lexical(疎・規則) | BM25 | 語の頻度・希少度(TF-IDF系) | 固有名詞・型番・完全一致 | 転置インデックス |
| Sparse-learned(疎・学習) | SPLADE | 学習した語の重み+語拡張 | 完全一致を保ちつつ同義語も拾う | 転置インデックス |
ポイントは、SPLADE は Dense と Lexical の「いいとこ取り」を狙う中間種だということ。
2. SPLADE とは — 「学習する BM25」¶
SPLADE(Sparse Lexical and Expansion model) は Formal, Lassance, Piwowarski, Clinchant(NAVER LABS Europe, 2021。SPLADE / SPLADE v2 = arXiv:2109.10086)が提案した学習型の疎ベクトル検索。
仕組み(一次資料に基づく): - BERT の MLM(Masked Language Modeling)ヘッドを使い、入力文を語彙次元の疎ベクトル(ほとんどが0、一部の語だけ重みを持つ)に変換する。 - このとき語の重み付け(re-weighting)と語の拡張(expansion)を同時に学習する。=原文に無い同義語・関連語にも重みが立つ。 - 出力は疎なので、BM25と同じ転置インデックスに載せて高速検索できる。
直感: BM25は「書いてある語をそのまま数える」。SPLADEは「書いてある語+関連語まで、重要度を学習して数える」。BM25の高速さ(転置インデックス)を保ったまま、埋め込み的な意味拡張を足したもの。だから「学習するBM25」と捉えると早い。
本検証で使われた日本語モデルは hotchpotch/japanese-splade-v2(base: japanese-splade-base-v1_5、YAST で学習、推論は YASEM ライブラリ。実在を HuggingFace で確認)。
3. 検証セットアップ(再現条件)¶
| 項目 | 内容 |
|---|---|
| ベンチマーク | JMTEB(Japanese Massive Text Embedding Benchmark, SB Intuitions)の Retrieval 11タスク |
| 評価指標 | NDCG@10(上位10件の順位品質。1.0が満点) |
| Dense | OpenAI text-embedding-3-large |
| Lexical | BM25(トークナイザは kuromoji) |
| Sparse | hotchpotch/japanese-splade-v2 |
| 検索エンジン | Elasticsearch 9.4.0(密・疎・転置を1基盤で扱う) |
| 融合 | RRF、k=60(Elasticsearch既定。順位の逆数を手法横断で合算) |
JMTEB は v2.0 で28データセット/5タスク種別に拡張され、現在は MTEB Leaderboard(Japanese)に統合されている。本検証の11タスクは Retrieval サブセット(Jaqket, MrTyDi, GovFaqs, TitleAbs/Intro 系, JaCWIR, MIRACL, Mintaka, MultiLongDoc 等)。
4. 結果 — NDCG@10 全タスク(太字=各タスク最高)¶
7パターン(単体3 + 2-way 3 + 3-way 1)の比較:
| 手法 | Jaqket | MrTyDi | GovFaqs | TitleAbs | TitleIntro | AbsIntro | AbsArticle | JaCWIR | MIRACL | Mintaka | MultiLongDoc |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3-way (D+L+S) | 0.7716 | 0.7764 | 0.7034 | 0.9825 | 0.9243 | 0.9728 | 0.9722 | 0.9591 | 0.9496 | 0.2320 | 0.4948 |
| 2-way A (D+L) | 0.7137 | 0.7215 | 0.6789 | 0.9696 | 0.9668 | 0.9939 | 0.9753 | 0.9461 | 0.9097 | 0.2355 | 0.5238 |
| 2-way B (D+S) | 0.6965 | 0.8209 | 0.7265 | 0.9760 | 0.8916 | 0.9539 | 0.9459 | 0.9416 | 0.9453 | 0.2752 | 0.3951 |
| 2-way C (L+S) | 0.8148 | 0.7439 | 0.6705 | 0.9711 | 0.8749 | 0.9535 | 0.9592 | 0.9781 | 0.9358 | 0.1613 | 0.4666 |
| Dense のみ | 0.6065 | 0.8171 | 0.7119 | 0.9666 | 0.9542 | 0.9934 | 0.9238 | 0.9210 | 0.9326 | 0.3930 | 0.3791 |
| BM25 のみ | 0.7829 | 0.5974 | 0.5996 | 0.9633 | 0.9435 | 0.9905 | 0.9942 | 0.9624 | 0.8502 | 0.1143 | 0.5991 |
| SPLADE のみ | 0.8003 | 0.8566 | 0.7152 | 0.9752 | 0.8021 | 0.9028 | 0.8998 | 0.9794 | 0.9858 | 0.2040 | 0.3416 |
読み取れること: - 各タスクの最高値は手法がバラバラ。SPLADEが3冠(MrTyDi, JaCWIR, MIRACL)、BM25が2冠(AbsArticle, MultiLongDoc)、Denseが1冠(Mintaka)、2-wayが残りを分け合う。「常勝の単体手法」は存在しない。 - SPLADEは振れ幅が最大: 最高 0.8566(MrTyDi)〜最低 0.1613相当の弱さ(Mintaka 0.2040)。強いが、ドメイン次第で大崩れする(学習データ依存)。 - Mintaka(エンティティQA)はDenseの独壇場(0.393 vs 3-wayの0.232)。逆に MultiLongDoc(長文)はBM25が強い(0.599 vs 3-wayの0.495)。
5. 総合順位 — 「尖り」でなく「転びにくさ」の指標¶
著者は各タスクの順位を再び RRF で合算して総合点を出している(=順位の安定性スコア)。
| 順位 | 手法 | 総合RRFスコア | 最高順位 | 最低順位 |
|---|---|---|---|---|
| 1 | 3-way (D+L+S) | 0.1736 | 1位(1回) | 4位 |
| 2 | 2-way A (D+L) | 0.1728 | 1位(2回) | 6位 |
| 3 | 2-way B (D+S) | 0.1725 | 1位(1回) | 6位 |
| 4 | SPLADE のみ | 0.1724 | 1位(3回) | 7位 |
| 5 | Dense のみ | 0.1711 | 1位(1回) | 7位 |
| 6 | 2-way C (L+S) | 0.1710 | 1位(1回) | 6位 |
| 7 | BM25 のみ | 0.1709 | 1位(2回) | 7位 |
解釈の注意(重要): - この総合スコアは NDCGの絶対値ではなく「7手法の順位を11タスクで RRF 集約したメタ指標」。だから 1位 0.1736 と最下位 0.1709 の差はごくわずか。「どれも総合では壊滅的に悪くはない」を意味するだけで、個別タスクの大差(§4)こそが実態。 - 3-wayが1位なのは最低順位が4位=一度も大コケしないから。単体手法は1位を何度も取る一方、苦手タスクで7位に沈む(SPLADE/Dense/BM25いずれも最低7位)。 - 3-wayの価値 = 分散の小ささ(保険)。手法どうしが互いの穴を埋め合う。ピーク性能は単体に譲る。
N. まとめ — いつ何を選ぶか¶
一言: ハイブリッド(特に3-way)は「最強」ではなく「最も安定」。クエリが読めないなら混ぜ、読めるなら単体を磨く。
| 状況 | 推奨 | 根拠 |
|---|---|---|
| クエリ分布が読めない汎用RAG | 3-way(D+L+S) | どのタスクでも4位以下に落ちない安定性 |
| エンティティ/事実QAが主 | Dense中心 | Mintakaで単体0.393 vs 3-way0.232 |
| 長文ドキュメント検索が主 | BM25中心 | MultiLongDocで単体0.599 vs 3-way0.495 |
| 一般的な短文検索・多言語 | SPLADE中心 | MrTyDi/MIRACL/JaCWIRで単体首位。ただしドメイン外で大崩れに注意 |
| コスト最小で底上げしたい | 2-way(D+L) | 3-wayとほぼ同点で、SPLADE運用(GPU推論・モデル管理)を省ける |
実務の勘所: - SPLADE導入は「日本語学習済みモデル(japanese-splade-v2等)+転置インデックス対応エンジン(ES 9.x)」が前提。Denseに比べ学習データドメイン依存が強いので、自ドメインでの NDCG 実測は必須。 - まず2-way(Dense+BM25)で基準を作り、SPLADE追加(3-way化)が自データで本当に上乗せするかを A/B で確認してから採否を決めるのが堅実。
参考リンク¶
- 出典: TAIMO「RAGの検索、結局どれが強い?Dense/BM25/SPLADE を RRF で混ぜて11タスクで検証」— https://zenn.dev/taimo/articles/28a1d0eccbc199
- 同著者の続報: 共有index方式でのBM25の落とし罠 on Elasticsearch — https://zenn.dev/taimo (フィード参照)
- SPLADE 原典: Formal et al., "SPLADE v2: Sparse Lexical and Expansion Model for Information Retrieval" (arXiv:2109.10086) — https://arxiv.org/abs/2109.10086
- SPLADE 解説: Pinecone — SPLADE for Sparse Vector Search — https://www.pinecone.io/learn/splade/
- 日本語モデル: hotchpotch/japanese-splade-v2 — https://huggingface.co/hotchpotch/japanese-splade-v2
- JMTEB(SB Intuitions)— https://github.com/sbintuitions/JMTEB / https://huggingface.co/datasets/sbintuitions/JMTEB
- RRF 原典(k=60): Cormack, Clarke, Büttcher (SIGIR 2009) — https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
作成: 2026-06-29 / 最終更新: 2026-06-29