• Informazioni su Milvus
  • Iniziare
  • Concetti
  • Guida per l'utente
  • Importazione dei dati
  • Strumenti AI
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

SCANN

Alimentato dalla libreria ScaNN di Google, l'indice SCANN di Milvus è stato progettato per affrontare le sfide della ricerca di similarità vettoriale in scala, trovando un equilibrio tra velocità e precisione, anche su grandi insiemi di dati che tradizionalmente porrebbero problemi alla maggior parte degli algoritmi di ricerca.

Panoramica

ScaNN è stato costruito per risolvere una delle maggiori sfide della ricerca vettoriale: trovare in modo efficiente i vettori più rilevanti in spazi ad alta dimensionalità, anche quando i set di dati diventano più grandi e complessi. La sua architettura suddivide il processo di ricerca vettoriale in fasi distinte:

Scann Scannerizzazione

  1. Partizione: Suddivide il set di dati in cluster. Questo metodo restringe lo spazio di ricerca concentrandosi solo su sottoinsiemi di dati rilevanti invece di scansionare l'intero set di dati, risparmiando tempo e risorse di elaborazione. ScaNN utilizza spesso algoritmi di clustering, come k-means, per identificare i cluster, il che consente di eseguire ricerche di similarità in modo più efficiente.

  2. Quantizzazione: ScaNN applica un processo di quantizzazione noto come quantizzazione vettoriale anisotropica dopo il partizionamento. La quantizzazione tradizionale si concentra sulla minimizzazione della distanza complessiva tra i vettori originali e quelli compressi, il che non è ideale per compiti come la ricerca del prodotto interno massimo (MIPS), in cui la somiglianza è determinata dal prodotto interno dei vettori piuttosto che dalla distanza diretta. La quantizzazione anisotropa dà invece priorità alla conservazione delle componenti parallele tra i vettori, ovvero le parti più importanti per il calcolo di prodotti interni accurati. Questo approccio consente a ScaNN di mantenere un'elevata precisione MIPS allineando accuratamente i vettori compressi con la query, consentendo ricerche di similarità più rapide e precise.

  3. Ri-classificazione: La fase di re-ranking è la fase finale, in cui ScaNN mette a punto i risultati della ricerca ottenuti dalle fasi di partizione e quantizzazione. Il re-ranking applica precisi calcoli del prodotto interno ai vettori candidati migliori, assicurando che i risultati finali siano altamente accurati. Il re-ranking è fondamentale nei motori di raccomandazione ad alta velocità o nelle applicazioni di ricerca di immagini, dove il filtraggio e il raggruppamento iniziali servono come strato grossolano e la fase finale assicura che all'utente vengano restituiti solo i risultati più rilevanti.

Le prestazioni di SCANN sono controllate da due parametri chiave che consentono di regolare con precisione l'equilibrio tra velocità e accuratezza:

  • with_raw_data: Controlla se i dati vettoriali originali vengono memorizzati insieme alle rappresentazioni quantizzate. L'attivazione di questo parametro migliora l'accuratezza durante la ri-classificazione, ma aumenta i requisiti di memorizzazione.

  • reorder_k: Determina il numero di candidati che vengono raffinati durante la fase finale di ri-classificazione. Valori più alti migliorano l'accuratezza ma aumentano la latenza di ricerca.

Per una guida dettagliata sull'ottimizzazione di questi parametri per il vostro caso d'uso specifico, fate riferimento a Parametri dell'indice.

Creare l'indice

Per costruire un indice SCANN su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type e altri parametri aggiuntivi per l'indice.

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="SCANN", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "with_raw_data": True, # Whether to hold raw data
    } # Index building params
)

In questa configurazione:

  • index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore su SCANN.

  • metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sono COSINE, L2 e IP. Per maggiori dettagli, consultare Tipi di metriche.

  • params: Opzioni di configurazione aggiuntive per la creazione dell'indice.

    • with_raw_data: Se memorizzare i dati vettoriali originali insieme alla rappresentazione quantizzata.

    Per conoscere gli altri parametri di costruzione disponibili per l'indice SCANN, fare riferimento a Parametri di costruzione dell'indice.

