Dot.Blog

Consulting DotNet C#, XAML, WinUI, WPF, MAUI, IA

Azure AI - Comprendre les embeddings et les bases vectorielles de Azure AI Search

Dans l’univers de l’intelligence artificielle, notamment dans les applications de recherche avancée et de traitement du langage naturel, la capacité à comprendre le sens (la sémantique) d’un document est cruciale. C’est ici que les embeddings et les bases vectorielles entrent en jeu.

Cet article a pour objectif d’expliquer clairement ces concepts, d’introduire Azure AI Search comme solution vectorielle intégrée, et de fournir un exemple concret en C# pour créer et interroger un index sémantique.

  1. Qu’est-ce qu’un embedding ?

Un embedding est une représentation numérique dense d’un contenu textuel (ou autre type de donnée) sous forme d’un vecteur de nombres réels en haute dimension.

Plutôt que de comparer des mots exacts, on compare désormais des vecteurs, ce qui permet de mesurer la similarité sémantique (le sens) entre des textes, même si les mots utilisés sont différents.

Exemple simple

Prenons deux phrases :

  • "Quelle est la météo aujourd'hui ?"
  • "Peux-tu me dire quel temps il fait ?"

Un moteur classique à base de mots clés pourrait ne pas détecter leur similarité, tandis que les embeddings transformeront ces deux phrases en vecteurs proches dans l’espace vectoriel.

  1. Pourquoi utiliser une base vectorielle ?

Les embeddings sont des vecteurs très longs (ex : 1536 dimensions pour Azure OpenAI) qui doivent être stockés et comparés efficacement.

Une base vectorielle permet :

  • De stocker ces vecteurs (embeddings) associés à leurs documents d’origine.
  • De rechercher rapidement les vecteurs les plus proches d’un vecteur requête.
  • D’implémenter la recherche dite approximate nearest neighbors (ANN) qui accélère la recherche dans de grandes bases.

Azure AI Search intègre ce type de technologie vectorielle dans son moteur.

Il est clair qu'une base de données SQL ou même NoSQL ne pourrait pas gérer ces données particulières que sont les vecteurs sémantiques. En réalité, vu l'importance de l'IA aujourd'hui, certains SGBD "classiques" commencent à offrir des solutions, mais les bases vectorielles auront encore pour longtemps l'avantage d'être conçues à l'origine pour traiter ce problème très délicat et donc d'y exceller.

  1. Azure AI Search : le moteur de recherche vectoriel intégré

Azure AI Search combine deux types de recherche :

  • La recherche classique textuelle (mots clés, filtres, facettes)
  • La recherche vectorielle basée sur la similarité des embeddings

Fonctionnalités clés

  • Création d’index contenant des champs vectoriels pour stocker embeddings.
  • Ingestion de documents avec génération automatique ou manuelle d’embeddings.
  • Recherche hybride : texte + vectorielle, pour un meilleur résultat.
  1. Exemple concret : création et interrogation d’un index vectoriel en C#

Nous allons voir comment :

  • Créer un index dans Azure AI Search avec un champ vectoriel.
  • Indexer des documents avec embeddings.
  • Interroger l’index avec un vecteur d’embedding pour retrouver des documents similaires.

Prérequis

  • Un service Azure AI Search actif.
  • Une ressource Azure OpenAI pour générer les embeddings.
  • Le SDK Azure.Search.Documents installé dans votre projet C#.
dotnet add package Azure.Search.Documents

4.1. Définition de l’index

Un index Azure AI Search est un peu comme une table de base de données. Voici un exemple de définition incluant un champ vectoriel :

using Azure;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
// Créer un client d’index
var serviceEndpoint = new Uri("https://<votre-service-search>.search.windows.net");
var adminApiKey = "<votre-clé-admin>";
var indexClient = new SearchIndexClient(serviceEndpoint, new AzureKeyCredential(adminApiKey));
// Définition de l’index
var index = new SearchIndex("documents")
{
    Fields =
    {
        new SimpleField("id", SearchFieldDataType.String) { IsKey = true },
        new SearchableField("content") { IsFilterable = false },
        new SearchField("embedding", SearchFieldDataType.Collection(SearchFieldDataType.Single))
        {
            VectorSearchDimensions = 1536,
            VectorSearchAlgorithmConfiguration = "default"
        }
    }
};
// Créer l’index (supprimer si existant avant)
try { await indexClient.DeleteIndexAsync(index.Name); } catch {}
await indexClient.CreateIndexAsync(index);

4.2. Indexation des documents avec embeddings

On suppose que vous avez un texte à indexer et que vous générez son embedding via Azure OpenAI.

Exemple simplifié d’indexation :

 

using Azure.Search.Documents;
using Azure.Search.Documents.Models;
var searchClient = new SearchClient(serviceEndpoint, "documents", new AzureKeyCredential(adminApiKey));
// Texte à indexer
string texte = "Azure AI Search est un service puissant.";
// Génération de l’embedding via Azure OpenAI (exemple fictif)
float[] embedding = await GenererEmbeddingAzureOpenAI(texte); // méthode à implémenter
// Créer le document à indexer
var doc = new
{
    id = Guid.NewGuid().ToString(),
    content = texte,
    embedding = embedding
};
// Indexer
await searchClient.MergeOrUploadDocumentAsync(doc);

4.3. Recherche vectorielle

Pour rechercher les documents proches d’une requête, vous devez d’abord générer l’embedding de la requête puis effectuer une recherche vectorielle :

// Embedding de la requête
string requete = "Quels services cloud Microsoft existent ?";
float[] requeteEmbedding = await GenererEmbeddingAzureOpenAI(requete);
// Requête vectorielle
var vectorQuery = new SearchQueryVector
{
    Value = requeteEmbedding,
    KNearestNeighborsCount = 5,
    Fields = new[] { "embedding" }
};
var options = new SearchOptions
{
    Size = 5,
    Vector = vectorQuery
};

SearchResults<dynamic> results = await searchClient.SearchAsync<dynamic>("*", options);
await foreach (SearchResult<dynamic> result in results.GetResultsAsync())
{
    Console.WriteLine($"Doc id: {result.Document["id"]}, contenu: {result.Document["content"]}");
}
  1. Conclusion

Les embeddings et les bases vectorielles sont au cœur des moteurs modernes d’IA et de recherche sémantique. Azure AI Search vous permet de bénéficier facilement de cette technologie puissante grâce à son intégration native.

L’exemple C# ci-dessus vous donne un cadre concret pour démarrer avec la création, l’indexation et la recherche dans un index vectoriel.

N'oubliez pas que stocker des éléments dans une base vectorielle permet à votre entreprise de stocker des documents qui lui sont propres comme de documentations de matériel qu'elle vend, des données chiffrées sur les ventes, etc, et de pouvoir les interroger facilement sans que Azure, OpenAI ou qui que ce soit d'autre sans que ces données ne soient publiques et intégrées au LLM (ce qui serait fâcheux pour le secret des affaires).

Les bases vectorielles sont ainsi des éléments clé d'une architecture IA en entreprise dès lors qu'il faut que l'intelligence travaille sur des données de l'entreprise. 

Dans le prochain article nous verrons comment créer un index sémantique et l'interroger en C#.

Restez connecté,

Stay Tuned !

Faites des heureux, PARTAGEZ l'article !