Ejercicio: Enrutamiento de la intención del usuario

Completado

En este ejercicio, detectará la intención del usuario y enrutará la conversación hacia los complementos que desee. Puede usar un complemento proporcionado para recuperar la intención del usuario. Comencemos.

  1. Actualice el archivo Program.cs con el código siguiente:

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

    En este código, usará la solicitud de GetIntent para detectar la intención del usuario. Después almacenará la intención en una variable llamada intent. A continuación, enruta la intención a su complemento CurrencyConverter.

  2. Agregue el siguiente código al archivo 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;
    }
    

    El complemento GetIntent devuelve los siguientes valores: ConvertCurrency, SuggestDestinations, SuggestActivities, Translate, HelpfulPhrases, Unknown. Usa una instrucción switch para enrutar la intención del usuario al complemento apropiado.

    Si la intención del usuario es convertir moneda, usa la solicitud de GetTargetCurrencies para recuperar la información de la moneda. Después usará el complemento CurrencyConverter para convertir el importe.

    A continuación, agregará algunos casos para controlar las demás intenciones. Por ahora, vamos a usar la capacidad de llamada de función automática del SDK de Semantic Kernel para enrutar la intención a los complementos disponibles.

  3. Cree la configuración de llamada de función automática añadiendo el siguiente código a su archivo 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 }}
    );
    

    A continuación, agregue casos a las instrucciones del conmutador para las otras intenciones.

  4. Actualice el archivo Program.cs con el código siguiente:

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

    En este código, usa la configuración de AutoInvokeKernelFunctions para llamar automáticamente a las funciones y solicitudes que están referenciadas en su kernel. Si la intención del usuario es convertir divisas, el complemento CurrencyConverter realiza su tarea.

    Si la intención del usuario es obtener sugerencias de destinos o actividades, traducir una frase u obtener frases útiles en un idioma, la configuración de AutoInvokeKernelFunctions llama automáticamente a los complementos existentes que se incluyeron en el código del proyecto.

    También puede agregar código para ejecutar la entrada del usuario como una solicitud al modelo de lenguaje de gran tamaño (LLM) si no entra en ninguno de estos casos de intención.

  5. Actualice el caso predeterminado con el código siguiente:

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

    Ahora, si el usuario tiene una intención diferente, el LLM puede controlar la solicitud del usuario. ¡Pruébelo!

Comprobar el trabajo

En esta tarea, ejecute su aplicación y verifique que su código funciona correctamente.

  1. Escriba dotnet run en el terminal. Cuando se le solicite, escriba un texto similar a la siguiente solicitud:

    What would you like to do?
    How many TTD is 50 Qatari Riyals?    
    
  2. Debería ver una salida similar a la siguiente respuesta:

    $50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
    
  3. Escriba dotnet run en el terminal. Cuando se le solicite, escriba un texto similar a la siguiente solicitud:

    What would you like to do?
    I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
    
  4. Debería ver una salida similar a la siguiente respuesta:

    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. Escriba dotnet run en el terminal. Cuando se le solicite, escriba un texto similar a la siguiente solicitud:

    What would you like to do?
    Can you give me a recipe for chicken satay?
    
    
  6. Debería ver una respuesta similar a la siguiente:

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

    La intención debería estar enrutada a su caso predeterminado y el LLM debería controlar la solicitud de una receta de pollo satay, ¡qué delicioso!

    Nota:

    Si el código no genera la salida esperada, puede revisar el código en la carpeta Solución.

A continuación, modifiquemos la lógica de enrutamiento para proporcionar un historial de conversaciones a determinados complementos. Proporcionar el historial permite a los complementos recuperar respuestas más relevantes desde el punto de vista contextual a las solicitudes del usuario.