Bagikan melalui


Mulai menggunakan SDK inferensi lokal untuk Azure AI Personalizer

Penting

Mulai tanggal 20 September 2023 Anda tidak akan dapat membuat sumber daya Personalizer baru. Layanan Personalizer dihentikan pada tanggal 1 Oktober 2026.

SDK inferensi lokal Personalizer (Pratinjau) mengunduh model Personalizer secara lokal, sehingga secara signifikan mengurangi latensi panggilan Pangkat dengan menghilangkan panggilan jaringan. Setiap saat, klien akan mengunduh model terbaru di latar belakang dan menggunakannya untuk inferensi.

Dalam panduan ini, Anda akan mempelajari cara menggunakan SDK inferensi lokal Personalizer.

Anda harus menginstal pustaka klien Personalizer pada .NET untuk:

  • Mengautentikasi contoh mulai cepat klien dengan sumber daya Personalizer di Azure.
  • Kirim fitur konteks dan tindakan ke REWARD API, yang akan menampilkan tindakan terbaik dari model Personalizer
  • Kirim skor hadiah ke Rank API dan latih model Personalizer.

Dokumentasi referensi | Kode sumber pustaka | Paket (NuGet)

Prasyarat

  • Langganan Azure - Buat langganan secara gratis
  • Versi .NET Core saat ini.
  • Setelah Anda memiliki langganan Azure, buat sumber daya Personalizer di portal Azure untuk mendapatkan kunci dan titik akhir Anda. Setelah menyebar, pilih Buka sumber daya.
    • Anda akan memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menyambungkan aplikasi Anda ke API Personalizer. Anda akan menempelkan kunci dan titik akhir ke dalam kode di bawah ini di mulai cepat.
    • Anda dapat menggunakan tingkat harga gratis (F0) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.

Menyiapkan

Mengubah frekuensi pembaruan model

Di portal Azure, buka halaman Konfigurasi sumber daya Personalizer Anda, dan ubah frekuensi pembaruan Model menjadi 30 detik. Durasi singkat ini akan melatih model dengan cepat, memungkinkan Anda untuk melihat bagaimana tindakan yang direkomendasikan berubah untuk setiap perulangan.

Change model update frequency

Ubah waktu tunggu hadiah

Di portal Azure, buka halaman Konfigurasi sumber daya Personalizer Anda, dan ubah waktu tunggu Hadiah menjadi 10 menit. Ini menentukan berapa lama model akan menunggu setelah mengirim rekomendasi, untuk menerima umpan balik hadiah dari rekomendasi tersebut. Pelatihan tidak akan terjadi sampai waktu tunggu hadiah berlalu.

Change reward wait time

Membuat aplikasi C# baru

Buat aplikasi .NET Core baru di editor atau IDE pilihan Anda.

Di jendela konsol (seperti cmd, PowerShell, atau Bash), gunakan perintah new dotnet untuk membuat aplikasi konsol baru bernama personalizer-quickstart. Perintah ini membuat proyek C# "Halo Dunia" sederhana dengan satu file sumber: Program.cs.

dotnet new console -n personalizer-quickstart

Ubah direktori Anda ke folder aplikasi yang baru dibuat. Anda dapat membangun aplikasi dengan:

dotnet build

Output build tidak boleh berisi peringatan atau kesalahan.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

Memasang pustaka klien

Dalam direktori aplikasi, pasang pustaka klien Personalizer untuk .NET dengan perintah berikut:

dotnet add package Azure.AI.Personalizer --version 2.0.0-beta.2

Tip

Jika Anda menggunakan IDE Visual Studio, pustaka klien tersedia sebagai paket NuGet yang dapat diunduh.

Dari direktori proyek, buka file Program.cs di editor atau IDE pilihan Anda. Tambahkan hal berikut menggunakan instruksi:

using Azure;
using Azure.AI.Personalizer;
using System;
using System.Collections.Generic;
using System.Linq;

Model objek

Klien Personalizer adalah objek PersonalizerClient yang mengautentikasi ke Azure dengan menggunakan Azure.AzureKeyCredential yang berisi kunci Anda.

