Primeros pasos con Milvus Hybrid Search
Con el lanzamiento de Milvus 2.4, introdujimos la búsqueda multivectorial y la capacidad de realizar búsqueda híbrida (búsqueda multivectorial). Esta nueva funcionalidad mejora la forma en que podemos buscar y analizar datos al permitir a los usuarios realizar una búsqueda híbrida, realizando consultas simultáneas en múltiples campos vectoriales e integrando los resultados con estrategias de reordenación.
La búsqueda híbrida, a menudo denominada búsqueda multivectorial, es el proceso de realizar búsquedas en varios campos vectoriales dentro del mismo conjunto de datos. Estos vectores pueden representar diferentes facetas de los datos, utilizar diversos modelos de incrustación, o emplear distintos métodos de procesamiento de datos y combinar los resultados utilizando reordenadores.
En este tutorial, aprenderá a aprovechar las capacidades de búsqueda híbrida de Milvus 2.4 para mejorar su búsqueda. Cubriremos:
Crear Sparse Embeddings
Crear incrustaciones densas
Indexe sus datos en Milvus
Realice una búsqueda multivectorial utilizando la misma colección.
Este tutorial utilizará el conjunto de datos eSci, un amplio conjunto de datos de búsqueda de productos de Amazon. Además, utilizaremos el modelo BGE-M3 a través de la biblioteca pymilvus[models], que facilita la generación de incrustaciones directas en Milvus.
Introducción a la búsqueda híbrida
La búsqueda híbrida es una potente técnica que combina los puntos fuertes de los métodos de recuperación dispersos y densos para mejorar los resultados de la búsqueda. Los métodos de recuperación dispersos tradicionales, aunque eficaces en determinadas situaciones, suelen adolecer de expresividad limitada y falta de flexibilidad. La búsqueda híbrida aborda estas limitaciones fusionando métodos de recuperación dispersos y densos, lo que permite obtener resultados de búsqueda más precisos y eficientes.
Al aprovechar las ventajas complementarias de los vectores dispersos y densos (https://zilliz.com/learn/sparse-and-dense-embeddings), la búsqueda híbrida puede captar tanto las coincidencias exactas como los matices semánticos (https://zilliz.com/glossary/semantic-search) de los datos. El resultado es una experiencia de búsqueda más completa y precisa. Tanto si se trata de texto como de imágenes u otros tipos de datos, la búsqueda híbrida puede mejorar significativamente la relevancia y la calidad de los resultados de búsqueda.
Comprender la búsqueda vectorial
La búsqueda vectorial es un tipo de búsqueda que utiliza vectores para representar datos. Los vectores son representaciones matemáticas que capturan la esencia de los puntos de datos, permitiendo el cálculo de similitudes entre ellos. En la búsqueda vectorial, tanto los datos como las consultas se transforman en vectores. A continuación, se calcula la similitud entre el vector de consulta y los vectores de datos, y se devuelven los puntos de datos más similares como resultados de la búsqueda.
Este método es especialmente útil para buscar en grandes conjuntos de datos, ya que permite recuperar información relevante de forma eficaz y escalable. La búsqueda vectorial puede aplicarse a diversos ámbitos, como la búsqueda de imágenes y textos, donde destaca por su capacidad para encontrar elementos semánticamente similares. Aprovechando la potencia de los vectores, puede obtener resultados de búsqueda más precisos y significativos.
Instalar e importar las bibliotecas necesarias y crear índices
pip install pymilvus[model] datasets
import pandas as pd
from datasets import load_dataset
from pymilvus import (
FieldSchema,
CollectionSchema,
TipoDatos,
Collection,
AnnSearchRequest,
RRFRanker,
conexiones,
)
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
Preparar el conjunto de datos
El conjunto de datos ESCI está diseñado para la correspondencia semántica de consultas y productos. En esta sección, prepararemos el conjunto de datos ESCI. Nos centraremos en seleccionar un subconjunto de los datos y asegurarnos de que están limpios y listos para su procesamiento.
Descarga y selección de un subconjunto
dataset = load_dataset("tasksource/esci", split="train")
dataset = dataset.select(range(500))
dataset = dataset.filter(lambda x: x["product_locale"] == "us")
conjunto de datos
Limpiar los datos
La limpieza del conjunto de datos es crucial para evitar que los resultados de la búsqueda sean erróneos debido a duplicados o a la falta de información.
fuente_df = conjunto_datos.to_pandas()
df = source_df.drop_duplicates(
subset=["product_text", "product_title", "product_bullet_point", "product_brand"])
)
# Eliminar las filas con valores omitidos
df = df.dropna(
subset=["producto_texto", "producto_título", "producto_punto_bulbula", "producto_marca"])
)
df.head()
He aquí un vistazo rápido a lo que incluyen los datos:
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... Ninguno Los ventiladores de techo WhisperCeiling... Panasonic Blanco Panasonic FV-20VQ3 WhisperCeiling 190 CFM Ceil...
2 1 revent 80 cfm 0 B07X3Y6B1V us Exact 0 1 Homewerks 7141-80 Ventilador de baño LED integrado ... Ninguno RENDIMIENTO EXCEPCIONAL: Este ventilador de baño Homewerk ... Ventilador de Baño Homewerks 7141-80 80 CFM LED Integrado ...
3 2 revent 80 cfm 0 B07WDM7MQQ us Exact 0 1 Homewerks 7140-80 Ventilador de baño de techo ... Ninguno RENDIMIENTO EXCEPCIONAL: Este ventilador de baño Homewerk ... Homewerks Blanco Homewerks 7140-80 Ventilador de Baño Montaje en Techo E...
4 3 revent 80 cfm 0 B07RH6Z8KW us Exact 0 1 Delta Electronics RAD80L BreezRadiance 80 CFM ... Este producto de segunda mano o reacondicionado ha sido... Funcionamiento silencioso a 1,5 sonesIncorpora termo... DELTA ELECTRONICS (AMERICAS) LTD. Blanco Delta Electronics RAD80L BreezRadiance 80 CFM ...
5 4 revent 80 cfm 0 B07QJ7WYFQ us Exact 0 1 Panasonic FV-08VRE2 Ventilador con re... Ninguno La solución de diseño para combinaciones ventilador/luz... Panasonic Blanco Panasonic FV-08VRE2 Ventilador con re...
Con el conjunto de datos ya preparado y limpio, podemos generar incrustaciones vectoriales e indexarlas en Milvus para nuestra búsqueda híbrida.
Generación de incrustaciones vectoriales con BGE-M3
Una vez que los datos están limpios y listos, el siguiente paso es generar incrustaciones vectoriales. Utilizaremos el modelo de incrustación BGE-M3 para transformar los datos de texto sin procesar en vectores numéricos que la base de datos vectorial de Milvus pueda indexar y buscar eficazmente.
Fusionar datos de texto
En primer lugar, concatene los distintos campos de texto asociados a cada producto para formar una representación vectorial de texto unificada. Esto ayuda a capturar toda la información relevante sobre el producto en un único vector:
df["texto_fusionado"] = df["título_producto"] + "\n" + df["texto_producto"] + "\n" + df["punto_bullet_producto"].
docs = df["texto_fusionado"].to_list()
Generar incrustaciones
ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]
docs_embeddings = ef(docs)
query = "¿Tiene un ejemplo de un producto Panasonic?"
query_embeddings = ef([query])
Configuración de su colección Milvus
Después de generar las incrustaciones, el siguiente paso es almacenar estos vectores en Milvus creando una colección que pueda manejar tanto vectores dispersos como vectores densos.
Conectarse a Milvus
Empiece por establecer una conexión con su servidor Milvus:
from pymilvus import conexiones
conexiones.conectar()
Defina su esquema de colección
campos = [
# Usar id autogenerado como clave primaria
CampoEsquema(
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=dim_denso),
]
schema = CollectionSchema(fields, "")
col = Colección("sparse_dense_demo", esquema)
Crear índices para vectores
sparse_index = {"tipo_índice": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
dense_index = {"tipo_índice": "FLAT", "metric_type": "COSINE"}
col.create_index("sparse_vector", sparse_index)
col.create_index("vector_denso", índice_denso)
Insertar los datos en la colección
entidades = [
docs,
docs_embeddings["sparse"],
docs_embeddings["dense"],
]
col.insert(entidades)
Ejecución de búsquedas híbridas en Milvus
Podemos realizar búsquedas híbridas una vez que su colección Milvus esté preparada con los datos e índices necesarios. Este paso utiliza tanto vectores dispersos como vectores densos para consultar la colección y refinar los resultados utilizando un re-ranker.
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"]
)
devolver res
Esta función genera incrustaciones para una consulta de entrada. A continuación, construye dos objetos AnnSearchRequest para los vectores disperso y denso, especificando el tipo de métrica de similitud a utilizar (IP para producto interior y COSINE para similitud coseno). El método hybrid_search** combina los resultados de ambos vectores utilizando un RRFRanker, que reordena los resultados combinados para priorizar las coincidencias más relevantes.
Ejemplo de búsqueda vectorial
Para ver esta función en acción, vamos a realizar una búsqueda híbrida con una consulta práctica:
query_hybrid_search("¿Tiene un producto Homewerks?")[0]
Salida
['id: 449353344520491318, distancia: 0.032786883413791656, entidad: {\'text\': "Homewerks 7141-80 Ventilador de Baño Integrado con Luz LED para Montaje en Techo Extractor de Ventilación, 1.1 Sones, 80 CFM\nHomewerks 7141-80 Ventilador de Baño Integrado con Luz LED para Montaje en Techo Extractor de Ventilación, 1.1 Sones, 80 CFM\nHomewerks\n80 CFM\NNNNningún rendimiento sobresaliente: Este ventilador de baño de Homewerk asegura la comodidad en su hogar eliminando silenciosamente la humedad y la humedad en el baño. Este extractor es de 1,1 sones a 80 CFM lo que significa que es capaz de gestionar espacios de hasta 80 pies cuadrados y es muy silencioso. Ventiladores de baño ayuda a eliminar el olor desagradable: Al limpiar el cuarto de baño o aseo, se utilizan productos químicos agresivos y pueden dejar un olor desagradable. Los ventiladores de baño de Homewerk pueden ayudar a eliminar este olor con su potente ventilación...]
Búsqueda Híbrida vs Búsqueda Simple por Similitud Vectorial
El uso exclusivo de incrustaciones densas en lugar de una mezcla de incrustaciones dispersas y densas puede plantear problemas con consultas que dependen de coincidencias exactas de palabras clave o distinciones categoriales de datos, que incrustaciones dispersas puede manejar bien.
Por ejemplo, si se busca un atributo muy específico, como "envío incluido". Las incrustaciones densas podrían recuperar una amplia gama de datos relacionados con las palabras clave principales, como el tipo de producto o la marca, pero pasar por alto el aspecto crucial de "envío incluido".
Comparemos el uso de un motor de búsqueda vectorial híbrido y el uso de una búsqueda vectorial simple con incrustaciones densas:
def query_dense_search(query: str):
query_embeddings = ef([query])
search_param = {
"datos": query_embeddings["denso"],
"anns_field": "dense_vector",
"param": {"metric_type": "COSINE"},
"limit": 2,
"output_fields": ["text"],
}
res_denso = col.buscar(**parámetro_buscar)
return res_dense
> query_dense_search("envío incluido")
[
{
"id": "449353344520491390",
"distancia": 0.5341320037841797,
"entidad": {
"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>Nuestro objetivo es proporcionar a cada cliente suministros duraderos a un coste asequible. Desde 1998, hemos cumplido esta promesa y sólo seguiremos mejorando cada año. Hemos construido nuestra marca sobre la integridad y la calidad, para que los clientes sepan exactamente qué esperar.</p> <p><strong>Comprometidos con los valores</strong></p> <p>Somos una empresa orientada a los valores, guiada por los principios de excelencia a través de un sólido diseño de productos a bajo coste. Nuestro compromiso con estos valores se refleja en nuestra dedicación a mejorar los productos actuales y a desarrollar nuevos productos interesantes para nuestros consumidores. Nos basamos en la imaginación, la pasión y el liderazgo. Tenemos grandes productos y queremos seguir creciendo con las expectativas de nuestros clientes.</p> <p><strong>ÉXITO BASADO EN LA SATISFACCIÓN</strong></p> <p>Sede central en Los Ángeles, California, Estados Unidos. Todos y cada uno de los productos que enviamos, esperamos la satisfacción de nuestros clientes al 100%. Nuestro éxito proviene de la satisfacción individual del consumidor. Creamos productos que la gente quiere recomendar a los demás.</p><p>n#6-3/4 sobres blancos autoadhesivos. Estos sobres autosellables de 3 5/8" x 6 1/2" pulgadas están diseñados para ahorrarle tiempo y dinero. Le ayudan a volar a través de los envíos postales en un tiempo récord.nSEGURA. Simplemente despegue y selle para crear un sello fuerte y duradero sin lamer ni humedecer. Nuestro diseño de autocierre es rápido y sencillo y garantiza que el sobre permanecerá cerrado sin necesidad de utilizar cinta adhesiva ni pegamento en barra.nDISEÑO SIN VENTANA. Sobres fabricados con un panel frontal sin ventana para facilitar la impresión, el etiquetado o el direccionamiento a mano, perfectos para envíos comerciales masivos y rápidos.nSOPORTE BLANCO DE 20 LB. Perfectos para el uso diario en los negocios, estos sobres blancos estándar están fabricados con papel resistente de 20 libras y sujetan con seguridad archivos pesados durante el transporte.nMULTIPROPÓSITO. En estos sobres caben fácilmente facturas, cartas, cheques, tarjetas regalo, etc. Estos sobres pueden utilizarse para prácticamente cualquier cosa que necesite".
}
},
Lo mismo para la búsqueda híbrida
> query_hybrid_search("envío incluido")
[
{
"id": "449353344520491358",
"distancia": 0.016393441706895828,
"entidad": {
"text": "ASURION Plan de protección de 4 años para mejoras en el hogar $20-29,99nASURION Plan de protección de 4 años para mejoras en el hogar $20-29,99nASURIONnNonenAsurion está tomando las conjeturas de encontrar planes de protección de productos para satisfacer sus necesidades. Los productos fallan, a menudo en el momento más inoportuno. Es bueno que esté cubierto porque ningún otro plan puede proteger sus cosas como lo hace un Plan de Protección Asurion. En pocas palabras, los Planes de Protección Asurion cubren sus productos cuando más lo necesita con un proceso de reclamación rápido y sencillo. Adquiera un plan de protección de una empresa que conoce y en la que confía. Añada un Plan de Protección Asurion a su cesta hoy mismo. Consulte la "Guía del usuario [pdf]" a continuación para ver los términos y condiciones detallados relacionados con este plan.nNO COSTE ADICIONAL: Usted paga $0 por reparaciones - piezas, mano de obra y envío incluidos.n
}
}
]
Aquí podemos ver que una búsqueda híbrida puede encontrar un producto en el que se incluya "envío", mientras que las incrustaciones densas van más a por un resultado en el que se pueda enviar algo.
Conclusión
A lo largo de este tutorial, hemos explorado una nueva capacidad de Milvus 2.4, centrándonos en la búsqueda híbrida, que permite búsquedas vectoriales a través de diferentes tipos de incrustaciones de datos.
No dude en consultar Milvus y el código en Github, y comparta sus experiencias con la comunidad uniéndose a nuestro Discord.
Realización de una búsqueda híbrida
Realizar una búsqueda híbrida implica combinar métodos de recuperación dispersos y densos para mejorar los resultados de la búsqueda. El proceso suele incluir los siguientes pasos:
Preparación de los datos: Preparar los datos convirtiéndolos en vectores. Para ello se pueden utilizar diversas técnicas, como la incrustación de palabras para datos de texto o la incrustación de imágenes para datos de imágenes. Al transformar los datos brutos en vectores numéricos, se posibilita una indexación y recuperación eficaces.
Crear índices: Crear índices para los vectores de datos. Los índices son estructuras de datos que permiten una rápida búsqueda y recuperación de datos. En Milvus, puede crear índices tanto para vectores dispersos como densos, lo que garantiza que sus consultas de búsqueda puedan procesarse con rapidez y precisión.
Realizar una búsqueda híbrida: Realice una búsqueda híbrida combinando métodos de recuperación dispersos y densos. Se pueden utilizar técnicas como la fusión recíproca de rangos para fusionar los resultados de ambos métodos de recuperación y obtener una clasificación final que equilibre la precisión y la recuperación. Este paso es crucial para aprovechar los puntos fuertes de los vectores dispersos y densos.
Recuperar resultados: Obtener los resultados de la búsqueda basándose en la clasificación final. Los resultados de la búsqueda pueden filtrarse y refinarse aún más utilizando diversas técnicas, como el filtrado por atributos. Esto garantiza que se presenten al usuario los resultados más relevantes y de mayor calidad.
La búsqueda híbrida ofrece varias ventajas, como mejores resultados de búsqueda, mayor eficacia y flexibilidad. Puede utilizarse para diversas aplicaciones, como la búsqueda de imágenes y texto, y puede implementarse utilizando diversas técnicas, como la fusión de rangos recíprocos y los métodos basados en vectores. Al realizar una búsqueda híbrida, puede conseguir una experiencia de búsqueda más completa y precisa, adaptada a las necesidades específicas de su aplicación.
Sigue leyendo

Why Not All VectorDBs Are Agent-Ready
Explore why choosing the right vector database is critical for scaling AI agents, and why traditional solutions fall short in production.

Zilliz Cloud BYOC Upgrades: Bring Enterprise-Grade Security, Networking Isolation, and More
Discover how Zilliz Cloud BYOC brings enterprise-grade security, networking isolation, and infrastructure automation to vector database deployments in AWS

Knowledge Injection in LLMs: Fine-Tuning and RAG
Explore knowledge injection techniques like fine-tuning and RAG. Compare their effectiveness in improving accuracy, knowledge retention, and task performance.
