類似ベクトルの検索 (index.search)

FAISS(Facebook AI Similarity Search)の「インデックスの基本操作」における「類似ベクトルの検索(index.search)」について、以下に詳しく説明します。


類似ベクトルの検索:index.search

1. 概要

index.search は、FAISS のインデックスに対して クエリベクトル を与えたときに、それに最も類似した(距離が近い)ベクトルをインデックスから検索する関数です。主に以下のような目的で使用されます:

  • クエリと類似するデータの検索

  • k-NN(k近傍法)検索

  • 埋め込みベースの推薦システムや情報検索


2. 基本構文

python
D, I = index.search(Xq, k)
  • Xq:検索対象のクエリベクトル(NumPy 配列、shape: [nq, d]

  • k:各クエリについて取得する近傍ベクトルの数

  • D:検索結果の各近傍ベクトルとの距離(shape: [nq, k]

  • I:検索結果の各近傍ベクトルのインデックス番号(shape: [nq, k]


3. パラメータの詳細

パラメータ 説明
Xq 検索したいクエリベクトル(複数でも可)。FAISS インデックスと同じ次元数が必要です。
k 各クエリベクトルに対して取得したい近傍の数(例:最も類似する上位5件なら k=5

4. 返り値の説明

  • D:クエリごとの検索結果の距離。ユークリッド距離や内積(負の距離)など、インデックスの種類によって異なります。

  • I:それぞれの距離に対応するインデックス内のベクトルの ID。


5. 使用例

python
import faiss import numpy as np # データとクエリの準備 d = 128 # ベクトルの次元 xb = np.random.random((1000, d)).astype('float32') # データベースベクトル xq = np.random.random((5, d)).astype('float32') # クエリベクトル # インデックスの作成とベクトルの追加 index = faiss.IndexFlatL2(d) # L2距離を使ったインデックス index.add(xb) # 類似ベクトルの検索 k = 3 D, I = index.search(xq, k) print("Distances:\n", D) print("Indices:\n", I)

6. 注意点

  • クエリベクトルの次元はインデックスと一致している必要があります。

  • 検索距離(D)の意味は、インデックスの種類(例:IndexFlatL2, IndexFlatIP, IndexIVFFlat)によって異なります。

    • IndexFlatL2 → ユークリッド距離(小さいほど類似)

    • IndexFlatIP → 内積(大きいほど類似)


7. 応用例

  • 文書検索:埋め込み空間上で質問と類似する文書を検索

  • 推薦システム:ユーザーの好みに近いアイテムをベクトルで検索

  • 画像類似検索:画像特徴ベクトル間の類似度をもとに検索

ChatGPT4o 生成日:2025/06/18