Exercício: Instalar o SDK do .NET para o OpenAI do Azure e criar seu primeiro aplicativo

Concluído

Agora que conseguimos entender os preenchimentos de texto e chat, vamos criar um aplicativo básico que usa esse recurso.

Você trabalha para uma organização que ajuda praticantes de caminhadas a explorar o ar livre recomendando trilhas. Você está pensando em adicionar uma IA de conversação ao recurso de recomendação e gostaria de criar um protótipo.

Você decidiu que precisa usar a API de Preenchimento de Chat fornecida pelo modelo GPT-35-Turbo.

Criar um recurso do OpenAI do Azure

A primeira etapa é criar o recurso do OpenAI do Azure e implantar o modelo. Nesse exercício vamos usar o modelo GPT-3 Turbo. Conforme observado na documentação, o GPT-3.5 Turbo usa uma API de Preenchimentos de Chat e é excelente para o nosso caso de uso.

Pré-requisitos

  • Uma assinatura do Azure

  • Acesso concedido ao OpenAI do Azure na assinatura pretendida

    No momento, o acesso a esse serviço é permitido somente por aplicativo. Você pode solicitar acesso ao Serviço OpenAI do Azure preenchendo o formulário em https://aka.ms/oai/access.

  • CLI do Azure instalada

Criar um recurso e implementar um modelo

Criar o recurso e implantar o modelo é um processo de várias etapas. Use a CLI do Azure, já que isso pode ser mais rápido do que usar o portal do Azure. Mas observe que você pode usar o portal do Azure, se quiser.

  1. Execute o comando az login para entrar, caso ainda não o tenha feito.

  2. Ao criar um novo recurso do Azure, você tem a opção de criar um novo grupo de recursos ou usar um grupo existente. Esse comando mostra como criar um novo grupo de recursos. Usamos o nome HikingConversations-RG, mas você pode substituir por um nome de sua escolha ou usar o nome de um grupo existente.

    az group create \
    --name HikingConversations-RG \
    --location eastus
    
    az group create `
    --name HikingConversations-RG `
    --location eastus
    
  3. Execute o comando a seguir para criar um recurso do OpenAI no novo grupo de recursos HikingConversations-RG. Dê ao recurso do OpenAI o nome HikingConversationsAI.

    az cognitiveservices account create \
    -n HikingConversationsAI \
    -g HikingConversations-RG \
    -l eastus \
    --kind OpenAI \
    --sku s0
    
    az cognitiveservices account create `
    -n HikingConversationsAI `
    -g HikingConversations-RG `
    -l eastus `
    --kind OpenAI `
    --sku s0
    
  4. Em seguida, queremos implantar o modelo GPT-35-Turbo no recurso do OpenAI que criamos. Chame a implantação de modelo HikingRecommendationTurbo. Observe que estamos usando HikingConversations-RG como o nome do grupo de recursos e HikingConversationsAI como o nome do recurso do OpenAI. Se você usou valores diferentes, certifique-se de substitui-los.

    az cognitiveservices account deployment create \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --deployment-name HikingRecommendationTurbo \
    --model-name gpt-35-turbo \
    --model-version "0301" \
    --model-format OpenAI \
    --scale-settings-scale-type "Standard"
    
    az cognitiveservices account deployment create `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --deployment-name HikingRecommendationTurbo `
    --model-name gpt-35-turbo `
    --model-version "0301" `
    --model-format OpenAI `
    --scale-settings-scale-type "Standard"
    
  5. Após o recurso e o modelo terem sido criados, precisamos obter o URL básico e as chaves de acesso para que o SDK do .NET possa acessar o recurso do OpenAI do Azure. Use esses comandos para obter o ponto de extremidade e as chaves de API primárias e anote-os para uso posterior:

    O ponto de extremidade

    az cognitiveservices account show \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "properties.endpoint"
    
    az cognitiveservices account show `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "properties.endpoint"
    

    A chave de API primária

    az cognitiveservices account keys list \
    -g HikingConversations-RG \
    -n HikingConversationsAI \
    --query "key1"
    
    az cognitiveservices account keys list `
    -g HikingConversations-RG `
    -n HikingConversationsAI `
    --query "key1"
    

Criar o aplicativo de console e adicionar o SDK do OpenAI

Em seguida, vamos querer criar um aplicativo de console .NET despojado e adicionar o SDK do OpenAI do Azure.

  1. Execute o seguinte para criar um novo aplicativo .NET chamado HikingConversationsAI.

    dotnet new console -n HikingConversationsAI
    
  2. Alterne para o diretório do HikingConversationsAI recém-criado.

    cd HikingConversationsAI
    
  3. Em seguida, adicione o SDK do Open AI do Azure.

    dotnet add package Azure.AI.OpenAI --prerelease
    
  4. Abra o projeto no VS Code ou no Visual Studio.

  5. No arquivo Program.cs, apague todo o código existente.

  6. Adicione using Azure.AI.OpenAI; na parte superior do Program.cs.

  7. Adicione using Azure; na parte superior do Program.cs.

  8. Adicione três variáveis de nível de classe que contenham referências ao ponto de extremidade do recurso do OpenAI do Azure, à chave de API primária e ao nome do modelo que você implantou.

    string openAIEndpoint = "<YOUR ENDPOINT URL VALUE>";
    string openAIAPIKey = "<YOUR PRIMARY API KEY VALUE>";
    string openAIDeploymentName = "HikingRecommendationTurbo";
    

    Nas etapas acima, demos à implantação o nome HikingRecommendationTurbo. Se você usou um valor diferente, certifique-se de usá-lo alternativamente.

  9. Para terminar, crie uma instância da classe necessária para se comunicar com o recurso do OpenAI do Azure.

    var endpoint = new Uri(openAIEndpoint);
    var credentials = new AzureKeyCredential(openAIAPIKey);
    var openAIClient = new AzureOpenAIClient(endpoint, credentials);
    

