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
Referenziare un @layer più alto in CSS
Ricevere notifiche sui test con Azure Load Testing
Gestione ciclo di vita in .NET Aspire
Ottimizzare le pull con Artifact Cache di Azure Container Registry
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Utilizzare Intersect e Except per filtrare set di dati in TSql
Utilizzare Hybrid Cache in .NET 9
Introduzione ai web component HTML
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Creare una libreria CSS universale: Immagini
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
I più letti di oggi
- Niente .NET sui server: siamo Microsoft
- Una funzione per validare un indirizzo e-mail
- Impersonation di utente per l'esecuzione di codice in una pagina ASP.NET
- Tutorial ASP.NET 4.0
- Tutorial Entity Framework 5.0
- Solo 5 minuti all'inizio della keynote!! http://aspitalia.com/build-win8 #BldWin
- Windows Embedded Standard 8 disponibile in CTP. stessa base di #win8, componentizzabile, con supporto a #metro: http://aspitalia.com/6u
- disponibile il nuovo #adsdk per #win8. doc su https://aspit.co/ad3 donwload diretto da https://aspit.co/ad4
- #MIX10: Windows Phone - demo Hush Hush, un diario con interfaccia completamente personalizzata
- Scott Guthrie on stage: inizia la seconda keynote di //build/ https://aspit.co/build-14 #bldwin