Vector индекс
Эта тема представляет функцию vector индекса Selena и как выполнять приблизительный поиск ближайших соседей (ANNS) с её помощью.
Функция vector индекса поддерживается только в shared-nothing кластерах версии v1.5.2 или более поздней.
Обзор
В настоящее время Selena поддерживает векторную индексацию на уровне файлов Segment. Индекс отображает каждый элемент поиска на его ID строки в файлах Segment, позволяя быстро извлекать данные путём прямого определения соответствующих строк данных без вычислений векторных расстояний методом грубой силы. Система теперь предоставляет два типа векторной индексации: Inverted File with Product Quantization (IVFPQ) и Hierarchical Navigable Small World (HNSW), каждый со своей организационной структурой.
Inverted File with Product Quantization (IVFPQ)
Inverted File with Product Quantization (IVFPQ) — это метод приблизительного поиска ближайших соседей в крупномасштабных многомерных векторах, обычно используемый в задачах векторного поиска в глубоком обучении и машинном обучении. IVFPQ состоит из двух основных компонентов: inverted file и product quantization.
- Inverted File: Этот компонент является методом индексации. Он разделяет набор данных на несколько кластеров (или ячеек Вороного), каждый с центроидом (начальной точкой), и назначает каждую точку данных (вектор) её ближайшему центру кластера. Для векторного поиска IVFPQ нужно только искать в ближайшем кластере, значительно уменьшая область и сложность поиска.
- Product Quantization: Этот компонент является методом сжатия данных. Он разбивает многомерные векторы на подвекторы и квантует каждый подвектор для отображения его на ближайшую точку в предопределённом наборе, уменьшая затраты на хранение и вычисления при сохранении высокой точности.
Комбинируя inverted files и product quantization, IVFPQ обеспечивает эффективный приблизительный поиск ближайших соседей в больших мног омерных наборах данных.
Hierarchical Navigable Small World (HNSW)
Hierarchical Navigable Small World (HNSW) — это алгоритм на основе графов для поиска ближайших соседей в многомерных пространствах, также широко используемый в задачах векторного поиска.
HNSW строит иерархическую структуру графов, в которой каждый уровень представляет собой navigable small world (NSW) граф. В графе каждая вершина представляет точку данных, а рёбра указывают на сходство между вершинами. Верхние уровни графа содержат меньше вершин с более разреженными соединениями для быстрого глобального поиска, в то время как нижние уровни включают все вершины с более плотными соединениями для точного локального поиска.
Для векторного поиска HNSW сначала выполняет поиск на верхнем уровне, быстро определяя приблизительную область ближайших соседей, затем перемещается вниз по уровням, чтобы найти точного ближайшего соседа на нижнем уровне.
HNSW предлагает как эффективность, так и т очность, делая его адаптируемым к различным данным и распределениям запросов.
Сравнение IVFPQ и HNSW
- Коэффициент сжатия данных: IVFPQ имеет более высокий коэффициент сжатия (около 1:0.15). Расчёт индексации обеспечивает только предварительные результаты сортировки после грубой ранжировки, потому что PQ сжимает векторы. Требуется дополнительная тонкая ранжировка для окончательных результатов сортировки, что приводит к более высоким вычислениям и задержке. HNSW имеет более низкий коэффициент сжатия (около 1:0.8) и обеспечивает точную ранжировку без дополнительной обработки, что приводит к более низким вычислительным затратам и задержке и более высоким затратам на хранение.
- Настройка Recall: Оба индекса поддерживают настройку уровня recall через регулировку параметров, но IVFPQ влечёт более высокие вычислительные затраты при аналогичных уровнях recall.
- Стратегия кэширования: IVFPQ позволяет балансировать з атраты на память и задержку вычислений путём регулировки пропорции кэша блоков индекса, в то время как HNSW в настоящее время поддерживает только полное кэширование файла.
Использование
Каждая таблица поддерживает только один vector индекс.
Предварительные условия
Перед созданием vector индексов необходимо включить его, установив параметр конфигурации FE enable_experimental_vector в true.
Выполните следующий оператор для динамического включения:
ADMIN SET FRONTEND CONFIG ("enable_experimental_vector" = "true");
Чтобы включить его постоянно, необходимо добавить enable_experimental_vector = true в файл конфигурации FE fe.conf и перезапустить FE.
Создание vector индекса
Это руководство создаёт vector индексы при создании таблиц. Вы также можете добавить vector индексы к существующей таблице. См. Добавление vector индекса для подробных инструкций.
-
Следующий пример создаёт HNSW vector индекс
hnsw_vectorна столбцеvectorв таблицеhnsw.CREATE TABLE hnsw (
id BIGINT(20) NOT NULL COMMENT "",
vector ARRAY<FLOAT> NOT NULL COMMENT "",
INDEX hnsw_vector (vector) USING VECTOR (
"index_type" = "hnsw",
"dim"="5",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"M" = "16",
"efconstruction" = "40"
)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1; -
Следующий пример создаёт IVFPQ vector индекс
ivfpq_vectorна столбцеvectorв таблицеivfpq.CREATE TABLE ivfpq (
id BIGINT(20) NOT NULL COMMENT "",
vector ARRAY<FLOAT> NOT NULL COMMENT "",
INDEX ivfpq_vector (vector) USING VECTOR (
"index_type" = "ivfpq",
"dim"="5",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"nbits" = "16",
"nlist" = "40"
)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1;
Параметры построения индекса
USING VECTOR
- По умолчанию: N/A
- Обязательно: Да
- Описание: Создаёт vector индекс.
index_type
- По умолчанию: N/A
- Обязательно: Да
- Описание: Тип vector индекса. Допустимые значения:
hnswиivfpq.
dim
- По умолчанию: N/A
- Обязательно: Да
- Описание: Размерность индекса. После построения индекса векторы, не соответствующие требованиям размерности, будут отклонены при загрузке в базовый столбец. Должно быть целым числом больше или равным
1.
metric_type
- По умолчанию: N/A
- Обязательно: Да
- Описание: Тип метрики (функция измерения) vector индекса. Допустимые значения:
l2_distance: Евклидово расстояние. Чем меньше значение, тем выше сходство.cosine_similarity: Косинусное сходство. Чем больше значение, тем выше сходство.
is_vector_normed
- По умолчанию: false
- Обязательно: Нет
- Описание: Нормализованы ли векторы. Допустимые значения
trueиfalse. Действует только когдаmetric_typeравенcosine_similarity. Если векторы нормализованы, значение вычисленных расстояний будет в пределах [-1, 1]. Векторы должны удовлетворять условию, что сумма квадратов равна1, иначе возвращается ошибка.
M
- По умолчанию: 16
- Обязательно: Нет
- Описание: Специфический параметр HNSW. Количество двунаправленных соединений, создаваемых для каждого нового элемента во время построения графа. Должно быть целым числом больше или равным
2. ЗначениеMнапрямую влияет на эффективность и точность построения и поиска графа. Во время построения графа каждая вершина попытается установить соединения с её ближайшимиMвершинами. Если вершина уже имеетMсоединений, но находит более близкую вершину, самое дальнее соединение будет удалено, и новое соединение будет установлено с более близкой вершиной. Векторный поиск начнётся с точки входа и найдёт ближайшего соседа вдоль вершин, соединённых с ней. Следовательно, чем больше значениеM, тем больше область поиска для каждой вершины, тем выше эффективность поиска, но тем выше стоимость построения и хранения графа.
efconstruction
- По умолчанию: 40
- Обязательно: Нет
- Описание: Специфический параметр HNSW. Размер списка кандидатов, содержащего ближайших соседей. Должно быть целым числом больше или равным
1. Используется для контроля глубины поиска во время процесса построения графа. В частности,efconstructionопределяет размер списка поиска (также известного как список кандидатов) для каждой вершины во время процесса построения графа. Этот список кандидатов используется для хранения кандидатов соседей текущей вершины, а размер списка равенefconstruction. Чем больше значениеefconstruction, тем больше кандидатов рассматривается как соседи вершины во время процесса построения графа, и, как результат, лучше качество (например, лучшая связность) графа, но также выше потребление времени и вычислительная сложность построения графа.
nbits
- По умолчанию: 16
- О бязательно: Нет
- Описание: Специфический параметр IVFPQ. Точность Product Quantization (PQ). Должно быть кратным
8. С IVFPQ каждый вектор разделяется на несколько подвекторов, и затем каждый подвектор квантуется.Nbitsопределяет точность квантования, то есть на сколько двоичных цифр квантуется каждый подвектор. Чем больше значениеnbits, тем выше точность квантования, но тем выше затраты на хранение и вычисления.
nlist
- По умолчанию: 16
- Обязательно: Нет
- Описание: Специфический параметр IVFPQ. Количество кластеров или inverted списков. Должно быть целым числом больше или равным
1. С IVFPQ набор данных разделяется на кластеры, и центроид каждого кластера соответствует inverted списку. Векторный поиск сначала найдёт центроид кластера, ближайший к точке данных, и затем извлечёт ближайших соседей в соответствующем inverted списке. Следовательно, значениеnlistбудет влиять на точность и эффективность поиска. Чем больше значениеnlist, тем мельче гранулярность кластеризации, таким образом, выше точность поиска, но также выше сложность поиска.
M_IVFPQ
- Обязательно: Да
- Описание: Специфический параметр IVFPQ. Количество подвекторов, на которые будет разделён исходный вектор. IVFPQ индекс разделит вектор размерности
dimнаM_IVFPQподвекторов равной длины. Следовательно, должно быть делителем значенияdim.
Добавление vector индекса
Вы также можете добавить vector индексы к существующей таблице, используя CREATE INDEX или ALTER TABLE ADD INDEX.
Пример:
CREATE INDEX ivfpq_vector
ON ivfpq (vector)
USING VECTOR (
"index_type" = "ivfpq",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"dim"="5",
"nlist" = "256",
"nbits"="10"
);
ALTER TABLE ivfpq
ADD INDEX ivfpq_vector (vector)
USING VECTOR (
"index_type" = "ivfpq",
"metric_type" = "l2_distance",
"is_vector_normed" = "false",
"dim"="5",
"nlist" = "256",
"nbits"="10"
);
Управление vector индексами
Просмотр vector индекса
Вы можете просмотреть определение vector индекса с помощью оператора SHOW CREATE TABLE:
Пример:
mysql> SHOW CREATE TABLE hnsw \G
*************************** 1. row ***************************
Table: hnsw
Create Table: CREATE TABLE hnsw (
id bigint(20) NOT NULL COMMENT "",
vector array<float> NOT NULL COMMENT "",
INDEX index_vector (vector) USING VECTOR("dim" = "5", "efconstruction" = "40", "index_type" = "hnsw", "is_vector_normed" = "false", "M" = "512", "metric_type" = "l2_distance") COMMENT ''
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"compression" = "LZ4",
"fast_schema_evolution" = "true",
"replicated_storage" = "false",
"replication_num" = "3"
);
1 row in set (0.00 sec)
Удаление vector индекса
Вы можете удалить vector индексы, используя DROP INDEX или ALTER TABLE DROP INDEX.
DROP INDEX ivfpq_vector ON ivfpq;
ALTER TABLE ivfpq DROP INDEX ivfpq_vector;
Выполнение ANNS с vector индексами
Перед запуском векторного поиска убедитесь, что параметр конфигурации FE enable_experimental_vector установлен в true.
Требования для запросов на основе vector индекса
SELECT *, <vector_index_distance_func>(v1, [1,2,3]) as dis
FROM table_name
WHERE <vector_index_distance_func>(v1, [1,2,3]) <= 10
ORDER BY <vector_index_distance_func>(v1, [1,2,3])
LIMIT 10
Чтобы использовать vector индекс в запросах, все следующие требования должны быть выполнены:
- Требования ORDER BY:
- Формат предложения ORDER BY: Предложение
ORDER BYдолжно следовать форматуORDER BY <vector_index_distance_func>(vector_column, constant_array)без включения дополнительных столбцов ORDER BY.- Требования к имени функции для
<vector_index_distance_func>:- Если
metric_typeравенl2_distance, имя функции должно бытьapprox_l2_distance. - Если
metric_typeравенcosine_similarity, имя функции должно бытьapprox_cosine_similarity.
- Если
- Требования к параметрам для
<vector_index_distance_func>:- Один из столбцов
constant_arrayдолжен быть константнымARRAY<FLOAT>с размерностью, соответствующейdimvector индекса. - Другой столбец
vector_columnдолжен быть столбцом, соответствующим vector индексу.
- Один из столбцов
- Требования к имени функции для
- Требования к направлению ORDER:
- Если
metric_typeравенl2_distance, порядок должен бытьASC. - Если
metric_typeравенcosine_similarity, порядок должен бытьDESC.
- Если
- Требуется предложение
LIMIT N.
- Формат предложения ORDER BY: Предложение
- Требования к предикатам:
- Все предикаты должны быть выражениями
<vector_index_distance_func>, объединёнными с использованиемANDи операторов сравнения (>или<). Направление оператора сравнения должно совпадать с порядкомASC/DESC. В частности: - Требование 1:
- Если
metric_typeравенl2_distance:col_ref <= constant. - Если
metric_typeравенcosine_similarity:col_ref >= constant. - Здесь
col_refотносится к результату<vector_index_distance_func>(vector_column, constant_array)и может быть приведён к типамFLOATилиDOUBLE, например:approx_l2_distance(v1, [1,2,3])CAST(approx_l2_distance(v1, [1,2,3]) AS FLOAT)CAST(approx_l2_distance(v1, [1,2,3]) AS DOUBLE)
- Если
- Требование 2:
- Предикат должен использовать
AND, где каждый дочерний предикат соответствует Требованию 1.
- Предикат должен использовать
- Все предикаты должны быть выражениями