IVF_SQ8
Индекс IVF_SQ8 - это алгоритм индексирования на основе квантования, предназначенный для решения масштабных задач поиска сходства. Этот тип индекса обеспечивает более быстрый поиск при значительно меньшем объеме памяти по сравнению с методами исчерпывающего поиска.
Обзор
Индекс IVF_SQ8 построен на двух ключевых компонентах:
Инвертированный файл (IVF): Организует данные в кластеры, позволяя поисковому алгоритму сосредоточиться только на наиболее релевантных подмножествах векторов.
Скалярная квантизация (SQ8): Сжимает векторы в более компактную форму, значительно сокращая расход памяти и сохраняя при этом достаточную точность для быстрых расчетов сходства.
ЭКО
ЭКО - это как создание индекса в книге. Вместо того чтобы сканировать каждую страницу (или, в нашем случае, каждый вектор), вы ищете определенные ключевые слова (кластеры) в индексе, чтобы быстро найти соответствующие страницы (векторы). В нашем сценарии векторы сгруппированы в кластеры, и алгоритм будет искать в нескольких кластерах, которые близки к вектору запроса.
Вот как это работает:
Кластеризация: Ваш набор векторных данных делится на определенное количество кластеров с помощью алгоритма кластеризации, например k-means. Каждый кластер имеет центроид (репрезентативный вектор для кластера).
Назначение: Каждый вектор назначается в кластер, центроид которого находится ближе всего к нему.
Инвертированный индекс: Создается индекс, сопоставляющий центроид каждого кластера со списком векторов, отнесенных к этому кластеру.
Поиск: При поиске ближайших соседей алгоритм поиска сравнивает вектор запроса с центроидами кластеров и выбирает наиболее перспективный кластер (кластеры). Затем поиск сужается до векторов, входящих в эти выбранные кластеры.
Чтобы узнать больше о технических деталях, обратитесь к разделу IVF_FLAT.
SQ8
Скалярное квантование (SQ) - это техника, используемая для уменьшения размера высокоразмерных векторов путем замены их значений более компактными представлениями. В варианте SQ8 для хранения каждого значения размерности вектора используются 8-битные целые числа вместо типичных 32-битных чисел с плавающей точкой. Это значительно сокращает объем памяти, необходимый для хранения данных.
Вот как работает SQ8:
Определение диапазона: Сначала определяются минимальное и максимальное значения в векторе. Этот диапазон определяет границы квантования.
Нормализация: Нормализуйте значения вектора в диапазоне от 0 до 1 с помощью формулы:
Это обеспечивает пропорциональное отображение всех значений в стандартном диапазоне, подготавливая их к сжатию.
8-битное сжатие: Умножьте нормализованное значение на 255 (максимальное значение для 8-битного целого числа) и округлите результат до ближайшего целого числа. Это эффективно сжимает каждое значение в 8-битное представление.
Предположим, у вас есть значение размерности 1,2, с минимальным значением -1,7 и максимальным значением 2,3. На следующем рисунке показано, как SQ8 применяется для преобразования значения float32 в целое число int8.
Ivf Sq8
ЭКО + SQ8
Индекс IVF_SQ8 сочетает в себе IVF и SQ8 для эффективного выполнения поиска по сходству:
IVF сужает область поиска: Набор данных делится на кластеры, и когда выдается запрос, IVF сначала сравнивает запрос с центроидами кластеров, выбирая наиболее релевантные кластеры.
SQ8 ускоряет вычисление расстояний: Внутри выбранных кластеров SQ8 сжимает векторы в 8-битные целые числа, сокращая объем памяти и ускоряя вычисление расстояний.
Используя ЭКО для фокусировки поиска и SQ8 для ускорения вычислений, IVF_SQ8 достигает как быстрого времени поиска, так и эффективности использования памяти.
Построение индекса
Чтобы построить индекс IVF_SQ8 для векторного поля в Milvus, используйте метод add_index(), указав index_type, metric_type и дополнительные параметры для индекса.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_SQ8", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters to create using the k-means algorithm during index building
} # Index building params
)
В данной конфигурации:
index_type: Тип индекса, который будет построен. В этом примере задайте значениеIVF_SQ8.metric_type: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения:COSINE,L2иIP. Подробнее см. в разделе Типы метрик.params: Дополнительные параметры конфигурации для построения индекса.nlist: Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса.
Чтобы узнать о параметрах построения, доступных для индекса
IVF_SQ8, обратитесь к разделу Параметры построения индекса.
После того как параметры индекса настроены, вы можете создать индекс, используя метод create_index() напрямую или передавая параметры индекса в метод create_collection. Подробности см. в разделе Создание коллекции.
Поиск по индексу
После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.
search_params = {
"params": {
"nprobe": 8, # Number of clusters to search for candidates
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
В этой конфигурации:
params: Дополнительные параметры конфигурации для поиска по индексу.nprobe: Количество кластеров для поиска кандидатов.
Чтобы узнать больше параметров поиска, доступных для индекса
IVF_SQ8, обратитесь к разделу Параметры поиска по индексу.
Параметры индекса
В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по нему.
Параметры построения индекса
В следующей таблице перечислены параметры, которые могут быть настроены в params при построении индекса.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса. |
Тип: Integer Диапазон: [1, 65536] Значение по умолчанию: |
Большие значения |
Параметры поиска, специфичные для индекса
В следующей таблице перечислены параметры, которые можно настроить в search_params.params при поиске по индексу.
Параметр |
Описание |
Диапазон значений |
Предложение по настройке |
|
|---|---|---|---|---|
ЭКО |
|
Количество кластеров для поиска кандидатов. |
Тип: Целое число Диапазон: [1, nlist]. Значение по умолчанию: |
Более высокие значения позволяют искать больше кластеров, что улучшает запоминание за счет расширения области поиска, но ценой увеличения задержки запроса. Установите значение В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, nlist]. |