Scegli una strategia di ricerca EmbeddingList

Le strategie di ricerca EmbeddingList determinano il modo in cui Milvus costruisce un indice approssimativo dei candidati per la ricerca EmbeddingList. La strategia predefinita è " tokenann". È possibile passare a " muvera " o " lemur " quando l'elenco di embedding è di grandi dimensioni, TokenANN è troppo oneroso o una rappresentazione a livello di riga appresa/compressa risulta più adatta. Il risultato finale viene comunque generato dal reranking di MaxSim quando è abilitata l’opzione « emb_list_rerank ».

Perché esistono le strategie di ricerca

EmbeddingList è progettato per righe che contengono più vettori, come gli embedding di token in un documento di testo, gli embedding di patch in un documento visivo o gli embedding di clip in un video. Anziché confrontare un vettore di query con un vettore di riga, MaxSim confronta un elenco di embedding di query con un elenco di embedding di documenti e aggrega le migliori corrispondenze.

Ciò offre una migliore capacità di rappresentazione, ma l’esecuzione esatta di MaxSim su larga scala è onerosa. Una ricerca MaxSim con metodo brute-force richiederebbe il confronto dei vettori di query con ogni vettore in ogni riga candidata. Ciò risulta solitamente troppo lento per la ricerca in produzione.

### Problema - Ogni riga può contenere molti vettori. - L’applicazione esatta di MaxSim su tutte le righe è costosa. - Le dimensioni dell’indice e la latenza di ricerca possono aumentare rapidamente.### Strategia - Utilizzare un metodo di recupero approssimativo nella prima fase. - Recuperare un numero di candidati superiore al topK richiesto. - Riclassificare i candidati con MaxSim esatto.

In questo senso, l’« emb_list_strategy » è principalmente una strategia di creazione dell’indice e di recupero dei candidati. Viene configurata durante la creazione dell’indice e determina come viene generato l’insieme dei candidati ANN di primo stadio. I parametri relativi al tempo di ricerca, quali « retrieval_ann_ratio » e « emb_list_rerank », controllano quindi il numero di candidati recuperati e se viene applicata la riclassificazione tramite MaxSim.


Strategie disponibili

StrategiaUnità di recupero dei candidatiCosa risolveMigliore adattamentoPrincipale compromesso
tokenannVettori individuali all'interno di ogni rigaMantiene i vettori originali ed evita la perdita dovuta alla compressione.Ricerca basata sulla qualità, elenchi di embedding brevi o medi, embedding ad alta discriminazione.Indice più ampio e costo di recupero dei candidati più elevato.
muveraUn vettore codificato per rigaComprime una lista di embedding in una rappresentazione FDE a dimensione fissa senza addestramento.Documenti più lunghi, embedding ad alta discriminazione, casi in cui TokenANN risulta troppo oneroso.La proiezione casuale introduce una perdita di approssimazione; la dimensione FDE influisce sulla latenza.
lemurUn vettore appreso per rigaApprende una compressione specifica per il corpus, trasformando gli elenchi di embedding in vettori di riga a dimensione fissa.Embedding a bassa discriminazione, recupero multimodale o di documenti visivi, elenchi di embedding di grandi dimensioni.Richiede addestramento e può essere sensibile alla distribuzione del corpus e alla distorsione legata alla lunghezza dei documenti.

TokenANN

tokenann indicizza ogni vettore nell’elenco di embedding. Durante la ricerca, ogni vettore di query esegue il recupero ANN, i vettori corrispondenti vengono aggregati nuovamente nelle rispettive righe e le righe candidate risultanti vengono riclassificate con MaxSim.

Utilizzare TokenANN quando la qualità è la priorità assoluta. Si tratta dell’approssimazione più vicina al calcolo MaxSim originale poiché mantiene tutti i vettori disponibili nell’indice di primo livello.

  • Adatto a: frammenti di testo brevi, righe con un numero ridotto o moderato di vettori, forte separazione semantica a livello di token, baseline sensibili alla qualità.

  • Meno adatto: documenti molto lunghi, pagine visive con migliaia di vettori di patch, limiti rigorosi di memoria o latenza.

  • Comportamento a livello di elemento: TokenANN può recuperare candidati da singoli vettori prima di aggregarli nuovamente in righe. Il risultato finale della ricerca nell’EmbeddingList rimane a livello di riga dopo il punteggio MaxSim.

