Condividi tramite


Indicizzare i dati di vettore in Cosmos DB (in Azure e Fabric)

Cosmos DB (in Azure e Fabric) offre un'efficiente indicizzazione e ricerca di vettori. Questa funzionalità è progettata per gestire vettori multi modali, ad alta dimensione, consentendo una ricerca di vettori efficiente e accurata su qualsiasi scala. È ora possibile archiviare i vettori direttamente nei documenti insieme ai dati. Ogni documento nel database può contenere non solo dati tradizionali senza schema, ma anche vettori ad alta dimensione multi modali come altre proprietà dei documenti. Questa coubicazione di dati e vettori consente un'indicizzazione e una ricerca efficienti, poiché i vettori vengono archiviati nella stessa unità logica dei dati che rappresentano. Mantenere insieme vettori e dati semplifica la gestione dei dati, le architetture delle applicazioni di intelligenza artificiale e l'efficienza delle operazioni basate su vettori.

Cosmos DB offre la flessibilità offerta nella scelta del metodo di indicizzazione vettoriale:

  • Una ricerca esatta "flat" o k-nearest neighbors o vicino più prossimo (talvolta chiamata anche forza bruta) può fornire il 100% di richiamo di recupero per ricerche vettoriali più piccole e incentrate. in particolare quando si combinano con filtri di query e chiavi di partizione.

  • Indice flat quantizzato che comprime i vettori usando metodi di quantizzazione basati su DiskANN per migliorare l'efficienza nella ricerca kNN.

  • DiskANN, una suite di algoritmi di indicizzazione vettoriali all'avanguardia sviluppati da Microsoft Research per una ricerca efficiente e ad alta precisione di vettori multi modali su qualsiasi scala.

La ricerca vettoriale in Cosmos DB può essere combinata con tutti gli altri filtri e indici di query NoSQL supportati tramite WHERE clausole. Questa combinazione consente alle ricerche vettoriali di essere i dati più rilevanti per le applicazioni.

Questa funzionalità migliora le funzionalità di base di Cosmos DB, rendendola più versatile per la gestione dei dati vettoriali e dei requisiti di ricerca nelle applicazioni di intelligenza artificiale.

Che cos'è un archivio di vettori?

Un archivio vettoriale o un database vettoriale è un database progettato per archiviare e gestire incorporamenti vettoriali, che sono rappresentazioni matematiche dei dati in uno spazio ad alta dimensione. In questo spazio, ogni dimensione corrisponde a una caratteristica dei dati e decine di migliaia di dimensioni possono essere usate per rappresentare dati sofisticati. La posizione di un vettore in questo spazio rappresenta le sue caratteristiche. Parole, frasi o interi documenti, immagini, audio e altri tipi di dati possono essere vettorizzati.

Come funziona un archivio vettoriale?

In un archivio vettoriale, gli algoritmi di ricerca vettoriale vengono usati per indicizzare ed eseguire query sugli incorporamenti. Alcuni algoritmi di ricerca vettoriale noti includono Hierarchical Navigable Small World (HNSW), Inverted File (IVF), DiskANN e così via. La ricerca vettoriale è un metodo che consente di trovare elementi simili in base alle caratteristiche dei dati anziché in base alle corrispondenze esatte in un campo di proprietà. Questa tecnica è utile nelle applicazioni come la ricerca di testi simili o di immagini correlate, la creazione di elementi consigliati o anche il rilevamento di anomalie. Viene usato per eseguire query sui vettori di incorporamento dei dati che hai creato utilizzando un modello di Apprendimento Automatico tramite un'API di vettori di incorporamento. Esempi di API di incorporamento sono gli incorporamenti OpenAI di Azure o Hugging Face in Azure. La ricerca vettoriale misura quindi la distanza tra i vettori di dati e i vettori di query. I vettori di dati più vicini al vettore di query sono quelli che risultano più simili dal punto di vista semantico.

