Начало работы с гибридным поиском Milvus
С выходом версии Milvus 2.4 мы представили многовекторный поиск и возможность осуществлять гибридный поиск (многовекторный поиск). Эта новая функциональность расширяет возможности поиска и анализа данных, позволяя пользователям осуществлять гибридный поиск, выполняя одновременные запросы по нескольким векторным полям и интегрируя результаты со стратегиями повторного ранжирования.
Гибридный поиск, часто называемый многовекторным, - это процесс поиска по различным векторным полям в одном и том же наборе данных. Эти векторы могут представлять различные аспекты данных, использовать различные [модели встраивания] (https://zilliz.com/blog/choosing-the-right-embedding-model-for-your-data) или применять различные методы обработки данных и объединять результаты с помощью [реранжировщиков] (https://zilliz.com/learn/optimize-rag-with-rerankers-the-role-and-tradeoffs).
В этом руководстве вы узнаете, как использовать возможности гибридного поиска в Milvus 2.4 для улучшения поиска. Мы рассмотрим:
Создание разреженных вкраплений
Создание плотных вкраплений
Индексируйте данные в Milvus
Выполните многовекторный поиск по одной и той же коллекции.
В этом уроке мы будем использовать набор данных eSci, обширный набор данных для поиска товаров от Amazon. Кроме того, мы будем использовать модель BGE-M3 через библиотеку pymilvus[models], которая упрощает создание прямого встраивания в Milvus.
Введение в гибридный поиск
Гибридный поиск - это мощная техника, которая объединяет сильные стороны разреженных и плотных методов поиска для улучшения результатов поиска. Традиционные методы разреженного поиска, хотя и эффективны в определенных сценариях, часто страдают от ограниченной выразительности и недостаточной гибкости. Гибридный поиск устраняет эти недостатки, объединяя разреженные и плотные методы поиска, что позволяет добиться более точных и эффективных результатов.
Используя взаимодополняющие преимущества разреженных и плотных векторов, гибридный поиск может улавливать как точные совпадения, так и семантические нюансы данных. В результате поиск становится более полным и точным. Независимо от того, работаете ли вы с текстом, изображениями или другими типами данных, гибридный поиск может значительно повысить релевантность и качество результатов поиска.
Понимание векторного поиска
Векторный поиск - это тип поиска, в котором для представления данных используются векторы. Векторы - это математические представления, которые отражают суть точек данных, позволяя вычислять сходство между ними. При векторном поиске и данные, и поисковые запросы преобразуются в векторы. Затем вычисляется сходство между вектором запроса и векторами данных, и наиболее похожие точки данных возвращаются в качестве результатов поиска.
Такой подход особенно полезен для поиска в больших массивах данных, поскольку позволяет эффективно и масштабируемо извлекать нужную информацию. Векторный поиск может применяться в различных областях, включая поиск изображений и текстов, где он отлично справляется с поиском семантически схожих элементов. Используя возможности векторов, вы сможете добиться более точных и значимых результатов поиска.
Установка и импорт необходимых библиотек и создание индексов
! pip install pymilvus[model] datasets
import pandas as pd
from datasets import load_dataset
из pymilvus import (
FieldSchema,
CollectionSchema,
DataType,
Collection,
AnnSearchRequest,
RRFRanker,
соединения,
)
из pymilvus.model.hybrid import BGEM3EmbeddingFunction
Подготовьте набор данных
Набор данных ESCI предназначен для семантического сопоставления запросов и товаров. В этом разделе мы подготовим набор данных ESCI. Мы сосредоточимся на выборе подмножества данных и обеспечении их чистоты и готовности к обработке.
Загрузка и выбор подмножества
dataset = load_dataset("tasksource/esci", split="train")
dataset = dataset.select(range(500))
dataset = dataset.filter(lambda x: x["product_locale"] == "us")
dataset
Очистите данные
Очистка набора данных очень важна, чтобы избежать плохих результатов поиска из-за дубликатов или недостающей информации.
source_df = dataset.to_pandas()
df = source_df.drop_duplicates(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"]
)
# Отбросьте строки с отсутствующими значениями
df = df.dropna(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"]
)
df.head()
Вот краткий обзор данных:
example_id query query_id product_id product_locale esci_label small_version large_version product_title product_description product_bullet_point product_brand product_color product_text
0 0 revent 80 cfm 0 B000MOO21W us Irrelevant 0 1 Panasonic FV-20VQ3 WhisperCeiling 190 CFM Ceil... Потолочные вентиляторы None WhisperCeiling имеют полностью закрытый... Panasonic Белый Panasonic FV-20VQ3 WhisperCeiling 190 CFM Ceil...
2 1 revent 80 cfm 0 B07X3Y6B1V us Exact 0 1 Homewerks 7141-80 Вентилятор для ванной комнаты встроенный светодиодный ... None OUTSTANDING PERFORMANCE: Этот вентилятор для ванной Homewerk ... Homewerks 80 CFM Homewerks 7141-80 Вентилятор для ванной комнаты Встроенный светодиодный ...
3 2 revent 80 cfm 0 B07WDM7MQQ us Exact 0 1 Homewerks 7140-80 Вентилятор для ванной комнаты потолочного крепления E... None OUTSTANDING PERFORMANCE: Этот вентилятор для ванной Homewerk ... Homewerks White Homewerks 7140-80 Вентилятор для ванной комнаты потолочное крепление E...
4 3 revent 80 cfm 0 B07RH6Z8KW нас Точный 0 1 Delta Electronics RAD80L BreezRadiance 80 CFM ... Этот подержанный или восстановленный продукт был... Бесшумная работа при 1,5 сонах\nВстроенный термос... DELTA ELECTRONICS (AMERICAS) LTD. Белый Delta Electronics RAD80L BreezRadiance 80 CFM ...
5 4 revent 80 cfm 0 B07QJ7WYFQ us Exact 0 1 Panasonic FV-08VRE2 Вентиляционный вентилятор с реце... Нет Дизайнерское решение для комбинации вентилятора и светильника... Panasonic Белый Panasonic FV-08VRE2 Вентиляционный вентилятор с реце...
Теперь, когда набор данных подготовлен и очищен, мы можем сгенерировать векторные вкрапления и проиндексировать их в Milvus для нашего гибридного поиска.
Генерация векторных вкраплений с помощью BGE-M3
После того как ваши данные очищены и готовы, следующим шагом будет генерация векторных вкраплений. Мы будем использовать модель встраивания BGE-M3 для преобразования необработанных текстовых данных в числовые векторы, которые могут быть эффективно проиндексированы и найдены в векторной базе данных Milvus.
Объединить текстовые данные
Сначала объедините различные текстовые поля, связанные с каждым продуктом, чтобы сформировать единое текстовое векторное представление. Это помогает собрать всю необходимую информацию о продукте в единый вектор:
df["merged_text"] = df["product_title"] + "\n" + df["product_text"] + "\n" + df["product_bullet_point"]
docs = df["merged_text"].to_list()
Генерируем вкрапления
ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]
docs_embeddings = ef(docs)
query = "Есть ли у вас пример продукта Panasonic?"
query_embeddings = ef([query])
Настройка коллекции Milvus
После генерации вкраплений следующим шагом будет хранение этих векторов в Milvus путем создания коллекции, которая может работать как с разреженными, так и с плотными векторами.
Подключение к Milvus
Начните с установления соединения с вашим сервером Milvus:
из pymilvus import connections
connections.connect()
Определите схему вашей коллекции
поля = [
# Используйте автоматически сгенерированный id в качестве первичного ключа
FieldSchema(
name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=8192),
FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
]
schema = CollectionSchema(fields, "")
col = Collection("sparse_dense_demo", schema)
Создание индексов для векторов
sparse_index = { "index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
dense_index = {"index_type": "FLAT", "metric_type": "COSINE"}
col.create_index("sparse_vector", sparse_index)
col.create_index("dense_vector", dense_index)
Вставьте данные в коллекцию
сущности = [
docs,
docs_embeddings["sparse"],
docs_embeddings["dense"],
]
col.insert(entities)
Выполнение гибридного поиска в Milvus
Мы можем выполнять гибридный поиск, как только ваша коллекция Milvus будет подготовлена с необходимыми данными и индексами. Этот шаг использует как разреженные, так и плотные векторы для запроса коллекции и уточнения результатов с помощью реранжировщика.
def query_hybrid_search(query: str):
query_embeddings = ef([query])
sparse_req = AnnSearchRequest(
query_embeddings["sparse"], "sparse_vector", {"metric_type": "IP"}, limit=2
)
dense_req = AnnSearchRequest(
query_embeddings["dense"], "dense_vector", {"metric_type": "COSINE"}, limit=2
)
res = col.hybrid_search(
[sparse_req, dense_req], rerank=RRFRanker(), limit=2, output_fields=["text"]
)
return res
Эта функция генерирует вкрапления для входного запроса. Затем она строит два объекта AnnSearchRequest для разреженного и плотного векторов, указывая тип используемой метрики сходства (IP для внутреннего произведения и COSINE для косинусного сходства). Метод гибридного_поиска** объединяет результаты из обоих векторов с помощью RRFRanker, который повторно ранжирует объединенные результаты для определения приоритета наиболее релевантных совпадений.
Пример векторного поиска
Чтобы увидеть эту функцию в действии, давайте выполним гибридный поиск с практическим запросом:
query_hybrid_search("У вас есть продукт Homewerks?")[0]
Выходные данные
['id: 449353344520491318, distance: 0.032786883413791656, entity: {\'text\': "Homewerks 7141-80 Вентилятор для ванной комнаты, встроенный светодиодный светильник, потолочный монтаж, вытяжная вентиляция, 1,1 сона, 80 CFM\nHomewerks 7141-80 Вентилятор для ванной комнаты, встроенный светодиодный светильник, потолочный монтаж, вытяжная вентиляция, 1,1 сона, 80 CFM\nHomewerks\n80 CFM\nNone\nOUTSTANDING PERFORMANCE: Этот вентилятор для ванной Homewerk\'s обеспечивает комфорт в вашем доме, тихо устраняя влажность и сырость в ванной. Этот вытяжной вентилятор имеет мощность 1,1 сона при 80 CFM, что означает, что он может управлять помещениями площадью до 80 квадратных футов и работает очень тихо.\nВентиляторы для ванной помогают устранить неприятный запах: При уборке ванной комнаты или туалета используются агрессивные химикаты, которые могут оставлять неприятный запах. Вентиляторы для ванной комнаты Homewerk помогут удалить этот запах благодаря мощной вентиляции\\n ...]
Гибридный поиск против простого поиска по векторному сходству
Использование только плотных вкраплений вместо смеси разреженных и плотных вкраплений может привести к проблемам с запросами, зависящими от точного совпадения ключевых слов или категориальных различий данных, с которыми разреженные вкрапления хорошо справляются.
Например, если человек ищет очень специфический атрибут, такой как "доставка включена". Плотные вкрапления могут получить широкий спектр вещей, связанных с основными ключевыми словами, например тип продукта или бренд, но пропустить важный аспект "доставка включена".
Давайте сравним использование гибридной векторной поисковой системы и простого векторного поиска с плотными вкраплениями:
def query_dense_search(query: str):
query_embeddings = ef([query])
search_param = {
"data": query_embeddings["dense"],
"anns_field": "dense_vector",
"param": { "metric_type": "COSINE"},
"limit": 2,
"output_fields": ["text"],
}
res_dense = col.search(**search_param)
return res_dense
> query_dense_search("shipping included")
[
{
"id": "449353344520491390",
"distance": 0.5341320037841797,
"entity": {
"text": "BAZIC Self Seal White Envelope 3 5/8" x 6 1/2" #6, No Window Mailing Envelopes, Peel & Seal Mailer for Business Invoice Check (100/Pack), 1-PacknBAZIC Self Seal White Envelope 3 5/8" x 6 1/2" #6, No Window Mailing Envelopes, Peel & Seal Mailer for Business Invoice Check (100/Pack), 1-PacknBAZIC Productsn#6 3/4 (100-count)n<p><strong>BACK TO BAZIC</strong></p> <p>Наша цель - обеспечить каждого клиента долговечными товарами по доступной цене. С 1998 года мы выполняем это обещание и продолжаем совершенствоваться с каждым годом. Мы построили свой бренд на честности и качестве, поэтому клиенты точно знают, чего ожидать.</p> <p><strong>СООТВЕТСТВИЕ ЦЕННОСТЯМ</strong></p> <p>Мы являемся компанией, ориентированной на ценности, руководствуясь принципами совершенства за счет прочного дизайна продукции по низкой цене. Наша приверженность этим ценностям находит отражение в стремлении совершенствовать существующие продукты и разрабатывать новые интересные продукты для наших потребителей. Мы процветаем благодаря воображению, страсти и лидерству. У нас отличные продукты, и мы будем продолжать расти в соответствии с ожиданиями наших клиентов.</p> <p><strong>Успех, основанный на удовлетворении потребностей</strong></p> <p>Главный офис в Лос-Анджелесе, Калифорния, США. Каждый продукт, который мы отправляем, мы ожидаем от наших клиентов 100% удовлетворения. Наш успех основан на индивидуальном подходе к потребителю. Мы создаем продукты, которые люди хотят рекомендовать другим.</p>n#6-3/4 БЕЛЫЕ БЕЛЫЕ ЭНВЕЛОПЫ. Эти самозапечатывающиеся конверты размером 3 5/8" x 6 1/2" дюйма созданы, чтобы сэкономить ваше время и деньги. Они помогут вам справиться с рассылкой в рекордно короткие сроки.nSECURE. Просто отклейте и запечатайте, чтобы создать прочную и долговечную печать без слизывания или увлажнения. Наша самозапечатывающаяся конструкция быстро и легко запечатывается и гарантированно остается герметичной, не требуя скотча или клея. nБЕЗ ОКНА. Конверты выпускаются с передней панелью без окна для удобства печати, маркировки или ручной адресации, что идеально подходит для быстрой массовой деловой рассылки.nБЕЛЫЙ СТОК 20 ЛБ. Эти стандартные белые конверты, идеально подходящие для повседневного делового использования, изготовлены из плотной, прочной бумаги плотностью 20 фунтов и надежно удерживают тяжелые файлы при транспортировке.nMULTI-PURPOSE. В эти конверты легко помещаются счета-фактуры, письма, чеки, подарочные карты и т. д. Эти конверты можно использовать практически для всего, что вам нужно!"
}
},
То же самое для гибридного поиска
> query_hybrid_search("доставка включена")
[
{
"id": "449353344520491358",
"distance": 0.016393441706895828,
"entity": {
"text": "ASURION 4 Year Home Improvement Protection Plan $20-29.99nASURION 4 Year Home Improvement Protection Plan $20-29.99nASURIONnNonenAsurion избавляет вас от необходимости гадать, как найти планы защиты товаров, соответствующие вашим потребностям. Товары выходят из строя - часто в самый неподходящий момент. Хорошо, что вы застрахованы, потому что ни один другой план не сможет защитить ваши вещи так, как план Asurion Protection Plan. Проще говоря, планы Asurion Protection покрывают ваши продукты, когда они вам больше всего нужны, и обеспечивают быстрый и простой процесс подачи претензий. Купите план защиты от компании, которую вы знаете и которой доверяете. Добавьте план защиты Asurion в корзину уже сегодня! Подробные условия и положения, связанные с этим планом, см. в "Руководстве пользователя [pdf]" ниже.nNO ДОПОЛНИТЕЛЬНЫЕ РАСХОДЫ: Вы платите 0 долларов за ремонт - детали, рабочая сила и доставка включены.n
}
}
]
Здесь мы видим, что гибридный поиск может найти продукт, в который включена "доставка", в то время как плотные вкрапления больше направлены на результат, в котором вы можете что-то отправить.
Заключение
В этом руководстве мы рассмотрели новую возможность Milvus 2.4 - гибридный поиск, который позволяет осуществлять векторный поиск по различным типам вкраплений данных.
Не стесняйтесь знакомиться с Milvus и кодом на Github, а также делиться своим опытом с сообществом, присоединившись к нашему Discord.
Проведение гибридного поиска
Гибридный поиск подразумевает комбинирование разреженных и плотных методов поиска для улучшения результатов поиска. Обычно этот процесс включает в себя следующие шаги:
Подготовка данных: Подготовьте данные, преобразовав их в векторы. Это можно сделать с помощью различных методов, таких как встраивание слов для текстовых данных или image embeddings для данных об изображениях. Преобразование исходных данных в числовые векторы позволяет эффективно индексировать и извлекать информацию.
Создание индексов: Создайте индексы для векторов данных. Индексы - это структуры данных, которые обеспечивают быстрый поиск и извлечение данных. В Milvus можно создавать индексы как для разреженных, так и для плотных векторов, что обеспечивает быструю и точную обработку поисковых запросов.
Выполнить гибридный поиск: Выполните гибридный поиск, комбинируя методы поиска по разреженным и плотным векторам. Такие техники, как взаимное слияние рангов, могут использоваться для объединения результатов обоих методов поиска и получения окончательного рейтинга, в котором сбалансированы точность и отзыв. Этот шаг очень важен для использования преимуществ как разреженных, так и плотных векторов.
Получение результатов: Получение результатов поиска на основе итогового ранжирования. Результаты поиска могут быть дополнительно отфильтрованы и уточнены с помощью различных методов, таких как фильтрация по атрибутам. Это гарантирует, что пользователю будут представлены наиболее релевантные и качественные результаты.
Гибридный поиск обладает рядом преимуществ, включая улучшение результатов поиска, повышение эффективности и гибкость. Он может использоваться в различных приложениях, таких как поиск изображений и текстов, и может быть реализован с помощью различных методов, таких как взаимное слияние рангов и векторные методы. Гибридный поиск позволяет получить более полные и точные результаты поиска, отвечающие специфическим потребностям вашего приложения.
Читать далее

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Context Engineering Strategies for AI Agents: A Developer’s Guide
Learn practical context engineering strategies for AI agents. Explore frameworks, tools, and techniques to improve reliability, efficiency, and cost.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.
