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

IVF_FLAT

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

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

Обзор

Термин IVF_FLAT означает Inverted File Flat, что отражает двухуровневый подход к индексированию и поиску векторов с плавающей точкой:

  • Inverted File (IVF): Относится к кластеризации векторного пространства на управляемые области с помощью кластеризации k-means. Каждый кластер представлен центроидом, служащим точкой отсчета для векторов внутри него.

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

На следующем рисунке показано, как это работает:

IVF FLAT Workflow Рабочий процесс ЭКО FLAT

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

Для решения этой проблемы IVF_FLAT предоставляет два гиперпараметра, которые мы можем настраивать:

  • nlist: Определяет количество разделов, которые необходимо создать с помощью алгоритма k-means.

  • nprobe: : Указывает количество разделов, которые следует учитывать при поиске кандидатов.

Теперь, если мы установим значение nprobe равным 3, а не 1, мы получим следующий результат:

IVF FLAT Workflow 2 ЭКО FLAT Workflow 2

Увеличив значение 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
    anns_field="vector_field",
    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 при построении индекса. Каждый кластер, представленный центроидом, хранит список векторов. Увеличение этого параметра уменьшает количество векторов в каждом кластере, создавая меньшие, более целенаправленные разделы.

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

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

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

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

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

Параметр

Описание

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

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

nprobe

Количество кластеров для поиска кандидатов. При больших значениях можно искать в большем количестве кластеров, что улучшает запоминание за счет расширения области поиска, но ценой увеличения задержки запроса.

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

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

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

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

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

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

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

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