FAISSは、Facebook AIが開発した、大規模なベクトルデータの中から「類似したベクトル」を高速に検索するためのライブラリです。
たとえば、「ネコの養い方」に関連する情報を、100万件のデータの中から検索したいときに便利です。
FAISSの基本的な作業は下記の通りです:
※この記事は、ChatGPTの出力を基に作成しています。
1. データの準備
ステップ 1.1: テキストデータをベクトル化
FAISSを使う前に、検索対象のデータを準備します!
- 各文章をAIモデルでベクトルに変換します。
- 例:
- 「ネコの飼い方」 → ベクトル
[0.12, -0.34, 0.56, ...]
- 「犬の世話」 → ベクトル
[0.45, -0.12, 0.67, ...]
- 「ネコの飼い方」 → ベクトル
ステップ 1.2: FAISSのインデックスに変換
ベクトルをFAISSが処理できる形式に変換します。このインデックスは「検索を効率化するためのデータ構造」です。
2. インデックスの構築
FAISSには複数のインデックスタイプがありますが、一番基本的な「Flat Index」を使う例を解説します。
ステップ 2.1: ベクトルを登録
下記は、100万件のベクトルを300次元で処理した例です。
import faiss
import numpy as np
# 例: 100万件のベクトルデータ、300次元
vectors = np.random.random((1000000, 300)).astype('float32')
# Flat Indexを作成
index = faiss.IndexFlatL2(300) # L2距離(ユークリッド距離)を使用
index.add(vectors) # ベクトルをインデックスに登録
-
IndexFlatL2
: ベクトル間のユークリッド距離を計算するインデックス。 -
add
メソッド: ベクトルデータをインデックスに追加。
3. 検索処理
ユーザーからのクエリ(例:「ネコの養い方」)に基づいて、関連するデータを検索します。
ステップ 3.1: クエリのベクトル化
「ネコの養い方」をベクトルに変換します!
query_vector = np.random.random((1, 300)).astype('float32') # クエリのベクトル
ステップ 3.2: FAISSで検索
クエリベクトルと似たベクトルを検索します。
k = 5 # 上位5件を収集
distances, indices = index.search(query_vector, k)
-
search
メソッド: クエリベクトルに最も近いベクトルを検索。 -
結果:
-
distances
: クエリベクトルと検索結果のベクトルとの距離。 -
indices
: 検索結果のベクトルのインデックス(元のデータと対応)。
-
4. 結果の収集
indices
を使って元のデータから検索結果を収集します。
例:
- インデックス
[123, 456, 789, 1011, 1213]
が返された場合、対応する文章を取り出します!- 123 → 「ネコの健康管理」
- 456 → 「子ネコの育て方」
- 789 → 「犬とネコの比較」
5. 高速化のための工夫
FAISSは、検索を高速化するために構造化された複数のインデックスを提供しています。
代表的なインデックス
-
Flat Index
- すべてのデータを総対象で計算。
- 小規模データ(数万件)に適している。
-
IVF (Inverted File Index)
- データをクラスターに分け、検索範囲を絞る。
- 大規模データに適している。
-
HNSW (Hierarchical Navigable Small World)
- グラフ構造を使用して高速検索を実現。
- 高精度かつ大規模データにも適している。
まとめ
FAISSの検索プロセスは下記の通りです:
- データをベクトル化してインデックスに登録。
- クエリをベクトル化して検索を実行。
- 類似したベクトルの結果を収集。
これにより、大量のデータから意味の近い情報を高速に検出できます。