FAISSベクトル検索

🔥 Vibe プロンプト

「1万件の128次元ベクトルでベクトル検索を構築。ブルートフォースvs IVFの速度と精度を比較。」

FAISSとは?

FAISS (Facebook AI Similarity Search) はMeta AIが開発した大規模類似検索ライブラリです。数十億のベクトルからミリ秒で最近傍を検索できます。

| 機能 | 性能 | |------|------| | 規模 | 最大数十億ベクトル | | 速度 | ブルートフォース比10-100倍 | | インデックスタイプ | Flat(正確), IVF(近似), HNSW(グラフ), PQ(圧縮) | | GPU対応 | マルチGPU自動シャーディング |

インデックスタイプ

1. Flat Index(正確検索)

IndexFlatL2 / IndexFlatIP: 全ベクトルを保存し、すべてをスキャン。100%再現率だが大規模では低速。

2. IVF(Inverted File)

ベクトルを (N_{list}) 個のクラスタに分割。検索時は (N_{probe}) 個の近傍クラスタのみ探索。計算量: O(N) → O(N_{list} + N/N_{list} × N_{probe})

3. HNSW(階層的ナビゲーション小世界グラフ)

マルチレイヤーグラフを構築。100万ベクトルで >99%再現率、0.5ms検索。

4. PQ(プロダクト量子化)

ベクトルを1/4〜1/32に圧縮。10億ベクトルをメモリ内で検索可能。

実装

import numpy as np
import faiss
import time

np.random.seed(42)
d = 128       # ベクトル次元
n = 10000     # ベクトル数
n_queries = 5
k = 5         # 最近傍数

xb = np.random.random((n, d)).astype('float32')
xq = np.random.random((n_queries, d)).astype('float32')

# 1. ブルートフォース(正確)— IndexFlatL2
index_flat = faiss.IndexFlatL2(d)
index_flat.add(xb)

start = time.time()
D_flat, I_flat = index_flat.search(xq, k)
t_flat = time.time() - start

print(f"=== ブルートフォース (IndexFlatL2) ===")
print(f"検索時間: {t_flat*1000:.2f} ms")

# 2. IVF(近似)— IndexIVFFlat
nlist = 100
quantizer = faiss.IndexFlatL2(d)
index_ivf = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
index_ivf.train(xb)
index_ivf.add(xb)
index_ivf.nprobe = 10

start = time.time()
D_ivf, I_ivf = index_ivf.search(xq, k)
t_ivf = time.time() - start

print(f"\n=== IVF (IndexIVFFlat) ===")
print(f"検索時間: {t_ivf*1000:.2f} ms")
print(f"高速化: {t_flat/t_ivf:.1f}x")

# 精度チェック
correct = sum(1 for i in range(n_queries) if set(I_flat[i]) == set(I_ivf[i]))
print(f"完全一致(top-{k}): {correct}/{n_queries}")

# 3. HNSW(最速近似)— IndexHNSWFlat
index_hnsw = faiss.IndexHNSWFlat(d, 32)
index_hnsw.hnsw.efConstruction = 40
index_hnsw.add(xb)
index_hnsw.hnsw.efSearch = 64

start = time.time()
D_hnsw, I_hnsw = index_hnsw.search(xq, k)
t_hnsw = time.time() - start

print(f"\n=== HNSW (IndexHNSWFlat) ===")
print(f"検索時間: {t_hnsw*1000:.2f} ms")
print(f"高速化: {t_flat/t_hnsw:.1f}x")

correct_hnsw = sum(1 for i in range(n_queries) if set(I_flat[i]) == set(I_hnsw[i]))
print(f"完全一致: {correct_hnsw}/{n_queries}")

インデックス比較

| インデックス | 検索タイプ | 100万ベクトル(128d) | 再現率@10 | |-----------|-----------|-------------------|----------| | Flat | 正確(全探索) | ~500ms | 100% | | IVF (nlist=4096, nprobe=64) | 近似 | ~5ms | ~95% | | HNSW | 近似 | ~0.5ms | ~99% | | IVF + PQ (M=64) | 圧縮近似 | ~4ms | ~90% |

実世界の応用

1. RAG(検索拡張生成)

LLMチャットボットが知識ベースから関連文書を検索し、コンテキストとしてLLMに渡す。100万文書から100ms未満で検索。

2. レコメンデーションエンジン

「これを気に入った人はこれも気に入っています」— Pinterest、Spotify、Instagramがユーザー埋め込みとアイテム埋め込みのベクトル検索でリアルタイム推薦。

3. セマンティック検索

キーワードではなく意味で検索。テキストを埋め込みに変換しFAISSで検索。類義語や文脈を理解。

クエリ: 「安いノートPC」→「格安ラップトップ」もマッチ

4. 画像類似検索

Google画像検索の「類似画像」機能。FAISSはPinterestで数10億の画像から類似検索を駆動。

5. 異常検知

最近傍距離が閾値を超えるものを異常値として検出。不正検知や品質管理に有効。

時間複雑度

| インデックスタイプ | 構築時間 | 検索時間(100万) | メモリ(128d, 100万) | |----------------|---------|----------------|-------------------| | Flat | O(nd) | O(nd) = ~500ms | 512 MB | | IVF | O(nd + nlist×train) | O(nlist×d×nprobe) = ~5ms | 512 MB + オーバーヘッド | | HNSW | O(nd log n) | O(log n×d) = ~0.5ms | 512 MB + グラフ(nd×8) | | PQ | O(nd) + 訓練 | O(nlist×M×4) = ~2ms | 512/32 = 16 MB |

まとめ

  • FAISS はベクトル類似検索の業界標準
  • Flat(正確)— 100%再現率、大規模では低速
  • IVF — 速度と精度の良いバランス、最も一般的
  • HNSW — 最速の近似検索、QPSが重要なアプリに最適
  • PQ(プロダクト量子化)— ベクトルを4-32x圧縮
  • 使用例: ChatGPT (RAG)、Pinterest (推薦)、Spotify
  • 規模: 1万(CPU)から10億以上(マルチGPU)

完全なチュートリアルをロック解除

このチャプターは有料コンテンツです。プロジェクトに参加して、10以上の神レベルのPromptや実際のソースコード例を含む、5000字以上の深い分析をロック解除してください!