ベクトル類似度検索(ANN検索)(ベクトルルイジドケンサク)
ベクトル類似度検索とは、テキスト埋め込みベクトル間のコサイン類似度やユークリッド距離を計算してクエリに最も近いベクトルを高速に検索する手法で、近似最近傍(ANN: Approximate Nearest Neighbor)アルゴリズムにより数十億ベクトル規模でもミリ秒単位の検索を実現する。
ベクトル類似度検索は、テキスト埋め込みの最も重要な応用先である。ユーザーのクエリを埋め込みモデルでベクトル化し、データベースに格納された大量のベクトルの中から最も類似度の高いベクトル(=最も意味的に近い文書)を高速に検索する。全ベクトルとの総当たり比較(ブルートフォース)は計算コストがO(n)で、100万件を超えるとリアルタイム検索が困難になるため、ANN(近似最近傍)アルゴリズムが不可欠となる。
類似度指標
ベクトル間の近さを測る主要な指標は3つある。
コサイン類似度(Cosine Similarity)
- 2つのベクトルの角度の余弦を計算。値は-1〜1(1が最も類似)
- ベクトルの大きさ(ノルム)に依存しないため、テキスト埋め込みで最も広く使用
- 計算式: cos(A, B) = (A·B) / (||A|| × ||B||)
ユークリッド距離(L2 Distance)
- 2つのベクトル間の直線距離。値は0〜∞(0が最も類似)
- 正規化されていないベクトルでの距離計算に使用
- 計算式: d(A, B) = √(Σ(ai - bi)²)
内積(Dot Product / Inner Product)
- 2つのベクトルの要素ごとの積の和。正規化済みベクトルではコサイン類似度と等価
- MaxSim(ColBERT)やMIPS(Maximum Inner Product Search)で使用
- 計算式: A·B = Σ(ai × bi)
ANNアルゴリズム比較
| アルゴリズム | 代表実装 | 検索精度(Recall@10) | メモリ効率 | インデックス構築速度 | 更新の柔軟性 |
|---|---|---|---|---|---|
| HNSW | FAISS, pgvector | 95〜99% | 中(グラフ構造) | 中 | 高(動的追加可) |
| IVF-PQ | FAISS | 85〜95% | 高(量子化圧縮) | 高速 | 低(再学習必要) |
| ScaNN | Google ScaNN | 95〜98% | 高 | 高速 | 中 |
| Annoy | Spotify Annoy | 90〜95% | 高(木構造) | 高速 | 低(リビルド必要) |
| DiskANN | Microsoft | 95〜98% | 非常に高(SSD活用) | 中 | 中 |
| Vamana | Milvus v2.4 | 96〜99% | 中 | 中 | 高 |
HNSW(Hierarchical Navigable Small World)
最も広く使われるANNアルゴリズム。グラフ構造を多層的に構築し、上位層で粗い探索、下位層で精密な探索を行う。検索精度と速度のバランスが良く、pgvector、Qdrant、Weaviate、Milvusなど主要なベクトルDBが採用。
IVF-PQ(Inverted File with Product Quantization)
ベクトル空間をVoronoi分割(IVF)し、各ベクトルをProduct Quantization(PQ)で圧縮する。メモリ効率が非常に高く、10億ベクトル規模のデータセットに適する。FAISSの代表的なインデックス。
主要ベクトルデータベース比較
| 製品 | 種別 | ANNアルゴリズム | スケーラビリティ | 価格帯 |
|---|---|---|---|---|
| pgvector | PostgreSQL拡張 | HNSW/IVFFlat | 単一ノード | 無料(OSS) |
| Qdrant | 専用ベクトルDB | HNSW | 分散対応 | OSS/クラウド |
| Pinecone | マネージドDB | 独自 | サーバーレス | $25/月〜 |
| Weaviate | 専用ベクトルDB | HNSW | 分散対応 | OSS/クラウド |
| Milvus | 専用ベクトルDB | HNSW/IVF/DiskANN | 大規模分散 | OSS/Zilliz Cloud |
| Chroma | 軽量ベクトルDB | HNSW | 単一ノード | 無料(OSS) |
| FAISS | ライブラリ | HNSW/IVF-PQ/Flat | ライブラリ | 無料(Meta OSS) |
検索精度と速度のトレードオフ
- ブルートフォース(FAISS Flat): Recall=100%だが、100万ベクトル × 768次元で約50ms。10億ベクトルでは非実用的
- HNSW(efSearch=64): Recall≈95%、1ms以下。メモリにグラフ全体を保持する必要あり
- IVF-PQ(nprobe=16, nbits=8): Recall≈90%、0.5ms以下。メモリ使用量がブルートフォースの1/10以下
- ハイブリッド検索: BM25(キーワード検索)+ ベクトル検索のスコアを融合。Reciprocal Rank Fusion(RRF)で統合するのが一般的
よくある質問(FAQ)
Q1: pgvector と専用ベクトルDB(Qdrant/Milvus)のどちらを選ぶべきですか? A: 100万ベクトル以下でPostgreSQLを既に使っているならpgvectorが最も運用負荷が低い。1000万ベクトル超や分散検索が必要ならQdrant/Milvus。pgvector 0.7.0以降のHNSWインデックスで性能が大幅に改善されている。
Q2: ベクトル検索の精度が低い場合、何を改善すべきですか? A: まず埋め込みモデルの品質を疑う。検索精度の80%以上はモデルの質で決まる。次にクエリと文書のプレフィクス設定(E5の「query:」「passage:」等)を確認。最後にANNパラメータ(HNSWのefSearch、IVFのnprobe)を調整。
Q3: 100億ベクトル規模の検索は可能ですか? A: 可能。MilvusやPineconeは100億ベクトル規模の本番運用実績がある。DiskANNはSSDを活用してメモリ使用量を削減し、コスト効率よく大規模検索を実現する。
まとめ
- ベクトル類似度検索はコサイン類似度/ユークリッド距離/内積で意味的な近さを計算
- ANN(HNSW/IVF-PQ/DiskANN)でブルートフォース比100〜1000倍の高速化を実現
- pgvectorは小〜中規模、Qdrant/Milvusは大規模分散検索に適する
- ハイブリッド検索(BM25 + ベクトル)が2025年のRAGベストプラクティス