Collezioni

Il concetto di collezioni nel database vettoriale Qdrant può essere analogo alla struttura delle tabelle in MYSQL, utilizzate per memorizzare in modo uniforme lo stesso tipo di dati vettoriali. Ogni dato memorizzato in una collezione è definito come un punto in Qdrant. Qui, un punto è simile al concetto matematico dello spazio geometrico, rappresentando la rappresentazione di un vettore nello spazio geometrico (consideralo semplicemente come un dato).

Nella stessa collezione, il vettore di ogni punto deve avere le stesse dimensioni e deve essere confrontato utilizzando una singola metrica. I vettori nominati possono essere utilizzati per includere più vettori in un singolo punto, con ciascun vettore che ha le proprie dimensioni e requisiti metrici.

Le metriche di distanza sono utilizzate per misurare la similarità tra i vettori. La scelta della metrica dipende dal modo in cui i vettori sono ottenuti, in particolare dal metodo utilizzato per l'addestramento degli encoder della rete neurale.

Qdrant supporta i seguenti tipi popolari di metriche:

  • Prodotto scalare: Dot
  • Similarità del coseno: Cosine
  • Distanza euclidea: Euclid

Per migliorare l'efficienza della ricerca, la similarità del coseno è ottenuta prendendo il prodotto scalare dei vettori normalizzati. Al momento del caricamento, i vettori vengono automaticamente normalizzati. Oltre alle metriche e alle dimensioni dei vettori, ogni collezione utilizza anche il proprio set di parametri per controllare l'ottimizzazione della collezione, la costruzione dell'indice e la pulizia. Queste impostazioni possono essere modificate in qualsiasi momento attraverso le richieste corrispondenti.

Configurazione della multi-tenant

Quante collezioni dovrebbero essere create? Nella maggior parte dei casi, è sufficiente utilizzare una singola collezione con partizionamento basato sul payload. Questo approccio è noto come multi-tenant. Per la maggior parte degli utenti, questo è efficiente ma richiede una configurazione aggiuntiva. Scopri come configurare il multi-tenant.

Quando dovrebbero essere create più collezioni? Quando si ha un numero limitato di utenti e si richiede un'isolamento. Questo approccio è più flessibile ma potrebbe essere più costoso, in quanto la creazione di un gran numero di collezioni potrebbe comportare un sovraccarico delle risorse. Inoltre, è necessario garantire che non interferiscano in alcun modo tra loro, anche in termini di prestazioni.

Creazione di una collezione

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

Oltre alle opzioni obbligatorie, è possibile specificare anche valori personalizzati per le seguenti opzioni della collezione:

  • hnsw_config - Per i dettagli dell'indice, fare riferimento alla sezione dell'indice.
  • wal_config - Configurazione relativa al write-ahead logging. Per informazioni più dettagliate su WAL, fare riferimento ad esso.
  • optimizers_config - Per i dettagli dell'ottimizzatore, fare riferimento alla sezione dell'ottimizzatore.
  • shard_number - Definisce quante shard dovrebbe avere la collezione. Per ulteriori informazioni, fare riferimento alla sezione di distribuzione distribuita.
  • on_disk_payload - Definisce la posizione per memorizzare i dati del payload. Se impostato su true, memorizzerà solo il payload su disco. Questo può essere molto utile per limitare l'uso della RAM quando si gestiscono payload di grandi dimensioni.
  • quantization_config - Per informazioni dettagliate sulla quantizzazione, fare riferimento alla quantizzazione.

I parametri predefiniti per i parametri opzionali della collezione sono definiti nel file di configurazione.

Per ulteriori informazioni sui parametri della collezione e dei vettori, si prega di consultare la definizione dello schema e il file di configurazione.

Disponibile dalla v1.2.0

I vettori sono memorizzati in RAM per un accesso molto veloce. Il parametro on_disk può essere impostato nella configurazione dei vettori. Se impostato su true, tutti i vettori verranno memorizzati su disco. Questo abiliterà l'uso della mappatura della memoria, adatto per l'importazione di grandi quantità di dati.

Creazione di una collezione da un'altra collezione

Disponibile dalla v1.0.0

Una collezione può essere inizializzata da un'altra collezione esistente.

Questo può essere utile per provare rapidamente diverse configurazioni dello stesso dataset.

Quando si imposta la configurazione dei vettori nella nuova collezione, assicurati che i vettori abbiano le stesse dimensioni e la stessa funzione di distanza della collezione originale.

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

Raccolta multi-vettoriale

Disponibile dalla versione 0.10.0

Ogni record può avere più vettori. Questa funzionalità consente di memorizzare più vettori in una raccolta. Per distinguere i vettori all'interno di un record, definire i loro nomi univoci durante la creazione della raccolta. Ogni vettore nominato in questo schema ha la propria distanza e dimensione:

PUT /collections/{nome_raccolta}

