Exercício - Criar um conversor de moeda

Concluído

Para este exercício, você cria um plugin que permite ao usuário converter valores de moeda de uma moeda para outra. Como o modelo não pode acessar a internet para determinar a taxa de câmbio atual, você precisa fornecer as taxas de câmbio em seu plugin. Para este exercício, você usa um arquivo de currencies.txt existente para fornecer as taxas de câmbio.

Importante

Você precisa completar as instruções de configuração na unidade anterior, Preparar, antes de começar este exercício.

Criar uma função nativa

Nesta tarefa, você cria uma função nativa que pode converter um valor de uma moeda base para uma moeda de destino.

  1. Crie um novo arquivo nomeado CurrencyConverter.cs na pasta Plugins/ConvertCurrency

  2. CurrencyConverter.cs No arquivo, adicione o seguinte código para criar uma função de plugin:

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

    Neste código, você usa o decorador KernelFunction para declarar sua função nativa. Você também usa o Description decorador para adicionar uma descrição do que a função faz. Você pode usar Currency.Currencies para obter um dicionário de moedas e suas taxas de câmbio. Em seguida, adicione alguma lógica para converter um determinado montante de uma moeda para outra.

  3. Modifique sua ConvertAmount função com o seguinte código:

    [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})";
        }
    }
    

    Neste código, você usa o Currency.Currencies dicionário para obter o Currency objeto para as moedas de destino e base. Em seguida, use o Currency objeto para converter o valor da moeda base para a moeda de destino. Finalmente, você retorna uma cadeia de caracteres com o valor convertido. Em seguida, vamos testar seu plugin.

    Nota

    Ao usar o SDK do kernel semântico em seus próprios projetos, você não precisa codificar dados em arquivos se tiver acesso a APIs RESTful. Em vez disso, você pode usar o Plugins.Core.HttpClient plug-in para recuperar dados de APIs.

  4. Program.cs No arquivo, importe e invoque sua nova função de plug-in com o seguinte código:

    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);
    

    Neste código, você usa o ImportPluginFromType método para importar seu plugin. Em seguida, você usa o InvokeAsync método para invocar sua função de plugin. O InvokeAsync método leva o nome do plugin, nome da função e um dicionário de parâmetros. Finalmente, você imprime o resultado no console. Em seguida, execute o código para se certificar de que está funcionando.

  5. Introduza dotnet run no terminal. Deverá ver o seguinte resultado:

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

    Agora que seu plugin está funcionando corretamente, vamos criar um prompt de linguagem natural que pode detetar quais moedas e quantidade o usuário deseja converter.

Criar um prompt

Nesta tarefa, você cria um prompt que analisa a entrada do usuário para identificar a moeda de destino, a moeda base e o valor a ser convertido.

  1. Criar uma nova pasta nomeada GetTargetCurrencies na pasta Prompts

  2. GetTargetCurrencies Na pasta, crie um novo arquivo chamadoconfig.json

  3. Insira o seguinte texto no config.json arquivo:

    {
        "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 Na pasta, crie um novo arquivo chamadoskprompt.txt

  5. Insira o seguinte texto no skprompt.txt arquivo:

    <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>
    

Verifique o seu trabalho

Nesta tarefa, você executa seu aplicativo e verifica se seu código está funcionando corretamente.

  1. Teste seu novo prompt atualizando seu Program.cs arquivo com o seguinte código:

    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. Introduza dotnet run no terminal. Deverá ver o seguinte resultado:

    AUD|KRW|140000
    

    Nota

    Se o código não produzir a saída esperada, você poderá revisar o código na pasta Solução . Talvez seja necessário ajustar o prompt no arquivo skprompt.txt para produzir resultados mais exatos.

Agora você tem um plugin que pode converter uma quantidade de uma moeda para outra, e um prompt que pode ser usado para analisar a entrada do usuário em um formato que a ConvertAmount função pode usar. No próximo exercício, você pode usar a intenção do usuário para executar suas funções.