Nel database vettoriale integrato in Cosmos DB, gli embedding possono essere archiviati, indicizzati ed interrogati insieme ai dati originali. Questo approccio elimina il costo aggiuntivo della replica dei dati in un database vettoriale puro separato. Inoltre, questa architettura mantiene insieme gli incorporamenti vettoriali e i dati originali, che facilitano meglio le operazioni di dati multi modale e consentono una maggiore coerenza, scalabilità e prestazioni dei dati.

Politiche vettoriali dei contenitori

Per eseguire la ricerca vettoriale con Cosmos DB è necessario definire criteri vettoriali per il contenitore. Questo criterio fornisce informazioni essenziali per il motore di database per eseguire una ricerca efficiente di somiglianza per i vettori presenti nei documenti del contenitore. Questa configurazione informa anche i criteri di indicizzazione vettoriale delle informazioni necessarie, se si sceglie di specificarne una. Le informazioni seguenti sono incluse nei criteri vettoriali contenuti:

  • path: proprietà contenente il vettore (obbligatorio).

  • datatype: tipo di dati della proprietà vettore. I tipi supportati sono float32 (impostazione predefinita), int8e uint8.

  • dimensions: la dimensionalità o la lunghezza di ogni vettore nel percorso. Tutti i vettori in un percorso devono avere lo stesso numero di dimensioni. (impostazione predefinita 1536).

  • distanceFunction: metrica usata per calcolare la distanza/somiglianza. Le metriche supportate sono:

    • cosine, che ha valori da $-1$ (meno simile) a $+1$ (più simile).

    • dot product, che ha valori da $-\infty$ (meno simile) a $+\infty$ (più simile).

    • euclidean, che ha valori compresi tra $0$ (più simili) a $+\infty$ (meno simile).

Annotazioni

Ogni percorso univoco può avere al massimo un criterio. Tuttavia, è possibile specificare più criteri se sono destinati a un percorso diverso.

I criteri del vettore del contenitore possono essere descritti come oggetti JSON. Di seguito sono riportati due esempi di criteri di vettori di contenitori validi:

Politica con un percorso vettoriale unico

Questo esempio illustra una configurazione di una politica di incorporamento vettoriale con un singolo percorso vettoriale, mostrando la configurazione di base per l'archiviazione di vettori float32 a 1536 dimensioni con similarità del coseno. Questa configurazione illustra:

  • /[0]: usa il tipo di dati 'float32' con somiglianza del coseno per vettori a 1536 dimensioni (comune per gli embedding OpenAI)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

Politica con due percorsi vettoriali