{
    "vectors": {
        "immagine": {
            "size": 4,
            "distance": "Dot"
        },
        "testo": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

Per alcuni casi speciali, è anche possibile creare una raccolta senza alcuno storage di vettori.

Disponibile dalla versione 1.1.1

Per ciascun vettore nominato, è possibile specificare facoltativamente hnsw_config o quantization_config per discostarsi dalla configurazione della raccolta. Ciò può essere utilizzato per ottimizzare le prestazioni di ricerca a livello di vettore.

Disponibile dalla versione 1.2.0

I vettori sono memorizzati in memoria per un accesso rapido. Per ciascun vettore, è possibile impostare on_disk su true per memorizzare sempre tutti i vettori su disco. Ciò abiliterà la mappatura della memoria, adatto per l'assunzione di grandi quantità di dati.

Eliminazione di una raccolta

DELETE /collections/{nome_raccolta}

Aggiornamento dei parametri della raccolta

Gli aggiornamenti dinamici dei parametri possono essere utili, ad esempio per un caricamento iniziale più efficiente dei vettori. Ad esempio, è possibile disabilitare l'indicizzazione durante il caricamento e abilitarla immediatamente dopo il completamento del caricamento. In questo modo, non si sprecheranno risorse computazionali aggiuntive per ricostruire l'indice.

Il seguente comando abilita l'indicizzazione per un segmento contenente vettori più grandi di 10000 kB:

PATCH /collections/{nome_raccolta}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

È possibile aggiornare i seguenti parametri:

  • optimizers_config - Vedere le descrizioni dettagliate degli ottimizzatori.
  • hnsw_config - Vedere le descrizioni dettagliate dell'indice.
  • quantization_config - Vedere le descrizioni dettagliate della quantizzazione.
  • vectors - Configurazione per vettori specifici, inclusi i rispettivi settaggi hnsw_config, quantization_config e on_disk.
  • params - Altri parametri della raccolta, inclusi write_consistency_factor e on_disk_payload.

Le specifiche complete dell'API si trovano nelle definizioni dello schema.

Disponibile dalla versione 1.4.0

Qdrant 1.4 aggiunge il supporto per l'aggiornamento di ulteriori parametri della raccolta durante l'esecuzione. L'indice HNSW, la quantizzazione e la configurazione del disco possono ora essere modificati senza ricreare la raccolta. I segmenti (con dati di indice e quantizzazione) verranno automaticamente ricostruiti in background per corrispondere ai parametri aggiornati.

Nell'esempio seguente, vengono aggiornati l'intera raccolta e i parametri dell'indice HNSW e della quantizzazione per my_vector:

PATCH /collections/{nome_raccolta}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

Nota: Per aggiornare i parametri dei vettori in una raccolta senza vettori nominati, è possibile utilizzare un nome vuoto ("").

Le chiamate a questo endpoint possono bloccarsi in attesa che gli ottimizzatori esistenti completino. Non consigliamo l'utilizzo di questa funzione in un database di produzione in quanto la ricostruzione dell'indice potrebbe introdurre un'enorme sovraccarico.

Informazioni sulla Collezione

Qdrant consente la determinazione dei parametri di configurazione per una collezione esistente al fine di comprendere meglio la distribuzione dei punti e la situazione dell'indicizzazione.

GET /collections/{nome_collezione}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

Se vettori vengono inseriti nella collezione, il campo status potrebbe cambiare in "yellow" durante l'ottimizzazione e diventare "green" una volta che tutti i punti sono stati processati con successo.

I seguenti stati di colore potrebbero essere incontrati:

  • ? green: la collezione è pronta
  • ? yellow: la collezione è in fase di ottimizzazione
  • ? red: il motore ha incontrato un errore irreversibile

Alcune altre proprietà di interesse includono:

  • points_count - Numero totale di oggetti (vettori e i loro payload) memorizzati nella collezione
  • vectors_count - Numero totale di vettori nella collezione. Se ogni oggetto ha più vettori, questo potrebbe non essere uguale a points_count.
  • indexed_vectors_count - Numero totale di vettori memorizzati nell'indice HNSW. Qdrant non memorizza tutti i vettori nell'indice, solo quelli che possono creare segmenti di indice in base alla configurazione fornita.

Indicizzazione Vettori in HNSW

In alcuni casi, potreste trovare che il valore di indexed_vectors_count è inferiore a vectors_count. Si tratta di un comportamento intenzionale a seconda della configurazione dell'ottimizzatore. Un nuovo segmento di indice verrà creato se la dimensione dei vettori non indicizzati supera la indexing_threshold (in KB). Se la vostra collezione è molto piccola o la dimensione del vettore è bassa, potrebbero non essere creati segmenti HNSW e indexed_vectors_count potrebbe essere uguale a 0.

È possibile ridurre il valore di indexing_threshold nei parametri della collezione per creare un nuovo segmento di indice nella collezione esistente.

Alias della Collezione

In un ambiente di produzione, potrebbe essere necessario passare senza soluzione di continuità tra diverse versioni di vettori, come ad esempio l'aggiornamento a una nuova versione di reti neurali.

In questi casi, potrebbe non essere fattibile interrompere il servizio e ricostruire la collezione utilizzando i nuovi vettori. Un alias è un nome aggiuntivo per una collezione esistente. Le query possono essere eseguite completamente utilizzando l'alias invece del nome della collezione.

Pertanto, una seconda collezione può essere costruita in background, e poi l'alias può essere cambiato dalla vecchia collezione alla nuova collezione. Poiché i cambiamenti degli alias sono atomici, le richieste concurrenti non vengono influenzate durante il processo di passaggio.

Creare un Alias

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

Eliminare un Alias

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

Cambiare Collezione

Operazioni di alias multiple possono essere eseguite atomicamente. Ad esempio, è possibile utilizzare il seguente comando per cambiare la collezione sottostante:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

Elenco degli Alias della Collezione

GET /collezioni/{nome_collezione}/alias

Elenco di Tutti gli Alias

GET /alias

Elenco di Tutte le Collezioni

GET /collezioni