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;
Этот код демонстрирует:
- Установку расширения pgvector
- Создание таблиц для пользователей и ресторанов с векторными представлениями
- Вставку примерных данных
- Создание индексов для ускорения векторного поиска
- Выполнение запроса для поиска ресторанов, наиболее близких к предпочтениям пользователя
В этом примере векторы представляют различные характеристики ресторанов и предпочтения пользователей. Например, элементы вектора могут отражать уровень шума, ценовую категорию, популярность, тип кухни и т.д.
Практическая значимость этого примера:
- Персонализированные рекомендации: Система может предлагать рестораны, наиболее соответствующие вкусам конкретного пользователя.
- Многофакторный анализ: Векторное представление позволяет учитывать множество характеристик одновременно.
- Масштабируемость: pgvector оптимизирован для работы с большими объемами данных.
- Гибкость: Этот подход можно адаптировать для рекомендаций в других областях (товары, фильмы, музыка и т.д.).
В реальном приложении вы бы использовали более сложные методы для создания векторных представлений и могли бы комбинировать векторный поиск с другими критериями для улучшения результатов.
Vector search in MongoDB
Рассмотрим простой пример векторного поиска в MongoDB, включая фикстуру данных, запрос, информацию о необходимых плагинах и версии.
Векторный поиск в MongoDB доступен начиная с версии 5.3 и требует использования Atlas Search.
Для начала, вам нужно установить следующие компоненты:
- MongoDB Atlas кластер (версия 5.3 или выше)
- Atlas Search (включен для вашего кластера)
Теперь давайте рассмотрим пример. Предположим, у нас есть коллекция рецептов, и мы хотим найти рецепты, похожие на заданный рецепт по ингредиентам.
- Создание фикстуры данных:
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)
- Создание индекса для векторного поиска:
# 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 (для работы с векторами в этом примере)
Leave a reply