Ответ
Да, я использовал векторные базы данных для реализации семантического поиска и рекомендательных систем. Основной опыт связан с 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) для ускорения поиска за счёт приемлемой потери точности.