Começar a utilizar o Milvus Hybrid Search
Com o lançamento do Milvus 2.4, introduzimos a pesquisa multi-vetorial e a capacidade de fazer pesquisa híbrida (pesquisa multi-vetorial). Esta nova funcionalidade melhora a forma como podemos pesquisar e analisar dados, permitindo aos utilizadores efetuar uma pesquisa híbrida, realizando consultas simultâneas em vários campos vectoriais e integrando os resultados com estratégias de reclassificação.
A pesquisa híbrida, frequentemente designada por pesquisa multi-vetorial, é o processo de realização de pesquisas em vários campos vectoriais dentro do mesmo conjunto de dados. Estes vectores podem representar diferentes facetas dos dados, utilizar diversos [modelos de incorporação] (https://zilliz.com/blog/choosing-the-right-embedding-model-for-your-data), ou empregar métodos de processamento de dados distintos e combinar os resultados utilizando [re-classificadores] (https://zilliz.com/learn/optimize-rag-with-rerankers-the-role-and-tradeoffs).
Neste tutorial, aprenderá a tirar partido das capacidades de pesquisa híbrida do Milvus 2.4 para melhorar a sua pesquisa. Iremos abordar:
Criar Sparse Embeddings
Criar Embeddings Densos
Indexar os seus dados em Milvus
Realizar uma pesquisa multi-vetorial utilizando a mesma coleção.
Este tutorial utilizará o conjunto de dados eSci, um conjunto de dados abrangente de pesquisa de produtos da Amazon. Adicionalmente, usaremos o modelo BGE-M3 através da biblioteca pymilvus[models], que facilita a geração de embedding direto no Milvus.
Introdução à pesquisa híbrida
A pesquisa híbrida é uma técnica poderosa que combina os pontos fortes dos métodos de recuperação esparsos e densos para melhorar os resultados da pesquisa. Os métodos tradicionais de recuperação esparsa, embora eficazes em determinados cenários, sofrem frequentemente de expressividade limitada e falta de flexibilidade. A pesquisa híbrida resolve estas limitações através da fusão de métodos de recuperação esparsos e densos, permitindo resultados de pesquisa mais precisos e eficientes.
Tirando partido dos pontos fortes complementares dos vectores esparsos e densos, a pesquisa híbrida pode captar tanto as correspondências exactas como as nuances semânticas dos dados. Isto resulta numa experiência de pesquisa mais abrangente e precisa. Quer esteja a lidar com texto, imagens ou outros tipos de dados, a pesquisa híbrida pode melhorar significativamente a relevância e a qualidade dos seus resultados de pesquisa.
Compreender a Pesquisa Vetorial
A pesquisa vetorial é um tipo de pesquisa que usa vetores para representar dados. Os vectores são representações matemáticas que captam a essência dos pontos de dados, permitindo o cálculo de semelhanças entre eles. Na pesquisa vetorial, tanto os dados como as consultas de pesquisa são transformados em vectores. A semelhança entre o vetor de consulta e os vectores de dados é então calculada, e os pontos de dados mais semelhantes são devolvidos como resultados da pesquisa.
Esta abordagem é particularmente útil para pesquisar grandes conjuntos de dados, uma vez que permite a recuperação eficiente e escalável de informações relevantes. A pesquisa vetorial pode ser aplicada a vários domínios, incluindo a pesquisa de imagens e de texto, onde se destaca na procura de itens [semanticamente semelhantes] (https://zilliz.com/glossary/semantic-similarity). Tirando partido do poder dos vectores, é possível obter resultados de pesquisa mais precisos e significativos.
Instalar e importar as bibliotecas necessárias e criar índices
pip install pymilvus[model] datasets
importar pandas como pd
from datasets import load_dataset
from pymilvus import (
FieldSchema,
CollectionSchema,
DataType,
Coleção,
AnnSearchRequest,
RRFRanker,
conexões,
)
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
Preparar o conjunto de dados
O conjunto de dados ESCI foi concebido para a correspondência semântica de consultas e produtos. Nesta secção, vamos preparar o conjunto de dados ESCI. Vamos concentrar-nos em selecionar um subconjunto dos dados e garantir que está limpo e pronto para ser processado.
Descarregar e selecionar um subconjunto
dataset = load_dataset("tasksource/esci", split="train")
dataset = dataset.select(range(500))
dataset = dataset.filter(lambda x: x["product_locale"] == "us")
conjunto de dados
Limpar os dados
A limpeza do conjunto de dados é crucial para evitar que os maus resultados da pesquisa sejam causados por duplicados ou informações em falta.
source_df = dataset.to_pandas()
df = source_df.drop_duplicates(
subconjunto=["texto_do_produto", "título_do_produto", "ponto_de_balão_do_produto", "marca_do_produto"]
)
# Eliminar linhas com valores em falta
df = df.dropna(
subconjunto=["texto_do_produto", "título_do_produto", "ponto_de_balão_do_produto", "marca_do_produto"]
)
df.head()
Aqui está uma rápida olhada no que os dados incluem:
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 Irrelevante 0 1 Panasonic FV-20VQ3 WhisperCeiling 190 CFM Ceil... Nenhum ventilador de teto WhisperCeiling possui um sistema de... Panasonic Branco Panasonic FV-20VQ3 WhisperCeiling 190 CFM Ceil...
2 1 revent 80 cfm 0 B07X3Y6B1V us Exact 0 1 Homewerks 7141-80 Ventilador de casa de banho com LED integrado ... Nenhum DESEMPENHO EXCELENTE: Esta ventoinha de casa de banho da Homewerk ... Homewerks 80 CFM Homewerks 7141-80 Ventilador de casa de banho com LED integrado ...
3 2 revent 80 cfm 0 B07WDM7MQQ us Exact 0 1 Homewerks 7140-80 Ventilador de casa de banho Montagem no teto E... Nenhum DESEMPENHO EXCELENTE: Este ventilador de casa de banho da Homewerk ... Homewerks Branco Homewerks 7140-80 Ventilador de casa de banho com montagem no teto ...
4 3 revent 80 cfm 0 B07RH6Z8KW us Exact 0 1 Delta Electronics RAD80L BreezRadiance 80 CFM ... Este produto usado ou recondicionado foi... Funcionamento silencioso a 1,5 sones\nTermoacumulador incorporado... DELTA ELECTRONICS (AMERICAS) LTD. Branco Delta Electronics RAD80L BreezRadiance 80 CFM ...
5 4 revent 80 cfm 0 B07QJ7WYFQ us Exact 0 1 Ventilador de ventilação Panasonic FV-08VRE2 com reces... Nenhum A solução de design para combinações de ventilador/luz... Panasonic Branco Ventilador de ventilação Panasonic FV-08VRE2 com recu...
Com o conjunto de dados agora preparado e limpo, podemos gerar vetor embeddings e indexá-los em Milvus para a nossa pesquisa híbrida.
Gerando vetores com BGE-M3
Uma vez que seus dados estejam limpos e prontos, o próximo passo é gerar embeddings vetoriais. Vamos usar o modelo de incorporação BGE-M3 para transformar os dados de texto em bruto em vectores numéricos que a base de dados de vectores Milvus pode indexar e pesquisar eficazmente.
Fundir dados de texto
Em primeiro lugar, concatenar os diferentes campos de texto associados a cada produto para formar uma representação vetorial de texto unificada. Isto ajuda a capturar todas as informações relevantes sobre o produto num único vetor:
df["merged_text"] = df["product_title"] + "\n" + df["product_text"] + "\n" + df["product_bullet_point"]
docs = df["texto_mesclado"].to_list()
Gerar Embeddings
ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]
docs_embeddings = ef(docs)
consulta = "Tem um exemplo de um produto Panasonic?"
consulta_embeddings = ef([consulta])
Configurar a sua coleção Milvus
Depois de gerar os embeddings, o próximo passo é armazenar estes vectores no Milvus, criando uma coleção que pode lidar tanto com vectores esparsos como com [vectores densos] (https://zilliz.com/learn/sparse-and-dense-embeddings).
Conectar ao Milvus
Comece por estabelecer uma ligação ao seu servidor Milvus:
from pymilvus import connections
connections.connect()
Defina o seu esquema de coleção
campos = [
# Usa o id gerado automaticamente como chave primária
Esquema de campo(
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 = Coleção("esparso_denso_demo", schema)
Criar índices para vectores
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("vector_denso", índice_denso)
Inserir os dados na coleção
entidades = [
docs,
docs_embeddings["sparse"],
docs_embeddings["dense"],
]
col.insert(entities)
Executando buscas híbridas em Milvus
Podemos executar pesquisas híbridas assim que a sua Milvus collection estiver preparada com os dados e índices necessários. Este passo usa tanto vetores esparsos quanto dense vectors para consultar a coleção e refinar os resultados usando um re-ranker.
def consulta_hibrida(consulta: str):
consulta_embeddings = ef([consulta])
esparso_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
Esta função gera embeddings para uma consulta de entrada. Depois constrói dois objectos AnnSearchRequest para os vectores esparsos e densos, especificando o tipo de métrica de similaridade a usar (IP para produto interno e COSINE para similaridade de cosseno). O método hybrid_search** combina os resultados de ambos os vectores utilizando um RRFRanker, que reordena os resultados combinados para dar prioridade às correspondências mais relevantes.
Um exemplo de pesquisa vetorial
Para ver essa função em ação, vamos realizar uma pesquisa híbrida com uma consulta prática:
pesquisa_hibrida("Você tem um produto da Homewerks?")[0]
Saída
['id: 449353344520491318, distance: 0.032786883413791656, entity: {\'text\': "Ventilador de Casa de Banho Homewerks 7141-80 Ventilação de Exaustão de Montagem no Teto com Luz LED Integrada, 1.1 Sones, 80 CFM\\nVentilador de Casa de Banho Homewerks 7141-80 Ventilação de Exaustão de Montagem no Teto com Luz LED Integrada, 1.1 Sones, 80 CFM\\nHomewerks\\n80 CFM\\nNone\\\nOUTRA PERFORMANCE: Este ventilador de banho da Homewerk garante o conforto em sua casa, eliminando silenciosamente a humidade e a umidade no banheiro. Este exaustor é de 1,1 sones a 80 CFM, o que significa que é capaz de gerir espaços de até 80 pés quadrados e é muito silencioso. As ventoinhas de casa de banho da Homewerk podem ajudar a remover este odor com a sua poderosa ventilação...]
Pesquisa híbrida versus pesquisa simples de similaridade vetorial
Usar apenas embeddings densos em vez de uma mistura de embeddings esparsos e densos pode ter problemas com consultas que dependem de correspondências exatas de palavras-chave ou distinções de dados categoriais, que [embeddings esparsos] (https://zilliz.com/learn/enhancing-information-retrieval-learned-sparse-embeddings) podem lidar bem.
Por exemplo, se alguém estiver à procura de um atributo muito específico, como "envio incluído". Os embeddings densos podem obter uma vasta gama de coisas relacionadas com as palavras-chave principais, como o tipo de produto ou a marca, mas perdem o aspeto crucial "envio incluído".
Vamos comparar a utilização de um motor de pesquisa vetorial híbrido e a utilização apenas de uma pesquisa vetorial simples com embeddings densos:
def consulta_pesquisa_densa(consulta: str):
query_embeddings = ef([query])
parâmetros_da_pesquisa = {
"dados": query_embeddings["dense"],
"anns_field": "vector_denso",
"param": {"metric_type": "COSINE"},
"limit": 2,
"output_fields": ["text"],
}
res_dense = col.search(**search_param)
return res_dense
> consulta_densa_pesquisa("envio incluído")
[
{
"id": "449353344520491390",
"distância": 0.5341320037841797,
"entidade": {
"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, Envelope branco 3/8 x 6 1/2" #6, sem janela, para envio de facturas (100/embalagem), 1 embalagemnProdutos BAZICn#6 3/4 (100 unidades)n<p><strong>VOLTA À BAZIC</strong></p> <p>O nosso objetivo é fornecer a cada cliente materiais duradouros a um custo acessível. Desde 1998, cumprimos esta promessa e só continuaremos a melhorar a cada ano. Construímos a nossa marca com base na integridade e na qualidade, para que os clientes saibam exatamente o que esperar.</p> <p><strong>COMPrometidos com os valores</strong></p> <p>Somos uma empresa orientada por valores, guiada pelos princípios da excelência através de uma forte conceção de produtos a baixo custo. O nosso compromisso com estes valores reflecte-se na nossa dedicação à melhoria dos produtos actuais e ao desenvolvimento de novos produtos interessantes para os nossos consumidores. Prosperamos com imaginação, paixão e liderança. Temos óptimos produtos e vamos continuar a subir com as expectativas dos nossos clientes.</p> <p><strong>SUCESSO BASEADO NA SATISFAÇÃO</strong></p> <p>Sede em Los Angeles, Califórnia, Estados Unidos. Cada produto que enviamos, esperamos 100% de satisfação do nosso cliente. O nosso sucesso resulta da satisfação individual do consumidor. Criamos produtos que as pessoas querem recomendar a outras pessoas.</p>n#6-3/4 ENVELOPES BRANCOS SELF-SEAL. Estes envelopes auto-selantes de 3 5/8" x 6 1/2" polegadas foram concebidos para poupar o seu tempo e dinheiro. Ajudam-no a enviar os seus envios em tempo recorde.nSECURE. Basta descascar e selar para criar um selo forte e duradouro sem lamber ou humedecer. O nosso design de auto-selagem é rápido e fácil e garante que fica selado sem necessidade de fita adesiva ou cola em bastão.nDesign sem janelas. Envelopes fabricados com um painel frontal sem janelas para facilitar a impressão, a etiquetagem ou o endereçamento manual, perfeitos para envios comerciais rápidos e em massa. Perfeitos para utilização comercial quotidiana, estes envelopes brancos normais são fabricados em papel resistente e duradouro de 20 lb e suportam com segurança ficheiros pesados durante o transporte.nMÚLTIPLA FINALIDADE. Estes envelopes podem facilmente conter facturas, cartas, cheques, cartões de oferta, etc. Estes envelopes podem ser utilizados para praticamente tudo o que precisar deles!
}
},
O mesmo para a pesquisa híbrida
> consulta_pesquisa_híbrida("portes incluídos")
[
{
"id": "449353344520491358",
"distância": 0.016393441706895828,
"entidade": {
"text": "ASURION 4 Year Home Improvement Protection Plan $20-29.99nASURION 4 Year Home Improvement Protection Plan $20-29.99nASURIONnNonenAsurion está a eliminar as suposições na procura de planos de proteção de produtos que se adaptem às suas necessidades. Os produtos falham - muitas vezes na altura mais inconveniente. É bom que esteja coberto, porque nenhum outro plano pode proteger o seu material da mesma forma que um Plano de Proteção Asurion. Em poucas palavras, os Planos de Proteção Asurion cobrem os seus produtos quando mais precisa deles, com um processo de reclamação rápido e fácil. Compre um plano de proteção de uma empresa que conhece e confia. Adicione um Plano de proteção Asurion ao seu carrinho hoje mesmo! Consulte o "Manual do utilizador [pdf]" abaixo para obter os termos e condições detalhados relacionados com este plano.nNO CUSTO ADICIONAL: Paga $0 pelas reparações - peças, mão de obra e envio incluídos.n
}
}
]
Aqui, podemos ver que uma pesquisa híbrida pode encontrar um produto em que o "envio" está incluído, enquanto os dense embeddings estão a ir mais para um resultado em que se pode enviar algo.
Conclusão
Ao longo deste tutorial, explorámos uma nova capacidade do Milvus 2.4, focando-nos na pesquisa híbrida, que permite pesquisas vectoriais em diferentes tipos de embeddings de dados.
Sinta-se à vontade para conferir Milvus e o código no Github, e compartilhe suas experiências com a comunidade juntando-se ao nosso Discord.
Conduzindo uma busca híbrida
A realização de uma pesquisa híbrida envolve a combinação de métodos de recuperação esparsos e densos para melhorar os resultados da pesquisa. O processo normalmente envolve as seguintes etapas:
Preparação de dados: Preparar os dados convertendo-os em vectores. Isto pode ser feito utilizando várias técnicas, como a incorporação de palavras para dados de texto ou [incorporação de imagens] (https://zilliz.com/learn/image-embeddings-for-enhanced-image-search) para dados de imagem. Ao transformar os dados brutos em vectores numéricos, permite uma indexação e recuperação eficientes.
Criar índices: Crie índices para os vectores de dados. Os índices são estruturas de dados que permitem uma rápida pesquisa e recuperação de dados. No Milvus, pode criar índices para vectores esparsos e densos, assegurando que as suas consultas de pesquisa podem ser processadas de forma rápida e precisa.
Efetuar pesquisa híbrida: Efectue uma pesquisa híbrida combinando métodos de recuperação esparsos e densos. Técnicas como a fusão de classificação recíproca podem ser utilizadas para fundir os resultados de ambos os métodos de recuperação, produzindo uma classificação final que equilibra a precisão e a recuperação. Este passo é crucial para aproveitar os pontos fortes dos vectores esparsos e densos.
Recuperar resultados: Recupera os resultados da pesquisa com base na classificação final. Os resultados da pesquisa podem ser ainda mais filtrados e refinados utilizando várias técnicas, como a filtragem de atributos. Isto garante que são apresentados ao utilizador os resultados mais relevantes e de maior qualidade.
A pesquisa híbrida oferece várias vantagens, incluindo melhores resultados de pesquisa, maior eficiência e flexibilidade. Pode ser utilizada para várias aplicações, como a pesquisa de imagens e de texto, e pode ser implementada utilizando várias técnicas, como a fusão de classificação recíproca e métodos baseados em vectores. Ao efetuar uma pesquisa híbrida, pode obter uma experiência de pesquisa mais abrangente e precisa, adaptada às necessidades específicas da sua aplicação.
Continue lendo

Zilliz Cloud Update: Smarter Autoscaling for Cost Savings, Stronger Compliance with Audit Logs, and More
Take a look at the latest release of Zilliz Cloud.

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.