Untuk meminta item terbaik tunggal untuk menampilkan pengguna, buat PersonalizerRankOptions, lalu teruskan ke metode PersonalizerClient.Rank . Metode Pangkat akan menampilkan PersonalizerRankResult.

Untuk mengirim skor hadiah ke Personalizer, berikan ID acara dan skor hadiah ke metode PersonalizerClient.Reward .

Menentukan skor hadiah dalam mulai cepat ini mudah. Dalam suatu sistem produksi, penentuan yang memengaruhi skor reward dan seberapa rumit proses tersebut, dapat Anda ubah seiring waktu. Keputusan desain ini harus menjadi salah satu keputusan utama dalam arsitektur Personalizer Anda.

Contoh kode

Cuplikan kode ini menunjukkan kepada Anda cara melakukan tugas berikut dengan pustaka klien Personalizer untuk .NET:

Mengautentikasi klien

Di bagian ini Anda akan melakukan dua hal:

  • Menentukan kunci dan titik akhir Anda
  • Membuat klien Personalizer

Mulailah dengan menambahkan baris berikut ke kelas Program Anda. Pastikan untuk menambahkan kunci dan titik akhir Anda dari sumber daya Personalizer.

Penting

Buka portal Microsoft Azure. Jika sumber daya Form Recognizer yang Anda buat di bagian Prasyarat berhasil disebarkan, klik tombol Buka Sumber Daya di bagian Langkah Berikutnya. Anda dapat menemukan kunci dan titik akhir Anda di halaman kunci dan titik akhir sumber daya, di bawah manajemen sumber daya.

Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, pertimbangkan penggunaan cara aman untuk menyimpan dan mengakses informasi masuk Anda. Misalnya, Azure key vault.

private const string ServiceEndpoint  = "https://REPLACE-WITH-YOUR-PERSONALIZER-RESOURCE-NAME.cognitiveservices.azure.com";
private const string ResourceKey = "<REPLACE-WITH-YOUR-PERSONALIZER-KEY>";

Selanjutnya, susun Rank dan URL Reward. Perhatikan bahwa pengaturan useLocalInference: true sebagai parameter untuk PersonalizerClientOptions diperlukan untuk mengaktifkan inferensi lokal.

static PersonalizerClient InitializePersonalizerClient(Uri url)
{
    // Set the local inference flag to true when initializing the client.
    return new PersonalizerClient(url, new AzureKeyCredential(ResourceKey), new PersonalizerClientOptions(useLocalInference: true));
}

Dapatkan pilihan konten yang dihadirkan sebagai tindakan

Tindakan mewakili pilihan konten yang menjadi tempat Personalizer memilih item konten terbaik yang Anda inginkan. Tambahkan metode berikut ke kelas Program untuk mewakili serangkaian tindakan dan fiturnya.

static IList<PersonalizerRankableAction> GetActions()
{
    IList<PersonalizerRankableAction> actions = new List<PersonalizerRankableAction>
    {
        new PersonalizerRankableAction(
            id: "pasta",
            features: new List<object>() { new { taste = "salty", spiceLevel = "medium" }, new { nutritionLevel = 5, cuisine = "italian" } }
        ),

        new PersonalizerRankableAction(
            id: "ice cream",
            features: new List<object>() { new { taste = "sweet", spiceLevel = "none" }, new { nutritionalLevel = 2 } }
        ),

        new PersonalizerRankableAction(
            id: "juice",
            features: new List<object>() { new { taste = "sweet", spiceLevel = "none" }, new { nutritionLevel = 5 }, new { drink = true } }
        ),

        new PersonalizerRankableAction(
            id: "salad",
            features: new List<object>() { new { taste = "salty", spiceLevel = "low" }, new { nutritionLevel = 8 } }
        )
    };

    return actions;
}

Mendapatkan preferensi pengguna untuk konteks

Tambahkan metode berikut ke kelas Program untuk mendapatkan input pengguna dari baris perintah untuk waktu dan preferensi pelanggan saat ini. Ini akan digunakan sebagai fitur konteks.

