Faissとは
Facebook AI Similarity Search
Meta(旧Facebook)が開発した、高次元ベクトルの類似検索・クラスタリング向けオープンソースライブラリ
ひとことで言うと
大量のベクトルの中から似たものを高速に探し出せる、Meta製の検索ツール。
概要
Faissは、Meta AI Researchが開発したオープンソースのライブラリ。 数百万〜数十億件規模の高次元ベクトルに対する類似検索やクラスタリングを、CPU・GPUの両方で高速に実行できる。 HNSWやIVF(転置ファイルインデックス)、積み量子化(Product Quantization)など、精度・速度・メモリ使用量のトレードオフが異なる複数の近似最近傍探索アルゴリズムを実装しており、データ規模や要件に応じて使い分けられる。 PythonとC++の両方からAPIを利用でき、埋め込みモデルが出力したベクトルをそのままFaissのインデックスへ登録し、類似度検索するという使い方が一般的。 独立したライブラリとして直接組み込む形で使われるほか、Milvusなど一部のベクトルデータベース製品が内部の検索エンジンとしてFaissを利用している。
背景
埋め込みベクトルを使った類似検索の需要が増える中、大規模なベクトル集合に対して実用的な速度で検索できる、信頼性の高いオープンソースの実装が求められていた。 Faissは、Meta社内での大規模な画像・テキスト検索の実運用経験をもとに、研究から実運用まで幅広く使える汎用的なベクトル検索ライブラリとして公開された。
歴史
2017年: Facebook AI Researchがオープンソースライブラリとしてfaissを公開。 2019年: GPU対応の実装が強化され、大規模データセットでの高速な検索が可能に。 2020年代: 多くのRAGシステムやベクトルデータベース製品の内部コンポーネントとして採用が拡大。
アーキテクチャ
インデックスと呼ばれるオブジェクトにベクトルを登録する構成を取り、インデックスの種類によって探索アルゴリズムが異なる。 IndexFlatL2やIndexFlatIPは全件比較による厳密な検索を行い、IndexIVFFlatはクラスタ分割で探索範囲を絞り込み、IndexHNSWFlatはグラフ構造をたどる近似最近傍探索を行う。 さらに積み量子化(Product Quantization)を組み合わせたインデックスでは、ベクトルを圧縮して保持することでメモリ使用量を抑えられる。
ワークフロー
埋め込みモデルなどで得たベクトル群を、用途に応じたインデックス(IndexFlatL2、IndexIVFFlat、IndexHNSWFlatなど)へ登録する。 IVF系のインデックスでは、事前に代表的なクラスタ中心を学習させるトレーニングの工程を挟む。 検索時はクエリベクトルをインデックスへ渡し、上位k件の近傍ベクトルとその距離を取得する。
コード例
Faissでのインデックス構築と検索
import faiss
import numpy as np
dim = 128
data = np.random.rand(10000, dim).astype("float32")
index = faiss.IndexFlatL2(dim)
index.add(data)
query = np.random.rand(1, dim).astype("float32")
distances, indices = index.search(query, k=5)利点
- 複数の近似最近傍探索アルゴリズムを備え、データ規模や精度要件に応じて使い分けられる
- GPU対応により、非常に大規模なベクトル集合でも高速な検索が可能
- オープンソースかつ実績が豊富で、多くのプロジェクトやベクトルデータベースの内部で採用されている
欠点
比較
- HNSW — FaissはHNSWを含む複数の近似最近傍探索アルゴリズムを実装した検索ライブラリ
- ベクトルデータベース — Faissは検索アルゴリズムのライブラリであり、永続化やAPIサーバー機能まで含む専用のベクトルデータベースとは役割が異なる
- 埋め込みモデル — Faissは、埋め込みモデルが出力したベクトルを登録・検索する用途で使われることが多い
- IVF — IVFは、Faissで実装されている代表的な近似最近傍探索のインデックス方式の1つ
関連用語
よくある質問
Faissとベクトルデータベースの違いは?
Faissは類似検索アルゴリズムを実装したライブラリで、永続化やAPIサーバー機能は含まない。Milvusなどのベクトルデータベースは、Faissのような検索エンジンにデータ管理やAPIの機能を組み合わせた製品にあたる。
FaissはGPUでも使える?
GPU対応の実装が用意されており、CPUだけの場合と比べて非常に大規模なベクトル集合でも高速に検索できる。
参考文献
- GitHubfacebookresearch/faiss
- DocumentationFaiss Documentation