Criar um aplicativo de chat do 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 gpt-35-turbo
implantado em uma conta do Azure OpenAI. 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 gpt-35-turbo
implantado em uma conta do Azure OpenAI. Siga estas etapas para provisionar o Azure OpenAI e saiba como usar o SDK do OpenAI do Azure .NET.
Pré-requisitos
- SDK do .NET 8.0 - Instale o SDK do .NET 8.0
- Uma assinatura do Azure - Crie uma gratuitamente
- CLI do Desenvolvedor do Azure - Instalar ou atualizar a CLI do Desenvolvedor do Azure
- Acesso ao serviço Azure OpenAI.
- No Windows, o PowerShell
v7+
é necessário. Para validar sua versão, executepwsh
em um terminal. Ele deve retornar a versão atual. Se retornar um erro, execute o seguinte comando:dotnet tool update --global PowerShell
.
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.
Clone o repositório: dotnet/ai-samples
A partir de um terminal ou prompt de comando, navegue até o diretório de inícios rápidos .
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 IConfiguration
arquivo .
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.
Experimentando o exemplo do HikerAI
- Em um terminal ou prompt de comando, navegue até o
semantic-kernel\02-HikerAI
diretório.
- Em um terminal ou prompt de comando, navegue até o
azure-openai-sdk\02-HikerAI
diretório.
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();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];
O AzureOpenAIChatCompletionService
serviço facilita as solicitações e respostas.
// == Create the Azure OpenAI Chat Completion Service ==========
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);
Depois que o AzureOpenAIChatCompletionService
serviço é criado, fornecemos mais contexto ao modelo adicionando um prompt do sistema. Isso instrui o modelo como você gostaria que ele agisse durante a conversa.
// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly.
You introduce yourself when first saying hello. When helping people out, you always ask them
for this information to inform the hiking recommendation you provide:
1. Where they are located
2. What hiking intensity they are looking for
You will then provide three suggestions for nearby hikes that vary in length after you get that information.
You will also share an interesting fact about the local nature on the hikes when making a recommendation.
""");
Em seguida, você pode adicionar uma mensagem de usuário ao modelo usando a AddUserMessage
função.
Para que o modelo gere uma resposta com base no prompt do sistema e na solicitação do usuário, use a GetChatMessageContentAsync
função.
// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");
// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
// Get response
var response = await service.GetChatMessageContentAsync(chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });
Para manter o histórico de bate-papo, certifique-se de adicionar a resposta do modelo.
// Add response to chat history
chatHistory.Add(response);
// Print Response to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
Personalize o prompt do sistema e a mensagem do usuário para ver como o modelo responde para ajudá-lo a encontrar uma caminhada que você vai gostar.
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
};
Depois que o OpenAIClient
cliente é criado, fornecemos mais contexto ao modelo adicionando um prompt do sistema. Isso instrui o modelo como você gostaria que ele agisse durante a conversa.
var systemPrompt =
"""
You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly.
You introduce yourself when first saying hello. When helping people out, you always ask them
for this information to inform the hiking recommendation you provide:
1. Where they are located
2. What hiking intensity they are looking for
You will then provide three suggestions for nearby hikes that vary in length after you get that information.
You will also share an interesting fact about the local nature on the hikes when making a recommendation.
""";
completionOptions.Messages.Add(new ChatRequestSystemMessage(systemPrompt));
Em seguida, você pode adicionar uma mensagem de usuário ao modelo usando a ChatRequestUserMessage
classe.
Para que o modelo gere uma resposta com base no prompt do sistema e na solicitação do usuário, use a GetChatCompletionsAsync
função.
string userGreeting = """
Hi!
Apparently you can help me find a hike that I will like?
""";
completionOptions.Messages.Add(new ChatRequestUserMessage(userGreeting));
Console.WriteLine($"\n\nUser >>> {userGreeting}");
ChatCompletions response = await openAIClient.GetChatCompletionsAsync(completionOptions);
ChatResponseMessage assistantResponse = response.Choices[0].Message;
Console.WriteLine($"\n\nAI >>> {assistantResponse.Content}");
completionOptions.Messages.Add(new ChatRequestAssisstantMessage(assistantResponse.Content));
Para manter o histórico ou o contexto do bate-papo, certifique-se de adicionar a resposta do modelo como um ChatRequestAssistantMessage
arquivo .
Personalize o prompt do sistema e a mensagem do usuário para ver como o modelo responde para ajudá-lo a encontrar uma caminhada que você vai gostar.
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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários