언어 모델 프롬프트 최적화

완료됨

프롬프트는 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은 짧고 긴 프롬프트를 모두 처리할 수 있지만 간결성과 명확성 간의 균형을 고려해야 합니다. 프롬프트 길이를 실험하면 최적의 균형을 찾는 데 도움이 될 수 있습니다.

프롬프트 템플릿 만들기

의미 체계 커널 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.

재사용 가능한 프롬프트를 만드는 것은 다양한 입력으로 동일한 작업을 수행해야 할 때 특히 유용합니다. 다음 연습에서는 의미 체계 커널 SDK를 사용하여 재사용 가능한 프롬프트를 만드는 실습을 하게 됩니다.