milvus-logo
LFAI
Home
  • Guide de l'utilisateur

Recherche hybride

Depuis Milvus 2.4, nous avons introduit la prise en charge de plusieurs vecteurs et un cadre de recherche hybride, ce qui signifie que les utilisateurs peuvent introduire plusieurs champs de vecteurs (jusqu'à 10) dans une seule collection. Ces vecteurs dans différentes colonnes représentent diverses facettes des données, provenant de différents modèles d'intégration ou subissant des méthodes de traitement distinctes. Les résultats des recherches hybrides sont intégrés à l'aide de stratégies de reclassement, telles que la fusion des rangs réciproques (RRF) et la notation pondérée. Pour en savoir plus sur les stratégies de reclassement, reportez-vous à la section Reclassement.

Cette fonctionnalité est particulièrement utile dans les scénarios de recherche exhaustive, tels que l'identification de la personne la plus similaire dans une bibliothèque de vecteurs sur la base de divers attributs tels que les images, la voix, les empreintes digitales, etc.

Dans ce tutoriel, vous apprendrez à :

  • Créer plusieurs instances AnnSearchRequest pour les recherches de similarité sur différents champs vectoriels ;

  • Configurer une stratégie de reclassement pour combiner et reclasser les résultats de recherche provenant de plusieurs instances AnnSearchRequest;

  • Utiliser la méthode hybrid_search() pour effectuer une recherche hybride.

Les extraits de code de cette page utilisent le module ORM PyMilvus pour interagir avec Milvus. Des extraits de code avec le nouveau SDK MilvusClient seront bientôt disponibles.

Préparations

Avant de lancer une recherche hybride, assurez-vous que vous disposez d'une collection comportant plusieurs champs vectoriels. Actuellement, Milvus introduit une valeur par défaut de quatre champs vectoriels par collection, qui peut être étendue à un maximum de dix en modifiant la configuration proxy.maxVectorFieldNum.

Voici un exemple de création d'une collection nommée test_collection avec deux champs vectoriels, filmVector et posterVector, et d'insertion d'entités aléatoires dans cette collection.

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)

Étape 1 : Créer plusieurs instances AnnSearchRequest

Une recherche hybride utilise l'API hybrid_search() pour effectuer plusieurs requêtes de recherche ANN en un seul appel. Chaque site AnnSearchRequest représente une demande de recherche unique sur un champ vectoriel spécifique.

L'exemple suivant crée deux instances AnnSearchRequest pour effectuer des recherches de similarité individuelles sur deux champs vectoriels.

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]

Paramètres :

  • AnnSearchRequest (objet)

    Une classe représentant une demande de recherche ANN. Chaque recherche hybride peut contenir de 1 à 1 024 objets ANNSearchRequest à la fois.

  • data (liste)

    Le vecteur de requête à rechercher dans une seule AnnSearchRequest. Actuellement, ce paramètre accepte une liste ne contenant qu'un seul vecteur de requête, par exemple [[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]. À l'avenir, ce paramètre sera étendu pour accepter plusieurs vecteurs de requête.

  • anns_field (chaîne)

    Le nom du champ vectoriel à utiliser dans une seule AnnSearchRequest.

  • param (dict)

    Un dictionnaire de paramètres de recherche pour un seul AnnSearchRequest. Ces paramètres de recherche sont identiques à ceux d'une recherche sur un seul vecteur. Pour plus d'informations, voir Paramètres de recherche.

  • limit (int)

    Le nombre maximum de résultats de recherche à inclure dans une seule ANNSearchRequest.

    Ce paramètre n'affecte que le nombre de résultats de recherche à renvoyer dans un appel individuel ANNSearchRequest, et ne détermine pas les résultats finaux à renvoyer pour un appel hybrid_search. Dans une recherche hybride, les résultats finaux sont déterminés en combinant et en reclassant les résultats de plusieurs instances ANNSearchRequest.

Étape 2 : configuration d'une stratégie de reclassement

