Condividi tramite


Generare immagini dal testo usando l'intelligenza artificiale

In questa guida introduttiva si usa la libreria Microsoft.Extensions.AI (MEAI) per generare immagini tramite prompt di testo usando un modello di intelligenza artificiale. Le funzionalità da testo a immagine MEAI consentono di generare immagini da richieste di linguaggio naturale o immagini esistenti usando una superficie API coerente ed estendibile.

L'interfaccia IImageGenerator fornisce un'API unificata ed estendibile per l'uso di vari servizi di generazione di immagini, semplificando l'integrazione delle funzionalità di sintesi testuale nelle app .NET. L'interfaccia supporta:

  • Generazione da testo a immagine.
  • Composizione della pipeline con middleware (registrazione, telemetria, memorizzazione nella cache).
  • Opzioni di configurazione flessibili.
  • Supporto per più provider di intelligenza artificiale.

Annotazioni

L'interfaccia IImageGenerator è attualmente contrassegnata come sperimentale con l'ID MEAI001 di diagnostica. Potrebbe essere necessario eliminare questo avviso nel file di progetto o nel codice.

Prerequisiti

Configurare il servizio di intelligenza artificiale

Per effettuare il provisioning di un servizio e un modello OpenAI di Azure usando il portale di Azure, completare la procedura descritta nell'articolo creare e distribuire una risorsa del servizio OpenAI di Azure. Nel passaggio "Distribuisci un modello" selezionare il modello di gpt-image-1.

Annotazioni

gpt-image-1 è un modello più recente che offre diversi miglioramenti rispetto a DALL-E 3. È disponibile da OpenAI su base limitata; richiedere l'accesso con questo modulo.

Creare l'applicazione

Completare la procedura seguente per creare un'applicazione console .NET che genera immagini da richieste di testo.

  1. Creare una nuova applicazione console:

    dotnet new console -o TextToImageAI
    
  2. Passare alla directory TextToImageAI e aggiungere i pacchetti necessari all'app:

    dotnet add package Azure.AI.OpenAI
    dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease
    dotnet add package Microsoft.Extensions.Configuration
    dotnet add package Microsoft.Extensions.Configuration.UserSecrets
    
  3. Eseguire i comandi seguenti per aggiungere segreti dell'app per l'endpoint Azure OpenAI, il nome del modello e la chiave API:

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_OPENAI_GPT_NAME gpt-image-1
    dotnet user-secrets set AZURE_OPENAI_API_KEY <your-azure-openai-api-key>
    
  4. Aprire la nuova app nell'editor preferito, ad esempio Visual Studio.

Implementare la generazione di immagini di base

  1. Aggiornare il Program.cs file con il codice seguente per ottenere i dati di configurazione e creare AzureOpenAIClient:

    using Azure;
    using Azure.AI.OpenAI;
    using Microsoft.Extensions.AI;
    using Microsoft.Extensions.Configuration;
    
    IConfigurationRoot config = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .Build();
    
    string endpoint = config["AZURE_OPENAI_ENDPOINT"];
    string apiKey = config["AZURE_OPENAI_API_KEY"];
    string model = config["AZURE_OPENAI_GPT_NAME"];
    
    // Create the Azure OpenAI client and convert to IImageGenerator.
    AzureOpenAIClient azureClient = new(
        new Uri(endpoint),
        new AzureKeyCredential(apiKey));
    
    var imageClient = azureClient.GetImageClient(model);
    #pragma warning disable MEAI001 // Type is for evaluation purposes only.
    IImageGenerator generator = imageClient.AsIImageGenerator();
    

    Il codice precedente:

    • Carica la configurazione dai segreti utente.
    • Crea un oggetto ImageClient da OpenAI SDK.
    • Converte il ImageClient in un IImageGenerator utilizzando il metodo di estensione AsIImageGenerator(ImageClient).
  2. Aggiungere il codice seguente per implementare la generazione di testo a immagine di base:

    // Generate an image from a text prompt
    var options = new ImageGenerationOptions
    {
        MediaType = "image/png"
    };
    string prompt = "A tennis court in a jungle";
    var response = await generator.GenerateImagesAsync(prompt, options);
    
    // Save the image to a file.
    var dataContent = response.Contents.OfType<DataContent>().First();
    string fileName = SaveImage(dataContent, "jungle-tennis.png");
    Console.WriteLine($"Image saved to file: {fileName}");
    
    static string SaveImage(DataContent content, string fileName)
    {
        string userDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        var path = Path.Combine(userDirectory, fileName);
        File.WriteAllBytes(path, content.Data.ToArray());
        return Path.GetFullPath(path);
    }
    

    Il codice precedente:

  3. Eseguire l'applicazione tramite l'IDE o usando dotnet run.

    L'applicazione genera un'immagine e restituisce il percorso del file all'immagine. Aprire il file per visualizzare l'immagine generata. L'immagine seguente mostra un esempio di immagine generata.

    Immagine generata dall'IA di un campo da tennis in una giungla.

Configurare le opzioni di generazione di immagini

È possibile personalizzare la generazione di immagini fornendo altre opzioni, ad esempio dimensioni, formato di risposta e numero di immagini da generare. La ImageGenerationOptions classe consente di specificare:

Usare l'integrazione dell'hosting

Quando si creano app Web o servizi ospitati, è possibile integrare la generazione di immagini usando l'inserimento delle dipendenze e i modelli di hosting. Questo approccio offre una migliore gestione del ciclo di vita, integrazione della configurazione e testability.

