Azure AI Search (precedentemente chiamato Cognitive Search) è un servizio di ricerca di Microsoft Azure che ci permette di creare esperienze di ricerca ricche e personalizzate per i nostri utenti. Può indicizzare dati strutturati e testo, rendendo le informazioni facilmente ricercabili. I suoi vantaggi includono scalabilità, integrazione con altri servizi Azure, e funzionalità avanzate come ricerca full-text, filtraggio, ordinamento e suggerimenti. Il tutto viene esposto tramite API REST e SDK per i rispettivi linguaggi in pieno stile Microsoft Azure.
Di recente è stata aggiunta la possibilità di indicizzare, oltre a testo e numeri, anche array di numeri aprendo le porte alla ricerca vettoriale, molto utile nell'ambito dell'intelligenza artificiale. In questo campo, infatti, testi, suoni e immagini possono essere rappresentati tramite vettore secondo un motore di embedding, come per esempio ADA, BERT, Word2vect, GloVe, che ne determina i valori. Contenuti simili o affini, a seconda del motore utilizzato, restituiscono vettori, cioè un punto multidimensionale la cui distanza è inferiore rispetto ad altri contenuti meno rilevanti.
In Azure AI Search possiamo quindi popolare i documenti con titoli, riferimento alla fonte, categorie, ecc, ma anche aggiungere uno o più campi di tipo collezione di single (32bit a virgola mobile) per effettuare una ricerca vettoriale oppure ibrida (ricerca full text), con o senza semantica.
Per sfruttare questa funzionalità dobbiamo prima di tutto creare un indice o modificarne uno già esistente, come mostrato nella figura seguente.
Per ogni campo va abbinato un profilo di ricerca che, se non ancora creato, va preparato per indicare le modalità di ricerca del vettore. Azure AI Search supporta due algoritmi:
- Hierarchical Navigable Small World (HNSW): algoritmo veloce e scalabile che richiede di mantenere tutti gli indici di memoria consumando la quota di spazio dell'indice;
- Exhaustive K-nearest neighbors (KNN): calcola la distanza scorrendo tutti i punti e calcolando la distanza. L'algoritmo è più lento, adatto per piccoli dataset, ma è più preciso.
Nella figura seguente utilizziamo HNSW con i valori standard, il quale permette comunque di effettuare una ricerca esaustiva, se necessario.
Tornando alla configurazione del profile di ricerca, possiamo eventualmente impostare un motore di vettorizzazione. Questo valore è facoltativo e dipende da come vogliamo calcolare i vettori. Possiamo, per esempio, utilizzare Azure OpenAI e il motore ADA per gli embedding sul testo, come mostrato di seguito.
A questo punto, come previsto da Azure AI Search, possiamo popolare l'indice con un approccio pull, sfruttando i data source già previsti e di conseguenza sfruttando il vectorizer scelto, o con un approccio push, usando le API (o SDK) per inviare i contenuti, come mostrato nell'esempio seguente di chiamata REST.
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/index?api-version=2023-11-01 Content-Type: application/json api-key: {{admin-api-key}} { "value": [ { "id": "1", "vector": [ -0.024740582332015038, ... ], "@search.action": "upload" } ] }
Popolato il nostro indice e sfruttando il Search Explorer dovremmo trovare i nostri documenti.
Per effettuare una ricerca possiamo ancora una volta usare SDK o le REST API, come nell'esempio seguente dove richiediamo i 5 documenti più vicini.
POST https://my-search-service.search.windows.net/indexes/my-index/docs/search?api-version=2023-11-01 Content-Type: application/json api-key: {{admin-api-key}} { "vector": { "value": [ -0.009154141, 0.018708462, . . . -0.02178128, -0.00086512347 ], "fields": "Vector", "k": 5 }, "select": "id" }
Otteniamo così la lista degli id e delle eventuali altre informazioni che abbiamo richiesto, utile nel caso in cui stiamo implementando il Retrieval-Augmented Generation (RAG).
Dal punto di vista dei costi ciò che va tenuto conto è l'ingrandirsi dello spazio dell'indice (a seconda dell'algoritmo di ricerca) e dei documenti che ora contengono i vettori.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire il colore CSS con HWB
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Utilizzare il trigger SQL con le Azure Function
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
Proteggere le risorse Azure con private link e private endpoints
Utilizzare una qualunque lista per i parametri di tipo params in C#
Recuperare App Service cancellati su Azure
Change tracking e composition in Entity Framework
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Utilizzare un service principal per accedere a Azure Container Registry
I più letti di oggi
- Build 2015: segui con noi tutte le novità per gli sviluppatori in diretta da San Francisco
- Speciale Windows Live Services: come integrarli nelle proprie applicazioni
- Rilasciata la RTM di SQL Server 2012, la versione Express subito in download
- Build 2014: tutte le novità per gli sviluppatori in diretta da San Francisco
- .NET Managed provider per MySQL
- WS-I approva Basic Profile 1.0
- Due regali dal Tech-Ed USA 2004: WSE 2.0 e VS 2005 Team System
- VS 2005 e SQL Server 2005 Express da scaricare
- Microsoft aggiorna WinFS beta 1 per VS 2005
- Utilizzare CLEditor per consentire l'input di HTML in ASP.NET MVC