46.6kデモを予約するログイン無料で始める

Faiss(フェイスブックAI類似検索)を理解する

Faiss(Facebook AI類似性検索)は、非構造化データの効率的な類似性検索と高密度ベクトルのクラスタリングのためのオープンソースライブラリである。

***最新のアップデート2024年10月21日

フェイスブックAI類似性検索を理解する

Faiss (Facebook AI Similarity search) は、非構造化データの効率的な類似検索とベクトルのクラスタリングのためのオープンソースライブラリです。

画像や文書の膨大なデータセットの中から、視覚的に類似した画像や意味的に類似したテキストを迅速かつ正確に見つけることができる。この機能は、Facebook AI Researchによって開発されたベクトル類似検索ライブラリであるFacebook AI類似検索(Faiss)によって現実のものとなりました。Faissは、ハッシュベースの検索や完全なキーワードマッチングに最適化された従来のクエリ検索エンジンを凌駕し、類似検索において電光石火の速さと驚くべき精度を提供します。

簡単に言えば、Facebook AI類似検索、つまりFaissは、オープンソースのベクトル検索ライブラリであり、開発者は、非構造化データの膨大なデータセットの中から、テキスト、画像、動画などの意味的に類似したマルチメディアデータを素早く検索することができる。この類似検索は、ベクトル埋め込みとして知られる数値表現の形で非構造化データを表現することによって実現される。これらのベクトル埋め込みが高次元空間において互いに近ければ近いほど、そのデータはより類似しており、関連性が高いということになる。

ベクトル類似度検索機能のおかげで、Faissは、推薦システム、チャットボット、自然言語処理(NLP)、ビデオ重複排除システム、検索拡張世代(RAG)など、多くのアプリケーションやユースケースで非常に有用である。

この投稿では、FacebookのAI類似検索(Faiss)について、その機能、実用的なユースケース、制限、プロジェクトでの効果的な使い方について説明する。また、Faissベクトル検索ライブラリと、MilvusやZilliz Cloud(フルマネージドMilvus)のような他の多くの目的別ベクトルデータベースとの違いについても簡単に紹介します。

効率的な類似検索のためのFaissの理解

ベクトル類似検索のための強力なライブラリのイラスト|出典:Pixabay]()Pixabay](https://assets.zilliz.com/understanding_faiss_30936fed0d.png)

ベクトル類似検索のための強力なライブラリのイラスト|出典:Pixabay]()Pixabay

図:ベクトル類似検索のための強力なライブラリの図解|出典:PixabayPixabay

Faissは、効率的なインデックス構造と異なるベクトル距離尺度を用いて、大量の非構造化データ内の意味的に類似したアイテムを検索するための情報検索で使用されるベクトル検索ライブラリです。ベクトルを格納し、ユークリッド距離(L2)、ドット積ベクトル比較、Faiss 余弦類似度のような類似度メトリクスで検索する方法を提供するFaissインデックスタイプを活用することで機能します。正確に検索することも、検索パラメータ(時間、品質、メモリ)を特定のニーズに合わせて調整することもできます。

フェイスブックAI研究チームは、フェイスブックAI類似検索を改善し、より優れたコア技術を導入するために、2015年にFaissを作成した。高次元のベクトルに対して非可逆圧縮方式を採用しており、圧縮データであっても正確な距離計算と再構成が可能です。 また、Faissは最先端のGPU実装を提供しており、CPU実装の最大5~10倍の速度を実現しています。

注: Hervé Jégou, Matthijs Douze, Jeff Johnson, Lucas Hosseini, Chengqi Deng, そして Alexandr Guzhva がFaissの主要な開発者である。**Alexandrはまた、ベクトルデータベースを提供するZillizで、Milvusの性能向上に取り組んでいる。

Faissのサポートされるベクトル距離メトリクス

