演習 - ユーザーの意図をルーティングする

完了

この演習では、ユーザーの意図を検出し、望ましいプラグインに会話をルーティングします。 提供されたプラグインを使用して、ユーザーの意図を取得できます。 それでは作業を始めましょう。

  1. 次のコードを使用して、Program.cs ファイルを更新してください。

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

    このコードでは、GetIntent プロンプトを使用してユーザーの意図を検出します。 次に、意図を intent という変数に保存します。 次に、意図を CurrencyConverter プラグインにルーティングします。

  2. 次のコードを 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;
    }
    

    GetIntent プラグインにより、次の値が返されます。ConvertCurrency、SuggestDestinations、SuggestActivities、Translate、HelpfulPhrases、Unknown。 switch ステートメントを使用して、ユーザーの意図を適切なプラグインにルーティングします。

    ユーザーの意図が通貨の変換の場合は、GetTargetCurrencies プロンプトを使用して通貨情報を取得します。 その後、CurrencyConverter プラグインを使用して金額を変換します。

    次に、他の意図を処理するいくつかのケースを追加します。 ここでは、Semantic Kernel SDK の自動関数呼び出し機能を使用して、使用可能なプラグインに意図をルーティングしてみましょう。

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

    次に、他の意図の switch ステートメントにケースを追加します。

  4. 次のコードを使用して、Program.cs ファイルを更新してください。

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

    このコードでは、AutoInvokeKernelFunctions 設定を使用して、カーネルで参照されている関数とプロンプトを自動的に呼び出します。 ユーザーの意図が通貨の変換の場合、CurrencyConverter プラグインがそのタスクを実行します。

    ユーザーの意図が目的地またはアクティビティの提案の取得、フレーズの翻訳、ある言語での役に立つフレーズの取得の場合、AutoInvokeKernelFunctions 設定によりプロジェクト コードに含まれていた既存のプラグインが自動的に呼び出されます。

    これらの意図のいずれのケースにも該当しない場合は、ユーザーの入力を大規模言語モデル (LLM) へのプロンプトとして実行するコードを追加することもできます。

  5. 既定のケースを以下のコードに置き換えてください。

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

    ユーザーが別の意図を持っている場合、LLM はユーザーの要求を処理できます。 試してみましょう。

作業の確認

このタスクでは、アプリケーションを実行し、コードが正しく機能することを確認します。

  1. ターミナルで「dotnet run」と入力します。 ダイアログが表示されたら、次のプロンプトのようなテキストを入力してください。

    What would you like to do?
    How many TTD is 50 Qatari Riyals?    
    
  2. 次の応答のような出力が表示されます。

    $50 QAR is approximately $93.10 in Trinidadian Dollars (TTD)
    
  3. ターミナルで「dotnet run」と入力します。 ダイアログが表示されたら、次のプロンプトのようなテキストを入力してください。

    What would you like to do?
    I want to go somewhere that has lots of warm sunny beaches and delicious, spicy food!
    
  4. 次の応答のような出力が表示されます。

    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. ターミナルで「dotnet run」と入力します。 ダイアログが表示されたら、次のプロンプトのようなテキストを入力してください。

    What would you like to do?
    Can you give me a recipe for chicken satay?
    
    
  6. 次の応答のような応答が表示されます。

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

    意図はデフォルトのケースにルーティングされ、LLM によりチキン サテのレシピの要求が処理されるはずです。

    Note

    コードが期待した出力を生成しない場合は、Solution フォルダー内のコードを確認します。

次に、特定のプラグインに会話履歴を提供するようにルーティング ロジックを変更しましょう。 履歴を提供すると、プラグインはユーザーの要求に対するよりコンテキストに関連した応答を取得できます。