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

SCANN

Созданный на основе библиотеки ScaNN от Google, индекс SCANN в Milvus предназначен для решения задач поиска векторного сходства, обеспечивая баланс между скоростью и точностью, даже на больших наборах данных, которые традиционно представляют трудности для большинства поисковых алгоритмов.

Обзор

ScaNN создан для решения одной из самых сложных задач векторного поиска: эффективного нахождения наиболее релевантных векторов в высокоразмерных пространствах даже при увеличении объема и сложности массивов данных. Его архитектура разбивает процесс векторного поиска на отдельные этапы:

Scann Scann

  1. Разбиение на разделы: Разбивает набор данных на кластеры. Этот метод сужает пространство поиска, фокусируясь только на релевантных подмножествах данных вместо сканирования всего набора данных, что экономит время и вычислительные ресурсы. ScaNN часто использует алгоритмы кластеризации, такие как k-means, для определения кластеров, что позволяет более эффективно выполнять поиск по сходству.

  2. Квантование: После разбиения ScaNN применяет процесс квантования, известный как анизотропное векторное квантование. Традиционное квантование направлено на минимизацию общего расстояния между исходным и сжатым векторами, что не является идеальным для таких задач, как поиск по максимальному внутреннему продукту (MIPS), где сходство определяется внутренним произведением векторов, а не прямым расстоянием. Вместо этого при анизотропном квантовании приоритет отдается сохранению параллельных компонент между векторами, или частей, наиболее важных для вычисления точного внутреннего произведения. Такой подход позволяет ScaNN поддерживать высокую точность MIPS за счет тщательного выравнивания сжатых векторов с запросом, что обеспечивает более быстрый и точный поиск сходства.

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

Производительность SCANN регулируется двумя ключевыми параметрами, которые позволяют точно настроить баланс между скоростью и точностью:

  • with_raw_data: Контролирует, хранятся ли исходные векторные данные наряду с квантованными представлениями. Включение этого параметра повышает точность при повторном ранжировании, но увеличивает требования к хранению.

  • reorder_k: Определяет, сколько кандидатов будет уточнено на этапе окончательного переранжирования. Более высокие значения повышают точность, но увеличивают задержку поиска.

Подробное руководство по оптимизации этих параметров для конкретного случая использования см. в разделе Параметры индекса.

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

Чтобы построить индекс SCANN по векторному полю в 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="SCANN", # 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={
        "with_raw_data": True, # Whether to hold raw data
    } # Index building params
)

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

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

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

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

    • with_raw_data: Хранить ли исходные векторные данные вместе с квантованным представлением.

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

После того как параметры индекса настроены, вы можете создать индекс, используя метод create_index() напрямую или передавая параметры индекса в метод create_collection. Подробности см. в разделе Создание коллекции.

Поиск по индексу

После того как индекс создан и сущности вставлены, можно выполнять поиск по сходству в индексе.

search_params = {
    "params": {
        "reorder_k": 10, # Number of candidates to refine
        "nprobe": 8 # Number of clusters to search
    }
}

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: Дополнительные параметры конфигурации для поиска по индексу.

    • reorder_k: : Количество кандидатов для уточнения на этапе повторного ранжирования.
    • nprobe: Количество кластеров для поиска.

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

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

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

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

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

Параметр

Описание

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

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

nlist

Количество единиц кластера

[1, 65536]

Больший nlist повышает эффективность обрезки и обычно ускоряет грубый поиск, но разделы могут стать слишком маленькими, что может снизить запоминаемость; меньший nlist сканирует большие кластеры, улучшая запоминаемость, но замедляя поиск.

with_raw_data

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

Тип: Булево

Диапазон: true, false

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

Установите значение true для повышения точности поиска и в тех случаях, когда место в памяти не является первостепенной задачей. Оригинальные векторные данные обеспечивают более точные расчеты сходства при повторном ранжировании.

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

Рекомендуется: Использовать true для производственных приложений, где точность очень важна.

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

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

Параметр

Описание

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

Tuning Suggestion

reorder_k

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

Тип: Целое число

Диапазон: [1, int_max].

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

Большее значение reorder_k обычно приводит к повышению точности поиска, поскольку на этапе окончательного уточнения рассматривается больше кандидатов. Однако это также увеличивает время поиска из-за дополнительных вычислений.

Рассматривайте возможность увеличения reorder_k, когда достижение высокого отзыва является критически важным, а скорость поиска менее важна. Хорошей отправной точкой является 2-5-кратное увеличение желаемого limit (количество возвращаемых результатов TopK).

Рассмотрите возможность уменьшения reorder_k, чтобы отдать предпочтение более быстрому поиску, особенно в сценариях, где небольшое снижение точности допустимо.

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

nprobe

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

Тип: Целое число

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

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

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

Установите значение nprobe пропорционально значению nlist, чтобы сбалансировать скорость и точность.

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

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

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

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

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