Exercício - Criar um conversor de moeda
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.
Crie um novo arquivo nomeado
CurrencyConverter.cs
na pasta Plugins/ConvertCurrencyCurrencyConverter.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 oDescription
decorador 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 montante de uma moeda para outra.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 oCurrency
objeto para as moedas de destino e base. Em seguida, use oCurrency
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.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 oInvokeAsync
método para invocar sua função de plugin. OInvokeAsync
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.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.
Criar uma nova pasta nomeada
GetTargetCurrencies
na pasta PromptsGetTargetCurrencies
Na pasta, crie um novo arquivo chamadoconfig.json
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 } ] }
GetTargetCurrencies
Na pasta, crie um novo arquivo chamadoskprompt.txt
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.
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);
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.