Partage via


Générer des images à l’aide d’Azure AI avec .NET

Prenez en main Semantic Kernel en créant une application de conversation de console .NET 8 simple. L’application s’exécute localement et utilise le modèle OpenAI dell-e-3 pour générer une carte postale et inviter vos amis à faire une randonnée ! Suivez ces étapes pour approvisionner Azure OpenAI et apprendre à utiliser Semantic Kernel.

Commencez à utiliser le kit de développement logiciel (SDK) .NET Azure OpenAI en créant une application de conversation console .NET 8 simple. L’application s’exécute localement et utilise le modèle OpenAI dell-e-3 pour générer une carte postale et inviter vos amis à faire une randonnée ! Suivez ces étapes pour approvisionner Azure OpenAI et apprendre à utiliser le kit de développement logiciel (SDK) .NET Azure OpenAI.

Prérequis

Déployer les ressources Azure

Vérifiez que vous suivez les conditions préalables pour avoir accès à Azure OpenAI Service, ainsi qu’à l’interface Azure Developer CLI, puis étudiez le guide suivant pour vous lancer avec l’exemple d’application.

  1. Clonez le référentiel : dotnet/ai-samples

  2. À partir d’un terminal ou d’une invite de commandes, accédez au répertoire des démarrages rapides.

  3. Cela approvisionne les ressources Azure OpenAI. La création du service Azure OpenAI et le déploiement du modèle peuvent prendre plusieurs minutes.

    azd up
    

Remarque

Si vous disposez déjà d’un service Azure OpenAI, vous pouvez ignorer le déploiement et utiliser cette valeur dans le Program.cs, de préférence à partir de IConfiguration.

Résolution des problèmes

Sur Windows, vous risquez d’obtenir les messages d’erreur suivants après avoir exécuté azd up :

postprovision.ps1 n’est pas signé numériquement. Le script ne s’exécute pas sur le système

Le script postprovision.ps1 est exécuté pour définir les secrets utilisateur .NET utilisés dans l’application. Pour éviter cette erreur, exécutez la commande PowerShell suivante :

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Réexécutez ensuite la commande azd up.

Autre erreur possible :

« pwsh » n’est pas reconnu comme commande interne ou externe, programme exécutable ou fichier batch. AVERTISSEMENT : échec du hook « postprovision » avec le code de sortie : « 1 ». Chemin d’accès : « .\infra\post-script\postprovision.ps1 ». : code de sortie : 1. L’exécution continue puisque ContinueOnError est défini sur true.

Le script postprovision.ps1 est exécuté pour définir les secrets utilisateur .NET utilisés dans l’application. Pour éviter cette erreur, exécutez manuellement le script à l’aide de la commande PowerShell suivante :

.\infra\post-script\postprovision.ps1

Les applications d’IA .NET disposent désormais des secrets utilisateur configurés et peuvent être testées.

Exemple d’essai de génération d’images de randonnée

  1. À partir d’un terminal ou d’une invite de commandes, accédez au répertoire semantic-kernel\05-HikeImages.
  1. À partir d’un terminal ou d’une invite de commandes, accédez au répertoire azure-openai-sdk\05-HikeImages.
  1. Il est maintenant temps d’essayer l’application console. Tapez ce qui suit pour exécuter l’application :

    dotnet run
    

    Si vous recevez un message d’erreur, les ressources Azure OpenAI n’ont peut-être pas terminé le déploiement. Attendez quelques minutes et réessayez.

Présentation du code

Notre application utilise le package Microsoft.SemanticKernel, disponible sur NuGet, pour envoyer et recevoir des requêtes à un service Azure OpenAI déployé dans Azure.

Toute l’application est contenue dans le fichier Program.cs. Les premières lignes de code chargent les secrets et les valeurs de configuration qui ont été définis pour vous dans le dotnet user-secrets pendant l’approvisionnement de l’application.

// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

Le service AzureOpenAITextToImageService facilite les requêtes et les réponses.