Criar o prompt do sistema

Vamos criar o prompt de função inicial do sistema, que fornecerá as instruções iniciais para o modelo.

  1. Primeiro, crie um prompt que ensine ao modelo como você gostaria que ele atuasse durante a conversa ao recomendar caminhadas.

    var systemPrompt = 
    """
    You are a hiking enthusiast who helps people discover fun hikes. You are upbeat and friendly. 
    You ask people what type of hikes they like to take and then suggest some.
    """;
    
  2. Em seguida, crie uma List<ChatMessage> para armazenar todas as mensagens que serão trocadas com o modelo.

    List<ChatMessage> chatHistory = new();
    
  3. Em seguida, crie um novo objeto SystemChatMessage e o adicione à lista de chatHistory. Vamos configurar a ChatMessage para ser proveniente da função do Sistema.

    SystemChatMessage systemMessage = ChatMessage.CreateSystemMessage(systemPrompt);
    
    chatHistory.Add(systemMessage);
    

Iniciar a conversa

Em seguida, vamos enviar a primeira mensagem para o modelo, iniciando a conversa.

  1. Crie um prompt para o usuário e o adicione às chatHistory como uma mensagem de usuário.

    string userGreeting = """
    Hi there hiking recommendation bot! 
    Can't wait to hear what you have in store for me!
    """;
    
    UserChatMessage userGreetingMessage = ChatMessage.CreateUserMessage(userGreeting);
    chatHistory.Add(userGreetingMessage);
    
    Console.WriteLine($"User >>> {userGreeting}");
    
  2. Agora, você vai precisar obter uma referência ao objeto ChatClient. Esse objeto é responsável por facilitar as conversas de chat com o modelo. Assim, você vai precisar informar ao objeto Cliente do OpenAI do Azure qual modelo implantado por você gostaria de usar.

    var chatClient = openAIClient.GetChatClient(openAIDeploymentName);
    
  3. Em seguida, chame a função CompleteChatAsync da classe ChatClient sendo repassada no chatHistory.

    var response = await chatClient.CompleteChatAsync(chatHistory);
    
  4. Para terminar, leia em voz alta o valor retornado pelo modelo.

    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  5. Vamos ver o que temos até agora; você pode executar o aplicativo digitando dotnet run no terminal.

  6. Experimente alterar o valor da userGreetingMessage para ver como o modelo poderá responder de forma diferente.

Em um exemplo de execução, recebemos o seguinte:

Hello! Great to hear from you. What type of hikes are you interested in? Do you enjoy easy scenic walks, challenging trails, or something in between? Do you prefer hikes with waterfalls, mountain views, or unique geological formations?

Você poderá receber algo diferente porque o modelo não é determinístico, ou talvez possa produzir uma saída diferente até mesmo com a mesma entrada.

Continuando a conversa

Vamos continuar respondendo à conversa e, em seguida, gerando a resposta.

  1. Certifique-se de manter o contexto da conversa; para isso, adicione a resposta que voltou diretamente para a lista de chatHistory.

    var assistantMessage = ChatMessage.CreateAssistantMessage(response.Value.Content.Last().Text);
    
    chatHistory.Add(assistantMessage); 
    
  2. Em seguida, crie um outro prompt de usuário e o envie para o modelo.

    var hikeRequest = 
    """
    I would like a strenuous hike near where I live that ends with
    a view that is amazing.
    """;
    
    Console.WriteLine($"User >>> {hikeRequest}");
    
    UserChatMessage hikeMessage = ChatMessage.CreateUserMessage(hikeRequest);
    
    chatHistory.Add(hikeMessage);
    
    response = await chatClient.CompleteChatAsync(chatHistory); 
    
    Console.WriteLine($"AI >>> {response.Value.Content.Last().Text}");
    
  3. Você pode experimentar alterar a variável hikeRequest para solicitar tipos diferentes de caminhadas. Em um exemplo de execução, recebemos o seguinte:

    Great choice! If you're up for a challenge, I recommend checking out the hike to Poo Poo Point in Issaquah, Washington. The hike is 7.2 miles roundtrip, with an elevation gain of 1,858 feet, so it's definitely a workout. But the stunning views of Mount Rainier and the Cascade Mountains make it all worthwhile. Plus, you'll get to see paragliders taking off from Poo Poo Point. It's a popular hike, so I recommend going early to avoid crowds. Let me know if you need more information!
    

Resumo

Agora podemos usar o SDK do OpenAI do Azure junto com o modelo do gpt-35-turbo para criar conversas que ajudem a fornecer recomendações de caminhadas. Em seguida, vamos ver o que podemos fazer para aprimorar os prompts que enviamos para o modelo.