Una volta configurati i parametri dell'indice, è possibile creare l'indice utilizzando direttamente il metodo create_index() o passando i parametri dell'indice nel metodo create_collection. Per i dettagli, fare riferimento a Creare una raccolta.

Ricerca nell'indice

Una volta costruito l'indice e inserite le entità, è possibile eseguire ricerche di similarità sull'indice.

search_params = {
    "params": {
        "reorder_k": 10, # Number of candidates to refine
        "nprobe": 8 # Number of clusters to search
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=10,  # TopK results to return
    search_params=search_params
)

In questa configurazione:

  • params: Opzioni di configurazione aggiuntive per la ricerca sull'indice.

    • reorder_k: Numero di candidati da affinare durante la fase di ri-classificazione.
    • nprobe: Numero di cluster da ricercare.

    Per conoscere altri parametri di ricerca disponibili per l'indice SCANN, fare riferimento a Parametri di ricerca specifici per l'indice.

Parametri dell'indice

Questa sezione fornisce una panoramica dei parametri utilizzati per la costruzione di un indice e per l'esecuzione di ricerche sull'indice.

Parametri di costruzione dell'indice

La tabella seguente elenca i parametri che possono essere configurati in params quando si costruisce un indice.

Parametro

Descrizione

Valore Intervallo

Suggerimento per la messa a punto

nlist

Numero di unità di cluster

[1, 65536]

Un nlist più alto aumenta l'efficienza della potatura e di solito accelera la ricerca grossolana, ma le partizioni possono diventare troppo piccole, riducendo il richiamo; un nlist più basso scansiona cluster più grandi, migliorando il richiamo ma rallentando la ricerca.

with_raw_data

Se memorizzare i dati vettoriali originali insieme alla rappresentazione quantizzata. Se abilitata, questa opzione consente di calcolare la somiglianza in modo più accurato durante la fase di ri-classificazione, utilizzando i vettori originali invece delle approssimazioni quantizzate.

Tipo: Booleano

Intervallo: true, false

Valore predefinito: true

Impostare su true per una maggiore accuratezza della ricerca e quando lo spazio di archiviazione non è una preoccupazione primaria. I dati vettoriali originali consentono di calcolare con maggiore precisione la somiglianza durante la ri-classificazione.

Impostare su false per ridurre l'overhead di archiviazione e l'uso della memoria, soprattutto per i grandi insiemi di dati. Tuttavia, ciò può comportare una precisione di ricerca leggermente inferiore, poiché la fase di ri-classificazione utilizzerà vettori quantizzati.

Consigliato: Utilizzare true per le applicazioni di produzione in cui la precisione è fondamentale.

Parametri di ricerca specifici per l'indice

La tabella seguente elenca i parametri che possono essere configurati in search_params.params per la ricerca sull'indice.

Parametro

Descrizione

Intervallo di valori

Suggerimento di ottimizzazione

reorder_k

Controlla il numero di vettori candidati che vengono raffinati durante la fase di ri-classificazione. Questo parametro determina il numero di candidati migliori delle fasi iniziali di partizione e quantizzazione che vengono rivalutati utilizzando calcoli di somiglianza più precisi.

Tipo: Intero

Intervallo: [1, int_max]

Valore predefinito: Nessuno

Un valore maggiore di reorder_k porta in genere a una maggiore accuratezza della ricerca, poiché vengono considerati più candidati durante la fase di affinamento finale. Tuttavia, questo aumenta anche il tempo di ricerca a causa dei calcoli aggiuntivi.

Si consiglia di aumentare reorder_k quando è fondamentale ottenere un richiamo elevato e la velocità di ricerca è meno importante. Un buon punto di partenza è 2-5 volte il valore desiderato di limit (TopK risultati da restituire).

Considerare di diminuire reorder_k per dare priorità a ricerche più veloci, soprattutto in scenari in cui una leggera riduzione dell'accuratezza è accettabile.

Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo:[limite, limite * 5].

nprobe

Numero di cluster in cui cercare i candidati.

Tipo: Intero

Intervallo: [1, nlist]

Valore predefinito: 8

Valori più alti consentono di cercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query.

Impostare nprobe in modo proporzionale a nlist per bilanciare velocità e precisione.

Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, nlist].

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?