中級 11 分Stack

FAISS:検索に使用されるライブラリ vectorielle

端的な回答

FAISS(Facebook AI Similarity Search)は、MetaのAI研究グループが開発したMITライセンスのオープンソースライブラリで、与えられたベクトルに最も近いベクトルを検索します。データベースではなく、サーバー、メタデータによるフィルタリング、組み込みの永続化機能はありません。2026年9月末時点でGitHubのスター数は41,000を超えており、複数のベクトルデータベースの内部エンジンとして利用されています。

FAISS は、主に Meta の基礎 AI 研究グループが開発した、密ベクトルの類似度検索ライブラリです。FAISS の名前を一切挙げない数多くのツールの内部で使われています。データベースではなく、サーバー、メタデータによるフィルタリング、アクセス制御、永続化のいずれも備えていません。単一プロセスで動くローカルの文書処理パイプラインには、実用になる最も軽量な選択肢です。ただし、アクセス権の管理や複数の書き込み主体が必要になった時点で、適切なツールではなくなります。

著者 Mohamed Meguedmi·更新 2026-09-28·Windows・macOS・Linuxでテスト済み

#ライブラリであり、データベースではない

FAISSは、ベクトルデータベースと互いの代替となるかのように比較されることがよくあります。しかし、両者は異なる種類のものです。ベクトルデータベースは、API、ストレージ、フィルタリング、権限管理を備えたサービスです。FAISSはコンポーネントです。C++で書かれ、PythonとNumPy向けの完全なラッパーを備えており、ベクトルを渡すとメモリ上にインデックスを構築し、「このベクトルに最も近いのはどれか」という問いに答えます。複数のベクトルデータベースが、内部でFAISSまたは類似のものを使用しています。このプロジェクトはMITライセンスで公開されており、2026年9月末時点でGitHubのスター数は41,000を超えていました。開発者らによると、一部の手法は、単一サーバーのメインメモリ上で数十億のベクトルを扱う規模にまで対応できます。

実用上、FAISSを選ぶということは、それ以外の処理をすべて自分で担うことを受け入れるということです。インデックスをディスクに保存して再読み込みし、ドキュメントとの整合性を保ち、ベクトルの位置とその元のテキストを対応付け、2つのプロセスが同時に書き込もうとした場合の処理を決める必要があります。これらはどれも標準では提供されません。これは意図的なアーキテクチャ上の選択であり、プロジェクト側の実装漏れではありません。

#重要となるインデックス

ローカルRAGキット

あなたのドキュメント、あなたのAI:あなたのPDF、メモ、メールを扱う信頼性の高いローカルRAG。何もクラウドに送信しません。

  • 永久に利用できるオンラインスペース
  • PDF + ファイル
  • 生涯アップデート
4つの系統、3つのトレードオフ
Indexどのように探しているか使用タイミング
厳密検索(Flat)すべてのベクトルと比較数万件程度まで:正確な結果、調整不要、実用上十分な速度
IVF(逆インデックスパーティション)スペースをクラスタに分割し、僅かなパーティションのみを探索します数十万規模から。代表的なデータを使った学習工程が必要
HNSW(近傍グラフ)リンクで構成されたグラフをたどる利用可能な RAM が多い場合、またはコーパスが小さい場合:高速で正確ですが、ベクトルの削除には対応していません
PQ / OPQ(積量子化)Mバイトのコードで圧縮されたベクトルを保存インデックスがメモリに収まらなくなった場合:精度は下がりますが、メモリ使用量はそれ以上に減ります
RaBitQ(最大圧縮)次元あたり1ビットに圧縮し、わずかな追加コストを含むメモリ節約の最後の手段。良好な精度を保つために、ランダム回転の処理を加えます。

最も時間の節約につながるアドバイスは、まず厳密検索から始めることです。近似インデックスは規模の問題を解決するためのものです。その問題に直面する前に採用すると、誰も気づかない数ミリ秒の短縮と引き換えに、パラメータの調整や再現率の測定という負担を抱えることになります。ローカルのコーパス程度の規模では、検索が遅い工程になることはほとんどありません。エンドユーザーが感じる応答時間の大部分を占めるのは、言語モデルによる生成です。

#Pythonで始めるために最低限必要なこと

  1. 01
    ライブラリのインストール
    pip install faiss-cpuで、公式PyPIパッケージをインストールします(2026年9月末時点のバージョンは1.15.1です)。GPU版については、プロジェクトがconda経由のインストールを案内しています:conda install -c pytorch -c nvidia -c conda-forge faiss-gpu=1.15.1。
  2. 02
    厳密検索用のインデックスを構築する
    index = faiss.IndexFlatL2(dimension)は、お使いの埋め込みモデルと同じ次元数のベクトルを対象に、厳密検索用のインデックスを作成します。
  3. 03
    ベクトルを追加する
    index.add(vecteurs) の vecteurs は、形状が (n, dimension) で、要素が 32 ビット浮動小数点数の NumPy 配列です。
  4. 04
    問い合わせる
    distances, indices = index.search(requete, k) は、最も近いk個の近傍とそれぞれの距離を返します。indicesを元のテキストの断片に対応付ける処理は、ご自身で行う必要があります。
  5. 05
    保存して再読み込みする
    faiss.write_index(index, chemin)で保存し、その後faiss.read_index(chemin)で読み込むことで、インデックスをディスク上に保持し、次の実行時にも利用できます。FAISS自体はこれを自動では行いません。

