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
- SDK .NET 8.0 – Installer le SDK .NET 8.0
- Un abonnement Azure - En créer un gratuitement
- Azure Developer CLI – Installer ou mettre à jour l’interface de ligne de commande Azure Developer CLI
- Accès auprès d’Azure OpenAI Service.
- Sur Windows, PowerShell
v7+
est requis. Pour valider votre version, exécutezpwsh
dans un terminal. La version actuelle doit être rétablie. Si une erreur est retournée, exécutez la commande suivante :dotnet tool update --global PowerShell
.
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.
Clonez le référentiel : dotnet/ai-samples
À partir d’un terminal ou d’une invite de commandes, accédez au répertoire des démarrages rapides.
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
- À partir d’un terminal ou d’une invite de commandes, accédez au répertoire
semantic-kernel\05-HikeImages
.
- À partir d’un terminal ou d’une invite de commandes, accédez au répertoire
azure-openai-sdk\05-HikeImages
.
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de l’année 2024, nous abandonnerons progressivement le mécanisme de retour d’information GitHub Issues pour le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultez :Soumettre et afficher des commentaires pour