Après avoir créé les instances AnnSearchRequest, configurez une stratégie de reclassement pour combiner et reclasser les résultats. Actuellement, il existe deux options : WeightedRanker et RRFRanker. Pour plus d'informations sur les stratégies de reranking, reportez-vous à la section Reranking.

  • Utiliser la notation pondérée

    L'adresse WeightedRanker est utilisée pour attribuer une importance aux résultats de chaque recherche de champ vectoriel avec les poids spécifiés. Si vous donnez la priorité à certains champs vectoriels par rapport à d'autres, WeightedRanker(value1, value2, ..., valueN) peut en tenir compte dans les résultats combinés de la recherche.

    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)  
    

    Lors de l'utilisation de WeightedRanker, il convient de noter que

    • Chaque valeur de pondération va de 0 (la moins importante) à 1 (la plus importante), ce qui influence le résultat final agrégé.
    • Le nombre total de valeurs de pondération fournies dans WeightedRanker doit être égal au nombre d'instances AnnSearchRequest que vous avez créées.
  • Utiliser la fusion réciproque des rangs (RFF)

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

Une fois les instances AnnSearchRequest et la stratégie de reclassement définies, utilisez la méthode hybrid_search() pour effectuer la recherche hybride.

# 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)

Paramètres :

  • reqs (liste)

    Une liste de requêtes de recherche, chaque requête étant un objet ANNSearchRequest. Chaque requête peut correspondre à un champ vectoriel différent et à un ensemble différent de paramètres de recherche.

  • rerank (objet)

    La stratégie de reclassement à utiliser pour la recherche hybride. Valeurs possibles : WeightedRanker(value1, value2, ..., valueN) et RRFRanker().

    Pour plus d'informations sur les stratégies de reclassement, voir Reranking.

  • limit (int)

    Le nombre maximum de résultats finaux à renvoyer dans la recherche hybride.

La sortie est similaire à ce qui suit :

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

Limites

  • En règle générale, chaque collection dispose par défaut d'un maximum de 4 champs vectoriels. Cependant, vous avez la possibilité d'ajuster la configuration de proxy.maxVectorFieldNum pour augmenter le nombre maximum de champs vectoriels dans une collection, avec une limite maximale de 10 champs vectoriels par collection. Pour plus d'informations, reportez-vous à la section Configurations liées à l'indexation.

  • Les champs vectoriels partiellement indexés ou chargés dans une collection entraîneront une erreur.

  • Actuellement, chaque site AnnSearchRequest dans une recherche hybride ne peut contenir qu'un seul vecteur de requête.

FAQ

  • Dans quel scénario la recherche hybride est-elle recommandée ?

    La recherche hybride est idéale pour les situations complexes exigeant une grande précision, en particulier lorsqu'une entité peut être représentée par plusieurs vecteurs différents. C'est le cas lorsque les mêmes données, comme une phrase, sont traitées par différents modèles d'intégration ou lorsque des informations multimodales (comme les images, les empreintes digitales et les empreintes vocales d'un individu) sont converties en différents formats vectoriels. En attribuant des poids à ces vecteurs, leur influence combinée peut considérablement enrichir le rappel et améliorer l'efficacité des résultats de recherche.

  • Comment un classificateur pondéré normalise-t-il les distances entre différents champs vectoriels ?

    Un classificateur pondéré normalise les distances entre les champs vectoriels en attribuant des poids à chaque champ. Il calcule l'importance de chaque champ vectoriel en fonction de son poids, en donnant la priorité à ceux qui ont un poids plus élevé. Il est conseillé d'utiliser le même type de métrique pour toutes les requêtes de recherche ANN afin de garantir la cohérence. Cette méthode permet de s'assurer que les vecteurs jugés plus importants ont une plus grande influence sur le classement général.

  • Est-il possible d'utiliser d'autres classeurs comme Cohere Ranker ou BGE Ranker ?

    Actuellement, seuls les classificateurs fournis sont pris en charge. Il est prévu d'inclure d'autres classificateurs dans les prochaines mises à jour.

  • Est-il possible d'effectuer plusieurs opérations de recherche hybride en même temps ?

    Oui, l'exécution simultanée de plusieurs opérations de recherche hybride est possible.

  • Puis-je utiliser le même champ vectoriel dans plusieurs objets AnnSearchRequest pour effectuer des recherches hybrides ?

    Techniquement, il est possible d'utiliser le même champ vectoriel dans plusieurs objets AnnSearchRequest pour effectuer des recherches hybrides. Il n'est pas nécessaire d'avoir plusieurs champs vectoriels pour une recherche hybride.

Traduit parDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?