faiss について
faiss は、大規模なベクトル集合を対象とする類似検索ライブラリです。低遅延・高スループットの検索や GPU アクセラレーションを必要とする開発者向けで、厳密・近似インデックスと保存・読み込みに対応します。
主な機能
- 01大規模ベクトルの類似検索
- 02厳密検索と近似検索のインデックス
- 03GPU と複数 GPU による高速化
- 04メモリを抑える積量子化
- 05インデックスの保存と読み込み
活用シーン
- 01数百万・数十億件のベクトル検索
- 02埋め込みのバッチ処理
- 03セマンティック検索システムの構築
- 04GPU によるベクトル検索の高速化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill faissインストール後、Claude Code で/faissを入力して読み込まれたか確認します。
同梱ファイルreferences/index_types.md
詳細
FAISS - 効率的な類似性検索
Facebook AI の、数十億規模のベクトル類似性検索ライブラリです。
FAISS を使う場面
次の場合は FAISS を使用してください:
- 大規模なベクトルデータセット(数百万〜数十億件)で高速な類似性検索が必要な場合
- GPU アクセラレーションが必要な場合
- 純粋なベクトル類似性検索を行う場合(メタデータフィルタリングが不要)
- 高スループットと低レイテンシが重要な場合
- 埋め込みのオフライン/バッチ処理を行う場合
指標:
- Meta/Facebook AI Research
- 数十億件のベクトルを処理
- Python バインディングを備えた C++
代わりに次を使用してください:
- Chroma/Pinecone:メタデータフィルタリングが必要な場合
- Weaviate:データベースの全機能が必要な場合
- Annoy:よりシンプルで、機能が少ないものが必要な場合
クイックスタート
インストール
# CPU only
pip install faiss-cpu
# GPU support
pip install faiss-gpu
基本的な使い方
import faiss
import numpy as np
# Create sample data (1000 vectors, 128 dimensions)
d = 128
nb = 1000
vectors = np.random.random((nb, d)).astype('float32')
# Create index
index = faiss.IndexFlatL2(d) # L2 distance
index.add(vectors) # Add vectors
# Search
k = 5 # Find 5 nearest neighbors
query = np.random.random((1, d)).astype('float32')
distances, indices = index.search(query, k)
print(f"Nearest neighbors: {indices}")
print(f"Distances: {distances}")
インデックスタイプ
1. Flat(完全検索)
# L2 (Euclidean) distance
index = faiss.IndexFlatL2(d)
# Inner product (cosine similarity if normalized)
index = faiss.IndexFlatIP(d)
# Slowest, most accurate
2. IVF(転置ファイル) - 高速な近似検索
# Create quantizer
quantizer = faiss.IndexFlatL2(d)
# IVF index with 100 clusters
nlist = 100
index = faiss.IndexIVFFlat(quantizer, d, nlist)
# Train on data
index.train(vectors)
# Add vectors
index.add(vectors)
# Search (nprobe = clusters to search)
index.nprobe = 10
distances, indices = index.search(query, k)
3. HNSW(階層型 NSW) - 品質と速度に優れる
# HNSW index
M = 32 # Number of connections per layer
index = faiss.IndexHNSWFlat(d, M)
# No training needed
index.add(vectors)
# Search
distances, indices = index.search(query, k)
4. Product Quantization - メモリ効率に優れる
# PQ reduces memory by 16-32×
m = 8 # Number of subquantizers
nbits = 8
index = faiss.IndexPQ(d, m, nbits)
# Train and add
index.train(vectors)
index.add(vectors)
保存と読み込み
# Save index
faiss.write_index(index, "large.index")
# Load index
index = faiss.read_index("large.index")
# Continue using
distances, indices = index.search(query, k)
GPU アクセラレーション
# Single GPU
res = faiss.StandardGpuResources()
index_cpu = faiss.IndexFlatL2(d)
index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu) # GPU 0
# Multi-GPU
index_gpu = faiss.index_cpu_to_all_gpus(index_cpu)
# 10-100× faster than CPU
LangChain との統合
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# Create FAISS vector store
vectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())
# Save
vectorstore.save_local("faiss_index")
# Load
vectorstore = FAISS.load_local(
"faiss_index",
OpenAIEmbeddings(),
allow_dangerous_deserialization=True
)
# Search
results = vectorstore.similarity_search("query", k=5)
LlamaIndex との統合
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
# Create FAISS index
d = 1536
faiss_index = faiss.IndexFlatL2(d)
vector_store = FaissVectorStore(faiss_index=faiss_index)
ベストプラクティス
- 適切なインデックスタイプを選ぶ - 1 万件未満なら Flat、1 万〜100 万件なら IVF、品質重視なら HNSW
- コサイン類似度では正規化する - 正規化したベクトルと IndexFlatIP を使用する
- 大規模なデータセットには GPU を使用する - 10〜100 倍高速
- 学習済みインデックスを保存する - 学習には時間がかかります
- nprobe/ef_search を調整する - 速度と精度のバランスを取る
- メモリを監視する - 大規模なデータセットには PQ を使用する
- クエリをバッチ処理する - GPU の利用効率が向上します
パフォーマンス
| インデックスタイプ | 構築時間 | 検索時間 | メモリ | 精度 |
|---|---|---|---|---|
| Flat | 高速 | 低速 | 多い | 100% |
| IVF | 中程度 | 高速 | 中程度 | 95-99% |
| HNSW | 低速 | 最速 | 多い | 99% |
| PQ | 中程度 | 高速 | 少ない | 90-95% |
リソース
- GitHub:https://github.com/facebookresearch/faiss ⭐ 31,700+
- Wiki:https://github.com/facebookresearch/faiss/wiki
- ライセンス:MIT
エージェントの実行手順
- 環境を確認します。 コーパス、埋め込みモデル、ベクトルストアのバージョン、およびインデックスの保存先を確認します。
- 入力内容を確定します。 データまたはユーザーに形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
- まず小規模で実行します。 データの小さなサブセットにインデックスを作成し、既知の質問と文章の組み合わせで検索をテストします。
- 上記の手順と参考情報を使用して、タスク全体を実行します。
- 結果を検証します。 ラベル付きデータセットで recall@k を測定し、回答が検索された文章のみを引用していることを確認します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定事項を明記します。
| 発生した状況 | 対応 |
|---|---|
| 検索結果に関連性のないチャンクが含まれる | チャンク分割を見直し、BM25/ハイブリッド検索を追加するか、生成モデルを変更する前に再ランキングします。 |
| これらの手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンに存在しない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認し、適宜対応してユーザーに伝えます。API を決してでっち上げないでください。 |
| 必須の入力、識別子、パラメーターが曖昧である | ユーザーに質問するか、実行前に前提を明示します。 |
整合性に関するルール
- 結果、パラメーター、識別子、引用、統計情報を捏造しないでください。実行または検証できない場合は、その旨を明確に伝えてください。
- 回答は検索されたテキストに基づく必要があります。コーパスに回答が含まれていない場合は、その旨を伝えてください。
- ここに記載されたバージョン固有の詳細は古くなっている可能性があります。インストール済みバージョンの公式ドキュメントで確認してください。
- 費用が発生する操作、共有 GPU やクラウドのクォータを消費する操作、個人データや患者データにアクセスする操作、または取り消せない操作を行う前に、許可を求めてください。
関連スキル
pinecone:Python クライアントと LangChain、LlamaIndex の統合を通じて、マネージド型サーバーレスベクトルデータベースである Pinecone の使い方を案内します。qdrant-vector-search:RAG とセマンティック検索向けの高性能なベクトル類似検索エンジンです。chroma:AI アプリケーション向けのオープンソース埋め込みデータベースです。
コメント
Markdown 対応