MUVERA

muvera codifica ogni lista di embedding in un vettore a dimensione fissa utilizzando proiezioni casuali. Ciò trasforma il recupero di primo stadio in una ricerca vettoriale standard a livello di riga. I candidati vengono quindi riclassificati con MaxSim.

Utilizzate MUVERA quando TokenANN risulta troppo oneroso ma non volete una fase di addestramento. Rappresenta un pratico compromesso tra qualità e costo.

  • Ideale per: documenti di testo lunghi, spazi di embedding ad alta discriminazione, carichi di lavoro che richiedono una dimensione dell’indice inferiore rispetto a TokenANN.

  • Meno adatto: spazi di embedding a bassa discriminazione o casi in cui la rappresentazione FDE diventa troppo ad alta dimensione per il budget di latenza.

  • Parametri importanti:muvera_num_projections, muvera_num_repeats e muvera_seed.

LEMUR

lemur addestra un modello per comprimere ogni lista di embedding in una rappresentazione a dimensionalità fissa. La ricerca ANN di primo stadio viene eseguita sui vettori appresi a livello di riga e i candidati vengono riclassificati con MaxSim.

Utilizzare LEMUR quando la compressione appresa giustifica il costo di addestramento. Può funzionare bene per spazi di embedding a bassa discriminazione e per il recupero multimodale, ma dovrebbe essere convalidato rispetto al corpus di destinazione poiché può essere sensibile alla distribuzione della lunghezza dei documenti.

  • Adatto a: ricerca di documenti visivi, embedding di patch multimodali, spazi di embedding a bassa discriminazione, elenchi di embedding di grandi dimensioni in cui TokenANN non è pratico.

  • Meno adatto: corpora soggetti a frequenti cambiamenti, embedding ad alta discriminazione con lunghezze dei documenti fortemente asimmetriche, carichi di lavoro in cui il costo di addestramento è inaccettabile.

  • Parametri importanti:lemur_hidden_dim, lemur_num_train_samples, lemur_num_epochs, lemur_batch_size, lemur_learning_rate, lemur_seed e lemur_num_layers.


Comportamento e configurazione predefiniti

La strategia predefinita per EmbeddingList in Knowhere è tokenann. Se non si specifica emb_list_strategy, Knowhere utilizza TokenANN. Le impostazioni predefinite in fase di ricerca includono retrieval_ann_ratio=3.0 e emb_list_rerank=true.

Elementi di configurazione per strategia

La tabella seguente elenca le voci di configurazione specifiche per ciascuna strategia. In Milvus, le voci relative alla fase di compilazione vengono solitamente passate nella mappa params durante la creazione di un indice. Se sono necessari valori predefiniti lato server, questi devono essere definiti nel file di configurazione di Milvus nella sezione knowhere.

