Dot.Blog

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

Azure AI - Créer un index sémantique avec Azure AI Search et l’interroger en C#

Dans cet article, nous allons passer de la théorie à la pratique concrète : créer un index sémantique complet dans Azure AI Search, y injecter des documents avec leurs embeddings, puis interroger cet index depuis une application C#. Le but est de maîtriser toutes les étapes pour exploiter la puissance des recherches vectorielles dans vos applications .NET.

  1. Prérequis

Avant de commencer :

  • Un service Azure AI Search configuré et accessible
  • Une clé d’administration Azure Search (API Key)
  • Une ressource Azure OpenAI pour générer les embeddings (ex : text-embedding-ada-002)
  • Le package NuGet Azure.Search.Documents installé dans votre projet C#
dotnet add package Azure.Search.Documents
  1. Créer l’index sémantique avec champ vectoriel

Un index sémantique comprend des champs classiques (id, texte) et un champ vectoriel stockant les embeddings.

Voici un exemple complet :

using Azure;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using System;
using System.Threading.Tasks;

public async Task CreerIndexAsync()
{
    var serviceEndpoint = new Uri("https://<votre-service-search>.search.windows.net");
    var adminApiKey = "<votre-clé-admin>";
    var indexClient = new SearchIndexClient(serviceEndpoint, new AzureKeyCredential(adminApiKey));
    var fields = new FieldBuilder().Build(typeof(Document));
    var index = new SearchIndex("documents-semantique")
    {
        Fields = fields,
        VectorSearch = new VectorSearchAlgorithmConfiguration("default")
    };
    // Supprimez l'index s'il existe déjà
    try
    {
        await indexClient.DeleteIndexAsync(index.Name);
    }
    catch { }

    await indexClient.CreateIndexAsync(index);
}

public class Document
{
    [SimpleField(IsKey = true)]
    public string Id { get; set; }

    [SearchableField(IsFilterable = false, IsSortable = false)]
    public string Content { get; set; }

    [SearchField(IsFilterable = false, IsSortable = false, IsFacetable = false, IsSearchable = false,
        VectorSearchDimensions = 1536, VectorSearchAlgorithmConfiguration = "default")]
    public float[] Embedding { get; set; }
}
  1. Indexer des documents avec embeddings générés

Une fois l’index créé, vous devez indexer vos documents avec leurs embeddings.

Voici comment procéder depuis C# :

using Azure;
using Azure.Search.Documents;
using System;
using System.Threading.Tasks;

public async Task IndexerDocumentAsync(string texte, float[] embedding)
{
    var serviceEndpoint = new Uri("https://<votre-service-search>.search.windows.net");
    var adminApiKey = "<votre-clé-admin>";
    var searchClient = new SearchClient(serviceEndpoint, "documents-semantique", new AzureKeyCredential(adminApiKey));

    var doc = new Document
    {
        Id = Guid.NewGuid().ToString(),
        Content = texte,
        Embedding = embedding
    };

    await searchClient.MergeOrUploadDocumentAsync(doc);
}

Note : La génération d’embeddings peut se faire via l’API Azure OpenAI avant d’appeler cette fonction.

  1. Interroger l’index vectoriellement

Pour retrouver des documents similaires à une requête, il faut :

  1. Générer l’embedding de la requête
  2. Interroger l’index avec une recherche vectorielle

Exemple complet :

using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Models;
using System;
using System.Threading.Tasks;

public async Task RechercheVectorielleAsync(float[] requeteEmbedding)
{
    var serviceEndpoint = new Uri("https://<votre-service-search>.search.windows.net");
    var adminApiKey = "<votre-clé-admin>";
    var searchClient = new SearchClient(serviceEndpoint, "documents-semantique", new AzureKeyCredential(adminApiKey));

    var vectorQuery = new SearchQueryVector
    {
        Value = requeteEmbedding,
        KNearestNeighborsCount = 5,
        Fields = new[] { "Embedding" }
    };

    var options = new SearchOptions
    {
        Size = 5,
        Vector = vectorQuery
    };

    var results = await searchClient.SearchAsync<Document>("*", options);

    await foreach (SearchResult<Document> result in results.GetResultsAsync())
    {
        Console.WriteLine($"Document Id: {result.Document.Id}");
        Console.WriteLine($"Contenu : {result.Document.Content}");
        Console.WriteLine("--------------------");
    }
}
  1. Conclusion

Vous disposez maintenant d’un guide complet pour créer un index sémantique dans Azure AI Search, indexer des documents avec leurs embeddings et effectuer des recherches vectorielles pertinentes via C#.

Cette méthode permet d’implémenter des fonctionnalités avancées de recherche sémantique dans vos applications .NET, en tirant parti des capacités combinées d’Azure OpenAI et Azure Search.

Il y a bien d'autres choses à savoir pour devenir un expert, mais pour se servir efficacement et rapidement de Azure AI vous commencez à en savoir beaucoup ! Pratiquez, faites des tests, tout ne marchera pas forcément comme prévu ou comme attendu, cela le fait tout le temps quand on aborde une nouvelle techno, mais c'est en passant par cette phase de mise en oeuvre qu'on apprend véritablement. Alors ne perdez pas un instant et commencez tout de suite !

Le prochain article de la série abordera la façon de Déployer une API d’IA personnalisée avec Azure Functions.

Stay Tuned !

Faites des heureux, PARTAGEZ l'article !