🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство пользователя
  • Home
  • Docs
  • Руководство пользователя

  • Индексы

  • Векторные индексы

  • IVF_PQ

IVF_PQ

Индекс IVF_PQ - это основанный на квантовании алгоритм индексации для приближенного поиска ближайших соседей в высокоразмерных пространствах. Хотя IVF_PQ не так быстр, как некоторые методы на основе графов, он часто требует значительно меньше памяти, что делает его практичным выбором для больших наборов данных.

Обзор

IVF_PQ означает Inverted File with Product Quantization- гибридный подход, сочетающий индексирование и сжатие для эффективного векторного поиска и извлечения информации. В нем задействованы два основных компонента: Inverted File (IVF) и Product Quantization (PQ).

ЭКО

ЭКО напоминает создание индекса в книге. Вместо того чтобы сканировать каждую страницу (или, в нашем случае, каждый вектор), вы ищете определенные ключевые слова (кластеры) в индексе, чтобы быстро найти соответствующие страницы (векторы). В нашем сценарии векторы сгруппированы в кластеры, и алгоритм будет искать в нескольких кластерах, которые близки к вектору запроса.

Вот как это работает:

  1. Кластеризация: Ваш набор векторных данных делится на определенное количество кластеров с помощью алгоритма кластеризации, например k-means. Каждый кластер имеет центроид (репрезентативный вектор для кластера).
  2. Назначение: Каждый вектор назначается в кластер, центроид которого находится ближе всего к нему.
  3. Инвертированный индекс: Создается индекс, сопоставляющий центроид каждого кластера со списком векторов, отнесенных к этому кластеру.
  4. Поиск: При поиске ближайших соседей алгоритм поиска сравнивает вектор запроса с центроидами кластеров и выбирает наиболее перспективный кластер (кластеры). Затем поиск сужается до векторов, входящих в эти выбранные кластеры.

Чтобы узнать больше о технических деталях, обратитесь к IVF_FLAT.

PQ

Квантование по продукту (PQ) - это метод сжатия высокоразмерных векторов, который значительно снижает требования к хранению данных и обеспечивает быстрое выполнение операций поиска по сходству.

Процесс PQ включает в себя следующие основные этапы:

pq-process-1 pq-process-1

  1. Декомпозиция размерности: Алгоритм начинает с разложения каждого высокоразмерного вектора на m равных по размеру подвекторов. Это разложение преобразует исходное D-мерное пространство в m дизъюнктивные подпространства, где каждое подпространство содержит D/m измерений. Параметр m управляет гранулярностью разложения и напрямую влияет на степень сжатия.
  2. Генерация кодовой книги подпространства: Внутри каждого подпространства алгоритм применяет кластеризацию k-means для получения набора репрезентативных векторов (центроидов). Эти центроиды в совокупности формируют кодовую книгу для данного подпространства. Количество центроидов в каждой кодовой книге определяется параметром nbits, где каждая кодовая книга содержит 2^nbits центроидов. Например, если nbits = 8, то каждая кодовая книга будет содержать 256 центроидов. Каждому центроиду присваивается уникальный индекс nbits бит.
  3. Векторное квантование: Для каждого подвектора в исходном векторе PQ определяет ближайший центроид в соответствующем подпространстве, используя определенный тип метрики. Этот процесс эффективно сопоставляет каждый подвектор с ближайшим вектором-представителем в кодовой книге. Вместо того чтобы хранить полные координаты подвектора, сохраняется только индекс соответствующего центроида.
  4. Сжатое представление: Окончательное сжатое представление состоит из индексов m, по одному из каждого подпространства, которые в совокупности называются PQ-кодами. Такое кодирование позволяет сократить объем памяти с D × 32 бит (в предположении 32-битных чисел с плавающей точкой) до m × n бит, что обеспечивает значительное сжатие при сохранении возможности аппроксимации расстояний между векторами.

Более подробную информацию о настройке и оптимизации параметров см. в разделе Index params.

Пример сжатия

Рассмотрим вектор с размерностью D = 128, использующий 32-битные числа с плавающей точкой. При параметрах PQ m = 64 (подвекторы) и nbits = 8 (таким образом, k = 2^8 = 256 центроидов на подпространство) мы можем сравнить требования к хранению:

  • Исходный вектор: 128 измерений × 32 бита = 4 096 бит
  • PQ-сжатый вектор: 64 подвектора × 8 бит = 512 бит

Это означает 8-кратное сокращение требований к хранению.

Вычисление расстояния с помощью PQ

