Skill v1.0.0
currentAutomated scan100/100name: faiss description: Facebook's library for efficient similarity search and clustering of dense vectors. Supports billions of vectors, GPU acceleration, and various index types (Flat, IVF, HNSW). Use for fast k-NN search, large-scale vector retrieval, or when you need pure similarity search without metadata. Best for high-performance applications. category: llm-tools version: 1.0.0 author: Orchestra Research license: MIT tags: [RAG, FAISS, Similarity Search, Vector Search, Facebook AI, GPU Acceleration, Billion-Scale, K-NN, HNSW, High Performance, Large Scale] dependencies: [faiss-cpu, faiss-gpu, numpy] metadata: upstream: Orchestra-Research/AI-Research-SKILLs upstream-url: https://github.com/Orchestra-Research/AI-Research-SKILLs upstream-path: 15-rag/faiss upstream-license: MIT upstream-relationship: derived skill-author: Orchestra Research adapted-by: Synthetic Sciences
FAISS - Efficient Similarity Search
Facebook AI's library for billion-scale vector similarity search.
When to use FAISS
Use FAISS when:
- Need fast similarity search on large vector datasets (millions/billions)
- GPU acceleration required
- Pure vector similarity (no metadata filtering needed)
- High throughput, low latency critical
- Offline/batch processing of embeddings
Metrics:
- 31,700+ GitHub stars
- Meta/Facebook AI Research
- Handles billions of vectors
- C++ with Python bindings
Use alternatives instead:
- Chroma/Pinecone: Need metadata filtering
- Weaviate: Need full database features
- Annoy: Simpler, fewer features
Quick start
Installation
# CPU onlypip install faiss-cpu# GPU supportpip install faiss-gpu
Basic usage
import faissimport numpy as np# Create sample data (1000 vectors, 128 dimensions)d = 128nb = 1000vectors = np.random.random((nb, d)).astype('float32')# Create indexindex = faiss.IndexFlatL2(d) # L2 distanceindex.add(vectors) # Add vectors# Searchk = 5 # Find 5 nearest neighborsquery = np.random.random((1, d)).astype('float32')distances, indices = index.search(query, k)print(f"Nearest neighbors: {indices}")print(f"Distances: {distances}")
Index types
1. Flat (exact search)
# L2 (Euclidean) distanceindex = faiss.IndexFlatL2(d)# Inner product (cosine similarity if normalized)index = faiss.IndexFlatIP(d)# Slowest, most accurate
2. IVF (inverted file) - Fast approximate
# Create quantizerquantizer = faiss.IndexFlatL2(d)# IVF index with 100 clustersnlist = 100index = faiss.IndexIVFFlat(quantizer, d, nlist)# Train on dataindex.train(vectors)# Add vectorsindex.add(vectors)# Search (nprobe = clusters to search)index.nprobe = 10distances, indices = index.search(query, k)
3. HNSW (Hierarchical NSW) - Best quality/speed
# HNSW indexM = 32 # Number of connections per layerindex = faiss.IndexHNSWFlat(d, M)# No training neededindex.add(vectors)# Searchdistances, indices = index.search(query, k)
4. Product Quantization - Memory efficient
# PQ reduces memory by 16-32×m = 8 # Number of subquantizersnbits = 8index = faiss.IndexPQ(d, m, nbits)# Train and addindex.train(vectors)index.add(vectors)
Save and load
# Save indexfaiss.write_index(index, "large.index")# Load indexindex = faiss.read_index("large.index")# Continue usingdistances, indices = index.search(query, k)
GPU acceleration
# Single GPUres = faiss.StandardGpuResources()index_cpu = faiss.IndexFlatL2(d)index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu) # GPU 0# Multi-GPUindex_gpu = faiss.index_cpu_to_all_gpus(index_cpu)# 10-100× faster than CPU
LangChain integration
from langchain_community.vectorstores import FAISSfrom langchain_openai import OpenAIEmbeddings# Create FAISS vector storevectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())# Savevectorstore.save_local("faiss_index")# Loadvectorstore = FAISS.load_local("faiss_index",OpenAIEmbeddings(),allow_dangerous_deserialization=True)# Searchresults = vectorstore.similarity_search("query", k=5)
LlamaIndex integration
from llama_index.vector_stores.faiss import FaissVectorStoreimport faiss# Create FAISS indexd = 1536faiss_index = faiss.IndexFlatL2(d)vector_store = FaissVectorStore(faiss_index=faiss_index)
Best practices
- Choose right index type - Flat for <10K, IVF for 10K-1M, HNSW for quality
- Normalize for cosine - Use IndexFlatIP with normalized vectors
- Use GPU for large datasets - 10-100× faster
- Save trained indices - Training is expensive
- Tune nprobe/ef_search - Balance speed/accuracy
- Monitor memory - PQ for large datasets
- Batch queries - Better GPU utilization
Performance
| Index Type | Build Time | Search Time | Memory | Accuracy | |
|---|---|---|---|---|---|
| Flat | Fast | Slow | High | 100% | |
| IVF | Medium | Fast | Medium | 95-99% | |
| HNSW | Slow | Fastest | High | 99% | |
| PQ | Medium | Fast | Low | 90-95% |
Resources
- GitHub: https://github.com/facebookresearch/faiss ⭐ 31,700+
- Wiki: https://github.com/facebookresearch/faiss/wiki
- License: MIT