Configurare i servizi di hosting

Il Aspire.Azure.AI.OpenAI pacchetto fornisce metodi di estensione per registrare i servizi OpenAI di Azure con il contenitore di inserimento delle dipendenze dell'applicazione:

  1. Aggiungere i pacchetti necessari all'applicazione Web:

    dotnet add package Aspire.Azure.AI.OpenAI --prerelease
    dotnet add package Azure.AI.OpenAI
    dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease
    
  2. Configurare il client e il generatore di immagini OpenAI di Azure nel Program.cs file:

    using Aspire.Azure.AI.OpenAI;
    using Microsoft.Extensions.AI;
    using OpenAI;
    
    WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
    
    // Add the Azure OpenAI client using hosting integration.
    AspireAzureOpenAIClientBuilder openai = builder.AddAzureOpenAIClient("openai");
    

    Il AddAzureOpenAIClient(IHostApplicationBuilder, String, Action<AzureOpenAISettings>, Action<IAzureClientBuilder<AzureOpenAIClient,AzureOpenAIClientOptions>>) metodo registra il client OpenAI di Azure con inserimento delle dipendenze. La stringa di connessione (denominata "openai") viene recuperata dalla configurazione, in genere dalle appsettings.json variabili di ambiente o :

    {
      "ConnectionStrings": {
        "openai": "Endpoint=https://your-resource-name.openai.azure.com/;Key=your-api-key"
      }
    }
    
  3. Registrazione del servizio IImageGenerator con iniezione delle dipendenze:

    // Register the image generator with dependency injection.
    ImageGeneratorBuilder imageBuilder = builder.Services.AddImageGenerator(services =>
    {
        OpenAIClient openAiClient = services.GetRequiredService<OpenAIClient>();
        OpenAI.Images.ImageClient imageClient = openAiClient.GetImageClient("gpt-image-1");
        #pragma warning disable MEAI001 // Type is for evaluation purposes only.
        return imageClient.AsIImageGenerator();
        #pragma warning restore MEAI001
    });
    

    Il AddImageGenerator metodo registra il generatore di immagini come servizio singleton che può essere inserito in controller, servizi o endpoint API minimi.

  4. Aggiungere opzioni e registrazione:

    imageBuilder.ConfigureOptions(options =>
    {
        options.MediaType = "image/png";
    }).UseLogging();
    

    Il codice precedente:

Usare il generatore di immagini negli endpoint

Una volta registrato, puoi eseguire l'inserimento di IImageGenerator nei tuoi endpoint o servizi.

// Use the image generator in an endpoint.
app.MapPost("/generate-image", async (IImageGenerator generator, string prompt) =>
{
    ImageGenerationResponse response = await generator.GenerateImagesAsync(prompt);
    DataContent dataContent = response.Contents.OfType<DataContent>().First();

    return Results.File(dataContent.Data.ToArray(), dataContent.MediaType);
});

Questo approccio di hosting offre diversi vantaggi:

  • Gestione della configurazione: le stringhe di connessione e le impostazioni vengono gestite tramite il sistema di configurazione .NET.
  • Dependency Injection: il generatore di immagini è disponibile in tutta l'applicazione tramite DI.
  • Gestione del ciclo di vita: i servizi vengono inizializzati e eliminati correttamente dall'infrastruttura di hosting.
  • Verificabilità: le implementazioni fittizie possono essere sostituite facilmente per i test.
  • Integrazione con .NET Aspire: quando si usa .NET Aspire, il AddAzureOpenAIClient metodo si integra con l'individuazione dei servizi e i dati di telemetria.

Procedure consigliate

Quando si implementa la generazione da testo a immagine nelle applicazioni, prendere in considerazione queste procedure consigliate:

  • Progettazione prompt: Scrivere istruzioni chiare e dettagliate che descrivono l'immagine desiderata. Includere dettagli specifici sullo stile, la composizione, i colori e gli elementi.
  • Gestione dei costi: la generazione di immagini può essere costosa. Memorizzare nella cache i risultati quando possibile e implementare la limitazione della frequenza per controllare i costi.
  • Sicurezza del contenuto: esaminare sempre le immagini generate per il contenuto appropriato, in particolare nelle applicazioni di produzione. Valutare la possibilità di implementare filtri e moderazione del contenuto.
  • Esperienza utente: la generazione di immagini può richiedere alcuni secondi. Fornire indicatori di stato e gestire correttamente i timeout.
  • Considerazioni legali: tenere conto delle licenze e dei diritti di utilizzo per le immagini generate. Esamina le condizioni di servizio del tuo provider di intelligenza artificiale.

Pulire le risorse

Quando la risorsa OpenAI di Azure non è più necessaria, eliminarla per evitare di incorrere in addebiti:

  1. Nel portale di Azure passare alla risorsa OpenAI di Azure.
  2. Selezionare la risorsa e quindi selezionare Elimina.

Passaggi successivi

Hai generato con successo alcune immagini diverse usando l'interfaccia IImageGenerator in Microsoft.Extensions.AI. Successivamente, è possibile esplorare alcune delle funzionalità aggiuntive, tra cui:

  • Ridefinizione dell'immagine generata in modo iterativo.
  • Modifica di un'immagine esistente.
  • Personalizzazione di un'immagine, di un diagramma o di un tema.

Vedere anche