연습 - 통화 변환기 만들기

완료됨

이 연습에서는 사용자가 통화 금액을 한 통화에서 다른 통화로 변환할 수 있는 플러그 인을 만듭니다. 모델은 인터넷에 액세스하여 현재 환율을 결정할 수 없으므로 플러그 인에 환율을 제공해야 합니다. 이 연습에서는 기존 currencies.txt 파일을 사용하여 환율을 제공합니다.

Important

이 연습을 시작하기 전에 이전 단원인 준비 단원의 설정 지침을 완료해야 합니다.

네이티브 함수 만들기

이 작업에서는 기본 통화에서 대상 통화로 금액을 변환할 수 있는 네이티브 함수를 만듭니다.

  1. Plugins/ConvertCurrency 폴더에 CurrencyConverter.cs(이)라는 새 파일 만들기

  2. CurrencyConverter.cs 파일에서 다음 코드를 추가하여 플러그 인 함수를 만듭니다.

    using AITravelAgent;
    
    class CurrencyConverter
    {
        [KernelFunction, 
        Description("Convert an amount from one currency to another")]
        public static string ConvertAmount()
        {
            var currencyDictionary = Currency.Currencies;
        }
    }
    

    이 코드에서는 KernelFunction 데코레이터를 사용하여 네이티브 함수를 선언합니다. 또한 Description 데코레이터를 사용하여 함수의 기능에 대한 설명을 추가합니다. Currency.Currencies을(를) 사용하여 통화 및 환율 사전을 가져올 수 있습니다. 다음으로 지정된 금액을 한 통화에서 다른 통화로 변환하는 몇 가지 논리를 추가합니다.

  3. ConvertAmount 함수를 다음 코드로 수정합니다.

    [KernelFunction, Description("Convert an amount from one currency to another")]
    public static string ConvertAmount(
        [Description("The target currency code")] string targetCurrencyCode, 
        [Description("The amount to convert")] string amount, 
        [Description("The starting currency code")] string baseCurrencyCode)
    {
        var currencyDictionary = Currency.Currencies;
    
        Currency targetCurrency = currencyDictionary[targetCurrencyCode];
        Currency baseCurrency = currencyDictionary[baseCurrencyCode];
    
        if (targetCurrency == null)
        {
            return targetCurrencyCode + " was not found";
        }
        else if (baseCurrency == null)
        {
            return baseCurrencyCode + " was not found";
        }
        else
        {
            double amountInUSD = Double.Parse(amount) * baseCurrency.USDPerUnit;
            double result = amountInUSD * targetCurrency.UnitsPerUSD;
            return @$"${amount} {baseCurrencyCode} is approximately 
                {result.ToString("C")} in {targetCurrency.Name}s ({targetCurrencyCode})";
        }
    }
    

    이 코드에서는 Currency.Currencies 사전을 사용하여 대상 및 기본 통화에 대한 Currency 개체를 가져옵니다. 그런 다음 Currency 개체를 사용하여 기본 통화에서 대상 통화로 금액을 변환합니다. 마지막으로, 변환된 양으로 문자열을 반환합니다. 다음으로 플러그 인을 테스트해 보겠습니다.

    참고 항목

    고유한 프로젝트에서 의미 체계 커널 SDK를 사용하는 경우 RESTful API에 액세스할 수 있는 경우 데이터를 파일로 하드 코딩할 필요가 없습니다. 대신 Plugins.Core.HttpClient 플러그 인을 사용하여 API에서 데이터를 검색할 수 있습니다.

  4. Program.cs 파일에서 다음 코드를 사용하여 새 플러그 인 함수를 가져오고 호출합니다.

    kernel.ImportPluginFromType<CurrencyConverter>();
    kernel.ImportPluginFromType<ConversationSummaryPlugin>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    var result = await kernel.InvokeAsync("CurrencyConverter", 
        "ConvertAmount", 
        new() {
            {"targetCurrencyCode", "USD"}, 
            {"amount", "52000"}, 
            {"baseCurrencyCode", "VND"}
        }
    );
    
    Console.WriteLine(result);
    

    이 코드에서는 ImportPluginFromType 메서드를 사용하여 플러그 인을 가져옵니다. 그런 다음 InvokeAsync 메서드를 사용하여 플러그 인 함수를 호출합니다. InvokeAsync 메서드는 플러그 인 이름, 함수 이름 및 매개 변수 사전을 사용합니다. 마지막으로 결과를 콘솔에 출력합니다. 다음으로 코드를 실행하여 작동하는지 확인합니다.

  5. 터미널에서 dotnet run를 입력합니다. 다음과 같은 출력이 표시됩니다.

    $52000 VND is approximately $2.13 in US Dollars (USD)
    

    플러그 인이 제대로 작동했으므로 사용자가 변환하려는 통화와 금액을 감지할 수 있는 자연어 프롬프트를 만들어 보겠습니다.

