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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Utilizzare un service principal per accedere a Azure Container Registry
Eliminare una project wiki di Azure DevOps
Utilizzare Model as a Service su Microsoft Azure
Utilizzare il trigger SQL con le Azure Function
Definire stili a livello di libreria in Angular
Introduzione alle Container Queries
.NET Conference Italia 2024
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Gestire il colore CSS con HWB
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
I più letti di oggi
- Screencast 'Primi passi con Windows Workflow Foundation'
- .NET Conference Italia 2021 - Online
- Venite a trovarci a SMAU, dal 2 al 6 ottobre!
- Validazione dell'input in ASP.NET MVC 2
- Ignorare gli errori negli script
- Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
- Inviare un'e-mail con ASP.NET