Partilhar via


Gerar imagens usando o Azure AI com .NET

Comece a usar o Kernel Semântico criando um aplicativo de bate-papo simples do console .NET 8. O aplicativo será executado localmente e usará o modelo OpenAI dell-e-3 para gerar cartão postal e convidar seus amigos para uma caminhada! Siga estas etapas para provisionar o Azure OpenAI e saiba como usar o Kernel Semântico.

Comece a usar o SDK do OpenAI do Azure .NET criando um aplicativo de chat de console simples do .NET 8. O aplicativo será executado localmente e usará o modelo OpenAI dell-e-3 para gerar cartão postal e convidar seus amigos para uma caminhada! Siga estas etapas para provisionar o Azure OpenAI e saiba como usar o SDK do OpenAI do Azure .NET.

Pré-requisitos

Implantar os recursos do Azure

Certifique-se de seguir os Pré-requisitos para ter acesso ao Serviço OpenAI do Azure, bem como à CLI do Desenvolvedor do Azure e, em seguida, siga o guia a seguir para começar com o aplicativo de exemplo.

  1. Clone o repositório: dotnet/ai-samples

  2. A partir de um terminal ou prompt de comando, navegue até o diretório de inícios rápidos .

  3. Isso provisiona os recursos do Azure OpenAI. Pode levar vários minutos para criar o serviço Azure OpenAI e implantar o modelo.

    azd up
    

Nota

Se você já tiver um serviço OpenAI do Azure disponível, poderá ignorar a implantação e usar esse valor no Program.cs, de preferência a partir de um IConfigurationarquivo .

Resolver problemas

No Windows, você pode receber as seguintes mensagens de erro após a execução azd up:

postprovision.ps1 não está assinado digitalmente. O script não será executado no sistema

O script postprovision.ps1 é executado para definir os segredos de usuário do .NET usados no aplicativo. Para evitar esse erro, execute o seguinte comando do PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Em seguida, execute novamente o azd up comando.

Outro erro possível:

'pwsh' não é reconhecido como um comando interno ou externo, programa operável ou ficheiro batch. AVISO: O gancho 'postprovision' falhou com o código de saída: '1', Caminho: '.\infra\post-script\postprovision.ps1'. : código de saída: 1 A execução continuará desde que ContinueOnError tenha sido definido como true.

O script postprovision.ps1 é executado para definir os segredos de usuário do .NET usados no aplicativo. Para evitar esse erro, execute manualmente o script usando o seguinte comando do PowerShell:

.\infra\post-script\postprovision.ps1

Os aplicativos de IA .NET agora têm os segredos do usuário configurados e podem ser testados.

Tentando gerar amostra de imagens de caminhada

  1. Em um terminal ou prompt de comando, navegue até o semantic-kernel\05-HikeImages diretório.
  1. Em um terminal ou prompt de comando, navegue até o azure-openai-sdk\05-HikeImages diretório.
  1. Agora é hora de experimentar o aplicativo de console. Digite o seguinte para executar o aplicativo:

    dotnet run
    

    Se você receber uma mensagem de erro, os recursos do Azure OpenAI podem não ter concluído a implantação. Aguarde alguns minutos e tente novamente.

Compreender o código

Nosso aplicativo usa o Microsoft.SemanticKernel pacote, que está disponível no NuGet, para enviar e receber solicitações para um serviço OpenAI do Azure implantado no Azure.

Todo o aplicativo está contido no arquivo Program.cs . As primeiras linhas de código carregam segredos e valores de configuração que foram definidos no dotnet user-secrets para você durante o provisionamento do aplicativo.

// == 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"];

O AzureOpenAITextToImageService serviço facilita as solicitações e respostas.

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

Depois que o textToImageService serviço é criado, fornecemos mais contexto ao modelo adicionando um prompt do sistema. Um bom prompt para gerar imagens requer uma descrição clara: o que está nas imagens, cor específica para usar, estilo (desenho, pintura, realista ou cartoony). O modelo usará esse prompt para gerar a imagem. Para que o modelo gere uma resposta com base na solicitação do usuário, use a GenerateImageAsync função e especifique o tamanho e a qualidade.

// 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}");

Personalize o prompt para personalizar as imagens geradas pelo modelo.

Compreender o código

Nosso aplicativo usa o SDK do Azure.AI.OpenAI cliente, que está disponível no NuGet, para enviar e receber solicitações para um serviço OpenAI do Azure implantado no Azure.

Todo o aplicativo está contido no arquivo Program.cs . As primeiras linhas de código carregam segredos e valores de configuração que foram definidos no dotnet user-secrets para você durante o provisionamento do aplicativo.

// == 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);

A OpenAIClient classe facilita as solicitações e respostas. ChatCompletionOptions Especifica parâmetros de como o modelo responderá.

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
};

Uma vez que o OpenAIClient cliente é criado, fornecemos mais contexto para o modelo adicionando um prompt do sistema. Um bom prompt para gerar imagens requer uma descrição clara: o que está nas imagens, cor específica para usar, estilo (desenho, pintura, realista ou cartoony). O modelo usará esse prompt para gerar a imagem.

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!'
""";

Para que o modelo gere uma resposta com base na solicitação do usuário, use a GetImageGenerationsAsync função e especifique o tamanho e a qualidade.

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}");

Personalize o prompt para personalizar as imagens geradas pelo modelo.

Clean up resources (Limpar recursos)

Quando você não precisar mais do aplicativo ou recursos de exemplo, remova a implantação correspondente e todos os recursos.

azd down

Próximos passos