Exercício - Criar funções nativas

Concluído

Neste exercício, você cria uma função nativa que adiciona uma música à lista "Recentemente reproduzido" de um usuário. Mais tarde, você pode usar a lista de músicas tocadas recentemente para fornecer recomendações personalizadas. Vamos começar!

Preparar o ambiente de desenvolvimento

Para estes exercícios, um projeto inicial está disponível para você usar. Use as seguintes etapas para configurar o projeto inicial:

Importante

Você deve ter o Visual Studio Code e o .NET Framework 8.0 instalado para concluir essas etapas. Também pode ser necessário instalar a extensão Visual Studio Code C# Dev Kit.

  1. Abra o Visual Studio Code.

  2. Na seção Visual Studio Code Start , selecione Clone Git Repository.

  3. Na barra de URL, digite https://github.com/MicrosoftLearning/MSLearn-Develop-AI-Agents-with-Azure-OpenAI-and-Semantic-Kernel-SDK.git

  4. No Explorador de Arquivos, crie uma nova pasta em um local fácil de encontrar e lembrar, como uma pasta na área de trabalho.

  5. Clique no botão Selecionar como destino do repositório.

    Você precisa estar conectado ao GitHub para clonar o projeto com êxito.

  6. Abra o projeto no Visual Studio Code.

  7. No Explorer, clique com o botão direito do mouse na pasta M03-give-your-ai-agent-skills/M03-Project e clique em Abrir no Terminal Integrado.

  8. Expanda a pasta M03-give-your-ai-agent-skills/M03-Project .

    Deverá ver um ficheiro "Program.cs".

  9. Abra o arquivo Program.cs e atualize as seguintes variáveis com seu nome de implantação dos Serviços OpenAI do Azure, chave de API, ponto de extremidade.

    string yourDeploymentName = "";
    string yourEndpoint = "";
    string yourKey = "";
    

Agora você está pronto para começar o exercício. Boa sorte!

Criar um plugin de biblioteca de música

  1. Crie uma nova pasta no diretório 'Projeto' e nomeie-a 'Plugins'.

  2. Na pasta 'Plugins', crie um novo ficheiro 'MusicLibrary.cs'

  3. Introduza o seguinte código:

    using System.ComponentModel;
    using System.Text.Json;
    using System.Text.Json.Nodes;
    using Microsoft.SemanticKernel;
    
    public class MusicLibraryPlugin
    {
        [KernelFunction, 
        Description("Get a list of music recently played by the user")]
        public static string GetRecentPlays()
        {
            string dir = Directory.GetCurrentDirectory();
            string content = File.ReadAllText($"{dir}/data/recentlyplayed.txt");
            return content;
        }
    }
    

    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. Por enquanto, você pode supor que a lista de reproduções recentes do usuário está armazenada em um arquivo de texto chamado 'recentlyplayed.txt'. Em seguida, você pode adicionar código para adicionar uma música à lista.

  4. Adicione o seguinte código à sua MusicLibraryPlugin classe:

    [KernelFunction, Description("Add a song to the recently played list")]
    public static string AddToRecentlyPlayed(
        [Description("The name of the artist")] string artist, 
        [Description("The title of the song")] string song, 
        [Description("The song genre")] string genre)
    {
        // Read the existing content from the file
        string filePath = "data/recentlyplayed.txt";
        string jsonContent = File.ReadAllText(filePath);
        var recentlyPlayed = (JsonArray) JsonNode.Parse(jsonContent);
    
        var newSong = new JsonObject
        {
            ["title"] = song,
            ["artist"] = artist,
            ["genre"] = genre
        };
    
        recentlyPlayed.Insert(0, newSong);
        File.WriteAllText(filePath, JsonSerializer.Serialize(recentlyPlayed,
            new JsonSerializerOptions { WriteIndented = true }));
    
        return $"Added '{song}' to recently played";
    }
    

    Neste código, você cria uma função que aceita o artista, a música e o gênero como strings. Além Description do da função, você também adiciona descrições das variáveis de entrada. Esse código lê o conteúdo existente do arquivo, analisa-o e adiciona a nova música à lista. Depois, a lista atualizada é gravada de volta no arquivo. Em seguida, você criará o arquivo 'recentlyplayed.txt' com alguns dados de exemplo.

  5. Crie uma nova pasta 'dados' na pasta 'M03-Project'.

  6. Crie um novo ficheiro 'recentlyplayed.txt' na pasta 'data' e, em seguida, cole o seguinte conteúdo:

    [
        {
            "title": "Loanh Quanh",
            "artist": "Ly Hoa",
            "genre": "indie, folk"
        },
        {
            "title": "Kalam Eineh",
            "artist": "Yasemin",
            "genre": "pop, Egyptian pop"
        },
        {
            "title": "I Miss You",
            "artist": "Chishin",
            "genre": "hiphop, rap"
        },
        {
            "title": "4EVER",
            "artist": "Gaby",
            "genre": "alternative, indie"
        }
    ]
    

    Em seguida, vamos modificar a lista importando e invocando seu novo plugin.

  7. Atualize seu arquivo 'Program.cs' com o seguinte código:

    var kernel = builder.Build();
    kernel.ImportPluginFromType<MusicLibraryPlugin>();
    
    var result = await kernel.InvokeAsync(
        "MusicLibraryPlugin", 
        "AddToRecentlyPlayed", 
        new() {
            ["artist"] = "Tiara", 
            ["song"] = "Danse", 
            ["genre"] = "French pop, electropop, pop"
        }
    );
    
    Console.WriteLine(result);
    

    Neste código, você importa o MusicLibraryPlugin para o kernel usando ImportPluginFromType. Em seguida, você liga InvokeAsync com o nome do plugin que deseja usar e a função que deseja chamar. Você também passa o artista, a música e o gênero como argumentos.

  8. Execute o código inserindo dotnet run no terminal.

    Deverá ver o seguinte resultado:

    Added 'Danse' to recently played
    

    Abra 'recentlyplayed.txt' e você verá a nova música adicionada à lista. Bom trabalho!