milvus-logo
LFAI
Casa
  • Guida per l'utente

Ricerca ibrida

A partire da Milvus 2.4, abbiamo introdotto il supporto per i vettori multipli e un framework di ricerca ibrida, il che significa che gli utenti possono inserire diversi campi vettoriali (fino a 10) in un'unica raccolta. Questi vettori in diverse colonne rappresentano diverse sfaccettature dei dati, provenienti da diversi modelli di incorporazione o sottoposti a diversi metodi di elaborazione. I risultati delle ricerche ibride vengono integrati utilizzando strategie di reranking, come Reciprocal Rank Fusion (RRF) e Weighted Scoring. Per saperne di più sulle strategie di reranking, consultare Reranking.

Questa funzione è particolarmente utile in scenari di ricerca completi, come l'identificazione della persona più simile in una libreria vettoriale basata su vari attributi come immagini, voce, impronte digitali, ecc.

In questa esercitazione si apprenderà come:

  • Creare istanze multiple di AnnSearchRequest per ricerche di somiglianza su campi vettoriali diversi;

  • Configurare una strategia di reranking per combinare e rerankare i risultati di ricerca di più istanze di AnnSearchRequest;

  • Utilizzare il metodo hybrid_search() per eseguire una ricerca ibrida.

I frammenti di codice di questa pagina utilizzano il modulo ORM PyMilvus per interagire con Milvus. I frammenti di codice con il nuovo SDK MilvusClient saranno presto disponibili.

Preparazione

Prima di iniziare una ricerca ibrida, assicurarsi di avere una collezione con più campi vettoriali. Attualmente, Milvus introduce un valore predefinito di quattro campi vettoriali per collezione, che può essere esteso a un massimo di dieci modificando la configurazione proxy.maxVectorFieldNum.

Di seguito è riportato un esempio di creazione di una collezione denominata test_collection con due campi vettoriali, filmVector e posterVector, e di inserimento di entità casuali in essa.

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)

Passo 1: creare più istanze AnnSearchRequest

Una ricerca ibrida utilizza l'API hybrid_search() per eseguire più richieste di ricerca ANN in un'unica chiamata. Ogni AnnSearchRequest rappresenta una singola richiesta di ricerca su uno specifico campo vettoriale.

L'esempio seguente crea due istanze AnnSearchRequest per eseguire ricerche di similarità individuali su due campi vettoriali.

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]

Parametri:

  • AnnSearchRequest (oggetto)

    Una classe che rappresenta una richiesta di ricerca RNA. Ogni ricerca ibrida può contenere da 1 a 1.024 oggetti ANNSearchRequest alla volta.

  • data (elenco)

    Il vettore di query da ricercare in un singolo AnnSearchRequest. Attualmente, questo parametro accetta un elenco contenente un solo vettore di query, ad esempio [[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]. In futuro, questo parametro sarà ampliato per accettare più vettori di query.

  • anns_field (stringa)

    Il nome del campo vettoriale da utilizzare in un singolo AnnSearchRequest.

  • param (dict)

    Un dizionario di parametri di ricerca per un singolo AnnSearchRequest. Questi parametri di ricerca sono identici a quelli di una ricerca a vettore singolo. Per ulteriori informazioni, consultare Parametri di ricerca.

  • limit (int)

    Il numero massimo di risultati della ricerca da includere in un singolo ANNSearchRequest.

    Questo parametro influisce solo sul numero di risultati di ricerca da restituire all'interno di un singolo ANNSearchRequest, e non decide i risultati finali da restituire per una chiamata a hybrid_search. In una ricerca ibrida, i risultati finali sono determinati dalla combinazione e dal reranking dei risultati di più istanze di ANNSearchRequest.

Passo 2: Configurare una strategia di reranking

Dopo aver creato le istanze AnnSearchRequest, configurare una strategia di reranking per combinare e classificare i risultati. Attualmente esistono due opzioni: WeightedRanker e RRFRanker. Per ulteriori informazioni sulle strategie di reranking, consultare Reranking.

  • Usa il punteggio ponderato

    Il sito WeightedRanker viene usato per assegnare l'importanza ai risultati di ogni ricerca di campi vettoriali con pesi specificati. Se si dà priorità ad alcuni campi vettoriali rispetto ad altri, WeightedRanker(value1, value2, ..., valueN) può rifletterlo nei risultati della ricerca combinata.

    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)  
    

    Quando si usa WeightedRanker, tenere presente che:

    • Ogni valore di peso varia da 0 (meno importante) a 1 (più importante), influenzando il punteggio finale aggregato.
    • Il numero totale di valori di peso forniti in WeightedRanker deve essere uguale al numero di istanze di AnnSearchRequest create.
  • Usare la Reciprocal Rank Fusion (RFF)

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

