Откройте возможности продвинутых рекомендательных систем с новым Range Search в Milvus
Введение
В поиске по сходству разработчикам часто нужна помощь с ограничениями, особенно при балансировке качества и разнообразия результатов поиска. Представляем новую функцию Milvus: Range Search. В этой статье мы расскажем, что такое Range Search, когда использовать его вместо традиционного Top-K Search, а также подробно рассмотрим его техническую архитектуру и руководство по использованию.
Что такое Range Search?
Range Search в Milvus обеспечивает детальный контроль над векторным сходством в результатах поиска, позволяя задавать диапазон расстояний для релевантных векторов. Эта функция устраняет ограничения традиционного KNN-поиска в рекомендательных системах, где результаты могут быть либо слишком похожими, либо слишком разнообразными по сравнению с вашими ожиданиями.
Когда выбирать range search вместо Top-K search?
У традиционного KNN-поиска есть два фундаментальных недостатка:
Несбалансированные рекомендации: Он может рекомендовать элементы, которые слишком похожи, что влияет на качество рекомендаций. Например, агрегатор спортивных новостей может в итоге рекомендовать пользователю несколько статей об одном и том же футбольном матче просто потому, что он прочитал одну статью об этой игре. Это может вытеснить разнообразный контент, из-за чего рекомендации будут казаться повторяющимися и менее увлекательными.
Системные ограничения: Параметр Top-K достигает максимума на уровне 16 384, что создает проблемы для запросов к данным большого масштаба и использования ресурсов. Рассмотрим сценарий, в котором вы выполняете запрос к набору данных из миллионов товаров. Ограничение Top-K в 16 384 означает, что вы можете упустить тысячи релевантных товаров, которые могли бы заинтересовать пользователя, одновременно нагружая системные ресурсы при попытке обработать и передать такой большой объем данных.
Range Search решает эти проблемы. Он обеспечивает сбалансированный набор результатов, позволяя задавать диапазон расстояний для векторного сходства. Добавление параметров, таких как radius и необязательный range_filter, обеспечивает более тонкий контроль, устраняя необходимость в фильтрации после запроса. Такой тонкий контроль делает Range Search идеальным для приложений, требующих точного управления результатами поиска.
Технические детали Range Search
Теперь, когда мы рассмотрели, что такое Range Search и когда его использовать, давайте углубимся в его архитектуру и алгоритмы. Этот обзор даст важные сведения о его сильных сторонах, ограничениях и интеграции со сторонними библиотеками.
Поток Range Search построен на основе существующего потока Search, повторно используя большинство путей передачи данных на более высоких уровнях. Ниже приведен обзор шагов, выполняемых при получении поискового запроса:
SDK обрабатывает поисковый запрос: SDK получает поисковый запрос пользователя, содержащий такие параметры, как radius и range_filter.
Proxy генерирует SearchTask: Получив поисковый запрос, proxy создает SearchTask и передает его узлу запроса.
Querynode в Segcore: Узел запроса вызывает интерфейс Search в Segcore через вызов cgo.
Разбор в Segcore: Segcore анализирует параметры в search_param. Если присутствует параметр radius, он вызывает knowhere::RangeSearch.
Knowhere и сторонние библиотеки: Затем Knowhere (основной движок выполнения векторных операций Milvus) направляет вызов в функцию range_search соответствующей сторонней библиотеки на основе типа индекса.
Все индексы сторонних библиотек, которые мы поддерживаем, настроены на выполнение одностороннего Range Search. «Односторонний» означает, что они принимают только один параметр 'radius' и возвращают все несортированные результаты в пределах этого радиуса. В таблице ниже описаны стратегии Range Search для разных типов индексов.
| Тип индекса | Стратегия поиска |
|---|---|
| IDMAP / BIN_IDMAP | Поиск полным перебором |
| IVF_xxx / SCANN / BIN_IVF_xxx (обновлено) | Начать поиск с сегмента, ближайшего к центральной точке. Остановить поиск при выполнении одного из следующих условий: 1. Все сегменты были просмотрены 2. В сегменте не найдено векторов, соответствующих условию. |
| HNSW (собственная разработка) | Начать поиск с самого верхнего слоя и определить вектор, ближайший к целевому, затем перейти на следующий слой ниже. Продолжать этот процесс послойно, пока не будет достигнут ближайший сосед в самом нижнем (1-м) слое. Оттуда выполнить поиск в ширину (BFS), начиная с этого ближайшего соседа и продолжая до тех пор, пока все посещенные точки и их исходящие соседи не окажутся за пределами требуемого диапазона. |
| DISKANN | Начать с l_search = min_l_search. На каждой итерации установить l_search = 2 * l_search. Остановить поиск при выполнении одного из следующих условий: 1. Количество результатов, возвращенных на итерации, меньше l_search / 2 2. l_search > max_l_search. |
Оба типа метрик HAMMING и JACCARD полностью поддерживают поиск по диапазону для бинарных типов данных. Однако типы метрик SUBSTRUCTURE/SUPERSTRUCTURE несовместимы с поиском по диапазону, поскольку их семантика основана на системе значений true/false. Что касается индексов с типом float, индексы, использующие метрики L2, IP и COSINE, полностью совместимы с поиском по диапазону.
В таблице ниже приведены подробные типы индексов и метрик, совместимые с Range Search.
| L2 | IP | COSINE | HAMMING | JACCARD | SUBSTRUCTURE | SUPERSTRUCTURE | |
|---|---|---|---|---|---|---|---|
| BIN_IDMAP | √ | √ | |||||
| BIN_IVF_FLAT | √ | √ | |||||
| IDMAP | √ | √ | √ | ||||
| IVF_FLAT | √ | √ | √ | ||||
| IVF_PQ | √ | √ | √ | ||||
| IVF_SQ8 | √ | √ | √ | ||||
| HNSW | √ | √ | √ | √ | √ | ||
| SCANN | √ | √ | √ | ||||
| DISKANN | √ | √ | √ |
Как использовать Range Search в Milvus
Чтобы использовать Range Search в Milvus, вам потребуется изменить параметры поиска в вашем поисковом запросе. Ниже приведено пошаговое руководство, включая пример фрагмента кода на Python:
Предварительные требования
Убедитесь, что Milvus установлен и запущен.
Убедитесь, что вы создали коллекцию и проиндексировали ее.
Важные параметры Range Search
radius: Это обязательный параметр, который определяет, будет ли поисковый запрос выполнять поиск по диапазону или обычный поиск.
range_filter: Это необязательный параметр. Если он указан, будет выполнена вторичная фильтрация результатов. Если не указан, функция вернет результаты напрямую.
Настроив эти два параметра, вы можете точно регулировать поведение ваших запросов Range Search для различных потребностей приложений. Учитывая это, давайте рассмотрим пример кода, который поможет вам начать.
default_index = {
"index_type": "HNSW",
"metric_type": "L2",
"params": {"M":48,"efConstruction":500}
}
collection.create_index("float_vector", default_index)
search_params = {
"metric_type": "L2",
"limit": TOPK,
"params": {"ef":32,"range_filter":1.0,"radius":2.0}
}
res = collection.search(vectors[:nq], "float_vector", search_params, limit)
Рекомендации по метрикам
Теперь, когда вы понимаете, как использовать Range Search, важно учитывать влияние типов метрик на ваши запросы. В зависимости от выбранного типа метрики вам следует проверять Radius, как мы рекомендовали в таблице ниже.
| Тип метрики | Radius | Похожие | Непохожие |
|---|---|---|---|
| L2 | [0.0, inf] | 0.0 | inf |
| IP | [-inf, inf] | inf | -inf |
| COSINE | [-1.0, 1.0] | 1.0 | -1.0 |
| HAMMING | [0, n] | 0 | n |
| JACCARD | [0.0, 1.0] | 0.0 | 1.0 |
Кроме того, range_filter должен соответствовать следующим правилам:
Для L2/Hamming/Jaccard, range_filter < radius
Для IP/Cosine, range_filter > radius
Заключение
Range Search в Milvus не ограничивается рекомендательными системами; у него есть более широкие применения в таких областях, как сопоставление контента, обнаружение аномалий и задачи поиска в NLP. Используя такие параметры, как radius и range_filter, вы можете точно адаптировать свои запросы к этим разнообразным сценариям использования.
Готовы взять под контроль свои поисковые запросы? Range Search теперь доступен для публичного предварительного просмотра на Zilliz Cloud. Перейдите на бета-версию Zilliz Cloud или скачайте Milvus 2.3.x, чтобы попробовать его. Ваши отзывы крайне важны для его постоянного улучшения, поэтому, если вы столкнетесь с какими-либо проблемами или у вас есть предложения, мы будем рады их услышать. Давайте вместе сделаем Range Search лучше.
Читать далее

Zilliz Cloud Update: Smarter Autoscaling for Cost Savings, Stronger Compliance with Audit Logs, and More
What's new in Zilliz Cloud? Smarter autoscaling with scale-down, audit logs GA, enhanced SSO, and Milvus 2.6 in Private Preview.

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

Similarity Metrics for Vector Search
Exploring five similarity metrics for vector search: L2 or Euclidean distance, cosine distance, inner product, and hamming distance.



