Выберите стратегию поиска EmbeddingList

Стратегии поиска EmbeddingList определяют, как Milvus строит приближенный индекс кандидатов для поиска EmbeddingList. Стратегией по умолчанию является « tokenann ». Вы можете переключиться на « muvera » или « lemur », если список вложений большой, TokenANN слишком ресурсоемкий или лучше подходит обученное/сжатое представление на уровне строк. Окончательный результат по-прежнему формируется в ходе переранжирования MaxSim, если включена опция « emb_list_rerank ».

Зачем нужны стратегии поиска

Список вложений (EmbeddingList) предназначен для строк, содержащих несколько векторов, таких как вложения токенов в текстовом документе, вложения фрагментов в визуальном документе или вложения клипов в видео. Вместо сравнения одного вектора запроса с одним вектором строки MaxSim сравнивает список вложений запроса со списком вложений документа и объединяет лучшие совпадения.

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

### Проблема - Каждая строка может содержать множество векторов. - Точный поиск MaxSim по всем строкам является ресурсоемким. - Размер индекса и задержка поиска могут быстро расти.### Стратегия — Использовать метод приблизительного поиска на первом этапе. — Извлечь больше кандидатов, чем запрашиваемые topK. — Переранжировать кандидатов с помощью точного MaxSim.

В этом смысле « emb_list_strategy » — это в основном стратегия построения индекса и извлечения кандидатов. Она настраивается при построении индекса и определяет, как формируется набор кандидатов ANN на первом этапе. Параметры, задаваемые во время поиска, такие как « retrieval_ann_ratio » и « emb_list_rerank », затем контролируют, сколько кандидатов будет извлечено и будет ли применено переранжирование с помощью MaxSim.


Доступные стратегии

СтратегияБлок извлечения кандидатовЗадача«Best fit»Основной компромисс
tokenannОтдельные векторы внутри каждой строкиСохраняет исходные векторы и позволяет избежать потерь при сжатии.Поиск с приоритетом качества, короткие или средние списки вложений, вложения с высокой дискриминационной способностью.Более крупный индекс и более высокие затраты на поиск кандидатов.
muveraОдин закодированный вектор на строкуСжимает список вложений в представление FDE фиксированной размерности без обучения.Более длинные документы, вложения с высокой дискриминацией, случаи, когда TokenANN слишком ресурсоемкий.Случайная проекция приводит к потере точности аппроксимации; размерность FDE влияет на задержку.
lemurОдин обученный вектор на строкуОбучается специфическому для корпуса сжатию списков вложений до векторов строк фиксированной размерности.Встраивания с низкой дискриминацией, мультимодальный поиск или поиск визуальных документов, большие списки встраиваний.Требует обучения и может быть чувствителен к распределению корпуса и смещению, связанному с длиной документов.

TokenANN

tokenann индексирует каждый вектор в списке вложений. Во время поиска каждый вектор запроса выполняет поиск с помощью ANN, совпадающие векторы агрегируются обратно в свои строки, а полученные кандидаты-строки переранжируются с помощью MaxSim.

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

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

  • Менее подходит: очень длинные документы, визуальные страницы с тысячами векторов фрагментов, строгие ограничения по памяти или задержке.

  • Поведение на уровне элементов: TokenANN может извлекать кандидаты из отдельных векторов перед их агрегированием обратно в строки. Окончательный результат поиска в EmbeddingList по-прежнему находится на уровне строк после оценки по алгоритму MaxSim.

MUVERA

muvera кодирует каждый список вложений в вектор фиксированной размерности с помощью случайных проекций. Это превращает поиск на первом этапе в стандартный поиск по векторам на уровне строк. Затем кандидаты переранжируются с помощью MaxSim.

Используйте MUVERA, когда TokenANN слишком ресурсоемкий, но вы не хотите проходить этап обучения. Это практичный компромисс между качеством и затратами.

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

  • Менее подходит: пространства вложений с низкой дискриминацией или случаи, когда представление FDE становится слишком многомерным для допустимого бюджета задержки.

  • Важные параметры:muvera_num_projections, muvera_num_repeats и muvera_seed.

LEMUR

lemur обучает модель сжимать каждый список вложений в представление фиксированной размерности. Поиск ANN на первом этапе выполняется на обученных векторах на уровне строк, а кандидаты переранжируются с помощью MaxSim.

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

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

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

  • Важные параметры:lemur_hidden_dim, lemur_num_train_samples, lemur_num_epochs, lemur_batch_size, lemur_learning_rate, lemur_seed и lemur_num_layers.


