演習 - コンテキスト キューを提供する
この演習では、会話履歴を使って、大規模言語モデル (LLM) にコンテキストを提供します。 また、実際のチャットボットと同様に、ユーザーが会話を続けられるようにコードを調整します。 それでは作業を始めましょう。
do
-while
ループを使ってユーザーによる入力を受け入れるようにコードを変更します。string input; do { Console.WriteLine("What would you like to do?"); input = Console.ReadLine(); // ... } while (!string.IsNullOrWhiteSpace(input));
これで、ユーザーが空白行を入力するまで会話を続けることができます。
SuggestDestinations
ケースを変更して、ユーザーの旅行に関する詳細をキャプチャします。case "SuggestDestinations": chatHistory.AppendLine("User:" + input); var recommendations = await kernel.InvokePromptAsync(input!); Console.WriteLine(recommendations); break;
次のコードにより、
SuggestActivities
ケースで旅行の詳細を使います。case "SuggestActivities": var chatSummary = await kernel.InvokeAsync( "ConversationSummaryPlugin", "SummarizeConversation", new() {{ "input", chatHistory.ToString() }}); break;
このコードでは、組み込みの
SummarizeConversation
関数を使って、ユーザーとのチャットを要約します。 次に、要約を使って、目的地でのアクティビティを提案しましょう。次のコードを使って、
SuggestActivities
ケースを拡張します。var activities = await kernel.InvokePromptAsync( input, new () { {"input", input}, {"history", chatSummary}, {"ToolCallBehavior", ToolCallBehavior.AutoInvokeKernelFunctions} }); chatHistory.AppendLine("User:" + input); chatHistory.AppendLine("Assistant:" + activities.ToString()); Console.WriteLine(activities); break;
このコードでは、カーネル引数として
input
とchatSummary
を追加します。 その後、カーネルはプロンプトを呼び出して、SuggestActivities
プラグインにルーティングします。 また、ユーザーの入力とアシスタントの応答をチャット履歴に追加して、結果を表示します。 次に、chatSummary
変数をSuggestActivities
プラグインに追加する必要があります。Prompts/SuggestActivities/config.json に移動し、Visual Studio Code でファイルを開きます
input_variables
の下に、チャット履歴の変数を追加します。"input_variables": [ { "name": "history", "description": "Some background information about the user", "required": false }, { "name": "destination", "description": "The destination a user wants to visit", "required": true } ]
Prompts/SuggestActivities/skprompt.txt に移動してファイルを開きます
チャット履歴を使うためのプロンプトを追加します。
You are an experienced travel agent. You are helpful, creative, and very friendly. Consider the traveler's background: {{$history}}
プロンプトの残りの部分はそのままにしておきます。 これで、プラグインはチャット履歴を使って LLM にコンテキストを提供するようになります。
作業の確認
このタスクでは、アプリケーションを実行し、コードが正しく機能することを確認します。
更新したスイッチ ケースを次のコードと比較します。
case "SuggestDestinations": chatHistory.AppendLine("User:" + input); var recommendations = await kernel.InvokePromptAsync(input!); Console.WriteLine(recommendations); break; case "SuggestActivities": var chatSummary = await kernel.InvokeAsync( "ConversationSummaryPlugin", "SummarizeConversation", new() {{ "input", chatHistory.ToString() }}); var activities = await kernel.InvokePromptAsync( input!, new () { {"input", input}, {"history", chatSummary}, {"ToolCallBehavior", ToolCallBehavior.AutoInvokeKernelFunctions} }); chatHistory.AppendLine("User:" + input); chatHistory.AppendLine("Assistant:" + activities.ToString()); Console.WriteLine(activities); break;
ターミナルで「
dotnet run
」と入力します。 メッセージが表示されたら、次のようなテキストを入力します。What would you like to do? How much is 60 USD in new zealand dollars?
次のような出力が表示されます。
$60 USD is approximately $97.88 in New Zealand Dollars (NZD) What would you like to do?
次のようなコンテキスト キューを使って、目的地の候補のプロンプトを入力します。
What would you like to do? I'm planning an anniversary trip with my spouse, but they are currently using a wheelchair and accessibility is a must. What are some destinations that would be romantic for us?
行きやすい目的地のおすすめ候補を含む出力を受け取るはずです。
次のような、アクティビティの候補に関するプロンプトを入力します。
What would you like to do? What are some things to do in Barcelona?
前のコンテキストに当てはまるおすすめ候補を受け取るはずです。次に示すのは、バルセロナでできるアクティビティの例です。
1. Visit the iconic Sagrada Família: This breathtaking basilica is an iconic symbol of Barcelona's architecture and is known for its unique design by Antoni Gaudí. 2. Explore Park Güell: Another masterpiece by Gaudí, this park offers stunning panoramic views of the city, intricate mosaic work, and whimsical architectural elements. 3. Visit the Picasso Museum: Explore the extensive collection of artworks by the iconic painter Pablo Picasso, showcasing his different periods and styles.
Note
期待した出力がコードで生成されない場合は、Solution フォルダー内のコードを確認できます。
さまざまなプロンプトとコンテキスト キューを使って、アプリケーションのテストを続けることができます。順調です。 LLM へのコンテキスト キューの提供と、ユーザーが会話を続けられるようにするコードの調整がうまくいきました。