Работали ли вы с векторными базами данных?

«Работали ли вы с векторными базами данных?» — вопрос из категории Базы данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я использовал векторные базы данных для реализации семантического поиска и рекомендательных систем. Основной опыт связан с FAISS (Facebook AI Similarity Search) и pgvector (расширение для PostgreSQL).

Пример интеграции FAISS для поиска похожих товаров:

import faiss
import numpy as np

# Допустим, у нас есть эмбеддинги товаров (512-мерные векторы)
product_embeddings = np.random.rand(10000, 512).astype('float32')

# Создание индекса L2 (евклидово расстояние)
dimension = 512
index = faiss.IndexFlatL2(dimension)
index.add(product_embeddings)

# Поиск 5 ближайших соседей для нового товара
query_embedding = np.random.rand(1, 512).astype('float32')
k = 5
distances, indices = index.search(query_embedding, k)
print(f"Ближайшие товары: {indices[0]}")
print(f"Расстояния: {distances[0]}")

Практическое применение:

  • Семантический поиск в документации: Индексировал эмбеддинги текстовых фрагментов (полученные через sentence-transformers) в FAISS, что позволяло находить релевантные разделы по смысловому запросу, а не только по ключевым словам.
  • Рекомендательная система: Хранил векторные представления пользовательских предпочтений и айтемов в pgvector. Это позволяло выполнять быстрые SQL-запросы с оператором <=> (косинусное сходство) для подбора персональных рекомендаций прямо в базе данных, без выгрузки данных в приложение.

Ключевые моменты:

  • Выбор между специализированными решениями (FAISS, Milvus) и расширениями для реляционных БД (pgvector) зависит от масштаба данных и требований к интеграции с существующей инфраструктурой.
  • Для больших датасетов в FAISS использовал индексы с квантованием (например, IndexIVFFlat) для ускорения поиска за счёт приемлемой потери точности.