Поведение и настройки по умолчанию

Стратегией EmbeddingList по умолчанию в Knowhere является tokenann. Если вы не укажете emb_list_strategy, Knowhere будет использовать TokenANN. По умолчанию при поиске используются retrieval_ann_ratio=3.0 и emb_list_rerank=true.

Элементы настройки по стратегиям

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

СтратегияЭлемент конфигурацииЭтапПо умолчаниюКогда следует изменять
tokenannemb_list_strategy="tokenann"Построение индексаtokenannИспользуйте явно, если требуется поведение индексирования вектора элементов по умолчанию или при использовании DiskANN.
muveraemb_list_strategy="muvera"Построение индексаtokenannИспользуйте, если требуется поиск с кодировкой на уровне строк без обучения.
muveramuvera_num_projectionsПостроение индекса4Регулирует количество проекций SimHash. Более высокие значения создают больше корзин и могут улучшить качество кодирования, но увеличивают размерность кодированного пространства.
muveramuvera_num_repeatsПостроение индекса7Регулирует количество объединяемых независимых кодировок FDE. Более высокие значения могут повысить отказоустойчивость, но увеличат затраты на индексирование и поиск.
muveramuvera_seedСоздание индекса42Устанавливается для получения воспроизводимых случайных проекций, особенно при тестировании и сравнительных тестах производительности.
lemuremb_list_strategy="lemur"Построение индексаtokenannИспользуйте, если ожидается, что обученное сжатие на уровне строк будет работать лучше, чем фиксированная случайная проекция.
lemurlemur_hidden_dimПостроение индекса256Регулирует размер сжатого представления. Увеличьте значение для увеличения емкости; уменьшите — для снижения потребления памяти и ускорения извлечения данных.
lemurlemur_num_train_samplesПостроение индекса20000Увеличивайте этот параметр, если корпус разнообразен, а обученная компрессия не обеспечивает полного покрытия; уменьшайте его только для небольших тестов или более быстрого построения.
lemurlemur_num_epochsПостроение индекса50Увеличьте значение, если обучение не сходится; уменьшите, если время построения является основным ограничением.
lemurlemur_batch_sizeПостроение индекса512Настройте с учетом пропускной способности обучения и использования памяти.
lemurlemur_learning_rateПостроение индекса0.001Регулируйте, если обучение нестабильно или сходится слишком медленно.
lemurlemur_seedПостроение индекса42Установите для воспроизводимых циклов обучения.
lemurlemur_num_layersПостроение индекса2Увеличивайте только в том случае, если корпусу требуется более выразительный экстрактор признаков и вы можете позволить себе дополнительные затраты на обучение.
Все стратегииretrieval_ann_ratioПоиск3.0Увеличивайте, чтобы извлечь больше кандидатов на первом этапе и повысить полноту; уменьшайте, чтобы сократить задержку.
Все стратегииemb_list_rerankПоискtrueОставьте включенной для переранжирования MaxSim. Отключайте только для контролируемых экспериментов, в которых качество ANN на первом этапе измеряется напрямую.

Настройка стратегии в Milvus

В Milvus стратегия передается в качестве параметра индекса при создании индекса для поля EmbeddingList, например для подполя вектора StructArray.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="clips[clip_embedding]",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 96,
        "emb_list_strategy": "muvera",
        "muvera_num_projections": 4,
        "muvera_num_repeats": 7,
        "muvera_seed": 42,
    },
)

Для LEMUR укажите параметры обучения LEMUR в той же карте « params ».

params={
    "M": 16,
    "efConstruction": 96,
    "emb_list_strategy": "lemur",
    "lemur_hidden_dim": 256,
    "lemur_num_train_samples": 20000,
    "lemur_num_epochs": 50,
    "lemur_batch_size": 512,
    "lemur_learning_rate": 0.001,
    "lemur_seed": 42,
    "lemur_num_layers": 2,
}

Настройка значений по умолчанию на стороне сервера в Milvus

Milvus также может заполнять параметры индекса из файла ` milvus.yaml`. Соответствующий раздел находится по адресу knowhere. Параметры организованы по типу индекса и этапу по шаблону knowhere.<INDEX_TYPE>.<stage>.<parameter>. Параметры индекса, указанные пользователем, имеют приоритет над этими значениями по умолчанию.

