Condividi tramite


Database vettoriali

Un database vettoriale archivia e gestisce i dati sotto forma di vettori, ovvero matrici numeriche di punti dati.

L'uso di vettori consente query e analisi complesse, perché i vettori possono essere confrontati e analizzati usando tecniche avanzate come la ricerca di somiglianza vettoriale, la quantizzazione e il clustering. I database tradizionali non sono particolarmente adatti per la gestione dei dati ad alta dimensione che stanno diventando sempre più comuni nell'analisi dei dati. Tuttavia, i database vettoriali sono progettati per gestire dati ad alta dimensione, ad esempio testo, immagini e audio, rappresentandoli come vettori. I database vettoriali sono utili per attività quali Machine Learning, elaborazione del linguaggio naturale e riconoscimento delle immagini, in cui l'obiettivo è identificare modelli o analogie in set di dati di grandi dimensioni.

Questo articolo fornisce informazioni generali sui database vettoriali e illustra concettualmente come usare una Eventhouse come database vettoriale in Intelligence in tempo reale in Microsoft Fabric. Per un esempio pratico, vedere Tutorial: Usare un eventhouse come database vettoriale.

Concetti chiave

I concetti chiave seguenti vengono usati nei database vettoriali:

Somiglianza vettoriale

La somiglianza vettoriale è una misura della differenza (o somiglianza) di due o più vettori. La ricerca di somiglianza vettoriale è una tecnica usata per trovare vettori simili in un set di dati. I vettori vengono confrontati usando una metrica di distanza, ad esempio la Distanza euclidea o la somiglianza del coseno. Più vicini sono i due vettori, più simili sono tra loro.

Incorporamenti

Gli incorporamenti sono un modo comune per rappresentare i dati in un formato vettoriale da usare nei database vettoriali. Un incorporamento è una rappresentazione matematica di una parte di dati, ad esempio una parola, un documento di testo o un'immagine, progettata per acquisire il significato semantico. Gli incorporamenti vengono creati usando algoritmi che analizzano i dati e generano un set di valori numerici che rappresentano le funzionalità chiave. Ad esempio, un incorporamento per una parola potrebbe rappresentarne il significato, il contesto e la relazione con altre parole. Il processo di creazione di incorporamenti è semplice. Anche se possono essere creati usando pacchetti Python standard (ad esempio spaCy, sent2vec, Gensim), i modelli linguistici di grandi dimensioni (LLM) generano incorporamenti di alta qualità per la ricerca di testo semantico. Ad esempio, è possibile inviare un testo a un modello di incorporamento in Azure OpenAI e questo genera una rappresentazione vettoriale che può essere archiviata per l'analisi. Per altre informazioni, vedere Informazioni sugli incorporamenti nel servizio OpenAI di Azure.

Flusso di lavoro generale

Schema di come incorporare, archiviare ed eseguire query su testo archiviato come vettori.

Il flusso di lavoro generale per l'uso di un database vettoriale è il seguente:

  1. Incorpora dati: convertire i dati in formato vettore usando un modello di incorporamento. Ad esempio, è possibile incorporare dati di testo usando un modello OpenAI.
  2. Archiviazione vettori: archiviare i vettori incorporati in un database vettoriale. È possibile inviare i dati incorporati a un’Eventhouse per archiviare e gestire i vettori.
  3. Incorporamento query: convertire i dati della query in formato vettore usando lo stesso modello di incorporamento usato per incorporare i dati archiviati.
  4. Vettori di query: usare la ricerca di somiglianza vettoriale per trovare voci nel database simili alla query.

Eventhouse come database vettoriale

Al centro della Ricerca di similarità del vettore è la possibilità di archiviare, indicizzare ed eseguire query sui dati vettoriali. Le Eventhouse offrono una soluzione per la gestione e l'analisi di grandi volumi di dati, in particolare negli scenari che richiedono analisi ed esplorazione in tempo reale, rendendola una scelta eccellente per l'archiviazione e la ricerca di vettori.

I componenti seguenti abilitano l'uso di Eventhouse come database vettoriale:

  • Tipo di dati dinamici, che può archiviare dati non strutturati, ad esempio matrici e contenitori di proprietà. Questo tipo di dati è quindi consigliato per l'archiviazione dei valori vettoriali. È possibile aumentare ulteriormente il valore del vettore archiviando i metadati correlati all'oggetto originale come colonne separate nella tabella.
  • Tipo di codificaVector16 progettato per l'archiviazione di vettori di numeri a virgola mobile in precisione a 16 bit, che usa Bfloat16 anziché i 64 bit predefiniti. Questa codifica è consigliata per l'archiviazione degli incorporamenti dei vettori di Machine Learning perché riduce i requisiti di archiviazione di un fattore di quattro e accelera le funzioni di elaborazione dei vettori, ad esempio series_dot_product() e series_cosine_similarity() per ordine di grandezza.
  • La funzione series_cosine_similarity, può eseguire ricerche di somiglianza vettoriale sopra i vettori archiviati in Eventhouse.

Ottimizzazione per la scalabilità

Per altre informazioni sull'ottimizzazione della ricerca di similarità vettoriale, vedere il blog.

Per ottimizzare le prestazioni e i tempi di ricerca risultanti, seguire questa procedura:

  1. Impostare la codifica della colonna incorporamenti su Vector16, la codifica a 16 bit dei coefficienti vettoriali (anziché il valore predefinito a 64 bit).
  2. Archiviare la tabella dei vettori di incorporamento in tutti i nodi del cluster con almeno una partizione per processore, che viene eseguita seguendo questa procedura:
    1. Limitare il numero di vettori di incorporamento per partizione modificando il valore di ShardEngineMaxRowCount dei criteri di partizionamento orizzontale. I criteri di partizionamento orizzontale bilanciano i dati in tutti i nodi con più extent per nodo, in modo che la ricerca possa usare tutti i processori disponibili.
    2. Modificare RowCountUpperBoundForMerge dei criteri di unione. I criteri di unione sono necessari per eliminare l'unione degli extent dopo l'inserimento.

Esempio dei passaggi di ottimizzazione

Nell'esempio seguente viene definita una tabella vettoriale statica per l'archiviazione di vettori 1M. I criteri di incorporamento vengono definiti come Vector16 e i criteri di partizionamento orizzontale e unione vengono impostati per ottimizzare la tabella per la ricerca di similarità vettoriale. Supponiamo che il cluster abbia 20 nodi ognuno con 16 processori. Le partizioni della tabella devono contenere al massimo 1000000/(20*16)=3125 righe.

  1. I comandi KQL seguenti vengono eseguiti uno alla volta per creare la tabella vuota e impostare i criteri e la codifica necessari:

    .create table embedding_vectors(vector_id:long, vector:dynamic)                                  //  This is a sample selection of columns, you can add more columns
    
    .alter column embedding_vectors.vector policy encoding type = 'Vector16'                         // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing
    
    .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }'       // Balanced data on all nodes and, multiple extents per node so the search can use all processors 
    
    .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }'      // Suppress merging extents after ingestion
    
  2. Inserire i dati nella tabella creata e definita nel passaggio precedente.

Passaggio successivo