Exercício: criar um conversor de moeda
Para este exercício, você criará um plug-in que permite ao usuário converter os valores monetários 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 plug-in. Neste exercício, você usará um arquivo currencies.txt existente para fornecer as taxas de câmbio.
Importante
Você precisa concluir as instruções de Instalação na unidade anterior, Preparar, antes de iniciar este exercício.
Criar uma função nativa
Nesta tarefa, crie uma função nativa que pode converter um valor de uma moeda base para uma moeda de destino.
Crie um novo arquivo chamado
CurrencyConverter.cs
na pasta Plugins/ConvertCurrencyNo arquivo
CurrencyConverter.cs
, adicione o seguinte código para criar uma função de plug-in:using AITravelAgent; class CurrencyConverter { [KernelFunction, Description("Convert an amount from one currency to another")] public static string ConvertAmount() { var currencyDictionary = Currency.Currencies; } }
Nesse código, use o decorador
KernelFunction
para declarar sua função nativa. Você também usará o decoradorDescription
para adicionar uma descrição do que a função faz. Você pode usarCurrency.Currencies
para obter um dicionário de moedas e suas taxas de câmbio. Em seguida, adicione alguma lógica para converter um determinado valor de uma moeda para outra.Modifique sua função
ConvertAmount
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})"; } }
Nesse código, use o dicionário
Currency.Currencies
para obter o objetoCurrency
para as moedas de destino e base. Em seguida, use o objetoCurrency
para converter o valor da moeda base para a moeda de destino. Por fim, retorne uma cadeia de caracteres com o valor convertido. Em seguida, vamos testar seu plug-in.Observação
Ao usar o SDK do Kernel Semântico em seus próprios projetos, não é necessário codificar os dados em arquivos se você tiver acesso a APIs RESTful. Em vez disso, você pode usar o plug-in
Plugins.Core.HttpClient
para recuperar dados de APIs.No arquivo
Program.cs
, 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);
Nesse código, use o método
ImportPluginFromType
para importar seu plug-in. Em seguida, use o métodoInvokeAsync
para invocar sua função de plug-in. O métodoInvokeAsync
recebe o nome do plug-in, o nome da função e um dicionário de parâmetros. Por fim, imprima o resultado no console. Em seguida, execute o código para ter certeza de que está funcionando.Insira
dotnet run
no terminal. A seguinte saída deve ser exibida:$52000 VND is approximately $2.13 in US Dollars (USD)
Agora que o plug-in está funcionando corretamente, vamos criar um prompt de linguagem natural que possa detectar quais moedas e valores o usuário deseja converter.
Criar um prompt
Nesta tarefa, crie um prompt que analise a entrada do usuário para identificar a moeda de destino, a moeda base e o valor a ser convertido.
Crie uma nova pasta chamada
GetTargetCurrencies
na pasta PromptsNa pasta
GetTargetCurrencies
, crie um novo arquivo chamadoconfig.json
Insira o seguinte texto no arquivo
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 } ] }
Na pasta
GetTargetCurrencies
, crie um novo arquivo chamadoskprompt.txt
Insira o texto a seguir no arquivo
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>
Verifique seu trabalho
Nesta tarefa, execute seu aplicativo e verifique se o código está funcionando corretamente.
Teste o novo prompt atualizando o arquivo
Program.cs
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);
Insira
dotnet run
no terminal. A seguinte saída deve ser exibida:AUD|KRW|140000
Observação
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 plug-in que pode converter um valor de uma moeda para outra e um prompt que pode ser usado para analisar a entrada do usuário em um formato que a função ConvertAmount
pode usar. No próximo exercício, você poderá usar a intenção do usuário para executar suas funções.