Мы рады объявить о выпуске pgvecto.rs, мощного расширения Postgres для поиска сходства векторов, написанного на Rust. Его алгоритм HNSW в 20 раз быстрее, чем pgvector при 90% отзыве. Но скорость — это только начало — pgvecto.rs спроектирован так, чтобы легко добавлять новые алгоритмы. Мы создали расширяемую архитектуру, чтобы участники могли быстро внедрить новый индекс, и мы с нетерпением ждем, когда сообщество разработчиков открытого исходного кода поднимет pgvecto.rs на новые высоты!

Почему Руст?

Pgvecto.rs реализован на Rust, а не на C, как и многие существующие расширения Postgres. Он построен на основе фреймворка pgrx для написания расширений Postgres в Rust. Rust предоставляет множество преимуществ для таких расширений, как pgvecto.rs. Строгие проверки Rust во время компиляции гарантируют безопасность памяти, что помогает избежать целых классов ошибок и проблем безопасности, которые могут досаждать расширениям C. Что не менее важно, Rust обеспечивает современную эргономику разработчика с отличной документацией, управлением пакетами и отличными сообщениями об ошибках. Это делает pgvecto.rs более доступным для разработчиков по сравнению с обширными кодовыми базами C. Безопасность и простота использования Rust делают его идеальным языком для создания следующего поколения расширений Postgres, таких как pgvecto.rs, поверх pgrx.

Расширяемые архитектуры

Pgvecto.rs имеет расширяемую архитектуру, которая упрощает добавление поддержки новых типов индексов. В основе лежит набор характеристик, определяющих требуемое поведение векторного индекса, например построение, сохранение, загрузку и выполнение запросов. Внедрить новый индекс так же просто, как создать структуру для этого типа индекса и реализовать необходимые свойства. Pgvecto.rs в настоящее время поставляется с двумя встроенными типами индексов — HNSW для максимальной скорости поиска и ivfflat для приблизительного поиска на основе квантования. Но двери открыты для всех, кто может создавать дополнительные индексы, такие как RHNSW, NGT или пользовательские типы, адаптированные к конкретным случаям использования. Расширяемая архитектура делает pgvecto.rs адаптируемым по мере появления новых алгоритмов поиска векторов. И это позволяет вам выбрать правильный индекс для ваших данных и потребностей в производительности. Pgvecto.rs обеспечивает основу для максимально гибкого и ориентированного на будущее векторного поиска в Postgres.

Скорость и производительность

Бечмарки показывают, что pgvecto.rs предлагает значительное улучшение скорости по сравнению с существующими расширениями Postgres, такими как pgvector. В тестах его индекс HNSW демонстрирует производительность поиска до 25 раз выше по сравнению с индексом ivfflat pgvector. Гибкая архитектура также позволяет использовать различные алгоритмы индексирования для оптимизации либо максимальной пропускной способности, либо точности. Сейчас мы работаем над квантованием HNSW, пожалуйста, следите за обновлениями!

Настойчивость и управление

Предыдущая работа pg_embedding отлично справилась с реализацией индексов HNSW, но ей не хватало поддержки персистентности и правильных операций CRUD. pgvecto.rs добавляет те две основные функции, которые отсутствовали в pg_embedding. Векторные индексы в pgvecto.rs должным образом сохраняются с помощью WAL (журнал с упреждающей записью). pgvecto.rs автоматически сохраняет, загружает, перестраивает и обновляет индексы за кулисами. Вы получаете надежные индексы, которые не требуют внешнего управления и идеально вписываются в текущие развертывания и рабочие процессы Postgres.

"Начиная"

Предположим, вы создали таблицу с помощью следующей команды SQL:

CREATE TABLE items (id bigserial PRIMARY KEY, emb vector(4));

Здесь vector(4) обозначает векторный тип данных, 4 представляет размерность вектора. Вы можете использовать vector без указания размера, но имейте в виду, что вы не можете создать индекс для векторного типа без указанного размера.

Вы можете вставлять такие данные в любое время.

INSERT INTO items (emb)
VALUES ('[1.1, 2.2, 3.3, 4.4]');

Чтобы создать индекс для векторного столбца emb с использованием возведенного в квадрат евклидова расстояния, вы можете использовать следующую команду:

CREATE INDEX ON items USING vectors (emb l2_ops)
WITH (options = $$
capacity = 2097152
size_ram = 4294967296
storage_vectors = "ram"
[algorithm.hnsw]
storage = "ram"
m = 32
ef = 256
$$);

Если вы хотите получить 10 лучших векторов, ближайших к исходной точке, вы можете использовать следующую команду SQL:

SELECT *, emb <-> '[0, 0, 0, 0]' AS score
FROM items
ORDER BY emb <-> '[0, 0, 0, 0]'
LIMIT 10;

"Заключение"

pgvecto.rs представляет собой захватывающий шаг вперед для векторного поиска в Postgres. Его реализация в Rust и расширяемой архитектуре обеспечивает ключевые преимущества по сравнению с существующими расширениями, такие как скорость, безопасность и гибкость. Мы очень рады выпустить pgvecto.rs как проект с открытым исходным кодом под лицензией Apache 2.0, и нам не терпится увидеть, что сообщество создаст на его основе. Существует достаточно возможностей для расширения pgvecto.rs — добавление новых типов индексов и алгоритмов, оптимизация для различных распределений данных и вариантов использования, а также интеграция с существующими рабочими процессами Postgres.

Мы рекомендуем вам попробовать pgvecto.rs на GitHub, сравнить его с вашими рабочими нагрузками и внести свои собственные инновации в индексировании. Вместе мы сможем сделать pgvecto.rs лучшим расширением векторного поиска, которое Postgres когда-либо видел! Потенциал огромен, и мы только начинаем. Пожалуйста, присоединяйтесь к нам в этом путешествии, чтобы внедрить беспрецедентные возможности векторного поиска в экосистему Postgres. Присоединяйтесь к нашему сообществу Discord, чтобы общаться с разработчиками и другими пользователями, работающими над улучшением pgvecto.rs!

Время рекламы

Миссия ModelZ — упростить процесс запуска моделей машинного обучения в производство. Благодаря опыту работы с AWS, TikTok и Kubeflow наша команда обладает обширными знаниями в области проектирования MLOps. Поэтому, если у вас есть какие-либо вопросы, связанные с запуском моделей в производство, не стесняйтесь обращаться, присоединившись к Discord или через [email protected]. Мы будем рады помочь использовать наш опыт создания платформ MLOps в компаниях, чтобы предоставить рекомендации по любой части рабочего процесса от разработки модели до развертывания.

Больше продуктов с ModelZ:

  • ModelZ — управляемая бессерверная платформа графического процессора для развертывания ваших собственных моделей.
  • Mosec — высокопроизводительная обслуживающая платформа для моделей машинного обучения, предлагающая динамическую пакетную обработку и конвейеры CPU/GPU для полного использования вашей вычислительной машины. Простая и быстрая альтернатива NVIDIA Triton.
  • envd — инструмент командной строки, который поможет вам создать контейнерную среду для AI/ML, от разработки до производства. Python — это все, что вам нужно знать, чтобы использовать этот инструмент.
  • ModelZ-llm — совместимый с OpenAI API для LLM и встраивания (LLaMA, Vicuna, ChatGLM и многие другие)