Faissは様々な距離メトリクスをサポートしています:

  • METRIC_L2: ベクトル間の距離の二乗を返すことによって計算されます。

  • METRIC_INNER_PRODUCT: ベクトル間の類似度を測定し、2つのベクトルの内積を計算するために使用されます。

  • コサイン類似度:2 つのベクトル間の角度の余弦を測定します。コサイン類似度は、ベクトル間の内積の計算を通して距離メトリックとして実装されます。

Faissは、METRIC_L1、METRIC_Linf、METRIC_Lp、METRIC_Canberra、METRIC_BrayCurtis、METRIC_JensenShannon、Mahalanobis距離もサポートしています。

あなたのプロジェクトにFaissをインストールする方法

プロジェクトにFaissをインストールする図|出典:Pixabay](https://assets.zilliz.com/Group_12_7b3a3030d5.png)

プロジェクトにFaissを設置するイラスト|出典:Pixabay]()ピクシブ

Faissのインストールは直接的でシンプルなプロセスであり、推奨されるパッケージのインストール方法はCondaである。パフォーマンス向上のため、FaissはオプションでCUDAによるGPUサポートも提供しており、そのサポートコードも用意されている。

FaissをCondaでインストールする。

Faissは、コミュニティが管理するCondaパッケージのリポジトリである "conda-forge` チャンネル "から入手できます。Condaを使ったFaissのインストールには、システム上のAnaconda(またはMiniconda)、仮想環境の設定(オプションですが推奨)、Condaプロンプトまたはターミナルへのアクセスが必要です。Condaを使ったFaissのインストール中にGPUサポートを有効にすることもできます。

前提条件

Anaconda または Miniconda:AnacondaまたはMinicondaがシステムにインストールされていることを確認してください。Conda がインストールされているかどうかは、以下を実行して確認できます:

conda --バージョン

**新しいConda環境を作成する(オプション)

プロジェクト用に新しいConda環境を作成するのは良い習慣です。これは依存関係を分離しておくためです:

conda create -n faiss_env python=3.8
conda activate faiss_env

Conda-Forgeからインストールします。

Faissをインストールするには、Conda-Forgeチャンネルを指定する必要があります。CPU版とGPU版のどちらが必要かによって、以下のコマンドを使用します:

  • CPUバージョン**:
conda install -c conda-forge faiss-cpu

このバージョンは開発や小規模なデータセットに適しています。

GPUバージョン:

conda install -c conda-forge faiss-gpu

GPUバージョンはCUDAを活用して処理を高速化し、大規模なデータセットや本番環境での使用を推奨します。

**インストールの確認

インストール後、Faissが正しくインストールされていることを確認するには、以下のコマンドを実行してください:

インポート faiss
print(faiss.__version__)

Faissが正しくインストールされていれば、このスクリプトはインストールされているFaissのバージョンを表示します。

Faissがインストールされたら、必要に応じてConda環境で使い始めることができます。

GPUの実装

GPUバージョンは、最新のGPU実装をインデックスメソッドに使用することで、ベクトル類似探索を高速化します。これは、高速、厳密、近似最近傍探索、 k-means、小さなk-選択アルゴリズムに役立ちます。

単一のGPU上のCPU実装と比較して、FaissのGPUは通常5-10倍高速です。

サンプルコードを含むインストール・セットアップの詳細なウォークスルーについては、私たちのブログをお読みください:Facebook AI類似検索(FAISS)のセットアップをご覧ください。

Faissインデックスの作成と管理

Faissでインデックスを作成・管理する図|出典:Pixabay](https://assets.zilliz.com/unnamed_1_a5ff757b5b.png)

Faissでインデックスを作成・管理するイラスト|出典:Pixabay]()Pixabay

効率的な類似検索やクラスタリングのために、FaissはIndexFlatL2、パーティショニング、量子化法、その他多くのCPUやGPUのインデックスを含む様々なインデックスタイプを提供しています。

インデックスの一種であるIndexFlatL2は、ブルートフォースサーチアルゴリズムを採用し、ユークリッド距離(L2)やドット積のような類似性メトリクスを用いてベクトル距離を計算する。

IndexFlatL2 とその他の FAISS インデックス