static string GetTimeOfDayForContext()
{
    string[] timeOfDayFeatures = new string[] { "morning", "afternoon", "evening", "night" };

    Console.WriteLine("\nWhat time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night");
    if (!int.TryParse(GetKey(), out int timeIndex) || timeIndex < 1 || timeIndex > timeOfDayFeatures.Length)
    {
        Console.WriteLine("\nEntered value is invalid. Setting feature value to " + timeOfDayFeatures[0] + ".");
        timeIndex = 1;
    }

    return timeOfDayFeatures[timeIndex - 1];
}
static string GetUsersTastePreference()
{
    string[] tasteFeatures = new string[] { "salty", "sweet" };
    var random = new Random();
    var taste = random.Next(1, 2);

    Console.WriteLine("\nWhat type of food would you prefer (enter number)? 1. salty 2. sweet");
    if (!int.TryParse(GetKey(), out int tasteIndex) || tasteIndex < 1 || tasteIndex > tasteFeatures.Length)
    {
        Console.WriteLine("\nEntered value is invalid. Setting feature value to " + tasteFeatures[0] + ".");
        tasteIndex = 1;
    }

    return tasteFeatures[taste - 1];
}

Kedua metode menggunakan metode GetKey untuk membaca pilihan pengguna dari baris perintah.

private static string GetKey()
{
    return Console.ReadKey().Key.ToString().Last().ToString().ToUpper();
}
private static IList<object> GetContext(string time, string taste)
{
    return new List<object>()
    {
        new { time = time },
        new { taste = taste }
    };
}

Membuat perulangan pembelajaran

Perulangan pembelajaran Personalizer adalah siklus panggilan Peringkat dan Reward. Dalam mulai cepat ini, setiap panggilan Rank, untuk menyesuaikan konten, diikuti dengan panggilan Reward untuk memberi tahu Personalizer sebaik apa performa layanannya.

Kode berikut berputar melalui siklus yang meminta preferensi pengguna melalui baris perintah, mengirim informasi tersebut ke Personalizer untuk mengambil tindakan terbaik untuk setiap slot, menghadirkan pilihan kepada pelanggan untuk memilih dari daftar, lalu mengirim skor hadiah ke Personalizer yang menandakan seberapa baik layanan dalam memilih.

static void Main(string[] args)
{
    Console.WriteLine($"Welcome to this Personalizer Quickstart!\n" +
    $"This code will help you understand how to use the Personalizer APIs (rank and reward).\n" +
    $"Each iteration represents a user interaction and will demonstrate how context, actions, and rewards work.\n" +
    $"Note: Personalizer AI models learn from a large number of user interactions:\n" +
    $"You won't be able to tell the difference in what Personalizer returns by simulating a few events by hand.\n" +
    $"If you want a sample that focuses on seeing how Personalizer learns, see the Python Notebook sample.");

    int iteration = 1;
    bool runLoop = true;

    IList<PersonalizerRankableAction> actions = GetActions();
    PersonalizerClient client = InitializePersonalizerClient(new Uri(ServiceEndpoint));

    do
    {
        Console.WriteLine("\nIteration: " + iteration++);

        string timeOfDayFeature = GetTimeOfDayForContext();
        string deviceFeature = GetUsersTastePreference();

        IList<object> currentContext = GetContext(timeOfDayFeature, deviceFeature);

        string eventId = Guid.NewGuid().ToString();

        var rankOptions = new PersonalizerRankOptions(actions: actions, contextFeatures: currentContext, eventId: eventId);
        PersonalizerRankResult rankResult = client.Rank(rankOptions);

        Console.WriteLine("\nPersonalizer service thinks you would like to have: " + rankResult.RewardActionId + ". Is this correct? (y/n)");

        float reward = 0.0f;
        string answer = GetKey();

        if (answer == "Y")
        {
            reward = 1.0f;
            Console.WriteLine("\nGreat! Enjoy your food.");
        }
        else if (answer == "N")
        {
            reward = 0.0f;
            Console.WriteLine("\nYou didn't like the recommended food choice.");
        }
        else
        {
            Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended food choice.");
        }

        client.Reward(rankResult.EventId, reward);

        Console.WriteLine("\nPress q to break, any other key to continue:");
        runLoop = !(GetKey() == "Q");

    } while (runLoop);
}

Jalankan program

Jalankan aplikasi dengan perintah run dotnet dari direktori aplikasi Anda.

dotnet run

The quickstart program asks a couple of questions to gather user preferences, known as features, then provides the top action.