• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

IVF_SQ8

Индекс IVF_SQ8 - это алгоритм индексирования на основе квантования, предназначенный для решения масштабных задач поиска сходства. Этот тип индекса обеспечивает более быстрый поиск при значительно меньшем объеме памяти по сравнению с методами исчерпывающего поиска.

Обзор

Индекс IVF_SQ8 построен на двух ключевых компонентах:

  • Инвертированный файл (IVF): Организует данные в кластеры, позволяя поисковому алгоритму сосредоточиться только на наиболее релевантных подмножествах векторов.

  • Скалярная квантизация (SQ8): Сжимает векторы в более компактную форму, значительно сокращая расход памяти и сохраняя при этом достаточную точность для быстрых расчетов сходства.

ЭКО

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

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

  1. Кластеризация: Ваш набор векторных данных делится на определенное количество кластеров с помощью алгоритма кластеризации, например k-means. Каждый кластер имеет центроид (репрезентативный вектор для кластера).

  2. Назначение: Каждый вектор назначается в кластер, центроид которого находится ближе всего к нему.

  3. Инвертированный индекс: Создается индекс, сопоставляющий центроид каждого кластера со списком векторов, отнесенных к этому кластеру.

  4. Поиск: При поиске ближайших соседей алгоритм поиска сравнивает вектор запроса с центроидами кластеров и выбирает наиболее перспективный кластер (кластеры). Затем поиск сужается до векторов, входящих в эти выбранные кластеры.

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

SQ8

Скалярное квантование (SQ) - это техника, используемая для уменьшения размера высокоразмерных векторов путем замены их значений более компактными представлениями. В варианте SQ8 для хранения каждого значения размерности вектора используются 8-битные целые числа вместо типичных 32-битных чисел с плавающей точкой. Это значительно сокращает объем памяти, необходимый для хранения данных.

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

  1. Определение диапазона: Сначала определяются минимальное и максимальное значения в векторе. Этот диапазон определяет границы квантования.

  2. Нормализация: Нормализуйте значения вектора в диапазоне от 0 до 1 с помощью формулы:

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    Это обеспечивает пропорциональное отображение всех значений в стандартном диапазоне, подготавливая их к сжатию.

  3. 8-битное сжатие: Умножьте нормализованное значение на 255 (максимальное значение для 8-битного целого числа) и округлите результат до ближайшего целого числа. Это эффективно сжимает каждое значение в 8-битное представление.

Предположим, у вас есть значение размерности 1,2, с минимальным значением -1,7 и максимальным значением 2,3. На следующем рисунке показано, как SQ8 применяется для преобразования значения float32 в целое число int8.

Ivf Sq8 Ivf Sq8

ЭКО + SQ8

Индекс IVF_SQ8 сочетает в себе IVF и SQ8 для эффективного выполнения поиска по сходству:

  1. IVF сужает область поиска: Набор данных делится на кластеры, и когда выдается запрос, IVF сначала сравнивает запрос с центроидами кластеров, выбирая наиболее релевантные кластеры.

  2. 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 при построении индекса.

Параметр

Описание

Диапазон значений

Предложение по настройке

ЭКО

nlist

Количество кластеров, создаваемых с помощью алгоритма k-means при построении индекса.

Тип: Integer Диапазон: [1, 65536]

Значение по умолчанию: 128

Большие значения nlist улучшают отзыв за счет создания более точных кластеров, но увеличивают время построения индекса. Оптимизируйте значение в зависимости от размера набора данных и доступных ресурсов. В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [32, 4096].

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

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

Параметр

Описание

Диапазон значений

Предложение по настройке

ЭКО

nprobe

Количество кластеров для поиска кандидатов.

Тип: Целое число Диапазон: [1, nlist].

Значение по умолчанию: 8

Более высокие значения позволяют искать больше кластеров, что улучшает запоминание за счет расширения области поиска, но ценой увеличения задержки запроса. Установите значение nprobe пропорционально nlist, чтобы сбалансировать скорость и точность.

В большинстве случаев мы рекомендуем устанавливать значение в этом диапазоне: [1, nlist].

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

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

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

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