Utilizzare Azure Cosmos DB con i vettori

di Cristian Civera, in Azure Cosmos DB,

I vettori sono sostanzialmente degli array di numeri che sono diventati molto utili nella negli embedding. Sono rappresentazioni matematiche in uno spazio ad alta dimensione, utili per descrivere dati complessi come parole, frasi, immagini o suoni. Sono fondamentali nell'IA per ricerche semantiche, raccomandazioni e rilevamento di anomalie, poiché catturano le caratteristiche essenziali dei dati in un formato che le macchine possono elaborare efficacemente.

Quando vogliamo effettuare una ricerca, oltre a campi di filtro con ricerca esatta o con ricerca testuale, tramite gli embedding possiamo fare ricerche di concetto e filtrarle/ordinarle secondo criteri di vicinanza. In Azure possiamo già usare Azure AI Search per effettuare questo lavoro, ma in alternativa è stata introdotta la possibilità di sfruttare questa caratteristica anche con Cosmos DB.
Per usufruire di questa caratteristica dobbiamo prima di tutto abilitare il supporto andando nella sezione Features del nostro account Cosmos DB ed abilitare la voce Vector Search for NoSQL API.

A questo punto dobbiamo creare un nuovo container, perché non possiamo applicare la ricerca vettoriale su container già esistenti. In fase di creazione (non più modificabile poi), dobbiamo istruire il motore in quali path andremo a salvare dei vettori, la tipologia, la dimensione e la funzione di calcolo della distanza. Nell'esempio seguente nel percorso /vector memorizziamo un embedding ADA di 1536 utilizzando la funzione di coseno, quella più comunemente usata.

Contestualmente alla creazione dobbiamo anche specificare i criteri di indicizzazione da adottare insieme agli altri, che normalmente troviamo nella indexing policy.
Abbiamo a disposizione tre tipologie di indicizzazione:
- flat: memorizza il vettore così com'è, fino ad una dimensione massima di 505. E' il metodo più preciso, ma anche il più lento nella ricerca;
- quantizedFlat: comprime il vettore di dimensione massima di 4096. E' un buon compromesso, perché rinuncia ad un po' di precisione, restando sempre lento visto che effettua una ricerca lineare come nel caso del flat. La documentazione parla di buone prestazioni fino a 100 mila vettori;
- diskANN: definisce un indice separato che effettua una ricerca più approssimata, ma garantisce ottime prestazioni.

Definiziamo quindi l'indice per il nostro vettore utilizzando la compressione, come nell'esempio.

A questo punto possiamo popolare il database e provare ad effettuare una query usando la funzione VectorDistance. A seconda della funziona usata restituisce un numero che, nel caso del cosino, restituisce un punteggio da 0 a 1 a seconda della similarità di due vettori.

SELECT c.title, VectorDistance(c.contentVector, [1,2,3, ...]) AS score 
FROM c
ORDER BY VectorDistance(c.contentVector, [1,2,3, ...])

Grazie a questa funzione possiamo contestualmente effettuare altri filtri e selezionare quali campi vogliamo estrarre. Dal punto di vista del pricing, tutto questo va ad influenzare gli RU necessari per la ricerca e lo spazio dedicato alla memorizzazione degli indici.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi