Faiss
Библиотека Facebook для эффективного поиска по сходству и кластеризации плотных векторов. Поддерживает миллиарды векторов, ускорение на GPU и различные типы индексов (Flat, IVF, HNSW). Используется для быстрого k-NN поиска, крупномасштабного векторного поиска или когда требуется чистый поиск по сходству без метаданных. Лучше всего подходит для высокопроизводительных приложений.
Метаданные навыка
| Источник | Опционально — установка с помощью vibeos skills install official/mlops/faiss |
| Путь | optional-skills/mlops/faiss |
| Версия | 1.0.0 |
| Автор | Orchestra Research |
| Лицензия | MIT |
| Зависимости | faiss-cpu, faiss-gpu, numpy |
| Платформы | linux, macos |
| Теги | RAG, FAISS, Поиск по сходству, Векторный поиск, Facebook AI, Ускорение GPU, Миллиардные масштабы, K-NN, HNSW, Высокая производительность, Крупный масштаб |
Справочник: полный SKILL.md
к сведению
Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.
FAISS — эффективный поиск по сходству
Библиотека Facebook AI для векторного поиска по сходству в миллиардных масштабах.
Когда использовать FAISS
Используйте FAISS когда:
- Требуется быстрый поиск по сходству на больших наборах векторов (миллионы/миллиарды)
- Необходимо ускорение на GPU
- Чистое векторное сходство (фильтрация по метаданным не требуется)
- Критичны высокая пропускная способность и низкая задержка
- Пакетная/офлайн обработка эмбеддингов
Метрики:
- 31 700+ звезд на GitHub
- Meta/Facebook AI Research
- Обрабатывает миллиарды векторов
- C++ с привязками к Python
Используйте альтернативы:
- Chroma/Pinecone: требуется фильтрация по метаданным
- Weaviate: нужны полноценные функции базы данных
- Annoy: проще, меньше функций
Быстрый старт
Установка
# Только CPU
pip install faiss-cpu
# Поддержка GPU
pip install faiss-gpu
Базовое использование
import faiss
import numpy as np
# Создание примера данных (1000 векторов, 128 измерений)
d = 128
nb = 1000
vectors = np.random.random((nb, d)).astype('float32')
# Создание индекса
index = faiss.IndexFlatL2(d) # L2 расстояние
index.add(vectors) # Добавление векторов
# Поиск
k = 5 # Найти 5 ближайших соседей
query = np.random.random((1, d)).astype('float32')
distances, indices = index.search(query, k)
print(f"Ближайшие соседи: {indices}")
print(f"Расстояния: {distances}")
Типы индексов
1. Flat (точный поиск)
# L2 (Евклидово) расстояние
index = faiss.IndexFlatL2(d)
# Скалярное произведение (косинусное сходство при нормализации)
index = faiss.IndexFlatIP(d)
# Самый медленный, самый точный
2. IVF (инвертированный файл) — быстрый приближенный
# Создание квантователя
quantizer = faiss.IndexFlatL2(d)
# IVF индекс с 100 кластерами
nlist = 100
index = faiss.IndexIVFFlat(quantizer, d, nlist)
# Обучение на данных
index.train(vectors)
# Добавление векторов
index.add(vectors)
# Поиск (nprobe = количество кластеров для поиска)
index.nprobe = 10
distances, indices = index.search(query, k)
3. HNSW (Иерархический NSW) — лучшее качество/скорость
# HNSW индекс
M = 32 # Количество соединений на слой
index = faiss.IndexHNSWFlat(d, M)
# Обучение не требуется
index.add(vectors)
# Поиск
distances, indices = index.search(query, k)
4. Продуктовое квантование — экономия памяти
# PQ уменьшает память в 16–32 раза
m = 8 # Количество субквантователей
nbits = 8
index = faiss.IndexPQ(d, m, nbits)
# Обучение и добавление
index.train(vectors)
index.add(vectors)
Сохранение и загрузка
# Сохранение индекса
faiss.write_index(index, "large.index")
# Загрузка индекса
index = faiss.read_index("large.index")
# Продолжение использования
distances, indices = index.search(query, k)
Ускорение на GPU
# Один GPU
res = faiss.StandardGpuResources()
index_cpu = faiss.IndexFlatL2(d)
index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu) # GPU 0
# Несколько GPU
index_gpu = faiss.index_cpu_to_all_gpus(index_cpu)
# В 10–100 раз быстрее CPU
Интеграция с LangChain
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# Создание векторного хранилища FAISS
vectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())
# Сохранение
vectorstore.save_local("faiss_index")
# Загрузка
vectorstore = FAISS.load_local(
"faiss_index",
OpenAIEmbeddings(),
allow_dangerous_deserialization=True
)
# Поиск
results = vectorstore.similarity_search("query", k=5)
Интеграция с LlamaIndex
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
# Создание индекса FAISS
d = 1536
faiss_index = faiss.IndexFlatL2(d)
vector_store = FaissVectorStore(faiss_index=faiss_index)
Рекомендации
- Выбирайте правильный тип индекса — Flat для <10K, IVF для 10K–1M, 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