Векторные индексы
Векторные индексы — это специализированные структуры данных, позволяющие эффективно выполнять поиск схожести в многомерных пространствах. В отличие от традиционных индексов, оптимизированных для точных совпадений, векторные индексы помогают находить наиболее похожие элементы на основе математических мер расстояния или схожести.
Данные в таблице YDB хранятся и сортируются по первичному ключу, что обеспечивает эффективный поиск по точному совпадению и сканирование диапазонов. Векторные индексы предоставляют аналогичную эффективность для поиска ближайших соседей в векторных пространствах, что особенно ценно при работе с эмбеддингами и другими многомерными представлениями данных.
В этой статье описаны практические операции с векторными индексами. Концептуальную информацию о типах векторных индексов и их характеристиках см. в разделе Векторные индексы в категории "Концепции".
Создание векторных индексов
Векторный индекс можно создать:
- При создании таблицы с помощью YQL-команды
CREATE TABLE
- Добавить к существующей таблице с помощью YQL-команды
ALTER TABLE
Пример создания префиксного векторного индекса с покрывающими колонками:
ALTER TABLE my_table
ADD INDEX my_index
GLOBAL USING vector_kmeans_tree
ON (user, embedding) COVER (data)
WITH (distance=cosine, type="uint8", dimension=512, levels=2, clusters=128);
Подробное описание параметров векторного индекса смотри в YQL-команде CREATE TABLE
.
Поскольку построение векторного индекса требует обработки существующих данных, создание индекса для заполненной таблицы может занять значительное время. Эта операция выполняется в фоновом режиме, позволяя продолжать работу с таблицей во время построения. Индекс становится доступным автоматически после завершения.
Использование векторных индексов для поиска схожести
Для выполнения поиска схожести явно укажите имя индекса в предложении VIEW. Для префиксных индексов включите условия для префиксных колонок в предложение WHERE:
DECLARE $query_vector AS List<Uint8>;
SELECT user, data
FROM my_table VIEW my_index
WHERE user = "john_doe"
ORDER BY Knn::CosineSimilarity(embedding, $query_vector) DESC
LIMIT 10;
Примечание
Без предложения VIEW запрос выполнит полное сканирование таблицы с попарным сравнением векторов.
Проверка стоимости запросов
Любой запрос в транзакционном приложении должен проверяться с точки зрения количества операций ввода-вывода и используемых вычислительных ресурсов. Также необходимо убедиться, что эти показатели не растут постоянно с увеличением объема данных. YDB возвращает статистику, необходимую для анализа, после выполнения каждого запроса.
При использовании CLI YDB выберите опцию --stats
, чтобы включить вывод статистики после выполнения команды yql
. Все SDK YDB также содержат структуры со статистикой, возвращаемой после выполнения запроса. В пользовательском интерфейсе статистика отображается на отдельной вкладке рядом с результатами запроса.
Важно
В текущей версии векторные индексы не поддерживают операции модификации данных.
Любая попытка изменить строки в индексированных таблицах завершится ошибкой.
Это ограничение будет снято в будущих релизах.