Exercício: encaminhar a intenção do usuário

Concluído

Neste exercício, você detecta a intenção do usuário e roteia a conversa para os plug-ins desejados. Você pode usar um plug-in fornecido para recuperar a intenção do usuário. Vamos começar!

  1. Atualize o arquivo Program.cs pelo seguinte código:

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    
    

    Nesse código, você usa o prompt GetIntent para detectar a intenção do usuário. Em seguida, você armazena a intenção em uma variável chamada intent. Em seguida, você roteia a intenção para o plug-in CurrencyConverter.

  2. Adicione o seguinte código ao seu arquivo Program.cs:

    switch (intent) {
        case "ConvertCurrency": 
            var currencyText = await kernel.InvokeAsync<string>(
                prompts["GetTargetCurrencies"], 
                new() {{ "input",  input }}
            );
            var currencyInfo = currencyText!.Split("|");
            var result = await kernel.InvokeAsync("CurrencyConverter", 
                "ConvertAmount", 
                new() {
                    {"targetCurrencyCode", currencyInfo[0]}, 
                    {"baseCurrencyCode", currencyInfo[1]},
                    {"amount", currencyInfo[2]}, 
                }
            );
            Console.WriteLine(result);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    O plug-in GetIntent retorna os seguintes valores: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Você usa uma instrução switch para rotear a intenção do usuário para o plug-in apropriado.

    Se a intenção do usuário for converter moeda, use o prompt GetTargetCurrencies para recuperar as informações de moeda. Em seguida, você usa o plug-in CurrencyConverter para converter o valor.

    Em seguida, adicione alguns casos para lidar com as outras intenções. Por enquanto, vamos usar o recurso de chamada automática de função do SDK do Kernel Semântico para rotear a intenção para os plug-ins disponíveis.

  3. Crie a configuração de chamada automática de função adicionando o seguinte código ao arquivo Program.cs:

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    OpenAIPromptExecutionSettings settings = new()
    {
        ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
    };
    
    Console.WriteLine("What would you like to do?");
    var input = Console.ReadLine();
    var intent = await kernel.InvokeAsync<string>(
        prompts["GetIntent"], 
        new() {{ "input",  input }}
    );
    

    Em seguida, adicione casos à instrução de alternância para as outras intenções.

  4. Atualize o arquivo Program.cs pelo seguinte código:

    switch (intent) {
        case "ConvertCurrency": 
            // ...Code you entered previously...
            break;
        case "SuggestDestinations":
        case "SuggestActivities":
        case "HelpfulPhrases":
        case "Translate":
            var autoInvokeResult = await kernel.InvokePromptAsync(input!, new(settings));
            Console.WriteLine(autoInvokeResult);
            break;
        default:
            Console.WriteLine("Other intent detected");
            break;
    }
    

    Neste código, você usa a configuração AutoInvokeKernelFunctions para chamar automaticamente funções e prompts que são referenciados em seu kernel. Se a intenção do usuário é converter moeda, o plug-in CurrencyConverter executa sua tarefa.

    Se a intenção do usuário for obter sugestões de destino ou atividade, traduzir uma frase ou obter frases úteis em um idioma, a configuração AutoInvokeKernelFunctions chamará automaticamente os plug-ins existentes que foram incluídos no código do projeto.

    Você também pode adicionar código para executar a entrada do usuário como um prompt para o modelo de linguagem grande (LLM) se ele não se enquadrar em nenhum desses casos de intenção.

  5. Atualize o caso padrão com o seguinte código:

    default:
        Console.WriteLine("Sure, I can help with that.");
        var otherIntentResult = await kernel.InvokePromptAsync(input!, new(settings));
        Console.WriteLine(otherIntentResult);
        break;
    

    Agora, se o usuário tiver uma intenção diferente, o LLM poderá lidar com a solicitação do usuário. Vamos experimentar!

Verifique seu trabalho

Nesta tarefa, execute seu aplicativo e verifique se o código está funcionando corretamente.

  1. Insira dotnet run no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:

    What would you like to do?
    How many TTD is 50 Qatari Riyals?    
    
  2. Você deverá ver uma saída semelhante à seguinte resposta:

    $50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
    
  3. Insira dotnet run no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:

    What would you like to do?
    I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
    
  4. Você deverá ver uma saída semelhante à seguinte resposta:

    Based on your preferences for warm sunny beaches and delicious, spicy food, I have a few destination recommendations for you:
    
    1. Thailand: Known for its stunning beaches, Thailand offers a perfect combination of relaxation and adventure. You can visit popular beach destinations like Phuket, Krabi, or Koh Samui, where you'll find crystal-clear waters and white sandy shores. Thai cuisine is famous for its spiciness, so you'll have plenty of mouthwatering options to try, such as Tom Yum soup, Pad Thai, and Green Curry.
    
    2. Mexico: Mexico is renowned for its beautiful coastal regions and vibrant culture. You can explore destinations like Cancun, Playa del Carmen, or Tulum, which boast stunning beaches along the Caribbean Sea. Mexican cuisine is rich in flavors and spices, offering a wide variety of dishes like tacos, enchiladas, and mole sauces that will satisfy your craving for spicy food.
    
    ...
    
    These destinations offer a perfect blend of warm sunny beaches and delicious, spicy food, ensuring a memorable trip for you. Let me know if you need any further assistance or if you have any specific preferences for your trip!
    
  5. Insira dotnet run no terminal. Quando solicitado, insira algum texto semelhante ao seguinte prompt:

    What would you like to do?
    Can you give me a recipe for chicken satay?
    
    
  6. Você deverá ver uma resposta semelhante à seguinte:

    Sure, I can help with that.
    Certainly! Here's a recipe for chicken satay:
    
    ...
    

    A intenção deve ser encaminhada para o seu caso padrão, e o LLM deve lidar com o pedido de uma receita de satay de frango, que delícia!

    Observação

    Se o código não produzir a saída esperada, você poderá revisar o código na pasta Solução.

Em seguida, vamos modificar a lógica de roteamento para fornecer algum histórico de conversas para determinados plug-ins. O fornecimento de histórico permite que os plug-ins recuperem respostas contextualmente relevantes às solicitações do usuário.