Вы когда-нибудь задумывались, как Netflix предлагает фильмы, которые могут вам понравиться, или как Spotify создаёт персонализированные плейлисты? Эти функции на базе ИИ часто используют поиск по векторному сходству. В этом гайде мы установим векторную БД pgvector на базе PostgreSQL подобную тем, что используют рекомендательные системы!
Давайте начнём…🐢
Обзор проекта ✨
Мы создадим поисковую систему, которая будет находить похожий контент по смыслу, а не только по ключевым словам. Это та же технология, которая лежит в основе:
- Предложения по написанию кода от GitHub Copilot
- Рекомендации Spotify по песням
- Рекомендации по фильмам от Netflix
Хотя различные инструменты и сервисы поддерживают схожие функции, мы будем использовать pgvector
для реализации поиска по векторному сходству в PostgreSQL.
Pgvector представляет собой специализированный тип данных, операторы и функции, которые обеспечивают эффективное хранение, обработку и анализ векторных данных.
Это решение с открытым исходным кодом, которое легко интегрируется с PostgreSQL, что делает его отличным выбором, если вы уже знакомы с базами данных Postgres.
В первой части мы настроим инфраструктуру базы данных. Во второй части мы реализуем функцию поиска с помощью встраиваний OpenAI.
Что такое векторный поиск? 🔎
Когда ИИ обрабатывает контент (текст, код или изображения), он создаёт специальный список чисел, называемый врезкой. Представьте себе, что это интеллектуальное резюме, которое отражает смысл контента. У похожего контента будут похожие числа, что упрощает поиск связанных элементов.
Если вы не знакомы с машинным обучением, не волнуйтесь! Вы можете легко получить эти векторы из API-интерфейсов ИИ, таких как OpenAI, даже не обладая глубокими знаниями в области ИИ.
pgvector помогает нам эффективно хранить и искать эти вложения в виде векторов в PostgreSQL.
Пошаговая настройка 👣
Убедитесь, что на вашем компьютере установлен Docker Desktop.
Структура проекта
vector-search/ ├── compose.yml └── postgres/ └── schema.sql
1. Создать compose.yml
services: db: image: pgvector/pgvector:pg17 # PostgreSQL with pgvector support container_name: pgvector-db environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: example_db ports: - "5432:5432" volumes: - pgdata:/var/lib/postgresql/data - ./postgres/schema.sql:/docker-entrypoint-initdb.d/schema.sql volumes: pgdata: # Stores data outside the container to ensure persistence
2. Определите схему базы данных
Создатьpostgres/schema.sql
:
-- Enable pgvector extension CREATE EXTENSION IF NOT EXISTS vector; -- Create sample table CREATE TABLE items ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, item_data JSONB, embedding vector(1536) -- vector data );
3. Запустите базу данных
Запустите Docker Compose, чтобы создать и запустить контейнер PostgreSQL с помощью pgvector.
docker compose up --build
4. Проверьте настройки
Подключение к PostgreSQL:
docker exec -it pgvector-db psql -U postgres -d example_db
Проверьте, всё ли настроено правильно:
-- Check installed extensions \dx -- Check table creation \dt -- Check table structure \d items
Советы по устранению неполадок 🛠️
Ошибка: порт 5432 уже используется
Измените порт в compose.yml
на 5433 или другой свободный порт.
ports: - "5433:5432"
База данных не инициализируется должным образом
Извлеките volume и перезагрузите компьютер.
docker-compose down -v # Remove existing volume docker-compose up --build # Start fresh
Вы всё ещё не знаете, что не так?
Проверьте журналы контейнеров.
docker compose logs db
Быстрый предварительный просмотр 👀
Вот краткий обзор того, как мы будем искать похожие товары в части 2:
-- Find items similar to a specific vector SELECT id, name, item_data FROM items ORDER BY embedding <-> '[0.1, 0.2, ...]'::vector LIMIT 5;
Замените [0,1, 0,2, …] на фактический вектор из моделей ИИ.
Что будет дальше? 💭
Мы рассмотрим следующие темы:
- Узнайте, что такое вложения и как они работают
- Создайте встраиваемые элементы с помощью OpenAI
- Посмотрите, как работает векторный поиск на практике
Оставайтесь с нами! 🚀
Вы заметили какие-то ошибки или знаете, как сделать лучше? Пожалуйста, оставьте комментарий ниже! 💬
Перевод: Setup with PostgreSQL and pgvector