Con le istanze AnnSearchRequest e la strategia di reranking impostata, utilizzare il metodo hybrid_search() per eseguire la ricerca ibrida.

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

Parametri:

  • reqs (elenco)

    Un elenco di richieste di ricerca, in cui ogni richiesta è un oggetto ANNSearchRequest. Ogni richiesta può corrispondere a un campo vettoriale diverso e a un diverso insieme di parametri di ricerca.

  • rerank (oggetto)

    La strategia di reranking da utilizzare per la ricerca ibrida. Valori possibili: WeightedRanker(value1, value2, ..., valueN) e RRFRanker().

    Per ulteriori informazioni sulle strategie di reranking, consultare Reranking.

  • limit (int)

    Il numero massimo di risultati finali da restituire nella ricerca ibrida.

L'output è simile al seguente:

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

Limiti

  • In genere, ogni collezione ha un limite predefinito di 4 campi vettoriali. Tuttavia, è possibile regolare la configurazione di proxy.maxVectorFieldNum per espandere il numero massimo di campi vettoriali in una collezione, con un limite massimo di 10 campi vettoriali per collezione. Per ulteriori informazioni, vedere Configurazioni relative al proxy.

  • I campi vettoriali parzialmente indicizzati o caricati in una collezione daranno luogo a un errore.

  • Attualmente, ogni AnnSearchRequest in una ricerca ibrida può contenere un solo vettore di query.

DOMANDE FREQUENTI

  • In quale scenario è consigliata la ricerca ibrida?

    La ricerca ibrida è ideale per situazioni complesse che richiedono un'elevata precisione, soprattutto quando un'entità può essere rappresentata da più vettori diversi. Questo vale per i casi in cui gli stessi dati, come una frase, vengono elaborati attraverso diversi modelli di incorporamento o quando le informazioni multimodali (come le immagini, le impronte digitali e le impronte vocali di un individuo) vengono convertite in diversi formati vettoriali. Assegnando dei pesi a questi vettori, la loro influenza combinata può arricchire significativamente il richiamo e migliorare l'efficacia dei risultati di ricerca.

  • Come fa un ranker ponderato a normalizzare le distanze tra diversi campi vettoriali?

    Un ranker ponderato normalizza le distanze tra i campi vettoriali utilizzando i pesi assegnati a ciascun campo. Calcola l'importanza di ogni campo vettoriale in base al suo peso, dando priorità a quelli con pesi più elevati. Si consiglia di utilizzare lo stesso tipo di metrica per tutte le richieste di ricerca di RNA, per garantire la coerenza. Questo metodo garantisce che i vettori ritenuti più significativi abbiano una maggiore influenza sulla classifica generale.

  • È possibile utilizzare classificatori alternativi come Cohere Ranker o BGE Ranker?

    Attualmente sono supportati solo i classificatori forniti. Per i prossimi aggiornamenti è prevista l'inclusione di altri classificatori.

  • È possibile eseguire più operazioni di ricerca ibrida contemporaneamente?

    Sì, è supportata l'esecuzione simultanea di più operazioni di ricerca ibrida.

  • È possibile utilizzare lo stesso campo vettoriale in più oggetti AnnSearchRequest per eseguire ricerche ibride?

    Tecnicamente, è possibile utilizzare lo stesso campo vettoriale in più oggetti AnnSearchRequest per eseguire ricerche ibride. Non è necessario avere più campi vettoriali per una ricerca ibrida.

Tradotto daDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?