言語モデルのプロンプトを最適化する

完了

プロンプトは、大規模言語モデル (LLM) に与える会話の手掛かりであり、クエリまたは指示に基づいて応答を整形します。 たとえば、文を英語からフランス語に変換することや、テキストの概要を生成することを LLM に指示できます。

前のユニットでは、プロンプトを入力文字列として作成しました。

    string input = @"I'm a vegan in search of new recipes. I love spicy food! 
    Can you give me a list of breakfast recipes that are vegan friendly?";

プロンプトを与えるには、目的とする応答を生成するようにモデルを導く、明確でコンテキスト豊富な指示を作成する必要があります。 効果的なプロンプトを作成するには、精度と明確さが重要です。 正確な結果を得るには、プロンプトの実験と調整が必要になる場合があります。

プロンプトを作成するためのヒント

  • 特定の入力から特定の出力が生成される: LLM は、受け取った入力に基づいて応答します。 目的とする出力を得るには、明確で具体的なプロンプトを作成することが重要です。

  • 実験が重要: モデルによる応答の解釈と生成の方法を理解するには、さまざまなプロンプトを繰り返し試してみることが必要になる場合があります。 少しの調整で結果が大きく変わる可能性があります。

  • コンテキストの重要性: LLM は、プロンプトで提供されたコンテキストを考慮します。 正確で一貫性のある応答を得るには、コンテキストが明確に定義されていて関連性があることを確認する必要があります。

  • あいまいさを処理する: LLM はあいまいなクエリに苦戦する可能性があることに注意してください。 あいまいな結果や予期しない結果を避けるために、コンテキストまたは構造を指定します。

  • プロンプトの長さ: LLM は短いプロンプトと長いプロンプトの両方を処理できますが、簡潔さと明確さの間のトレードオフを考慮する必要があります。 さまざまなプロンプトの長さを試してみると、最適なバランスを見つけるのに役立ちます。

プロンプト テンプレートを作成する

Semantic Kernel SDK では、自然言語プロンプトで式と変数を使用できるテンプレート言語がサポートされています。 つまり、さまざまな入力パラメーターで再利用可能なプロンプトを作成できます。 プロンプトに式を埋め込むには、テンプレート言語で中かっこ {{...}} を使用します。

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Plugins.Core;

var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
    "your-deployment-name",
    "your-endpoint",
    "your-api-key",
    "deployment-model");

builder.Plugins.AddFromType<ConversationSummaryPlugin>();
var kernel = builder.Build();

string history = @"In the heart of my bustling kitchen, I have embraced 
    the challenge of satisfying my family's diverse taste buds and 
    navigating their unique tastes. With a mix of picky eaters and 
    allergies, my culinary journey revolves around exploring a plethora 
    of vegetarian recipes.

    One of my kids is a picky eater with an aversion to anything green, 
    while another has a peanut allergy that adds an extra layer of complexity 
    to meal planning. Armed with creativity and a passion for wholesome 
    cooking, I've embarked on a flavorful adventure, discovering plant-based 
    dishes that not only please the picky palates but are also heathy and 
    delicious.";

string prompt = @"This is some information about the user's background: 
    {{$history}}

    Given this user's background, provide a list of relevant recipes.";

var result = await kernel.InvokePromptAsync(prompt, 
    new KernelArguments() {{ "history", history }});

Console.WriteLine(result);

この例では、history 変数がプロンプトで参照され、$ 記号で示されます。 プロンプトが呼び出されると、history 変数は、KernelArguments 辞書で指定された実際の値に置き換えられます。 これにより、さまざまな入力を動的に設定できるプロンプトを作成できます。

出力の例を次に示します。

1. Lentil and vegetable soup - a hearty, filling soup that is perfect for a cold day. This recipe is vegetarian and can easily be adapted to accommodate allergies.

2. Cauliflower "steaks" - a delicious and healthy main course that is sure to satisfy even the pickiest of eaters. This recipe is vegetarian and can easily be made vegan.

3. Quinoa salad with roasted vegetables - a healthy and filling salad that is perfect for any occasion. This recipe is vegetarian and can easily be adapted to accommodate allergies.

4. Peanut-free pad Thai - a classic dish made without peanut sauce, perfect for those with peanut allergies. This recipe is vegetarian and can easily be made vegan.

5. Black bean and sweet potato enchiladas - a delicious and healthy twist on traditional enchiladas. This recipe is vegetarian and can easily be made vegan.

再利用可能なプロンプトの作成は、異なる入力で同じタスクを実行する必要がある場合に特に便利です。 次の演習では、Semantic Kernel SDK を使用して、独自の再利用可能なプロンプトの作成を練習します。