프롬프트 만들기

이 작업에서는 사용자의 입력을 구문 분석하여 변환할 대상 통화, 기본 통화 및 금액을 식별하는 프롬프트를 만듭니다.

  1. 프롬프트 폴더에 GetTargetCurrencies(이)라는 새 폴더 만들기

  2. GetTargetCurrencies 폴더에서 config.json(이)라는 새 파일을 만듭니다.

  3. config.json 파일에 다음 텍스트를 입력합니다.

    {
        "schema": 1,
        "type": "completion",
        "description": "Identify the target currency, base currency, and amount to convert",
        "execution_settings": {
            "default": {
                "max_tokens": 800,
                "temperature": 0
            }
        },
        "input_variables": [
            {
                "name": "input",
                "description": "Text describing some currency amount to convert",
                "required": true
            }
        ]
    }
    
  4. GetTargetCurrencies 폴더에서 skprompt.txt(이)라는 새 파일을 만듭니다.

  5. skprompt.txt 파일에 다음 텍스트를 입력합니다.

    <message role="system">Identify the target currency, base currency, and 
    amount from the user's input in the format target|base|amount</message>
    
    For example: 
    
    <message role="user">How much in GBP is 750.000 VND?</message>
    <message role="assistant">GBP|VND|750000</message>
    
    <message role="user">How much is 60 USD in New Zealand Dollars?</message>
    <message role="assistant">NZD|USD|60</message>
    
    <message role="user">How many Korean Won is 33,000 yen?</message>
    <message role="assistant">KRW|JPY|33000</message>
    
    <message role="user">{{$input}}</message>
    <message role="assistant">target|base|amount</message>
    

작업 확인

이 작업에서는 애플리케이션을 실행하고 코드가 올바르게 작동하는지 확인합니다.

  1. 다음 코드로 Program.cs 파일을 업데이트하여 새 프롬프트를 테스트합니다.

    kernel.ImportPluginFromType<CurrencyConverter>();
    var prompts = kernel.ImportPluginFromPromptDirectory("Prompts");
    
    var result = await kernel.InvokeAsync(prompts["GetTargetCurrencies"],
        new() {
            {"input", "How many Australian Dollars is 140,000 Korean Won worth?"}
        }
    );
    
    Console.WriteLine(result);
    
  2. 터미널에 dotnet run을 입력합니다. 다음 출력이 표시됩니다.

    AUD|KRW|140000
    

    참고 항목

    코드가 예상한 결과를 생성하지 못하는 경우 솔루션 폴더에서 코드를 검토할 수 있습니다. 더 정확한 결과를 생성하려면 skprompt.txt 파일에서 프롬프트를 조정해야 할 수 있습니다.

이제 한 통화에서 다른 통화로 금액을 변환할 수 있는 플러그 인과 사용자의 입력을 ConvertAmount 함수에서 사용할 수 있는 형식으로 구문 분석하는 데 사용할 수 있는 프롬프트가 있습니다. 다음 연습에서는 사용자의 의도를 사용하여 함수를 실행할 수 있습니다.