In questo esempio viene illustrato come configurare un criterio di indicizzazione vettoriale con due percorsi di incorporamento di vettori diversi, ognuno con tipi di dati distinti, funzioni di distanza e dimensioni. Questa configurazione illustra:

  • /[0]: usa il tipo di dati float32 con somiglianza coseno per vettori a 1536 dimensioni (comuni per gli embedding OpenAI)
  • /[1]: usa il tipo di dati int8 con distanza del prodotto punto per vettori 100 dimensionali (più efficiente per incorporamenti più piccoli)
{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

Per altre informazioni ed esempi di impostazioni dei criteri di vettore del contenitore, vedere esempi di criteri di indicizzazione vettoriali.

Criteri di indicizzazione vettoriale

Gli indici vettoriali aumentano l'efficienza durante l'esecuzione di ricerche vettoriali usando la funzione di sistema VectorDistance. Le ricerche vettoriali hanno una latenza inferiore, una velocità effettiva più elevata e un consumo minore di UR quando si usa un indice vettoriale. È possibile specificare questi tipi di criteri di indice vettoriale:

Description Dimensioni massime
flat Archivia i vettori nello stesso indice di altre proprietà indicizzate. 505
quantizedFlat Quantizza (comprime) i vettori prima di archiviarli nell'indice. Questa politica può migliorare la latenza e la capacità sacrificando leggermente la precisione. 4096
diskANN Crea un indice basato su DiskANN per una ricerca approssimativa veloce ed efficiente. 4096

Annotazioni

Gli indici quantizedFlat e diskANN richiedono che vengano inseriti almeno 1.000 vettori. Questo valore minimo consiste nel garantire l'accuratezza del processo di quantizzazione. Se sono presenti meno di 1.000 vettori, viene eseguita invece un'analisi completa e comporta costi di ur più elevati per una query di ricerca vettoriale.

Alcuni punti da notare:

  • I flat tipi di indice e quantizedFlat usano l'indice di Cosmos DB per archiviare e leggere ogni vettore durante una ricerca vettoriale. Le ricerche vettoriali con un indice flat sono ricerche di forza bruta e producono precisione o richiamo al 100%. Ovvero, è garantito che trovino i vettori più simili nel set di dati. Tuttavia, esiste una limitazione delle 505 dimensioni per i vettori in un indice flat.

  • L'indice quantizedFlat archivia i vettori quantizzati (compressi) nell'indice. Anche le ricerche vettoriali con indice quantizedFlat sono ricerche di forza bruta, ma la loro accuratezza potrebbe essere leggermente inferiore al 100% perché i vettori vengono quantizzati prima dell'aggiunta all'indice. Tuttavia, le ricerche vettoriali con quantized flat devono avere una latenza inferiore, una velocità effettiva più elevata e un costo UR inferiore rispetto alle ricerche vettoriali su un indice flat. Questo indice è un'opzione valida per scenari più piccoli o scenari in cui si usano filtri di query per restringere la ricerca vettoriale a un set relativamente ridotto di vettori. quantizedFlat è consigliabile quando il numero di vettori da indicizzare è in una posizione di circa 50.000 o meno per partizione fisica. Tuttavia, questa raccomandazione è solo una linea guida generale e le prestazioni effettive devono essere testate perché ogni scenario può essere diverso.

  • L'indice diskANN è un indice separato definito in modo specifico per i vettori che usano DiskANN, una suite di algoritmi di indicizzazione a vettori con prestazioni elevate sviluppati da Microsoft Research. Gli indici DiskANN possono offrire una certa latenza più bassa, la velocità effettiva più elevata e le query sui costi delle UR più basse, mantenendo comunque un'accuratezza elevata. In generale, DiskANN è il più efficiente di tutti i tipi di indice se sono presenti più di 50.000 vettori per partizione fisica.

Ecco alcuni esempi di criteri di indice vettoriale validi:

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*"
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN"
    }
  ]
}
{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*",
    },
    {
      "path": "/vector2/*",
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "quantizedFlat"
    },
    {
      "path": "/vector2",
      "type": "diskANN"
    }
  ]
}

Importante

Il percorso vettoriale è stato aggiunto alla sezione excludedPaths della politica di indicizzazione per garantire prestazioni ottimizzate per l'inserimento. Non aggiungere il percorso vettoriale a excludedPaths si traduce in un addebito maggiore di unità di richiesta e una latenza più elevata per gli inserimenti vettoriali.

Importante

I caratteri jolly (*, []) non sono attualmente supportati nei criteri vettoriali o nell'indice vettoriale.

Eseguire la ricerca vettoriale con query usando VECTORDISTANCE

Dopo aver creato un contenitore con i criteri vettoriali desiderati e aver inserito i dati vettoriali nel contenitore, è possibile eseguire una ricerca vettoriale usando la funzione predefinita VECTORDISTANCE in una query. Un esempio di query NoSQL che proietta il punteggio di somiglianza con l'alias score e li ordina dal più simile a quello meno simile:

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

Importante

Usare sempre una clausola TOP N nell'istruzione SELECT di una query. In caso contrario, la ricerca vettoriale tenta di restituire molti più risultati che causano un costo maggiore di unità richiesta (UR) e una latenza maggiore del necessario.