Выберите стратегию поиска 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.
| Стратегия | Элемент конфигурации | Этап | По умолчанию | Когда следует изменять |
|---|---|---|---|---|
tokenann | emb_list_strategy="tokenann" | Построение индекса | tokenann | Используйте явно, если требуется поведение индексирования вектора элементов по умолчанию или при использовании DiskANN. |
muvera | emb_list_strategy="muvera" | Построение индекса | tokenann | Используйте, если требуется поиск с кодировкой на уровне строк без обучения. |
muvera | muvera_num_projections | Построение индекса | 4 | Регулирует количество проекций SimHash. Более высокие значения создают больше корзин и могут улучшить качество кодирования, но увеличивают размерность кодированного пространства. |
muvera | muvera_num_repeats | Построение индекса | 7 | Регулирует количество объединяемых независимых кодировок FDE. Более высокие значения могут повысить отказоустойчивость, но увеличат затраты на индексирование и поиск. |
muvera | muvera_seed | Создание индекса | 42 | Устанавливается для получения воспроизводимых случайных проекций, особенно при тестировании и сравнительных тестах производительности. |
lemur | emb_list_strategy="lemur" | Построение индекса | tokenann | Используйте, если ожидается, что обученное сжатие на уровне строк будет работать лучше, чем фиксированная случайная проекция. |
lemur | lemur_hidden_dim | Построение индекса | 256 | Регулирует размер сжатого представления. Увеличьте значение для увеличения емкости; уменьшите — для снижения потребления памяти и ускорения извлечения данных. |
lemur | lemur_num_train_samples | Построение индекса | 20000 | Увеличивайте этот параметр, если корпус разнообразен, а обученная компрессия не обеспечивает полного покрытия; уменьшайте его только для небольших тестов или более быстрого построения. |
lemur | lemur_num_epochs | Построение индекса | 50 | Увеличьте значение, если обучение не сходится; уменьшите, если время построения является основным ограничением. |
lemur | lemur_batch_size | Построение индекса | 512 | Настройте с учетом пропускной способности обучения и использования памяти. |
lemur | lemur_learning_rate | Построение индекса | 0.001 | Регулируйте, если обучение нестабильно или сходится слишком медленно. |
lemur | lemur_seed | Построение индекса | 42 | Установите для воспроизводимых циклов обучения. |
lemur | lemur_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. |
Рекомендуемый рабочий процесс оценки
Начните с
tokenannв качестве эталона качества, если размер набора данных это позволяет.Запустите те же запросы с
muveraи сравните показатели recall, nDCG, задержку и размер индекса.Попробуйте использовать
lemur, если список вложений большой, пространство вложений содержит много шума или рабочая нагрузка является визуальной или мультимодальной.Настройте параметр «
retrieval_ann_ratio» перед тем, как изменять слишком много параметров, задаваемых на этапе сборки. Увеличьте его, если коэффициент воспроизведения низкий; уменьшите — если задержка слишком высокая.Всегда проводите валидацию на репрезентативных запросах и распределениях длины документов. Стратегия, которая работает с короткими текстами, может не сработать с визуальными документами или корпусами с длинным хвостом.
### «Качество прежде всего» Начните с параметра ` 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 или только более небольшое документированное подмножество.