Database vettoriali

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

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 di base sui database vettoriali e illustra concettualmente come usare una eventhouse come database vettoriale in Real-Time Intelligence in Microsoft Fabric. Per esempi pratici, vedere Esercitazione: Usare una eventhouse come database vettoriale con incorporamenti LLM ed Esercitazione: Usare una eventhouse come database vettoriale con incorporamenti SLM.

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, che acquisisce il suo significato semantico. È possibile creare incorporamenti usando algoritmi che analizzano i dati e generano un set di valori numerici che ne rappresentano le funzionalità principali. Ad esempio, un incorporamento per una parola potrebbe rappresentarne il significato, il contesto e la relazione con altre parole. 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, che acquisisce il suo significato semantico. È possibile creare incorporamenti usando algoritmi che analizzano i dati e generano un set di valori numerici che ne rappresentano le funzionalità principali. Ad esempio, un incorporamento per una parola potrebbe rappresentarne il significato, il contesto e la relazione con altre parole. Eventhouse supporta due metodi per generare incorporamenti direttamente in KQL:

  • plug-in ai_embeddings: chiama un endpoint OpenAI esterno Azure per generare incorporamenti usando modelli di linguaggio di grandi dimensioni. Questo metodo produce incorporamenti di alta qualità ed è più adatto per i carichi di lavoro di ricerca semantica di produzione.

  • slm_embeddings_fl(): esegue modelli di linguaggio di piccole dimensioni in locale all'interno della sandbox kusto Python, generando incorporamenti senza alcun endpoint esterno. Questo metodo non richiede Azure risorsa OpenAI e non comporta alcun costo per incorporamento.

Per altre informazioni sugli incorporamenti in Azure OpenAI, vedere Informazioni sugli incorporamenti in Servizio Azure OpenAI.

Scegliere un metodo di incorporamento

Usare la tabella seguente per scegliere il metodo più adatto allo scenario:

Consideration plugin ai_embeddings (LLM) slm_embeddings_fl() (SLM)
Qualità del modello Massima qualità; usa Azure modelli OpenAI, ad esempiotext-embedding-3-large Buona qualità; utilizza SLM open source come harrier-v1-270m, jina-v2-small e e5-small-v2
Dipendenza esterna Richiede una risorsa OpenAI Azure con un modello di incorporamento distribuito Nessuno; i modelli vengono eseguiti localmente nella sandbox Python
Cost Prezzi per richiesta in base all'utilizzo Azure OpenAI Nessun costo per incorporamento
Throughput Soggetto ai limiti di frequenza di Azure OpenAI; richiede l'elaborazione in batch e una logica di nuovo tentativo Limitato solo dalle risorse di calcolo del cluster; ridimensiona naturalmente con le dimensioni del cluster
Setup Richiede una distribuzione di Azure OpenAI, la configurazione del criterio di callout e la configurazione dell'identità Richiede il plug-in di Python abilitato e gli artefatti SLM caricati in un lakehouse
Lunghezza massima del contesto Dipende dal modello distribuito (ad esempio, 8.192 token per text-embedding-3-large) Fino a 32.768 token con harrier-v1-270m, 8.192 con jina-v2-small e 512 con e5-small-v2
Migliore per Ricerca semantica di produzione in cui la qualità di incorporamento è la priorità principale Workflow sensibili alla privacy, prototipazione rapida, generazione in batch di grandi volumi di embedding o scenari senza accesso ad Azure OpenAI

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.
  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 somiglianza vettoriale è la possibilità di archiviare, indicizzare ed eseguire query sui dati vettoriali. Gli 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. Questa funzionalità rende Eventhouse una scelta eccellente per l'archiviazione e la ricerca di vettori.

I componenti seguenti di Eventhouse consentono di usarlo come database vettoriale:

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

Ottimizzazione per la scalabilità

Per altre informazioni sull'ottimizzazione della ricerca di somiglianza 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. A tale scopo, seguire questa procedura:
    1. Limitare il numero di vettori di embedding per partizione modificando il valore di ShardEngineMaxRowCount della politica di sharding. Questa impostazione distribuisce i dati in tutte le risorse di calcolo disponibili per ricerche più veloci.
    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. Si definiscono i criteri di incorporamento come Vector16 e si impostano i criteri di partizionamento orizzontale e unione per ottimizzare la tabella per la ricerca di somiglianza vettoriale. Per questo esempio, si supponga che il cluster abbia 20 nodi e che ogni nodo abbia 16 processori. Le partizioni della tabella devono contenere al massimo 1.000.000/(20*16)=3.125 righe.

  1. Eseguire i comandi KQL seguenti uno alla sola 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.

Passaggi successivi