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
Implementare l'infinite scroll con QuickGrid in Blazor Server
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Le novità di Angular: i miglioramenti alla CLI
Gestire i dati con Azure Cosmos DB Data Explorer
Cancellare una run di un workflow di GitHub
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Creazione di componenti personalizzati in React.js con Tailwind CSS
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Creazione di plugin per Tailwind CSS: espandere le Funzionalità del Framework
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
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