knowhere:
  enable: true
  HNSW:
    build:
      emb_list_strategy: muvera
      muvera_num_projections: 4
      muvera_num_repeats: 7
      muvera_seed: 42
    search:
      retrieval_ann_ratio: 3.0
      emb_list_rerank: true

Для выбора стратегии предпочтительно использовать параметры на уровне отдельного индекса. Значения по умолчанию из конфигурационного файла Milvus применяются в общем случае ко всем индексам данного типа и этапа. Используйте параметры из create_index, когда для разных коллекций или полей требуются разные стратегии EmbeddingList.

Настройка извлечения кандидатов во время поиска

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

results = client.search(
    collection_name=collection_name,
    data=[query_embedding_list],
    anns_field="clips[clip_embedding]",
    search_params={
        "metric_type": "MAX_SIM_COSINE",
        "params": {
            "ef": 64,
            "retrieval_ann_ratio": 3.0,
            "emb_list_rerank": True,
        },
    },
    limit=10,
)
ПараметрЭтапПо умолчаниюЗначение
emb_list_strategyПостроение индексаtokenannОпределяет способ индексирования и извлечения кандидатов из EmbeddingList.
retrieval_ann_ratioПоиск3.0Коэффициент расширения кандидатов для первого раунда ANN.
emb_list_rerankПоискtrueНеобходимо ли переранжировать найденные кандидаты с помощью MaxSim.

Примечания по совместимости: MUVERA и LEMUR в настоящее время поддерживают данные fp32 в Knowhere. DiskANN поддерживает EmbeddingList только со стратегией TokenANN. Если вы используете типы векторов, отличные от fp32, или DiskANN, проверьте поддержку стратегии перед изменением значения по умолчанию.


Как выбрать стратегию

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

ВопросСигналРекомендуемая отправная точка
Вам нужна высококачественная базовая модель?Вы хотите определить наилучшую практическую аппроксимацию перед оптимизацией затрат.tokenann
Количество элементов в строках небольшое или умеренное?Каждая строка содержит небольшое количество векторов токенов, патчей или клипов.tokenann
TokenANN слишком велик или работает слишком медленно?Узким местом является размер индекса или задержка поиска на первом этапе.muvera
Вам нужна компрессия без обучения?Вам нужна более простая операционная модель и воспроизводимое кодирование.muvera
Имеет ли пространство вложений низкую дискриминационную способность?Кандидаты ANN на уровне токенов содержат много шума, а случайная проекция не сохраняет достаточно сигнала.lemur
Является ли рабочая нагрузка визуальной или мультимодальной?Строки содержат множество векторов фрагментов, а TokenANN слишком ресурсоемка.lemur или muvera
Имеет ли длина документов сильный асимметричный распредел?Некоторые строки содержат гораздо больше векторов, чем другие.Начните с muvera; тщательно проверьте lemur.

Рекомендуемый рабочий процесс оценки

  1. Начните с tokenann в качестве эталона качества, если размер набора данных это позволяет.

  2. Запустите те же запросы с muvera и сравните показатели recall, nDCG, задержку и размер индекса.

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

  4. Настройте параметр « retrieval_ann_ratio » перед тем, как изменять слишком много параметров, задаваемых на этапе сборки. Увеличьте его, если коэффициент воспроизведения низкий; уменьшите — если задержка слишком высокая.

  5. Всегда проводите валидацию на репрезентативных запросах и распределениях длины документов. Стратегия, которая работает с короткими текстами, может не сработать с визуальными документами или корпусами с длинным хвостом.

### «Качество прежде всего» Начните с параметра ` tokenann`. Используйте его в качестве базового значения для оценки качества аппроксимации MaxSim.### Сбалансированный подход Попробуйте muvera, если вам требуется снизить затраты без добавления конвейера обучения.### Сжатие. Попробуйте lemur, если обученное сжатие на уровне строк, вероятно, превзойдет фиксированную случайную проекцию.

Источники, использованные в данном проекте

  • Тесты Milvus для emb_list_strategy, retrieval_ann_ratio и emb_list_rerank.

  • Обработка конфигурационных файлов Milvus для значений по умолчанию серверных индексов в разделе « knowhere ».

  • Определения параметров Knowhere для значений по умолчанию и поддерживаемых названий стратегий.

  • Проверки совместимости Knowhere для поддержки только fp32 MUVERA/LEMUR и только TokenANN в DiskANN.

  • Внутренние заметки по оценке, сравнивающие TokenANN, MUVERA и LEMUR для поиска кандидатов в MaxSim.

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