milvus-logo
LFAI
Home
  • Guía del usuario

Búsqueda híbrida

Desde Milvus 2.4, hemos introducido el soporte multivectorial y un marco de búsqueda híbrida, lo que significa que los usuarios pueden introducir varios campos vectoriales (hasta 10) en una única colección. Estos vectores en diferentes columnas representan diversas facetas de los datos, procedentes de diferentes modelos de incrustación o sometidos a distintos métodos de procesamiento. Los resultados de las búsquedas híbridas se integran mediante estrategias de reordenación, como la fusión recíproca de rangos (RRF) y la puntuación ponderada. Para obtener más información sobre las estrategias de reordenación, consulte Reordenación.

Esta función es especialmente útil en escenarios de búsqueda exhaustiva, como la identificación de la persona más similar en una biblioteca de vectores basada en varios atributos como imágenes, voz, huellas dactilares, etc.

En este tutorial, aprenderá a:

  • Crear múltiples instancias de AnnSearchRequest para búsquedas de similitud en diferentes campos vectoriales;

  • Configurar una estrategia de renumeración para combinar y renumerar los resultados de búsqueda de múltiples instancias de AnnSearchRequest;

  • Utilizar el método hybrid_search() para realizar una búsqueda híbrida.

Los fragmentos de código de esta página utilizan el módulo PyMilvus ORM para interactuar con Milvus. Pronto estarán disponibles fragmentos de código con el nuevo SDK MilvusClient.

Preparativos

Antes de iniciar una búsqueda híbrida, asegúrese de que tiene una colección con múltiples campos vectoriales. Actualmente, Milvus introduce por defecto cuatro campos vectoriales por colección, que pueden ampliarse hasta un máximo de diez modificando la configuración proxy.maxVectorFieldNum.

A continuación se muestra un ejemplo de creación de una colección llamada test_collection con dos campos vectoriales, filmVector y posterVector, e inserción de entidades aleatorias en ella.

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import random

# Connect to Milvus
connections.connect(
    host="127.0.0.1", # Replace with your Milvus server IP
    port="19530"
)

# Create schema
fields = [
    FieldSchema(name="film_id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="filmVector", dtype=DataType.FLOAT_VECTOR, dim=5), # Vector field for film vectors
    FieldSchema(name="posterVector", dtype=DataType.FLOAT_VECTOR, dim=5)] # Vector field for poster vectors

schema = CollectionSchema(fields=fields,enable_dynamic_field=False)

# Create collection
collection = Collection(name="test_collection", schema=schema)

# Create index for each vector field
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {"nlist": 128},
}

collection.create_index("filmVector", index_params)
collection.create_index("posterVector", index_params)

# Generate random entities to insert
entities = []

for _ in range(1000):
    # generate random values for each field in the schema
    film_id = random.randint(1, 1000)
    film_vector = [ random.random() for _ in range(5) ]
    poster_vector = [ random.random() for _ in range(5) ]

    # create a dictionary for each entity
    entity = {
        "film_id": film_id,
        "filmVector": film_vector,
        "posterVector": poster_vector
    }

    # add the entity to the list
    entities.append(entity)
    
collection.insert(entities)

Paso 1: Crear varias instancias de AnnSearchRequest

Una búsqueda híbrida utiliza la API hybrid_search() para realizar múltiples peticiones de búsqueda RNA en una sola llamada. Cada AnnSearchRequest representa una única petición de búsqueda en un campo vectorial específico.

El siguiente ejemplo crea dos instancias AnnSearchRequest para realizar búsquedas de similitud individuales en dos campos vectoriales.

from pymilvus import AnnSearchRequest

# Create ANN search request 1 for filmVector
query_filmVector = [[0.8896863042430693, 0.370613100114602, 0.23779315077113428, 0.38227915951132996, 0.5997064603128835]]

