연습 - 파일에 프롬프트 저장

완료됨

사용자에게 여행 대상을 제안하고 작업을 권장한다고 가정해 보겠습니다. 이 연습에서는 프롬프트를 만들고 파일에 저장하는 방법을 실습합니다. 그럼 시작하겠습니다.

  1. 이전 연습에서 만든 Visual Studio Code 프로젝트를 엽니다.

  2. Program.cs 파일에서 이전 연습에서 만든 promptinput 변수를 제거하여 다음 코드를 남게 합니다.

    using Microsoft.SemanticKernel;
    using Microsoft.SemanticKernel.Plugins.Core;
    
    var builder = Kernel.CreateBuilder();
    builder.AddAzureOpenAIChatCompletion(
        "your-deployment-name",
        "your-endpoint",
        "your-api-key",
        "deployment-model");
    var kernel = builder.Build();
    
  3. 프로젝트에 다음 폴더가 있는지 확인합니다.

    • ‘Prompts’
    • ‘Prompts/TravelPlugins’
    • ‘Prompts/TravelPlugins/SuggestDestinations’
    • ‘Prompts/TravelPlugins/GetDestination’
    • ‘Prompts/TravelPlugins/SuggestActivities’

    이러한 디렉터리를 사용하면 프롬프트를 구성하는 데 도움이 됩니다. 먼저, 사용자가 여행하려는 목적지를 식별하는 프롬프트를 만듭니다. 프롬프트를 만들려면 config.json 및 skprompt.txt 파일을 만들어야 합니다. 그럼 시작하겠습니다.

  4. GetDestination 폴더에서 config.json 파일을 열고 다음 코드를 입력합니다.

    {
        "schema": 1,
        "type": "completion",
        "description": "Identify the destination of the user's travel plans",
        "execution_settings": {
            "default": {
                "max_tokens": 1200,
                "temperature": 0
            }
        },
        "input_variables": [
            {
                "name": "input",
                "description": "Text from the user that contains their travel destination",
                "required": true
            }
        ]
    }
    

    이 구성은 프롬프트가 수행하는 작업과 수락할 입력 변수를 커널에 알려줍니다. 다음으로, skprompt.txt 파일에 프롬프트 텍스트를 제공합니다.

  5. GetDestination 폴더에서 skprompt.txt 파일을 열고 다음 텍스트를 입력합니다.

    <message role="system">
    Instructions: Identify the destination the user wants to travel to.
    </message>
    <message role="user">
    I am so excited to take time off work! My partner and I are thinking about going to Santorini in Greece! I absolutely LOVE Greek food, I can't wait to be some place warm.
    </message>
    <message role="assistant">Santorini, Greece</message>
    
    <message role="user">{{$input}}</message>
    

    이 프롬프트는 LLM(대규모 언어 모델)이 사용자 입력을 필터링하고 텍스트에서 목적지만 검색하는 데 도움이 됩니다.

  6. SuggestDestinations 폴더에서 config.json 파일을 열고 다음 텍스트를 입력합니다.

    {
        "schema": 1,
        "type": "completion",
        "description": "Recommend travel destinations to the user",
        "execution_settings": {
            "default": {
                "max_tokens": 1200,
                "temperature": 0.3
            }
        },
        "input_variables": [
            {
                "name": "input",
                "description": "Details about the user's travel plans",
                "required": true
            }
        ]
    }
    

    이 구성에서는 출력을 보다 창의적으로 만들기 위해 열기를 조금 더할 수 있습니다.

  7. SuggestDestinations 폴더에서 skprompt.txt 파일을 열고 다음 텍스트를 입력합니다.

    The following is a conversation with an AI travel assistant. 
    The assistant is helpful, creative, and very friendly.
    
    <message role="user">Can you give me some travel destination 
    suggestions?</message>
    
    <message role="assistant">Of course! Do you have a budget or 
    any specific activities in mind?</message>
    
    <message role="user">${input}</message>
    

    이 프롬프트는 입력에 따라 사용자에게 여행 목적지를 제안합니다. 이제 목적지에서 활동을 추천하는 플러그 인을 만들어 보겠습니다.

  8. SuggestActivities 폴더에서 config.json 파일을 열고 다음 텍스트를 입력합니다.

    {
        "schema": 1,
        "type": "completion",
        "description": "Recommend activities at a travel destination to the user",
        "execution_settings": {
            "default": {
                "max_tokens": 4000,
                "temperature": 0.3
            }
        },
        "input_variables": [
            {
                "name": "history",
                "description": "Background information about the user",
                "required": true
            },
            {
                "name": "destination",
                "description": "The user's travel destination",
                "required": true
            }
        ]
    }
    

    이 구성에서는 기록 및 생성된 텍스트에 더 많은 텍스트를 허용하도록 max_tokens를 늘립니다.

  9. SuggestActivities 폴더에서 skprompt.txt 파일을 열고 다음 텍스트를 입력합니다.

    You are a travel assistant. You are helpful, creative, and very friendly.
    Consider your previous conversation with the traveler: 
    {{$history}}
    
    The traveler would like some activity recommendations, things to do, and points 
    of interest for their trip. They want to go to {{$destination}}.
    Please provide them with a list of things they might like to do at their chosen destination.
    

    이제 새 프롬프트를 가져오고 테스트해 보겠습니다!

  10. Program.cs 파일을 다음 코드로 업데이트합니다.

    using Microsoft.SemanticKernel;
    using Microsoft.SemanticKernel.Plugins.Core;
    using Microsoft.SemanticKernel.ChatCompletion;
    
    var builder = Kernel.CreateBuilder();
    builder.AddAzureOpenAIChatCompletion(
        "your-deployment-name",
        "your-endpoint",
        "your-api-key",
        "deployment-model");
    var kernel = builder.Build();
    
    kernel.ImportPluginFromType<ConversationSummaryPlugin>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts/TravelPlugins");
    
    ChatHistory history = [];
    string input = @"I'm planning an anniversary trip with my spouse. We like hiking, 
        mountains, and beaches. Our travel budget is $15000";
    
    var result = await kernel.InvokeAsync<string>(prompts["SuggestDestinations"],
        new() {{ "input", input }});
    
    Console.WriteLine(result);
    history.AddUserMessage(input);
    history.AddAssistantMessage(result);
    

    이 코드에서 만든 플러그 인을 가져옵니다. 또한 ChatHistory 개체를 사용하여 사용자의 대화를 저장합니다. 마지막으로, SuggestDestinations 프롬프트에 일부 정보를 전달하고 결과를 기록합니다. 다음으로, 사용자에게 어디로 가고 싶은지 물어보고 몇 가지 활동을 추천하겠습니다.

  11. 다음 코드를 Program.cs 파일에 추가합니다.

    Console.WriteLine("Where would you like to go?");
    input = Console.ReadLine();
    
    result = await kernel.InvokeAsync<string>(prompts["SuggestActivities"],
        new() {
            { "history", history },
            { "destination", input },
        }
    );
    Console.WriteLine(result);
    

    이 코드에서는 사용자로부터 일부 입력을 받아 사용자가 어디로 가고 싶은지 확인합니다. 그런 다음 목적지 및 대화 기록을 사용하여 SuggestActivities 프롬프트를 호출합니다.

  12. 코드를 테스트하려면 터미널에 dotnet run을 입력합니다.

    최종 출력은 다음과 유사할 수 있습니다.

    Absolutely! Japan is a wonderful destination with so much to see and do. Here are some recommendations for activities and points of interest:
    
    1. Visit Tokyo Tower: This iconic tower offers stunning views of the city and is a must-visit attraction.
    
    2. Explore the temples of Kyoto: Kyoto is home to many beautiful temples, including the famous Kiyomizu-dera and Fushimi Inari-taisha.
    
    3. Experience traditional Japanese culture: Attend a tea ceremony, try on a kimono, or take a calligraphy class to immerse yourself in Japanese culture.
    

    이제 AI 여행 도우미의 시작을 만들었습니다! 입력을 변경하여 LLM이 응답하는 방법을 확인합니다.