StrategiaElemento di configurazioneFaseImpostazione predefinitaQuando modificarla
tokenannemb_list_strategy="tokenann"Creazione dell'indicetokenannDa utilizzare esplicitamente quando si desidera il comportamento predefinito di indicizzazione vettore-elemento o quando si utilizza DiskANN.
muveraemb_list_strategy="muvera"Creazione dell'indicetokenannDa utilizzare quando si desidera un recupero codificato a livello di riga senza addestramento.
muveramuvera_num_projectionsCreazione dell'indice4Controlla il numero di proiezioni SimHash. Valori più elevati creano un numero maggiore di bucket e possono migliorare la qualità della codifica, ma aumentano la dimensionalità codificata.
muveramuvera_num_repeatsCreazione dell'indice7Controlla il numero di codifiche FDE indipendenti da concatenare. Valori più alti possono migliorare la robustezza, ma aumentano il costo dell’indice e della ricerca.
muveramuvera_seedCreazione dell'indice42Da impostare per proiezioni casuali riproducibili, specialmente nei test e nei confronti di benchmark.
lemuremb_list_strategy="lemur"Creazione dell'indicetokenannDa utilizzare quando si prevede che la compressione a livello di riga appresa funzioni meglio della proiezione casuale fissa.
lemurlemur_hidden_dimCreazione dell'indice256Controlla la dimensione della rappresentazione compressa. Aumentare per una maggiore capacità; diminuire per un minor consumo di memoria e un recupero più veloce.
lemurlemur_num_train_samplesCreazione dell'indice20000Aumentare quando il corpus è eterogeneo e la compressione appresa è sottodimensionata; ridurre solo per test di piccole dimensioni o per creazioni più veloci.
lemurlemur_num_epochsCreazione dell'indice50Aumentare se l'addestramento non ha raggiunto la convergenza; ridurre quando il tempo di creazione è il vincolo principale.
lemurlemur_batch_sizeCreazione dell'indice512Regolare in base alla velocità di addestramento e all'utilizzo della memoria.
lemurlemur_learning_rateCreazione dell'indice0.001Regolare quando l'addestramento è instabile o converge troppo lentamente.
lemurlemur_seedCreazione dell'indice42Impostare per eseguire sessioni di addestramento riproducibili.
lemurlemur_num_layersCreazione dell'indice2Aumentare solo quando il corpus richiede un estrattore di caratteristiche più espressivo e si è in grado di sostenere i costi aggiuntivi di addestramento.
Tutte le strategieretrieval_ann_ratioRicerca3.0Aumentare per recuperare più candidati di primo livello e migliorare il recall; diminuire per ridurre la latenza.
Tutte le strategieemb_list_rerankRicercatrueLasciare abilitata per il riordino con MaxSim. Disabilitare solo per esperimenti controllati in cui la qualità della rete neurale artificiale (ANN) di primo stadio viene misurata direttamente.

Configurare la strategia in Milvus

In Milvus, la strategia viene passata come parametro dell’indice durante la creazione di un indice su un campo EmbeddingList, come un sottocampo vettoriale StructArray.

index_params = client.prepare_index_params()
index_params.add_index(
    field_name="clips[clip_embedding]",
    index_type="HNSW",
    metric_type="MAX_SIM_COSINE",
    params={
        "M": 16,
        "efConstruction": 96,
        "emb_list_strategy": "muvera",
        "muvera_num_projections": 4,
        "muvera_num_repeats": 7,
        "muvera_seed": 42,
    },
)

Per LEMUR, specificare i parametri di addestramento di LEMUR nella stessa mappa « params ».

params={
    "M": 16,
    "efConstruction": 96,
    "emb_list_strategy": "lemur",
    "lemur_hidden_dim": 256,
    "lemur_num_train_samples": 20000,
    "lemur_num_epochs": 50,
    "lemur_batch_size": 512,
    "lemur_learning_rate": 0.001,
    "lemur_seed": 42,
    "lemur_num_layers": 2,
}

Configurazione delle impostazioni predefinite lato server in Milvus

Milvus può anche precompilare i parametri dell’indice da ` milvus.yaml`. La sezione pertinente è knowhere. I parametri sono organizzati per tipo di indice e fase, utilizzando lo schema knowhere.<INDEX_TYPE>.<stage>.<parameter>. I parametri dell’indice forniti dall’utente hanno la precedenza su questi valori predefiniti.

knowhere:
  enable: true
  HNSW:
    build:
      emb_list_strategy: muvera
      muvera_num_projections: 4
      muvera_num_repeats: 7
      muvera_seed: 42
    search:
      retrieval_ann_ratio: 3.0
      emb_list_rerank: true

È preferibile utilizzare i parametri specifici per indice per la selezione della strategia. Un valore predefinito nel file di configurazione di Milvus si applica in generale agli indici di quel tipo e di quella fase. Utilizzare i parametri di create_index quando collezioni o campi diversi richiedono strategie EmbeddingList diverse.

Configurare il recupero dei candidati in fase di ricerca

La strategia determina come viene costruito l’indice. Al momento della ricerca, utilizzare retrieval_ann_ratio per controllare il numero di candidati della prima fase recuperati prima del riordino con MaxSim. Valori più elevati di solito migliorano il recall ma aumentano la latenza.