search_param_1 = {
    "data": query_filmVector, # Query vector
    "anns_field": "filmVector", # Vector field name
    "param": {
        "metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
        "params": {"nprobe": 10}
    },
    "limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_1 = AnnSearchRequest(**search_param_1)

# Create ANN search request 2 for posterVector
query_posterVector = [[0.02550758562349764, 0.006085637357292062, 0.5325251250159071, 0.7676432650114147, 0.5521074424751443]]
search_param_2 = {
    "data": query_posterVector, # Query vector
    "anns_field": "posterVector", # Vector field name
    "param": {
        "metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
        "params": {"nprobe": 10}
    },
    "limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_2 = AnnSearchRequest(**search_param_2)

# Store these two requests as a list in `reqs`
reqs = [request_1, request_2]

Parámetros:

  • AnnSearchRequest (objeto)

    Una clase que representa una petición de búsqueda RNA. Cada búsqueda híbrida puede contener de 1 a 1.024 objetos ANNSearchRequest a la vez.

  • data (lista)

    El vector de consulta a buscar en un único AnnSearchRequest. Actualmente, este parámetro acepta una lista que contiene un único vector de consulta, por ejemplo, [[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]. En el futuro, este parámetro se ampliará para aceptar múltiples vectores de consulta.

  • anns_field (cadena)

    El nombre del campo vectorial que se utilizará en un único AnnSearchRequest.

  • param (dict)

    Un diccionario de parámetros de búsqueda para un único AnnSearchRequest. Estos parámetros de búsqueda son idénticos a los de una búsqueda de un solo vector. Para más información, consulte Parámetros de búsqueda.

  • limit (int)

    Número máximo de resultados de búsqueda que se incluirán en un único ANNSearchRequest.

    Este parámetro sólo afecta al número de resultados de búsqueda a devolver dentro de un ANNSearchRequest individual, y no decide los resultados finales a devolver para una llamada a hybrid_search. En una búsqueda híbrida, los resultados finales se determinan combinando y reordenando los resultados de múltiples instancias de ANNSearchRequest.

Paso 2: Configurar una estrategia de reordenación

Una vez creadas las instancias AnnSearchRequest, configure una estrategia de reordenación para combinar y reordenar los resultados. Actualmente, existen dos opciones: WeightedRanker y RRFRanker. Para obtener más información sobre las estrategias de reordenación, consulte Reordenación.

  • Utilizar puntuación ponderada

    WeightedRanker se utiliza para asignar importancia a los resultados de cada búsqueda de campo vectorial con pesos especificados. Si da prioridad a unos campos vectoriales sobre otros, WeightedRanker(value1, value2, ..., valueN) puede reflejarlo en los resultados combinados de la búsqueda.

    from pymilvus import WeightedRanker
    # Use WeightedRanker to combine results with specified weights
    # Assign weights of 0.8 to text search and 0.2 to image search
    rerank = WeightedRanker(0.8, 0.2)  
    

    Al utilizar WeightedRanker, tenga en cuenta que

    • Cada valor de peso oscila entre 0 (menos importante) y 1 (más importante), lo que influye en la puntuación agregada final.
    • El número total de valores de ponderación proporcionados en WeightedRanker debe ser igual al número de instancias de AnnSearchRequest que haya creado.
  • Utilizar la fusión recíproca de rangos (RFF)

    # Alternatively, use RRFRanker for reciprocal rank fusion reranking
    from pymilvus import RRFRanker
    
    rerank = RRFRanker()
    

Una vez definidas las instancias de AnnSearchRequest y la estrategia de reordenación, utilice el método hybrid_search() para realizar la búsqueda híbrida.

# Before conducting hybrid search, load the collection into memory.
collection.load()

res = collection.hybrid_search(
    reqs, # List of AnnSearchRequests created in step 1
    rerank, # Reranking strategy specified in step 2
    limit=2 # Number of final search results to return
)

print(res)

Parámetros:

  • reqs (lista)

    Una lista de peticiones de búsqueda, donde cada petición es un objeto ANNSearchRequest. Cada petición puede corresponder a un campo vectorial diferente y a un conjunto diferente de parámetros de búsqueda.

  • rerank (objeto)

    La estrategia de reordenación que se utilizará para la búsqueda híbrida. Valores posibles: WeightedRanker(value1, value2, ..., valueN) y RRFRanker().

    Para más información sobre las estrategias de reordenación, consulte Reordenación.

  • limit (int)

    El número máximo de resultados finales a devolver en la búsqueda híbrida.

La salida es similar a la siguiente:

["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]

Límites

  • Normalmente, cada colección tiene un límite por defecto de hasta 4 campos vectoriales. Sin embargo, tiene la opción de ajustar la configuración de proxy.maxVectorFieldNum para ampliar el número máximo de campos vectoriales de una colección, con un límite máximo de 10 campos vectoriales por colección. Consulte Configuraciones relacionadas con proxy para obtener más información.

  • Los campos vectoriales parcialmente indexados o cargados en una colección provocarán un error.

  • Actualmente, cada AnnSearchRequest en una búsqueda híbrida sólo puede llevar un vector de consulta.

PREGUNTAS FRECUENTES

  • ¿En qué situaciones se recomienda la búsqueda híbrida?

    La búsqueda híbrida es ideal para situaciones complejas que exigen una gran precisión, especialmente cuando una entidad puede estar representada por vectores múltiples y diversos. Esto se aplica a los casos en que los mismos datos, como una frase, se procesan a través de diferentes modelos de incrustación o cuando la información multimodal (como imágenes, huellas dactilares y huellas de voz de un individuo) se convierte en varios formatos vectoriales. Al asignar pesos a estos vectores, su influencia combinada puede enriquecer significativamente la recuperación y mejorar la eficacia de los resultados de búsqueda.

  • ¿Cómo normaliza un clasificador ponderado las distancias entre distintos campos vectoriales?

    Un clasificador ponderado normaliza las distancias entre campos vectoriales utilizando pesos asignados a cada campo. Calcula la importancia de cada campo vectorial en función de su peso, dando prioridad a los que tienen pesos más altos. Se recomienda utilizar el mismo tipo de métrica en todas las solicitudes de búsqueda de RNA para garantizar la coherencia. Este método garantiza que los vectores considerados más significativos tengan una mayor influencia en la clasificación general.

  • ¿Es posible utilizar clasificadores alternativos como Cohere Ranker o BGE Ranker?

    Actualmente, sólo se admiten los clasificadores proporcionados. Se está planeando incluir otros clasificadores en futuras actualizaciones.

  • ¿Es posible realizar varias operaciones de búsqueda híbrida al mismo tiempo?

    Sí, se admite la ejecución simultánea de múltiples operaciones de búsqueda híbrida.

  • ¿Puedo utilizar el mismo campo vectorial en varios objetos AnnSearchRequest para realizar búsquedas híbridas?

    Técnicamente, es posible utilizar el mismo campo vectorial en múltiples objetos AnnSearchRequest para realizar búsquedas híbridas. No es necesario tener varios campos vectoriales para realizar una búsqueda híbrida.

Traducido porDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

¿Fue útil esta página?