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
Utilizzare una qualunque lista per i parametri di tipo params in C#
Supportare la sessione affinity di Azure App Service con Application Gateway
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Implementare l'infinite scroll con QuickGrid in Blazor Server
Configurare e gestire sidecar container in Azure App Service
Creare una libreria CSS universale: Cards
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Eliminare una project wiki di Azure DevOps
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Utilizzare Azure Cosmos DB con i vettori
Rendere le variabili read-only in una pipeline di Azure DevOps