При выполнении поиска по сходству с вектором запроса PQ обеспечивает эффективное вычисление расстояния за счет следующих шагов:

  1. Препроцессирование запроса

    1. Вектор запроса декомпозируется на подвекторы m в соответствии с оригинальной структурой декомпозиции PQ.
    2. Для каждого подвектора запроса и соответствующей ему кодовой книги (содержащей 2^nbits центроидов) вычисляются и сохраняются расстояния до всех центроидов.
    3. При этом создаются m таблиц поиска, где каждая таблица содержит 2^nbits расстояний.
  2. Аппроксимация расстояний

    Для любого вектора базы данных, представленного PQ-кодами, его приблизительное расстояние до вектора запроса вычисляется следующим образом:

    1. Для каждого из подвекторов m извлекаем предварительно вычисленное расстояние из соответствующей таблицы поиска, используя сохраненный индекс центроида.
    2. Просуммируйте эти m расстояния, чтобы получить приблизительное расстояние, основанное на определенном типе метрики (например, евклидово расстояние).

pq-process-1 pq-process-1

ЭКО + PQ

Индекс IVF_PQ объединяет сильные стороны IVF и PQ для ускорения поиска. Процесс работает в два этапа:

  1. Грубая фильтрация с помощью ЭКО: ЭКО разбивает векторное пространство на кластеры, сокращая область поиска. Вместо того чтобы оценивать весь набор данных, алгоритм фокусируется только на кластерах, наиболее близких к вектору запроса.
  2. Тонкое сравнение с помощью PQ: внутри выбранных кластеров PQ использует сжатые и квантованные представления векторов для быстрого вычисления приблизительных расстояний.

На производительность индекса IVF_PQ существенно влияют параметры, управляющие алгоритмами IVF и PQ. Настройка этих параметров очень важна для достижения оптимальных результатов для конкретного набора данных и приложения. Более подробную информацию об этих параметрах и о том, как их настраивать, можно найти в разделе Index params.

Построение индекса

Чтобы построить индекс IVF_PQ по векторному полю в 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_PQ", # 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={
        "m": 4, # Number of sub-vectors to split eahc vector into
    } # Index building params
)

В данной конфигурации:

  • index_type: Тип индекса, который будет построен. В этом примере задайте значение IVF_PQ.

  • metric_type: Метод, используемый для вычисления расстояния между векторами. Поддерживаются следующие значения: COSINE, L2 и IP. Подробнее см. в разделе Типы метрик.

  • params: Дополнительные параметры конфигурации для построения индекса.

    • m: Количество субвекторов, на которые нужно разбить вектор.

    Чтобы узнать больше параметров построения, доступных для индекса IVF_PQ, обратитесь к разделу Параметры построения индекса.

После того как параметры индекса настроены, вы можете создать индекс, используя метод 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_PQ, обратитесь к разделу Параметры поиска по индексу.

Параметры индекса

В этом разделе представлен обзор параметров, используемых для построения индекса и выполнения поиска по нему.

Параметры построения индекса

В следующей таблице перечислены параметры, которые могут быть настроены в params при построении индекса.

ПараметрОписаниеДиапазон значенийПредложение по настройке
ЭКОnlistКоличество кластеров, создаваемых с помощью алгоритма k-means при построении индекса.Тип: Целое число
Диапазон: [1, 65536]
Значение по умолчанию: 128
Большие значения nlist улучшают отзыв за счет создания более точных кластеров, но увеличивают время построения индекса. Оптимизируйте значение в зависимости от размера набора данных и доступных ресурсов.
В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [32, 4096].
PQmКоличество подвекторов (используемых для квантования), на которые нужно разделить каждый высокоразмерный вектор в процессе квантования.Тип: Целое число
Диапазон: [1, 65536]
Значение по умолчанию: Нет
Большее значение m может повысить точность, но также увеличивает сложность вычислений и объем используемой памяти.
m должно быть делителем размерности вектора(D), чтобы обеспечить правильное разложение. Обычно рекомендуется значение m = D/2.
В большинстве случаев мы рекомендуем задавать значение в этом диапазоне: [D/8, D].
nbitsКоличество битов, используемых для представления индекса центроида каждого субвектора в сжатом виде. Оно напрямую определяет размер каждой кодовой книги. Каждая кодовая книга будет содержать 2^nbits центроидов. Например, если nbits имеет значение 8, то каждый субвектор будет представлен 8-битным индексом центроида. Это позволяет использовать 2^8 (256) возможных центроидов в кодовой книге для данного субвектора.Тип: Целое число
Диапазон: [1, 64]
Значение по умолчанию: 8
Большее значение nbits позволяет использовать большие кодовые книги, что потенциально приводит к более точному представлению исходных векторов. Однако это также означает использование большего количества битов для хранения каждого индекса, что приводит к меньшему сжатию.
В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, 16].

Параметры поиска, специфичные для индексов

В следующей таблице перечислены параметры, которые могут быть настроены в search_params.params при поиске по индексу.

ПараметрОписаниеДиапазон значенийПредложение по настройке
ЭКОnprobeКоличество кластеров для поиска кандидатов.Тип: Целое число
Диапазон: [1, nlist].
Значение по умолчанию: 8
Большие значения позволяют искать больше кластеров, что улучшает запоминание благодаря расширению области поиска, но ценой увеличения задержки запроса.
Установите значение nprobe пропорционально значению nlist, чтобы сбалансировать скорость и точность.
В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, nlist].

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?