Использование vector в Yandex Managed Service for PostgreSQL
Вы можете хранить векторные данные и выполнять векторный поиск в Yandex Managed Service for PostgreSQL с помощью расширения vector.
Расширение поддерживает:
- Точный и приблизительный поиск ближайших соседей.
- Различные типы векторов: одинарной точности, половинной точности, бинарные и разреженные векторы.
- Несколько метрик сравнения векторов: L2 (евклидово расстояние), косинусное расстояние, скалярное произведение, L1 (манхэттенское расстояние), расстояние Хэмминга и Жаккара.
- Работу с любым языком программирования, который поддерживает подключение к PostgreSQL.
Векторный поиск можно комбинировать с привычными возможностями PostgreSQL и SQL.
По умолчанию в vector выполняется точный поиск, при котором сравниваются все векторы. Для больших объемов данных можно создавать векторные индексы и использовать приблизительный поиск. В этом случае поиск выполняется быстрее, но результаты могут быть менее точными.
В vector поддерживается два типа индексов:
- HNSW — организует векторы в структуру данных, которая позволяет быстро переходить от одного похожего вектора к другому и находить ближайших соседей без проверки всей таблицы. В основе этой структуры лежит многослойный граф.
- IVFFlat — разбивает все векторы на несколько групп (списков). Во время поиска проверяются не все группы, а только те, которые наиболее близки к искомому вектору. По сравнению с HNSW этот индекс строится быстрее и использует меньше памяти, но уступает по качеству и скорости поиска.
Расширение vector доступно в кластерах Managed Service for PostgreSQL версии 13 и выше.
Подробнее о расширении vector читайте в его документации
Установить расширение vector в кластер Yandex Managed Service for PostgreSQL
Чтобы установить расширение в Managed Service for PostgreSQL, добавьте расширение vector в нужную базу данных.
Примеры использования
Подробнее об использовании vector в руководстве Выполнение векторного поиска в Yandex Managed Service for PostgreSQL с помощью vector.
Выполнить векторный поиск
Для получения расстояния в расширении vector используются следующие функции:
<->— расстояние L2 (евклидово расстояние);<#>— отрицательное скалярное произведение;<=>— косинусное расстояние;<+>— расстояние L1 (манхэттенское расстояние);<~>— расстояние Хэмминга (для бинарных векторов);<%>— расстояние Жаккара (для бинарных векторов).
Чтобы найти ближайшие к заданному вектору записи по расстоянию L2, выполните запрос:
SELECT *
FROM <имя_таблицы>
ORDER BY <имя_столбца> <-> '<вектор_запроса>'
LIMIT <количество_результатов>;
Где:
<вектор_запроса>— вектор, с которым сравниваются векторы из столбца. Например[3, 1, 2].<количество_результатов>— количество возвращаемых результатов.
Также расширение vector поддерживает следующие поисковые запросы:
- поиск записей, наиболее похожих на существующую запись;
- поиск записей, находящихся ближе заданного расстояния;
- получение расстояния между векторами;
- получение значения скалярного произведения;
- получение косинусного сходства;
- вычисление среднего вектора.
Пример выполнения этих поисковых запросов приведен в руководстве Выполнение векторного поиска в Yandex Managed Service for PostgreSQL с помощью vector.
Создать индекс
Индексы позволяют ускорить векторный поиск. Для каждой функции расчета расстояния нужно создавать свой индекс HNSW и IVFFlat.
HNSW
Чтобы создать HNSW-индекс для определенного расстояния, выполните запрос:
CREATE INDEX ON <имя_таблицы>
USING hnsw (<имя_столбца> <тип_расстояния>)
WITH (
m = <число_связей>,
ef_construction = <число_кандидатов>
);
Где:
-
<тип_расстояния>— функция расчета расстояния, напримерvector_l2_ops. Подробнее в документации расширенияvector. -
m— максимальное количество связей, которое может иметь вершина графа на каждом уровне. По умолчанию —16. -
ef_construction— количество кандидатов, рассматриваемых при построении графа. По умолчанию —64. Чем выше значение, тем выше вероятность найти наиболее подходящие записи, но индекс строится дольше и операции вставки выполняются медленнее.Параметры
mиef_constructionзадаются один раз при создании индекса. Чтобы изменить их значения, пересоздайте индекс.
Чтобы настроить точность поиска, выполните запрос:
SET hnsw.ef_search = <число_векторов>;
Где ef_search — количество векторов, которые алгоритм рассматривает во время поиска. По умолчанию — 40. Чем выше значение, тем выше вероятность найти наиболее похожие записи, но запрос будет выполняться медленнее.
В отличие от параметров индекса m и ef_construction, параметр поиска ef_search можно изменять перед выполнением запросов.
IVFFlat
Чтобы создать IVFFlat-индекс, выполните запрос:
CREATE INDEX ON <имя_таблицы>
USING ivfflat (<имя_столбца> <тип_расстояния>)
WITH (
lists = <число_групп>
);
Где:
-
<тип_расстояния>— функция расчета расстояния, напримерvector_l2_ops. Подробнее в документации расширенияvector. -
lists— количество групп (списков), на которые будут разделены векторы. Рекомендуемое значение зависит от объема данных. Чем больше групп, тем быстрее поиск, но качество поиска может снизиться.Параметр
listsзадается один раз при создании индекса. Чтобы изменить его значение, пересоздайте индекс.
Чтобы настроить точность поиска, выполните запрос:
SET ivfflat.probes = <число_групп_для_поиска>;
Где probes — количество групп (списков), просматриваемых при выполнении поиска. По умолчанию — 1. Чем больше значение, тем выше вероятность найти наиболее похожие записи, но ниже скорость выполнения запроса.
В отличие от параметра индекса lists, параметр поиска probes можно изменять перед выполнением запросов.