Notes

Vector search in PostgreSQL, MongoDB

Vector search in PostgreSQL

Давайте рассмотрим пример системы рекомендации ресторанов на основе предпочтений пользователей.

Практический смысл: Этот пример демонстрирует, как использовать векторный поиск для создания персонализированных рекомендаций. Вместо простого текстового поиска или фильтрации по категориям, векторный поиск позволяет находить рестораны, наиболее близкие к предпочтениям пользователя, учитывая множество факторов одновременно.

Необходимый плагин: pgvector Версия PostgreSQL: 11 или выше

Вот пример кода:

-- Install the pgvector extension
CREATE EXTENSION vector;

-- Create the tables
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    preferences vector(50)  -- 50-dimensional vector for user preferences
);

CREATE TABLE restaurants (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    cuisine TEXT NOT NULL,
    features vector(50)  -- 50-dimensional vector for restaurant features
);

-- Create indexes for faster vector search
CREATE INDEX ON users USING ivfflat (preferences vector_cosine_ops);
CREATE INDEX ON restaurants USING ivfflat (features vector_cosine_ops);

-- Insert sample data (fixture)
INSERT INTO users (name, preferences) VALUES
('Alice', '[0.9, 0.1, 0.5, 0.3, 0.7, ...]'::vector),
('Bob', '[0.2, 0.8, 0.4, 0.6, 0.1, ...]'::vector),
('Charlie', '[0.5, 0.5, 0.5, 0.5, 0.5, ...]'::vector);

INSERT INTO restaurants (name, cuisine, features) VALUES
('Pasta Palace', 'Italian', '[0.8, 0.2, 0.6, 0.4, 0.7, ...]'::vector),
('Sushi Supreme', 'Japanese', '[0.3, 0.7, 0.5, 0.8, 0.2, ...]'::vector),
('Burger Bonanza', 'American', '[0.6, 0.4, 0.7, 0.3, 0.5, ...]'::vector);

-- Query to find restaurants similar to a user's preferences
WITH user_preferences AS (
    SELECT preferences
    FROM users
    WHERE name = 'Alice'
)
SELECT r.name, r.cuisine, 1 - (r.features <=> up.preferences) AS similarity
FROM restaurants r, user_preferences up
ORDER BY similarity DESC
LIMIT 5;

Этот код демонстрирует:

  1. Установку расширения pgvector
  2. Создание таблиц для пользователей и ресторанов с векторными представлениями
  3. Вставку примерных данных
  4. Создание индексов для ускорения векторного поиска
  5. Выполнение запроса для поиска ресторанов, наиболее близких к предпочтениям пользователя

В этом примере векторы представляют различные характеристики ресторанов и предпочтения пользователей. Например, элементы вектора могут отражать уровень шума, ценовую категорию, популярность, тип кухни и т.д.

Практическая значимость этого примера:

  1. Персонализированные рекомендации: Система может предлагать рестораны, наиболее соответствующие вкусам конкретного пользователя.
  2. Многофакторный анализ: Векторное представление позволяет учитывать множество характеристик одновременно.
  3. Масштабируемость: pgvector оптимизирован для работы с большими объемами данных.
  4. Гибкость: Этот подход можно адаптировать для рекомендаций в других областях (товары, фильмы, музыка и т.д.).

В реальном приложении вы бы использовали более сложные методы для создания векторных представлений и могли бы комбинировать векторный поиск с другими критериями для улучшения результатов.

 

Vector search in MongoDB

Рассмотрим простой пример векторного поиска в MongoDB, включая фикстуру данных, запрос, информацию о необходимых плагинах и версии.

Векторный поиск в MongoDB доступен начиная с версии 5.3 и требует использования Atlas Search.

Для начала, вам нужно установить следующие компоненты:

  1. MongoDB Atlas кластер (версия 5.3 или выше)
  2. Atlas Search (включен для вашего кластера)

Теперь давайте рассмотрим пример. Предположим, у нас есть коллекция рецептов, и мы хотим найти рецепты, похожие на заданный рецепт по ингредиентам.

  1. Создание фикстуры данных:
from pymongo import MongoClient
import numpy as np

# Connect to MongoDB Atlas
client = MongoClient("your_mongodb_atlas_connection_string")
db = client["recipes_db"]
collection = db["recipes"]

# Create fixture data
recipes = [
    {
        "name": "Pasta Carbonara",
        "ingredients": ["pasta", "eggs", "bacon", "parmesan cheese", "black pepper"],
        "ingredients_vector": np.random.rand(128).tolist()  # Assume this is the ingredient vector
    },
    {
        "name": "Pizza Margherita",
        "ingredients": ["pizza dough", "tomato sauce", "mozzarella", "basil"],
        "ingredients_vector": np.random.rand(128).tolist()
    },
    {
        "name": "Greek Salad",
        "ingredients": ["cucumbers", "tomatoes", "red onion", "olives", "feta cheese"],
        "ingredients_vector": np.random.rand(128).tolist()
    }
]

# Insert data into the collection
collection.insert_many(recipes)
  1. Создание индекса для векторного поиска:
# Create index for vector search
db.command({
    "createSearchIndex": "recipes",
    "definition": {
        "mappings": {
            "dynamic": False,
            "fields": {
                "ingredients_vector": {
                    "type": "knnVector",
                    "dimensions": 128,
                    "similarity": "cosine"
                }
            }
        }
    }
})

3 Выполнение векторного поиска:

# Assume this is the ingredient vector for the recipe we're looking for
query_vector = np.random.rand(128).tolist()

# Perform vector search
result = collection.aggregate([
    {
        "$search": {
            "index": "recipes",
            "knnBeta": {
                "vector": query_vector,
                "path": "ingredients_vector",
                "k": 2
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "ingredients": 1,
            "score": { "$meta": "searchScore" }
        }
    }
])

# Output results
for doc in result:
    print(f"Recipe: {doc['name']}")
    print(f"Ingredients: {', '.join(doc['ingredients'])}")
    print(f"Similarity score: {doc['score']}")
    print()

 

Этот пример демонстрирует, как можно использовать векторный поиск для нахождения рецептов, наиболее похожих на заданный рецепт по составу ингредиентов.

Обратите внимание, что в реальном приложении вам нужно будет использовать настоящие векторные представления ингредиентов, а не случайные векторы, как в этом примере.

Для работы с векторным поиском в MongoDB вам потребуются следующие компоненты:

  • MongoDB Atlas кластер (версия 5.3 или выше)
  • Atlas Search (должен быть включен для вашего кластера)
  • PyMongo (библиотека Python для работы с MongoDB)
  • NumPy (для работы с векторами в этом примере)

 

 

Афоризм дня:
Наихудшее, чему может научиться молодежь, – легкомыслие. Ибо последнее порождает те удовольствия, из которых развивается порок. (502)

Leave a reply

Яндекс.Метрика