演習 - ネイティブ関数を作成する

完了

この演習では、ユーザーの "最近再生された" リストに曲を追加するネイティブ関数を作成します。 後で、最近再生した曲のリストを使用して、カスタマイズされたレコメンデーションを提供できます。 それでは始めましょう。

開発環境を準備する

これらの演習では、スターター プロジェクトを使用できます。 スターター プロジェクトを設定するには、次の手順を使用します。

重要

これらの手順を完了するには、Visual Studio Code と .NET Framework 8.0 がインストールされている必要があります。 Visual Studio Code C# 開発キット拡張機能のインストールが必要になる場合もあります。

  1. Visual Studio Code を開きます。

  2. Visual Studio Code の[開始] セクションで、[Git リポジトリのクローン] を選択してください。

  3. URL バーに、「https://github.com/MicrosoftLearning/MSLearn-Develop-AI-Agents-with-Azure-OpenAI-and-Semantic-Kernel-SDK.git」と入力してください

  4. エクスプローラーで、デスクトップ内のフォルダーなど、見つけやすく覚えやすい場所に新しいフォルダーを作成してください。

  5. [リポジトリの場所を選択] ボタンをクリックしてください。

    プロジェクトを正常にクローンするには、GitHub にサインインする必要があります。

  6. Visual Studio Code でプロジェクトを開きます。

  7. エクスプローラーで、M03-give-your-ai-agent-skills/M03-Project フォルダーを右クリック し、[統合ターミナル で開く] をクリックします。

  8. M03-give-your-ai-agent-skills/M03-Project フォルダーを展開します。

    "Program.cs" ファイルが表示されます。

  9. Program.cs ファイルを開き、以下の変数をお使いの Azure OpenAI Services のデプロイ名、API キー、エンドポイントに更新します。

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

これで、演習を始める準備ができました。 がんばってください。

音楽ライブラリ プラグインを作成する

  1. "Project" ディレクトリに新しいフォルダーを作成し、"Plugins" という名前を付けます。

  2. "Plugins" フォルダーに、新しいファイル "MusicLibrary.cs" を作成します

  3. 次のコードを入力します。

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

    このコードでは、KernelFunction デコレーターを使用してネイティブ関数を宣言します。 Description デコレーターも使用して、関数の動作の説明を追加します。 現時点では、ユーザーの最近再生したものリストが "recentlyplayed.txt" というテキスト ファイルに保存されていると仮定できます。 次に、リストに曲を加えるコードを追加できます。

  4. MusicLibraryPlugin クラスに次のコードを追加します。

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

    このコードで、アーティスト、曲、ジャンルを文字列として受け入れる関数を作成します。 関数の Description に加えて、入力変数の説明を追加することもできます。 このコードは、ファイルから既存のコンテンツを読み取り、解析して、新しい曲をリストに追加します。 その後、更新されたリストがファイルに書き戻されます。 次に、いくつかのサンプル データを含む "recentlyplayed.txt" ファイルを作成します。

  5. "M03-Project" フォルダーに新しいフォルダー "data" を作成します。

  6. "data" フォルダーに新しいファイル "recentlyplayed.txt" を作成し、次の内容を貼り付けます。

    [
        {
            "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"
        }
    ]
    

    次に、新しいプラグインをインポートして呼び出し、リストを変更しましょう。

  7. 次のコードで "Program.cs" ファイルを更新します。

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

    このコードでは、ImportPluginFromType を使用して MusicLibraryPlugin をカーネルにインポートします。 次に、使用するプラグインの名前と呼び出す関数を使用して InvokeAsync を呼び出します。 また、アーティスト、曲、ジャンルを引数として渡します。

  8. ターミナルに「dotnet run」を入力してコードを実行します。

    次の出力が表示されます。

    Added 'Danse' to recently played
    

    "recentlyplayed.txt" を開くと、リストに追加した新しい曲が表示されます。 上出来