#コーパスのサイズに応じてインデックスを選択する

プロジェクトの公式Wikiには、インデックスファクトリ(index_factory)に渡す文字列として表現された正確な目安が公開されています。100万ベクトル未満の場合、IVF_K が十分であり、K はベクトル数 N に応じて 4×√N から 16×√N の間で選択し、学習セットは 30×K から 256×K ベクトルを使用します。100万から1000万の場合、推奨される組み合わせは IVF65536_HNSW32 で、HNSW を使用してクラスタへの割り当てを高速化します。1000万から1億の場合、IVF262144_HNSW32 を使用し、1億を超えて10億まででは IVF1048576_HNSW32 を使用します。この段階では、学習が明らかに遅くなり、通常は残りの処理が CPU で実行されている間に GPU で行われます。

コーパスの規模別の公式目安
コーパスのサイズ推奨される設定
100万未満IVF_K(K は 4×√N から 16×√N の間)
100万から1,000万IVF65536_HNSW32
1,000 万から 1 億IVF262144_HNSW32
1億から10億IVF1048576_HNSW32

ローカルの文書コーパス、つまり数千から数十万のテキスト断片を扱う場合、これらの目安からまず確認できるのは、近似インデックスが必要になる規模にはまだ遠く及ばないということです。厳密インデックス、あるいは必要になっても単純な IVF_K で、実際のケースのほぼすべてに対応できます。また、数十万件の学習用エントリを必要とする構成は、一般的な文書利用では依然として手の届かないものです。

#数字で見るメモリ

32ビット浮動小数点数の1,024次元ベクトルは、約4 KBを占有します。したがって、100万個のベクトルでは、インデックス構造自体を含まずとも、約4 GBになります。HNSWインデックスについては、公式Wikiにベクトルあたり(d×4 + M×2×4)バイトという式が示されています。ここでdは次元数、Mはベクトルあたりのリンク数(4から64の間:リンク数が多いほど精度は高くなりますが、メモリ使用量も増加します)です。この計算が多くのアーキテクチャを決定づけており、圧縮が存在する理由であり、言語モデルもホストするマシンが想像以上に余裕が少ない理由でもあります。

圧縮の観点では、積量子化(PQ)は各ベクトルをMバイトで符号化します。通常は最大64バイトまでで、それを超えるとスカラー量子化(SQ)の方が一般的に同等の精度を持ち、より高速です。圧縮品質が本当に重要になる場合、公式ガイドでは量子化の前にOPQ変換を追加することを推奨しています。OPQはまず線形変換によってベクトルの次元を下げ、圧縮しやすくしてから、その結果に積量子化を適用します。インデックス作成時に計算するステップが一つ増えますが、コードサイズが同じ場合、直接積量子化を行うよりも精度の劣化を軽減できます。最大限の圧縮オプションであるRaBitQは、各次元につき1ビットのみを保持することで、ベクトルあたり約(d/8 + 8)バイトまで削減できます。ただし、適切な精度を維持するためにランダム回転のステップが必要です。各次元につき複数ビットを使用することで、わずかなストレージ増加の代わりにある程度の精度を取り戻せるバリアントも存在します。

i
RAMにインデックス、VRAMにモデル
FAISSのインデックスは、デフォルトではシステムメモリに保持されます。非常に大規模なデータ向けにはGPUで実行する方法もあり、公式ドキュメントではCPUメモリとGPUメモリのどちらからでもデータを受け取れると明記されています。ただし、ローカル環境では、言語モデルとGPUのリソースを奪い合う構成にしても、割に合うことはほとんどありません。また、HNSWインデックスは順次追加のみを受け付け(IDMapでラップしない限り、独自のIDは指定できません)、IVFとは異なり、ベクトルを1つずつ削除することはできません。

#未搭載の機能がすべてを左右する

実際の条件は、このクライアントのドキュメントのみ、この日付以降のみ、この人物が読む権限を持つもののみに限定されます。FAISSはメタデータの概念を持ちません。一般的な回避策——必要な結果よりも多くの結果を取得してその後Pythonでフィルタリングする——は正確に誤りです。もし五十件のトップ結果がすべて別のサービスに属している場合、フィルタリングによって何も残らず、アシスタントは情報が見つからなかったと報告しますが、実際にはあなたが見られる情報が一つも存在しないという状況を伝えているにすぎません。