IndexFlatL2 と IndexFlatIP は、Faiss の基本的なインデックスタイプで、クエリベクトルと インデックス付きベクトル間の L2 距離類似度を計算します。IndexFlatL2 の他に、以下のものがあります:

  • ブルートフォースサーチ](https://zilliz.com/learn/choosing-right-vector-index-for-your-project#Brute-force-search-FLAT) CPUまたはGPU上でインデックスを使用しない。

  • 反転ファイル(IVF)インデックス](https://zilliz.com/learn/choosing-right-vector-index-for-your-project#Inverted-file-index-IVF) (IndexIVFFlat)

  • HNSW (IndexHNDSWFlat)

  • 製品量子化(PQ)インデックス](https://zilliz.com/learn/choosing-right-vector-index-for-your-project#Product-quantization-PQ)

  • Locality Sensitive Hashing](https://zilliz.com/learn/mastering-locality-sensitive-hashing-a-comprehensive-tutorial) (IndexLSH) インデックス

  • フラットモードでのスカラー量子化(SQ) (IndexScalarQuantizer)

  • フラットモードにおける積量子化器 (PQ) (IndexPQ)

  • 複合インデックス(異なるインデックス構造の組み合わせ)

  • IVFおよびスカラー量子化器 (IndexIVFScalarQuantizer)

  • IVFADC (粗量子化器+残差PQ) (IndexIVFPQ)

  • IVFADC+R (IVFADCと同じでコードに基づく再順位付け) (IndexIVFPQR)

これらのインデックスタイプは、効率的な類似度検索や密なベクトルのクラスタリングを容易にするために設計されています。

非常に多くのベクトルインデックスタイプが利用可能であるため、プロジェクトに適したものをどのように選択すればよいのでしょうか?ここでは、適切なベクトルインデックスを選択するためのガイドラインを紹介します。

分割と量子化

Faissのパーティショニングと量子化技術は、検索範囲を狭め、ベクトルを圧縮することで、検索効率を最適化するのに役立ちます。パーティショニングでは、特徴空間をより小さなサブセットまたはセルに分割し、量子化では、圧縮された形式でベクトルをエンコードします。

FaissはProduct Quantizationを採用しており、類似検索のための高次元ベクトルのインデックス付けを容易にしている。

テキストデータのためのベクトル埋め込み作成

テキストの意味検索はFaissの最も一般的なユースケースです。そのため、テキストデータのためのベクトル埋め込みを作成する方法を理解することは有益です。

テキスト埋め込みを生成するには、データの準備と、Sentence TransformersやBERTなどの深層学習モデルを使ったベクトル生成が含まれます。ベクトル埋め込み](https://zilliz.com/learn/what-are-binary-vector-embedding)、つまりテキストデータの数値ベクトル表現は、機械学習モデルによって解釈可能な言語を提供する。ベクトル埋め込みの種類は、使用するモデルや機械学習手法によって異なります。

データの準備

Faissにおけるデータ準備のために、そのドキュメントはL2正規化テクニックを推奨している。これはテキストデータを表すベクトルにL2ノルムを適用することを含み、Faissのnormalize_L2関数を使用して行うことができます。

これは、Faiss の normalize_L2 関数を使用して実行できます。

PythonのフレームワークであるSentence Transformersは、高度なセンテンス、テキスト、image embeddingsの生成を支援します。上述したように、これらの埋め込みはベクトルの類似性検索のケースに使うことができる。

Faissの使い方と類似検索の実装方法

Faissを使ったベクトル類似検索の実装図|ソース Pixababy](https://assets.zilliz.com/Group_13_2c2152b97c.png)

Faissを使ったベクトル類似検索の実装例|出典 Pixababy

Faissをベクトル類似検索に利用するには、インデックスの作成、類似検索の実行、結果の分析とソートが必要です。検索は、類似したベクトルを追加して見つけるための構造を作成するIndexインスタンスを使用して行われます。

ベクトル埋め込みを作成する**。

ベクトル埋め込み](https://zilliz.com/glossary/vector-embeddings)は、入力テキストを正規化し、数値表現に変換することで作成されます。単語埋め込みや、TF-IDFやBERTのようなベクトル化手法は、入力テキストを、Faissを使って検索できるベクトル埋め込み(数値表現)に変換することができます。

ベクトル検索を実行する**。

Faissを使って検索を実行すると、検索ベクトルから最近傍とその距離が返されます。本ライブラリの検索関数の k パラメータは、各クエリベクトルに対して返される最も類似したベクトルの数を示します。

Faiss 検索の間、ライブラリは二乗ユークリッド距離 (L2) メトリックを用いてベクトル間の距離を計算します。

結果の分析と並べ替え**。

結果を並べ替えたり分析したりすることで、適切な情報を素早く検索して取り出すことができます。Faissは、類似検索手法や近似検索を含むいくつかの最近傍検索実装を提供し、速度と精度のトレードオフを提供するため、大規模な画像類似検索タスクに理想的な選択肢となります。

Faissでは、インデックス作成時に各ベクトルにラベルやカテゴリを関連付けることが可能であり、これにより、Faissを使用する際に最近傍の対応するラベルやカテゴリを検索することができる、つまり、最近傍検索が可能である。

Faissチュートリアル](https://zilliz.com/blog/set-up-with-facebook-ai-similarity-search-faiss)では、FAISSのセットアップ、起動、サンプル検索プログラムによるデモを行います。さらに詳しい情報はFaiss Documentationを参照してください。

Faissにおけるスピードと精度のバランス

Faissでは、パラメータチューニングやGPUとCPUの実装の選択によって、速度と精度のバランスを取ることができます。Faissのこの機能は、類似検索の速度と精度の両方に大きな影響を与えます。

パラメータチューニング

Faissでは、精度と検索時間のバランスを最適化するために、検索時間パラメータを微調整することができます。パラメータを調整することで、ユースケースに適したスピードと精度のバランスを見つけることができます。

GPUとCPUのパフォーマンス比較

FaissのGPU実装は、CPU実装と比較して大幅な速度向上を実現し、大規模データセットにおける類似検索の高速化を可能にします。シングルGPUでのCPU実装と比較して、FaissのGPUは通常5~10倍高速です。

##Faissの実世界での応用と使用例

Faissは、大規模画像類似検索、テキスト分類、クラスタリングなど、様々な実世界アプリケーションで使用されています。Faissは、膨大なデータセットから類似する写真を効率的に検索する大規模画像検索に採用されています。

大規模画像類似検索

Faissの類似検索機能とGPUメモリ実装を活用し、10億スケールのベクトル類似検索タスクに成功。

GPUを活用したプロジェクトの例としては、ベクトルベースの検索エンジンの作成や、IVF法を用いたベクトル検索の高速化などがあります。

テキストの分類とクラスタリング

テキストの分類とクラスタリングは、テキストデータからベクトルを構築し、関連する文書やカテゴリを特定するために類似性検索を実行することによって、Faissを使用して達成することができます。

自然言語処理(NLP)](https://zilliz.com/learn/A-Beginner-Guide-to-Natural-Language-Processing)における意味的類似検索に利用できる。また、Loopioでは、テキストの類似検索にも利用されている。さらに、FaissはSentence Transformersを使ってベクトルベースの検索エンジンを作ることもできる。

2024年のベクトル検索のトップ・ユースケースを学ぶ。

類似検索ライブラリFaissの制限事項

Faiss (Facebook AI Similarity Search)は、密なベクトルの類似性検索とクラスタリングのための強力なツールですが、ユーザーが注意すべきいくつかの制限があります:

メモリ使用量

  • 高いメモリ消費**:Faiss インデックス、特にフラット・インデックスは、大規模なデータセットを扱う場合、かなりのメモリを消費します。これは、すべてのベクトルがメモリに格納されるためで、非常に大きなデータセッ トでは制限となる可能性があります。

  • スケーラビリティの制限:非常に大きなデータセット(数十億ベクトル)の場合、Faiss はかなりのメモリリソースを必要とし、標準的なハードウェアでのスケーラビリティが制限されることがあります。億単位のベクトルを扱うには、MilvusやZilliz Cloud**のような専用に構築されたベクトルデータベースが良いでしょう。

GPU依存性

  • GPU アクセラレーションのための CUDA 依存性:Faiss GPU の機能には NVIDIA GPU と CUDA が必要です。この依存性は、非NVIDIAハードウェアを使用しているユーザーや、CUDAがサポートされていない環境で作業しているユーザーにとって制限となる可能性があります。

  • 複雑なセットアップ**:特に、CUDAや必要なドライバが正しくインストールまたは設定されていない場合、GPUサポートによるFaissのセットアップは複雑になる可能性があります。

インデックスタイプのトレードオフ

  • 精度対速度**:Faissは様々なインデックスタイプを提供しており、それぞれ精度とスピードのトレードオフがあります。例えば、近似最近傍(ANN)検索は、正確な検索よりも高速ですが、精度は劣ります。適切なインデックスを選択するには、特定のユースケースに基づいて、これらのトレードオフのバランスを取る必要があります。

  • インデックス作成オーバーヘッド**:IVF(Inverted File Index)やHNSW(Hierarchical Navigable Small World)のような高度なインデックス作成方法では、特に大規模なデータセットの場合、インデックスの学習と構築に追加の時間と計算リソースが必要となる。

スパース・ベクトルやマルチモーダル・ベクトルをサポートしていない。

  • Faissは密なベクトルやシングルモダリティデータ(テキストや画像埋め込みなど)に最適化されています。Faissは、疎なベクトルやマルチモーダル検索(例えば、テキストと画像ベクトルを組み合わせる)をネイティブにサポートしていません。

    • Milvus(オープンソース)とZilliz Cloud** (フルマネージドMilvus)は、強力なハイブリッド検索機能を持つ、Faissに代わる2つのベストな検索ツールです。このハイブリッド検索は、マルチモーダル検索、ハイブリッドスパース検索と密検索、ハイブリッド密検索と全文検索を組み合わせることができ、多用途で柔軟な検索機能を提供する。

ビルトイン分散サポート**の欠如

  • Faissは分散または複数ノードのデプロイメントをネイティブにはサポートしていません。これは、複数のマシンに分散する必要があるような非常に大きなデータセットを扱う際の制限となる可能性があります。

    • Milvus**は、コンピューティングとストレージの分離アーキテクチャを備えた、オープンソース、分散、クラウド・ネイティブのベクトル・データベースであり、10億スケールのベクトル埋め込みを保存、インデックス付け、検索することができます。
  • ユーザは独自のシャーディング戦略を実装するか、外部ツールを使用してFaissを複数のノードに分散させる必要があり、複雑さを増す可能性がある。

これらの制限を理解することで、Faissが特定のユースケースに適したツールであるかどうかを判断し、その制約を意識しながら効果的に活用する方法を導くことができます。

Faiss とベクターデータベースまたはベクター検索サービスの比較

Faissは効率的なベクトル類似検索のための強力なツールですが、それだけが唯一の選択肢ではありません。Milvusのようなスケーラブルな専用ベクターデータベースや、Elasticsearchのような従来のリレーショナルデータベース用のベクター検索プラグインもあります。これらのソリューションの違いはどこにあるのでしょうか?以下の比較ページで、主な違いを探ってみてください。

まとめ

結論として、Faissはベクトル埋込みの効率的な類似性検索とクラスタリングのための強力なライブラリであり、大規模な画像検索やテキストの分類とクラスタリングなど、様々な実世界での応用が可能です。インストール、GPU実装、パラメータチューニングが容易なFaissは、プロジェクトの速度と精度を最適化するのに役立ちます。Faissライブラリの可能性を探求し、そのパワーをあなたの次の類似検索の試みに活用することをためらわないでください。

詳しくは、Faissドキュメントをご覧ください。

よくある質問

Faissとは何ですか?

Faiss (Facebook AI Similarity Search)はFacebook AIが開発した、効率的な類似性検索と密なベクトルのクラスタリングのためのライブラリです。高次元空間における類似性検索とクラスタリングのための効率的なソリューションを提供し、開発者が互いに類似するマルチメディアドキュメントの埋め込みを素早く検索できるようにします。一般的な使用例としては、RAG、推薦システム、セマンティック検索、自然言語処理、チャットボットなどがある。

Faissはベクトルデータベースですか?

いいえ、Faissはベクトルデータベースではなく、オープンソースの近似最近傍探索(ANN)ライブラリであり、限られた機能で完全に管理されたソリューションの代わりに使用されます。データセットが小さく限定的であれば、本番稼動しているシステムであっても、非構造化データ処理にはこのFAISSで十分です。

専用のベクトルデータベース](https://zilliz.com/blog/what-is-a-real-vector-database)、従来のデータベース内のベクトル検索プラグイン、Faissのようなベクトル検索ライブラリの違いについては、比較ブログをお読みください。

FaissとMilvusの違いは何ですか?

FAISSは基礎となるライブラリであり、Milvusはベクトルデータベースです。これに対して、Milvus ベクトルデータベースは、非構造化データ の保存と検索に最適なソリューションです。億単位のベクトルを保存・検索でき、ミリ秒レベルの応答が可能である。また、ハイブリッド検索のような様々な高度でエンタープライズグレードの機能を提供し、ハイブリッドスパースと高密度ベクトル検索、マルチモーダルベクトル検索、ハイブリッド高密度検索とフルテキスト検索を可能にします。

さらに、Milvusは、クラウドネイティブ、マルチテナント、スケーラビリティなど、構造化/半構造化データのための使いやすい機能を備えている。

**FaissからMilvusへのデータ移行の方法をお知りになりたいですか?Milvusマイグレーションテクニックとツール](https://zilliz.com/learn/introduction-to-milvus-vector-database)についてのブログをお読みください。

ChromaとFaiss、どっちがいいの?

Chromaはローカル開発が容易で、FAISSは効率的な検索とクラスタリングが可能です。ユースケースにもよりますが、どちらも小規模なデータセットには最適なオプションです。以下はChromaとFaissの比較です。

Faissの主な目的は何ですか?

主にFacebook AI Researchによって開発されたライブラリで、密なベクトルの類似性検索とクラスタリングを可能にします。多くの開発者に人気のあるアプローチです。

Faiss の余弦類似度はサポートされていますか?

はい、ベクトル検索操作でFAISS余弦類似度を行うことができます。以下はその概要です:

FAISSは密なベクトルの効率的な類似度検索とクラスタリングを提供します。また、コサイン類似度を距離メトリックとして使用するものを含む、複数のインデックスタイプと検索アルゴリズムが含まれています。

FAISSで余弦類似度を使うには

1.ベクトルを正規化する:コサイン類似度は正規化されたベクトル上のL2距離と等価です。FAISSは通常L2距離で動作しますので、インデックスを作成する前にベクトルを単位長に正規化する必要があります。

2.適切なインデックスを選択します:ほとんどの FAISS インデックスは L2 距離をサポートしており、これは正規化されたベクトル上の余弦類似度に変換されます。一般的な選択肢としては、厳密検索にはIndexFlatL2、近似検索にはIndexIVFFlatがあります。

3.検索の実行正規化ベクトルをインデックス化した後、検索クエリは余弦類似度に基づいた結果を返します。

ベクトル・データベースの未来は?

従来、ベクトルデータベースは類似度ベースの検索をサポートしていました。現在では、正確な検索やマッチングなど、その機能を拡張しています。この多機能性により、より広い理解のための類似検索と、ニュアンスの正確な検索の2つのレンズを通してデータを分析することができます。この2つのアプローチを組み合わせることで、ユーザーはハイレベルな概観を得ることと、具体的な詳細を掘り下げることのバランスを微調整することができる。詳しくは、ベクトル・データベースの進化に関するCharles Xieの洞察をお読みください。