Перейти к основному содержимому

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)

Рекомендации​

  1. Выбирайте правильный тип индекса — Flat для <10K, IVF для 10K–1M, HNSW для качества
  2. Нормализуйте для косинусного сходства — используйте IndexFlatIP с нормализованными векторами
  3. Используйте GPU для больших наборов данных — в 10–100 раз быстрее
  4. Сохраняйте обученные индексы — обучение затратно
  5. Настраивайте nprobe/ef_search — баланс скорости и точности
  6. Следите за памятью — PQ для больших наборов данных
  7. Группируйте запросы — лучшее использование GPU

Производительность​

Тип индексаВремя построенияВремя поискаПамятьТочность
FlatБыстроМедленноВысокая100%
IVFСреднеБыстроСредняя95–99%
HNSWМедленноБыстрейшееВысокая99%
PQСреднеБыстроНизкая90–95%

Ресурсы​