特に、アクセス権に基づくフィルタリングは、検索結果を取得した後の段階で実装してはいけません。これが、検索中にフィルタリングを行うシステムを選ぶ最も強い実務上の理由です。選択肢はベクトルデータベース、またはPostgreSQL内にベクトルを保存し、WHERE句でフィルタリングする方法です。

#FAISS が適している場合

単一プロセスアプリケーション
起動時にインデックスを読み込み、それに対して検索を行うものです。例えば、デスクトップツール、バッチ処理、ノートブックなどです。
固定されたコーパス
継続的に更新するのではなく、決まったスケジュールに従って再構築します。
ユーザーごとのフィルタリングなし
または、フィルタリングの区分が十分に大まかで、カテゴリごとにインデックスを用意しても無理がない場合です。
低遅延が重要な場合
データベースとのネットワーク往復にかかるコストこそをなくしたい場合。たとえば、接続が保証されない組み込みツールなどです。

これらの場合を除けば、導入を避けているサービスを使うほうが、プロジェクトの成長に伴って結局自分で書き直すことになる永続化、フィルタリング、並行処理のコードよりも、長期的には一般にコストが低くなります。

判断する前に、最後にもう一つ押さえておきたい点があります。他で目にする複数のベクトルデータベースは、FAISS を魔法のように置き換えるものではありません。FAISS を包み込む形で利用するか、同じ系統のインデックス(IVF、HNSW、積量子化)を参考にし、その上にネットワーク API、管理された永続化の仕組み、フィルタリングエンジンを備えています。つまり、FAISS を理解することは、ベクトルデータベース自体の内部動作のかなりの部分を理解することにつながります。最終的なプロジェクトで FAISS を直接使わず、Qdrant や Milvus を使う場合でも、この寄り道は役立ちます。同じメモリと精度のトレードオフが、別のパラメータ名で現れるからです。

#FAQ

FAISSはベクトルデータベースですか?+
いいえ、C++で書かれた類似度検索ライブラリで、PythonとNumPy向けのラッパーを備えています。サーバー、メタデータによるフィルタリング、アクセス制御、組み込みの永続性はいずれもありません。QdrantやMilvusのようなベクトルデータベースは、同じインデックス作成の原理に着想を得ていることも多い同種のエンジンの上に、まさにこうした機能を追加しています。
FAISSは無料かつオープンソースですか?+
はい。このプロジェクトは、使用料なしでの商用利用を認める制約の少ないMITライセンスで公開されており、主にMetaの基礎AI研究グループが開発しています。ライセンス費用はかからず、必要なのは、使用する技術スタックへのライブラリの統合、運用、最新の状態を維持するための時間だけです。
どれくらいの数のベクトルを扱えますか?+
適切なインデックスと十分なRAMがあれば、数百万、プロジェクトの作者によれば数十億のベクトルも扱えます。制約となるのはRAMです。フル精度の1,024次元ベクトルは、インデックス構造の分を含めずに1本あたり約4 KBを必要としますが、非常に大規模なデータでは、積量子化やRaBitQを使うことで大幅に減らせます。
結果をメタデータでフィルタリングできるのでしょうか?+
検索中にはできません。検索後に自分のコードでフィルタリングしますが、上位の結果がすべてフィルターの条件を満たさない場合は、何も残らない可能性があります。アクセス権に基づいてフィルタリングするには、pgvectorや専用のベクトルデータベースのように、検索結果を取得する段階でフィルタリングするシステムが必要です。
FAISSとベクトルデータベース、どちらを選ぶべきですか?+
単一プロセスで、コーパスが固定されており、フィルタリングが不要ならFAISSです。複数のクライアント、継続的な更新、データの永続化、あるいは検索後にアプリケーションコードで処理するのではなく検索そのものの中でアクセス権を適用する必要があるなら、データベースを選びます。
どのインデックスから始めますか?+
厳密な最近傍検索(距離に応じて IndexFlatL2 または IndexFlatIP)。設定も学習フェーズも不要で、再現率を測定する必要もありません。ほとんどのローカルコーパスを大きく上回る規模でも十分に高速です。公式Wikiでは、ベクトル数が100万を超える場合にのみ近似インデックスを推奨しています。
HNSWはあらゆる場合にIVFを置き換えられますか?+
いいえ。RAMに余裕がある場合やコーパスの規模が小さい場合は HNSW が適していますが、シーケンシャルな追加のみを許可し、ベクトルの削除には対応していません。IVF は純粋なクエリ速度では劣りますが、進化していくコーパスに対してより柔軟であり、100万ベクトルを超えると HNSW と組み合わせられます。GPU 実行は、同等の CPU インデックスを直接置き換えます(例えば IndexFlatL2 に対して GpuIndexFlatL2 など)が、ローカルコーパスの規模ではほとんど有用ではありません。
このガイドは役に立ちましたか?

ご意見、誤りのご指摘、補足はありますか?ぜひお知らせください。皆さんにとってより良いガイドにするために役立ちます。