AzureOpenAITextToImageService textToImageService = new(deployment, endpoint, key, null);

Une fois le service textToImageService créé, nous fournissons davantage de contexte au modèle en ajoutant une invite système. Une bonne invite de génération d’images nécessite une description claire avec : ce qui se trouve dans les images, la couleur spécifique à utiliser, le style (dessin, peinture, réaliste ou dessin animé). Le modèle utilise cette invite pour générer l’image. Pour que le modèle génère une réponse basée sur la demande de l’utilisateur, utilisez la fonction GenerateImageAsync et spécifiez la taille et la qualité.

// Generate the image
string imageUrl = await textToImageService.GenerateImageAsync("""
    A postal card with an happy hiker waving and a beautiful mountain in the background.
    There is a trail visible in the foreground.
    The postal card has text in red saying: 'You are invited for a hike!'
    """, 1024, 1024);
Console.WriteLine($"The generated image is ready at:\n{imageUrl}");

Personnalisez l’invite pour personnaliser les images générées par le modèle.

Présentation du code

Notre application utilise le SDK client Azure.AI.OpenAI, disponible sur NuGet, pour envoyer et recevoir des demandes à un service Azure OpenAI déployé dans Azure.

Toute l’application est contenue dans le fichier Program.cs. Les premières lignes de code chargent les secrets et les valeurs de configuration qui ont été définis pour vous dans le dotnet user-secrets pendant l’approvisionnement de l’application.

// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

string openAIEndpoint = config["AZURE_OPENAI_ENDPOINT"];
string openAIDeploymentName = config["AZURE_OPENAI_GPT_NAME"];
string openAiKey = config["AZURE_OPENAI_KEY"];

// == Creating the AIClient ==========
var endpoint = new Uri(openAIEndpoint);
var credentials = new AzureKeyCredential(openAiKey);

La classe OpenAIClient facilite les requêtes et les réponses. ChatCompletionOptions spécifie les paramètres définissant la façon dont le modèle répond.

var openAIClient = new OpenAIClient(endpoint, credentials);

var completionOptions = new ChatCompletionsOptions
{
    MaxTokens = 400,
    Temperature = 1f,
    FrequencyPenalty = 0.0f,
    PresencePenalty = 0.0f,
    NucleusSamplingFactor = 0.95f, // Top P
    DeploymentName = openAIDeploymentName
};

Une fois le client OpenAIClient créé, nous fournirons davantage de contexte au modèle en ajoutant une invite système. Une bonne invite de génération d’images nécessite une description claire avec : ce qui se trouve dans les images, la couleur spécifique à utiliser, le style (dessin, peinture, réaliste ou dessin animé). Le modèle utilise cette invite pour générer l’image.

string imagePrompt = """
A postal card with an happy hiker waving, there a beautiful mountain in the background.
There is a trail visible in the foreground. 
The postal card has text in red saying: 'You are invited for a hike!'
""";

Pour que le modèle génère une réponse basée sur la demande de l’utilisateur, utilisez la fonction GetImageGenerationsAsync et spécifiez la taille et la qualité.

Response<ImageGenerations> response = await openAIClient.GetImageGenerationsAsync(
    new ImageGenerationOptions()
    {
        DeploymentName = openAIDalleName,
        Prompt = imagePrompt,
        Size = ImageSize.Size1024x1024,
        Quality = ImageGenerationQuality.Standard
    });

ImageGenerationData generatedImage = response.Value.Data[0];
if (!string.IsNullOrEmpty(generatedImage.RevisedPrompt))
{
    Console.WriteLine($"\n\nInput prompt automatically revised to:\n {generatedImage.RevisedPrompt}");
}
Console.WriteLine($"\n\nThe generated image is ready at:\n {generatedImage.Url.AbsoluteUri}");

Personnalisez l’invite pour personnaliser les images générées par le modèle.

Nettoyer les ressources

Lorsque vous n’avez plus besoin de l’exemple d’application ou de ressources, supprimez le déploiement correspondant et toutes les ressources.

azd down

Étapes suivantes