が万能のように扱われる風潮がありますが、現場では「Elasticsearch などの全文検索 + 」のほうが上手くいくケースが少なくありません。今回は逆張り回として、シンプル路線が勝つパターンを共有します。
全文検索+LLM が勝つ3パターン
- 1質問が「キーワード明確型」:「請求書テンプレートのファイル名」「2024年Q3の売上」など、固有名詞がはっきりしている問い合わせ
- 2ナレッジ規模が小〜中(〜数千件):Embeddingの強みが出にくく、全文検索のチューニングのほうが速い
- 3運用人員のスキル分布:Elasticsearch / OpenSearch の経験者が組織内にいて、Embeddingベクトルストアの運用ノウハウがない
比較:全文検索 vs RAG
| 観点 | 全文検索 + LLM | RAG |
|---|---|---|
| セットアップ | 1日(既存ESに乗せる) | 2〜4週間 |
| コスト | ES の月額のみ | Embedding コスト + ベクトルDB |
| 精度(キーワード型質問) | 高い | やや劣る |
| 精度(曖昧質問) | やや劣る | 高い |
| 運用ノウハウ | 豊富 | 新しい |
| デバッグ | クエリログで容易 | なぜヒットしたか難解 |
ハイブリッド:全文検索 + の組み合わせ
結局のところ、両方やるのが現実解です。BM25(全文検索)と Embedding(ベクトル検索)の結果を Reciprocal Rank Fusion(RRF)でマージする手法は、シンプルかつ効果的。
RRF(Reciprocal Rank Fusion)の実装
Python
def rrf_merge(bm25_results, vector_results, k: int = 60): """全文検索とベクトル検索の結果をRRFでマージ""" scores = {} for rank, doc in enumerate(bm25_results, start=1): scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank) for rank, doc in enumerate(vector_results, start=1): scores[doc.id] = scores.get(doc.id, 0) + 1 / (k + rank) return sorted(scores.items(), key=lambda x: -x[1])選定の判断軸(私たちの実例)
ふくふくが過去の案件で実装したパターンの内訳:純粋RAG 30% / 全文検索のみ 25% / ハイブリッド 45%。「とにかくRAG」よりも「ハイブリッドで安全策」が最多です。
でハイブリッド実装
prompt:BM25+ベクトル ハイブリッド検索
既存の Elasticsearch + 新規 Embedding ベクトルDB を組み合わせた、ハイブリッド検索を実装してください。
## 要件
1. BM25 と ベクトル検索を並列実行(asyncio.gather)
2. RRF でスコアマージ
3. 上位 k=10 を返す
4. レイテンシ計測(全体、BM25のみ、Vectorのみ)
5. ログに「どちらが優勢か」を記録
## 既存構成
@search/elasticsearch_client.py
@search/vector_db_client.py
## 出力
@search/hybrid.py
@tests/test_hybrid.py 想定される実行結果(例示)
## ハイブリッド検索 実装完了
### ファイル生成
- `search/hybrid.py` (135行) - HybridSearch クラス、asyncio で並列実行
- `search/rrf.py` (38行) - RRFマージロジック
- `tests/test_hybrid.py` (95行) - 統合テスト含む
### 計測結果(評価セット100問)
| 検索方式 | Recall@10 | MRR | P95レイテンシ |
|---|---|---|---|
| BM25 のみ | 0.71 | 0.55 | 110ms |
| Vector のみ | 0.78 | 0.62 | 290ms |
| **Hybrid (RRF)** | **0.86** | **0.71** | 320ms |
### ログから見えた傾向
- キーワード型クエリ(39%)は BM25 優勢
- 曖昧型クエリ(45%)は Vector 優勢
- 残り16%は両方が補完
- → ハイブリッドの効果が高い裏付け
PR #602 を生成しました。次回予告
EP.07 は エージェント型RAG。「単発の検索」を超えて、AIが何度も検索をて答えに辿り着く設計を。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。