results = client.search(
    collection_name=collection_name,
    data=[query_embedding_list],
    anns_field="clips[clip_embedding]",
    search_params={
        "metric_type": "MAX_SIM_COSINE",
        "params": {
            "ef": 64,
            "retrieval_ann_ratio": 3.0,
            "emb_list_rerank": True,
        },
    },
    limit=10,
)
ParametroFasePredefinitoSignificato
emb_list_strategyCreazione dell'indicetokenannDetermina le modalità di indicizzazione e recupero dei candidati di EmbeddingList.
retrieval_ann_ratioRicerca3.0Fattore di espansione dei candidati per il primo round ANN.
emb_list_rerankRicercatrueSe riclassificare i candidati recuperati con MaxSim.

Note sulla compatibilità: MUVERA e LEMUR attualmente supportano i dati fp32 in Knowhere. DiskANN supporta EmbeddingList solo con la strategia TokenANN. Se si utilizzano tipi di vettori non fp32 o DiskANN, verificare il supporto della strategia prima di modificare l’impostazione predefinita.


Come scegliere una strategia

Non esiste una strategia universalmente migliore. Scegli in base alla lunghezza dell’embedding list, alla discriminazione dello spazio di embedding, al budget di latenza, alle dimensioni dell’indice e alla disponibilità di una fase di addestramento.

DomandaSegnalePunto di partenza consigliato
Hai bisogno di una linea di base di alta qualità?Si desidera misurare la migliore approssimazione pratica prima di ottimizzare il costo.tokenann
Le righe contengono un numero ridotto o moderato di vettori?Ogni riga contiene un numero ridotto di vettori di token, patch o clip.tokenann
TokenANN è troppo grande o troppo lento?La dimensione dell'indice o la latenza di recupero nella prima fase rappresentano il collo di bottiglia.muvera
Vuoi la compressione senza addestramento?È necessario un modello operativo più semplice e una codifica riproducibile.muvera
Lo spazio di embedding presenta una bassa discriminabilità?I candidati ANN a livello di token sono rumorosi e la proiezione casuale non preserva un segnale sufficiente.lemur
Il carico di lavoro è visivo o multimodale?Le righe contengono molti vettori di patch e TokenANN è troppo onerosa.lemur oppure muvera
La lunghezza dei documenti è fortemente asimmetrica?Alcune righe contengono molti più vettori rispetto ad altre.Inizia con muvera; verifica attentamente lemur.

Flusso di lavoro di valutazione suggerito

  1. Inizia con tokenann come riferimento di qualità quando le dimensioni del set di dati lo consentono.

  2. Esegui le stesse query con muvera e confronta recall, nDCG, latenza e dimensione dell’indice.

  3. Provare lemur quando l'elenco degli embedding è ampio, lo spazio degli embedding è rumoroso o il carico di lavoro è visivo o multimodale.

  4. Ottimizzare l'retrieval_ann_ratio prima di modificare troppi parametri di compilazione. Aumentarlo se il recall è basso; ridurlo se la latenza è troppo elevata.

  5. Effettuare sempre la validazione su query rappresentative e distribuzioni della lunghezza dei documenti. Una strategia che funziona su testi brevi potrebbe non funzionare su documenti visivi o corpora long-tail.

### Qualità prima di tutto: iniziare con ` tokenann`. Utilizzarlo come riferimento per la qualità dell’approssimazione di MaxSim.### Equilibrato Prova muvera quando hai bisogno di costi inferiori senza aggiungere una pipeline di addestramento.### Compressa: provate lemur quando la compressione appresa a livello di riga è suscettibile di superare le prestazioni della proiezione casuale fissa.

Riferimenti utilizzati per questa bozza

  • Test di Milvus per emb_list_strategy, retrieval_ann_ratio e emb_list_rerank.

  • Gestione dei file di configurazione di Milvus per le impostazioni predefinite dell’indice lato server nella sezione knowhere.

  • Definizioni dei parametri di Knowhere per i valori predefiniti e i nomi delle strategie supportate.

  • Verifiche di compatibilità Knowhere per il supporto esclusivo di MUVERA/LEMUR in fp32 e di DiskANN esclusivamente con TokenANN.

  • Note di valutazione interne che mettono a confronto TokenANN, MUVERA e LEMUR per il recupero dei candidati MaxSim.

Nota sulla pubblicazione: prima di pubblicare esternamente, verificare quali parametri siano ufficialmente supportati nella versione di Milvus di destinazione e se il prodotto intenda esporre tutti i parametri Knowhere di basso livello o solo un sottoinsieme più ristretto e documentato.