Вы когда-нибудь задумывались, как 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