IVF_FLAT
Индекс IVF_FLAT - это алгоритм индексирования, который позволяет повысить производительность поиска для векторов с плавающей точкой.
Этот тип индекса идеально подходит для крупных наборов данных, требующих быстрых ответов на запросы и высокой точности, особенно если кластеризация набора данных позволяет сократить пространство поиска, а для хранения данных кластера имеется достаточно памяти.
Обзор
Термин IVF_FLAT означает Inverted File Flat, что отражает двухуровневый подход к индексированию и поиску векторов с плавающей точкой:
- Inverted File (IVF): Относится к кластеризации векторного пространства на управляемые области с помощью кластеризации k-means. Каждый кластер представлен центроидом, служащим точкой отсчета для векторов внутри него.
- Плоский: означает, что внутри каждого кластера векторы хранятся в исходном виде (плоская структура), без сжатия или квантования, для точного вычисления расстояния.
На следующем рисунке показано, как это работает:
ivf-flat-1.png
Этот метод индексирования ускоряет процесс поиска, но имеет потенциальный недостаток: кандидат, найденный как ближайший к вкраплению запроса, может оказаться не совсем ближайшим. Это может произойти, если ближайший к запросу эмбеддинг находится в кластере, отличном от того, который был выбран на основе ближайшего центроида (см. визуализацию ниже).
Для решения этой проблемы IVF_FLAT предоставляет два гиперпараметра, которые мы можем настраивать:
nlist
: Определяет количество разделов, которые нужно создать с помощью алгоритма k-means.nprobe
: : Указывает количество разделов, которые следует учитывать при поиске кандидатов.
Теперь, если мы установим значение nprobe
равным 3 вместо 1, мы получим следующий результат:
ivf-flat-2.png
Увеличив значение nprobe
, можно включить в поиск больше разделов, что поможет не пропустить ближайшее к запросу вкрапление, даже если оно находится в другом разделе. Однако за это приходится платить увеличением времени поиска, поскольку необходимо оценить больше кандидатов. Дополнительные сведения о настройке параметров индекса см. в разделе Параметры индекса.
Построение индекса
Чтобы построить индекс IVF_FLAT
для векторного поля в 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_FLAT", # 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 for the index
} # Index building params
)
В данной конфигурации:
index_type
: Тип индекса, который будет построен. В этом примере задайте значениеIVF_FLAT
.metric_type
: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения:COSINE
,L2
иIP
. Подробнее см. в разделе Типы метрик.params
: Дополнительные параметры конфигурации для построения индекса.nlist
: Количество кластеров для разделения набора данных.
Чтобы узнать о параметрах построения, доступных для индекса
IVF_FLAT
, обратитесь к разделу Параметры построения индекса.
После того как параметры индекса настроены, вы можете создать индекс, используя метод create_index()
напрямую или передавая параметры индекса в метод create_collection
. Подробности см. в разделе Создание коллекции.
Поиск по индексу
После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
В этой конфигурации:
params
: Дополнительные параметры конфигурации для поиска по индексу.nprobe
: Количество кластеров для поиска.
Чтобы узнать больше параметров поиска, доступных для индекса
IVF_FLAT
, обратитесь к разделу Параметры поиска по индексу.
Параметры индекса
В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по нему.
Параметры построения индекса
В следующей таблице перечислены параметры, которые могут быть настроены в params
при построении индекса.
Параметр | Описание | Диапазон значений | Предложение по настройке |
---|---|---|---|
nlist | Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса. Каждый кластер, представленный центроидом, хранит список векторов. Увеличение этого параметра уменьшает количество векторов в каждом кластере, создавая меньшие, более целенаправленные разделы. | Тип: Целое число Диапазон: [1, 65536] Значение по умолчанию: 128 | Большие значения nlist улучшают отзыв за счет создания более точных кластеров, но увеличивают время построения индекса. Оптимизируйте в зависимости от размера набора данных и доступных ресурсов. В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [32, 4096]. |
Параметры поиска, специфичные для индекса
В следующей таблице перечислены параметры, которые можно настроить в search_params.params
при поиске по индексу.
Параметр | Описание | Диапазон значений | Предложение по настройке |
---|---|---|---|
nprobe | Число кластеров для поиска кандидатов. Большие значения позволяют искать в большем числе кластеров, что улучшает запоминание за счет расширения области поиска, но ценой увеличения задержки запроса. | Тип: Целое число Диапазон: [1, nlist]. Значение по умолчанию: 8 | Увеличение этого значения улучшает запоминание, но может замедлить поиск. Установите nprobe пропорционально nlist , чтобы сбалансировать скорость и точность.В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, nlist]. |