Mulai cepat: Pustaka klien Personalizer

Penting

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

Mulai menggunakan pustaka klien Azure AI Personalizer untuk menyiapkan perulangan pembelajaran dasar. Perulangan pembelajaran adalah sistem keputusan dan umpan balik: aplikasi meminta peringkat keputusan dari layanan, kemudian menggunakan pilihan peringkat teratas dan menghitung skor hadiah dari hasil. Ini mengembalikan skor hadiah ke layanan. Seiring waktu, Personalizer menggunakan algoritma AI untuk membuat keputusan yang lebih baik untuk konteks tertentu. Ikuti langkah-langkah ini untuk menyiapkan aplikasi sampel.

Contoh skenario

Dalam mulai cepat ini, e-retailer kelontong ingin meningkatkan pendapatan dengan menunjukkan produk yang relevan dan dipersonalisasi kepada setiap pelanggan di situs webnya. Di halaman utama, ada bagian "Produk Unggulan" yang menampilkan produk makanan siap saji kepada calon pelanggan. E-retailer ingin menentukan cara menunjukkan produk yang tepat kepada pelanggan yang tepat untuk memaksimalkan kemungkinan pembelian.

Layanan Personalizer memecahkan masalah ini dengan cara otomatis, dapat diskalakan, dan dapat disesuaikan menggunakan pembelajaran penguatan. Anda akan mempelajari cara membuat tindakan dan fitur, fitur konteks, dan skor hadiahnya. Anda juga akan menggunakan pustaka klien Personalizer untuk melakukan panggilan ke API Peringkat dan Hadiah.

Dokumentasi referensi | Kode sumber pustaka | Paket (NuGet) | sampel kode .NET

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 menghubungkan 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.

Konfigurasi model

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 dotnet new untuk membuat aplikasi konsol baru dengan nama 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. Kemudian buat 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 Microsoft.Azure.CognitiveServices.Personalizer --version 1.0.0

Tip

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

Blok kode 1: Hasilkan data sampel

Personalizer dimaksudkan untuk berjalan pada aplikasi yang menerima dan menginterpretasikan data real time. Dalam mulai cepat ini, Anda akan menggunakan kode sampel untuk menghasilkan tindakan pelanggan imajiner di situs web grocery. Blok kode berikut mendefinisikan tiga metode utama: GetActions, GetContext, dan GetRewardScore.

  • GetActions mengembalikan daftar pilihan yang perlu diberi peringkat oleh situs web grocery. Dalam contoh ini, tindakannya adalah produk makanan. Setiap pilihan tindakan memiliki detail (fitur) yang dapat memengaruhi perilaku pengguna di kemudian hari. Tindakan digunakan sebagai input untuk API Peringkat

  • GetContext mengembalikan kunjungan pelanggan yang disimulasikan. Ini memilih detail acak (fitur konteks) seperti pelanggan mana yang ada dan jam berapa kunjungan berlangsung. Secara umum, konteks mewakili status aplikasi, sistem, lingkungan, atau pengguna Anda saat ini. Objek konteks digunakan sebagai input untuk RANK API.

    Fitur konteks dalam mulai cepat ini sederhana. Namun, dalam sistem produksi nyata, merancang fitur Anda dan mengevaluasi efektivitasnya penting. Lihat dokumentasi tertaut untuk panduan.

  • GetRewardScore mengembalikan skor antara nol dan skor yang mewakili keberhasilan interaksi pelanggan. Ini menggunakan logika sederhana untuk menentukan bagaimana konteks yang berbeda merespons pilihan tindakan yang berbeda. Misalnya, pengguna tertentu akan selalu memberikan 1,0 untuk produk vegetarian dan vegan, dan 0,0 untuk produk lain. Dalam skenario nyata, Personalizer akan mempelajari preferensi pengguna dari data yang dikirim dalam panggilan API Peringkat dan Hadiah. Anda tidak akan mendefinisikan ini secara eksplisit seperti dalam kode contoh.

    Dalam sistem produksi nyata, skor hadiah harus dirancang untuk selaras dengan tujuan bisnis dan KPI Anda. Menentukan cara menghitung metrik hadiah mungkin memerlukan beberapa eksperimen.

    Dalam kode di bawah ini, preferensi dan respons pengguna terhadap tindakan dikodekan secara permanen sebagai serangkaian pernyataan kondisi, dan teks penjelasan disertakan dalam kode untuk tujuan demonstratif.

  1. Temukan kunci dan titik akhir Anda.

    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.

  2. Buka Program.cs di editor teks atau IDE dan tempelkan kode berikut.

    using Microsoft.Azure.CognitiveServices.Personalizer;
    using Microsoft.Azure.CognitiveServices.Personalizer.Models;
    
    class Program
    {
        private static readonly string ApiKey = "REPLACE_WITH_YOUR_PERSONALIZER_KEY";
        private static readonly string ServiceEndpoint = "REPLACE_WITH_YOUR_ENDPOINT_URL";
    
        static PersonalizerClient InitializePersonalizerClient(string url)
        {
            PersonalizerClient client = new PersonalizerClient(
                new ApiKeyServiceClientCredentials(ApiKey))
            { Endpoint = url };
    
            return client;
        }
    
        static Dictionary<string, ActionFeatures> actions = new Dictionary<string, ActionFeatures>
        {
        {"pasta", new ActionFeatures(
                        new BrandInfo(company: "pasta_inc"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "Italian",
                            price: 12),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: false,
                            highProtein: false,
                            vegetarian: false,
                            lowFat: true,
                            lowSodium: true))},
        {"bbq", new ActionFeatures(
                        new BrandInfo(company: "ambisco"),
                        new ItemAttributes(
                            quantity: 2,
                            category: "bbq",
                            price: 20),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: true,
                            highProtein: true,
                            vegetarian: false,
                            lowFat: false,
                            lowSodium: false))},
        {"bao", new ActionFeatures(
                        new BrandInfo(company: "bao_and_co"),
                        new ItemAttributes(
                            quantity: 4,
                            category: "Chinese",
                            price: 8),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: true,
                            highProtein: true,
                            vegetarian: false,
                            lowFat: true,
                            lowSodium: false))},
        {"hummus", new ActionFeatures(
                        new BrandInfo(company: "garbanzo_inc"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "Breakfast",
                            price: 5),
                        new DietaryAttributes(
                            vegan: true,
                            lowCarb: false,
                            highProtein: true,
                            vegetarian: true,
                            lowFat: false,
                            lowSodium: false))},
        {"veg_platter", new ActionFeatures(
                        new BrandInfo(company: "farm_fresh"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "produce",
                            price: 7),
                        new DietaryAttributes(
                            vegan: true,
                            lowCarb: true,
                            highProtein: false,
                            vegetarian: true,
                            lowFat: true,
                            lowSodium: true ))},
    };
    
        static IList<RankableAction> GetActions()
        {
            IList<RankableAction> rankableActions = new List<RankableAction>();
            foreach (var action in actions)
            {
                rankableActions.Add(new RankableAction
                {
                    Id = action.Key,
                    Features = new List<object>() { action.Value }
                });
            }
    
            return rankableActions;
        }
    
        public class BrandInfo
        {
            public string Company { get; set; }
            public BrandInfo(string company)
            {
                Company = company;
            }
        }
    
        public class ItemAttributes
        {
            public int Quantity { get; set; }
            public string Category { get; set; }
            public double Price { get; set; }
            public ItemAttributes(int quantity, string category, double price)
            {
                Quantity = quantity;
                Category = category;
                Price = price;
            }
        }
    
        public class DietaryAttributes
        {
            public bool Vegan { get; set; }
            public bool LowCarb { get; set; }
            public bool HighProtein { get; set; }
            public bool Vegetarian { get; set; }
            public bool LowFat { get; set; }
            public bool LowSodium { get; set; }
            public DietaryAttributes(bool vegan, bool lowCarb, bool highProtein, bool vegetarian, bool lowFat, bool lowSodium)
            {
                Vegan = vegan;
                LowCarb = lowCarb;
                HighProtein = highProtein;
                Vegetarian = vegetarian;
                LowFat = lowFat;
                LowSodium = lowSodium;
    
            }
        }
    
        public class ActionFeatures
        {
            public BrandInfo BrandInfo { get; set; }
            public ItemAttributes ItemAttributes { get; set; }
            public DietaryAttributes DietaryAttributes { get; set; }
            public ActionFeatures(BrandInfo brandInfo, ItemAttributes itemAttributes, DietaryAttributes dietaryAttributes)
            {
                BrandInfo = brandInfo;
                ItemAttributes = itemAttributes;
                DietaryAttributes = dietaryAttributes;
            }
        }
    
        public static Context GetContext()
        {
            return new Context(
                    user: GetRandomUser(),
                    timeOfDay: GetRandomTimeOfDay(),
                    location: GetRandomLocation(),
                    appType: GetRandomAppType());
        }
    
        static string[] timesOfDay = new string[] { "morning", "afternoon", "evening" };
    
        static string[] locations = new string[] { "west", "east", "midwest" };
    
        static string[] appTypes = new string[] { "edge", "safari", "edge_mobile", "mobile_app" };
    
        static IList<UserProfile> users = new List<UserProfile>
    {
        new UserProfile(
            name: "Bill",
            dietaryPreferences: new Dictionary<string, bool> { { "low_carb", true } },
            avgOrderPrice: "0-20"),
        new UserProfile(
            name: "Satya",
            dietaryPreferences: new Dictionary<string, bool> { { "low_sodium", true} },
            avgOrderPrice: "201+"),
        new UserProfile(
            name: "Amy",
            dietaryPreferences: new Dictionary<string, bool> { { "vegan", true }, { "vegetarian", true } },
            avgOrderPrice: "21-50")
    };
    
        static string GetRandomTimeOfDay()
        {
            var random = new Random();
            var timeOfDayIndex = random.Next(timesOfDay.Length);
            Console.WriteLine($"TimeOfDay: {timesOfDay[timeOfDayIndex]}");
            return timesOfDay[timeOfDayIndex];
        }
    
        static string GetRandomLocation()
        {
            var random = new Random();
            var locationIndex = random.Next(locations.Length);
            Console.WriteLine($"Location: {locations[locationIndex]}");
            return locations[locationIndex];
        }
    
        static string GetRandomAppType()
        {
            var random = new Random();
            var appIndex = random.Next(appTypes.Length);
            Console.WriteLine($"AppType: {appTypes[appIndex]}");
            return appTypes[appIndex];
        }
    
        static UserProfile GetRandomUser()
        {
            var random = new Random();
            var userIndex = random.Next(users.Count);
            Console.WriteLine($"\nUser: {users[userIndex].Name}");
            return users[userIndex];
        }
    
        public class UserProfile
        {
            // Mark name as non serializable so that it is not part of the context features
            [NonSerialized()]
            public string Name;
            public Dictionary<string, bool> DietaryPreferences { get; set; }
            public string AvgOrderPrice { get; set; }
    
            public UserProfile(string name, Dictionary<string, bool> dietaryPreferences, string avgOrderPrice)
            {
                Name = name;
                DietaryPreferences = dietaryPreferences;
                AvgOrderPrice = avgOrderPrice;
            }
        }
    
        public class Context
        {
            public UserProfile User { get; set; }
            public string TimeOfDay { get; set; }
            public string Location { get; set; }
            public string AppType { get; set; }
    
            public Context(UserProfile user, string timeOfDay, string location, string appType)
            {
                User = user;
                TimeOfDay = timeOfDay;
                Location = location;
                AppType = appType;
            }
        }
        public static float GetRewardScore(Context context, string actionId)
        {
            float rewardScore = 0.0f;
            string userName = context.User.Name;
            ActionFeatures actionFeatures = actions[actionId];
            if (userName.Equals("Bill"))
            {
                if (actionFeatures.ItemAttributes.Price < 10 && !context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill likes to be economical when he's not in the midwest visiting his friend Warren. He bought {actionId} because it was below a price of $10.");
                }
                else if (actionFeatures.DietaryAttributes.LowCarb && context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill is visiting his friend Warren in the midwest. There he's willing to spend more on food as long as it's low carb, so Bill bought {actionId}.");
                }
                else if (actionFeatures.ItemAttributes.Price >= 10 && !context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill didn't buy {actionId} because the price was too high when not visting his friend Warren in the midwest.");
                }
                else if (actionFeatures.DietaryAttributes.LowCarb && context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill didn't buy {actionId} because it's not low-carb, and he's in the midwest visitng his friend Warren.");
                }
            }
            else if (userName.Equals("Satya"))
            {
                if (actionFeatures.DietaryAttributes.LowSodium)
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nSatya is health conscious, so he bought {actionId} since it's low in sodium.");
                }
                else
                {
                    Console.WriteLine($"\nSatya did not buy {actionId} because it's not low sodium.");
                }
            }
            else if (userName.Equals("Amy"))
            {
                if (actionFeatures.DietaryAttributes.Vegan || actionFeatures.DietaryAttributes.Vegetarian)
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nAmy likes to eat plant-based foods, so she bought {actionId} because it's vegan or vegetarian friendly.");
                }
                else
                {
                    Console.WriteLine($"\nAmy did not buy {actionId} because it's not vegan or vegetarian.");
                }
            }
            return rewardScore;
        }
        // ...
    
  3. Tempelkan kunci langganan dan titik akhir Anda ke dalam kode yang ditunjukkan. Titik akhir Anda memiliki formulir https://<your_resource_name>.cognitiveservices.azure.com/.

    Penting

    Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Lihat artikel keamanan layanan Azure AI untuk informasi selengkapnya.

Blok kode 2: Iterasi perulangan pembelajaran

Blok kode berikutnya mendefinisikan metode utama dan menutup skrip. Ini menjalankan iterasi perulangan pembelajaran, di mana ia menghasilkan konteks (termasuk pelanggan), meminta peringkat tindakan dalam konteks tersebut menggunakan API Peringkat, menghitung skor hadiah, dan meneruskan skor tersebut kembali ke layanan Personalizer menggunakan REWARD API. Ini mencetak informasi yang relevan ke konsol di setiap langkah.

Dalam contoh ini, setiap panggilan Peringkat dilakukan untuk menentukan produk mana yang harus ditampilkan di bagian "Produk Unggulan". Kemudian panggilan Hadiah menunjukkan apakah produk unggulan dibeli oleh pengguna atau tidak. Hadiah dikaitkan dengan keputusan mereka melalui nilai umum EventId .

    static void Main(string[] args)
    {
        int iteration = 1;
        bool runLoop = true;

        // Get the actions list to choose from personalizer with their features.
        IList<RankableAction> actions = GetActions();

        // Initialize Personalizer client.
        PersonalizerClient client = InitializePersonalizerClient(ServiceEndpoint);

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

            // Get context information.
            Context context = GetContext();

            // Create current context from user specified data.
            IList<object> currentContext = new List<object>() {
            context
        };

            // Generate an ID to associate with the request.
            string eventId = Guid.NewGuid().ToString();

            // Rank the actions
            var request = new RankRequest(actions: actions, contextFeatures: currentContext, eventId: eventId);
            RankResponse response = client.Rank(request);

            Console.WriteLine($"\nPersonalizer service thinks {context.User.Name} would like to have: {response.RewardActionId}.");

            float reward = GetRewardScore(context, response.RewardActionId);

            // Send the reward for the action based on user response.
            client.Reward(response.EventId, new RewardRequest(reward));

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

        } while (runLoop);
    }

        private static string GetKey()
    {
        return Console.ReadKey().Key.ToString().Last().ToString().ToUpper();
    }

}

Jalankan program

Jalankan aplikasi dengan perintah dotnet run dotnet dari direktori aplikasi Anda.

dotnet run

Pada iterasi pertama, Personalizer akan merekomendasikan tindakan acak, karena belum melakukan pelatihan apa pun. Anda dapat secara opsional menjalankan lebih banyak iterasi. Setelah sekitar 10 menit, layanan akan mulai menunjukkan peningkatan dalam rekomendasinya.

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

Hasilkan banyak peristiwa untuk analisis (opsional)

Anda dapat dengan mudah menghasilkan, misalnya, 5.000 peristiwa dari skenario mulai cepat ini, yang cukup untuk mendapatkan pengalaman menggunakan mode Magang dan mode Online, menjalankan evaluasi offline, dan membuat evaluasi fitur. Ganti metode utama di atas dengan:

    static void Main(string[] args)
    {
    int iteration = 1;
    int runLoop = 0;

    // Get the actions list to choose from personalizer with their features.
    IList<RankableAction> actions = GetActions();

    // Initialize Personalizer client.
    PersonalizerClient client = InitializePersonalizerClient(ServiceEndpoint);

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

        // Get context information.
        Context context = GetContext();

        // Create current context from user specified data.
        IList<object> currentContext = new List<object>() {
            context
        };

        // Generate an ID to associate with the request.
        string eventId = Guid.NewGuid().ToString();

        // Rank the actions
        var request = new RankRequest(actions: actions, contextFeatures: currentContext, eventId: eventId);
        RankResponse response = client.Rank(request);

        Console.WriteLine($"\nPersonalizer service thinks {context.User.Name} would like to have: {response.RewardActionId}.");

        float reward = GetRewardScore(context, response.RewardActionId);

        // Send the reward for the action based on user response.
        client.Reward(response.EventId, new RewardRequest(reward));

        runLoop = runLoop + 1;

    } while (runLoop < 1000);
}

Kode sumber untuk mulai cepat ini tersedia di GitHub.

Dokumentasi |referensi Paket kode | sumber Pustaka (npm) | Sampel kode mulai cepat

Prasyarat

  • Langganan Azure - Buat langganan secara gratis
  • Instal Node.js dan npm (diverifikasi dengan Node.js v14.16.0 dan npm 6.14.11).
  • 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 menghubungkan 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.

Konfigurasi model

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 Node.js baru

Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda, dan buka direktori tersebut.

mkdir myapp && cd myapp

Jalankan perintah npm init -y untuk membuat file package.json.

npm init -y

Buat skrip Node.js baru di editor atau IDE pilihan Anda bernama personalizer-quickstart.js dan buat variabel untuk titik akhir sumber daya dan kunci langganan Anda.

Memasang pustaka klien

Instal pustaka klien Personalizer untuk Node.js dengan perintah berikut:

npm install @azure/cognitiveservices-personalizer --save

Instal paket npm yang tersisa untuk mulai cepat ini:

npm install @azure/ms-rest-azure-js @azure/ms-rest-js readline-sync uuid --save

Blok kode 1: Hasilkan data sampel

Personalizer dimaksudkan untuk berjalan pada aplikasi yang menerima dan menginterpretasikan data real time. Dalam mulai cepat ini, Anda akan menggunakan kode sampel untuk menghasilkan tindakan pelanggan imajiner di situs web grocery. Blok kode berikut mendefinisikan tiga metode utama: getActionsList, getContextFeaturesList dan getReward.

  • getActionsList mengembalikan daftar pilihan yang perlu diberi peringkat oleh situs web grocery. Dalam contoh ini, tindakannya adalah produk makanan. Setiap pilihan tindakan memiliki detail (fitur) yang dapat memengaruhi perilaku pengguna di kemudian hari. Tindakan digunakan sebagai input untuk API Peringkat

  • getContextFeaturesList mengembalikan kunjungan pelanggan yang disimulasikan. Ini memilih detail acak (fitur konteks) seperti pelanggan mana yang ada dan jam berapa kunjungan berlangsung. Secara umum, konteks mewakili status aplikasi, sistem, lingkungan, atau pengguna Anda saat ini. Objek konteks digunakan sebagai input untuk RANK API.

    Fitur konteks dalam mulai cepat ini sederhana. Namun, dalam sistem produksi nyata, merancang fitur Anda dan mengevaluasi efektivitasnya penting. Lihat dokumentasi tertaut untuk panduan.

  • getReward meminta pengguna untuk menilai rekomendasi layanan sebagai keberhasilan atau kegagalan. Ini mengembalikan skor antara nol dan satu yang mewakili keberhasilan interaksi pelanggan. Dalam skenario nyata, Personalizer akan mempelajari preferensi pengguna dari interaksi pelanggan real time.

    Dalam sistem produksi nyata, skor hadiah harus dirancang untuk selaras dengan tujuan bisnis dan KPI Anda. Menentukan cara menghitung metrik hadiah mungkin memerlukan beberapa eksperimen.

Buka personalizer-quickstart.js di editor teks atau IDE dan tempelkan kode di bawah ini.

const uuidv1 = require('uuid/v1');
const Personalizer = require('@azure/cognitiveservices-personalizer');
const CognitiveServicesCredentials = require('@azure/ms-rest-azure-js').CognitiveServicesCredentials;
const readline = require('readline-sync');

function getReward() {
  const answer = readline.question("\nIs this correct (y/n)\n");
  if (answer.toLowerCase() === 'y') {
    console.log("\nGreat| Enjoy your food.");
    return 1;
  }
  console.log("\nYou didn't like the recommended food choice.");
  return 0;
}

function getContextFeaturesList() {
  const timeOfDayFeatures = ['morning', 'afternoon', 'evening', 'night'];
  const tasteFeatures = ['salty', 'sweet'];

  let answer = readline.question("\nWhat time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night\n");
  let selection = parseInt(answer);
  const timeOfDay = selection >= 1 && selection <= 4 ? timeOfDayFeatures[selection - 1] : timeOfDayFeatures[0];

  answer = readline.question("\nWhat type of food would you prefer (enter number)? 1. salty 2. sweet\n");
  selection = parseInt(answer);
  const taste = selection >= 1 && selection <= 2 ? tasteFeatures[selection - 1] : tasteFeatures[0];

  console.log("Selected features:\n");
  console.log("Time of day: " + timeOfDay + "\n");
  console.log("Taste: " + taste + "\n");

  return [
    {
      "time": timeOfDay
    },
    {
      "taste": taste
    }
  ];
}

function getExcludedActionsList() {
  return [
    "juice"
  ];
}

function getActionsList() {
  return [
    {
      "id": "pasta",
      "features": [
        {
          "taste": "salty",
          "spiceLevel": "medium"
        },
        {
          "nutritionLevel": 5,
          "cuisine": "italian"
        }
      ]
    },
    {
      "id": "ice cream",
      "features": [
        {
          "taste": "sweet",
          "spiceLevel": "none"
        },
        {
          "nutritionalLevel": 2
        }
      ]
    },
    {
      "id": "juice",
      "features": [
        {
          "taste": "sweet",
          "spiceLevel": "none"
        },
        {
          "nutritionLevel": 5
        },
        {
          "drink": true
        }
      ]
    },
    {
      "id": "salad",
      "features": [
        {
          "taste": "salty",
          "spiceLevel": "low"
        },
        {
          "nutritionLevel": 8
        }
      ]
    }
  ];
}

Blok kode 2: Iterasi perulangan pembelajaran

Blok kode berikutnya mendefinisikan metode utama dan menutup skrip. Ini menjalankan iterasi perulangan pembelajaran, di mana ia meminta pengguna preferensi mereka di baris perintah dan mengirim informasi tersebut ke Personalizer untuk memilih tindakan terbaik. Ini menyajikan tindakan yang dipilih kepada pengguna, yang membuat pilihan menggunakan baris perintah. Kemudian mengirimkan skor hadiah ke layanan Personalizer untuk memberi sinyal seberapa baik layanan melakukan dalam pilihannya.

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.

  1. Tambahkan kode di bawah ini ke personalizer-quickstart.js.

  2. Temukan kunci dan titik akhir Anda. Titik akhir Anda memiliki formulir https://<your_resource_name>.cognitiveservices.azure.com/.

    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.

  3. Tempelkan kunci langganan dan titik akhir Anda ke dalam kode yang ditunjukkan.

    Penting

    Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan, lihat artikel keamanan layanan Azure AI.

    async function main() {
    
        // The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
        const serviceKey = "PASTE_YOUR_PERSONALIZER_SUBSCRIPTION_KEY_HERE";
      
        // The endpoint specific to your personalization service instance; 
        // e.g. https://<your-resource-name>.cognitiveservices.azure.com
        const baseUri = "PASTE_YOUR_PERSONALIZER_ENDPOINT_HERE";
      
        const credentials = new CognitiveServicesCredentials(serviceKey);
      
        // Initialize Personalization client.
        const personalizerClient = new Personalizer.PersonalizerClient(credentials, baseUri);
      
      
        let runLoop = true;
      
        do {
      
          let rankRequest = {}
      
          // Generate an ID to associate with the request.
          rankRequest.eventId = uuidv1();
      
          // Get context information from the user.
          rankRequest.contextFeatures = getContextFeaturesList();
      
          // Get the actions list to choose from personalization with their features.
          rankRequest.actions = getActionsList();
      
          // Exclude an action for personalization ranking. This action will be held at its current position.
          rankRequest.excludedActions = getExcludedActionsList();
      
          rankRequest.deferActivation = false;
      
          // Rank the actions
          const rankResponse = await personalizerClient.rank(rankRequest);
      
          console.log("\nPersonalization service thinks you would like to have:\n")
          console.log(rankResponse.rewardActionId);
      
          // Display top choice to user, user agrees or disagrees with top choice
          const reward = getReward();
      
          console.log("\nPersonalization service ranked the actions with the probabilities as below:\n");
          for (let i = 0; i < rankResponse.ranking.length; i++) {
            console.log(JSON.stringify(rankResponse.ranking[i]) + "\n");
          }
      
          // Send the reward for the action based on user response.
      
          const rewardRequest = {
            value: reward
          }
      
          await personalizerClient.events.reward(rankRequest.eventId, rewardRequest);
      
          runLoop = continueLoop();
      
        } while (runLoop);
      }
      
      function continueLoop() {
        const answer = readline.question("\nPress q to break, any other key to continue.\n")
        if (answer.toLowerCase() === 'q') {
          return false;
        }
        return true;
      }
    
    main()
    .then(result => console.log("done"))
    .catch(err=> console.log(err));
    

Jalankan program

Jalankan aplikasi dengan perintah Node.js dari direktori aplikasi Anda.

node personalizer-quickstart.js

Iterasi melalui beberapa perulangan pembelajaran. Setelah sekitar 10 menit, layanan akan mulai menunjukkan peningkatan dalam rekomendasinya.

Kode sumber untuk mulai cepat ini tersedia di GitHub.

Dokumentasi referensi | Kode sumber pustaka | Paket (pypi) | Sampel kode mulai cepat

Prasyarat

  • Langganan Azure - Buat langganan secara gratis
  • Python 3.x
  • Setelah langganan Azure Anda disiapkan, buat sumber daya Personalizer di portal Azure dan dapatkan kunci dan titik akhir Anda. Setelah menyebar, pilih Buka sumber daya.
    • Anda memerlukan kunci dan titik akhir dari sumber daya yang dibuat untuk menghubungkan aplikasi Anda ke API Personalizer, yang akan Anda tempelkan ke kode mulai cepat di bawah ini.
    • Anda dapat menggunakan tingkat harga gratis (F0) untuk mencoba layanannya, lalu meningkatkannya ke tingkat berbayar untuk produksi nantinya.

Konfigurasi model

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 Python baru

Buat file Python baru bernama personalizer-quickstart.py.

Memasang pustaka klien

Instal pustaka klien Personalizer dengan pip:

pip install azure-cognitiveservices-personalizer

Blok kode 1: Hasilkan data sampel

Personalizer dimaksudkan untuk berjalan pada aplikasi yang menerima dan menginterpretasikan data real time. Untuk tujuan mulai cepat ini, Anda akan menggunakan kode sampel untuk menghasilkan tindakan pelanggan imajiner di situs web grocery. Blok kode berikut mendefinisikan tiga fungsi utama: get_actions, get_context , dan get_reward_score.

  • get_actions mengembalikan daftar pilihan yang perlu diberi peringkat oleh situs web grosir. Dalam contoh ini, tindakannya adalah produk makanan. Setiap pilihan tindakan memiliki detail (fitur) yang dapat memengaruhi perilaku pengguna di kemudian hari. Tindakan digunakan sebagai input untuk API Peringkat

  • get_context mengembalikan kunjungan pelanggan yang disimulasikan. Ini memilih detail acak (fitur konteks) seperti pelanggan mana yang ada dan jam berapa kunjungan berlangsung. Secara umum, konteks mewakili status aplikasi, sistem, lingkungan, atau pengguna Anda saat ini. Objek konteks digunakan sebagai input untuk RANK API.

    Fitur konteks dalam mulai cepat ini sederhana. Namun, dalam sistem produksi nyata, merancang fitur Anda dan mengevaluasi efektivitasnya sangat penting. Lihat dokumentasi tertaut untuk panduan.

  • get_reward_score mengembalikan skor antara nol dan skor yang mewakili keberhasilan interaksi pelanggan. Ini menggunakan logika sederhana untuk menentukan bagaimana konteks yang berbeda akan merespons pilihan tindakan yang berbeda. Misalnya, pengguna tertentu akan selalu memberikan 1,0 untuk produk vegetarian dan vegan, dan 0,0 untuk produk lain. Dalam skenario nyata, Personalizer akan mempelajari preferensi pengguna dari data yang dikirim dalam panggilan API Peringkat dan Hadiah. Anda tidak akan mendefinisikan ini secara eksplisit seperti dalam kode contoh.

    Dalam sistem produksi nyata, skor hadiah harus dirancang untuk selaras dengan tujuan bisnis dan KPI Anda. Menentukan cara menghitung metrik hadiah mungkin memerlukan beberapa eksperimen.

    Dalam kode di bawah ini, preferensi dan respons pengguna terhadap tindakan dikodekan secara permanen sebagai serangkaian pernyataan kondisi, dan teks penjelasan disertakan dalam kode untuk tujuan demonstratif.

Ikuti langkah-langkah ini untuk menyiapkan skrip Personalizer.

  1. Temukan kunci dan titik akhir Anda.

    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.

  2. Buka personalizer-quickstart.py di editor teks atau IDE dan tempelkan kode di bawah ini.

  3. Tempelkan kunci langganan dan titik akhir Anda ke dalam kode yang ditunjukkan. Titik akhir Anda memiliki formulir https://<your_resource_name>.cognitiveservices.azure.com/.

    Penting

    Jangan lupa menghapus kunci dari kode setelah Anda selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan metode aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya, lihat keamanan layanan Azure AI.

from azure.cognitiveservices.personalizer import PersonalizerClient
from azure.cognitiveservices.personalizer.models import RankableAction, RewardRequest, RankRequest
from msrest.authentication import CognitiveServicesCredentials

import datetime, json, os, time, uuid, random

key = "paste_your_personalizer_key_here"
endpoint = "paste_your_personalizer_endpoint_here"

# Instantiate a Personalizer client
client = PersonalizerClient(endpoint, CognitiveServicesCredentials(key))

actions_and_features = {
    'pasta': {
        'brand_info': {
            'company':'pasta_inc'
        }, 
        'attributes': {
            'qty':1, 'cuisine':'italian',
            'price':12
        },
        'dietary_attributes': {
            'vegan': False,
            'low_carb': False,
            'high_protein': False,
            'vegetarian': False,
            'low_fat': True,
            'low_sodium': True
        }
    },
    'bbq': {
        'brand_info' : {
            'company': 'ambisco'
        },
        'attributes': {
            'qty': 2,
            'category': 'bbq',
            'price': 20
        }, 
        'dietary_attributes': {
            'vegan': False,
            'low_carb': True,
            'high_protein': True,
            'vegetarian': False,
            'low_fat': False,
            'low_sodium': False
        }
    },
    'bao': {
        'brand_info': {
            'company': 'bao_and_co'
        },
        'attributes': {
            'qty': 4,
            'category': 'chinese',
            'price': 8
        }, 
        'dietary_attributes': {
            'vegan': False,
            'low_carb': True,
            'high_protein': True,
            'vegetarian': False,
            'low_fat': True,
            'low_sodium': False
        }
    },
    'hummus': {
        'brand_info' : { 
            'company': 'garbanzo_inc'
        },
        'attributes' : {
            'qty': 1,
            'category': 'breakfast',
            'price': 5
        }, 
        'dietary_attributes': {
            'vegan': True, 
            'low_carb': False,
            'high_protein': True,
            'vegetarian': True,
            'low_fat': False, 
            'low_sodium': False
        }
    },
    'veg_platter': {
        'brand_info': {
            'company': 'farm_fresh'
        }, 
        'attributes': {
            'qty': 1,
            'category': 'produce', 
            'price': 7
        },
        'dietary_attributes': {
            'vegan': True,
            'low_carb': True,
            'high_protein': False,
            'vegetarian': True,
            'low_fat': True,
            'low_sodium': True
        }
    }
}

def get_actions():
    res = []
    for action_id, feat in actions_and_features.items():
        action = RankableAction(id=action_id, features=[feat])
        res.append(action)
    return res

user_profiles = {
    'Bill': {
        'dietary_preferences': 'low_carb', 
        'avg_order_price': '0-20',
        'browser_type': 'edge'
    },
    'Satya': {
        'dietary_preferences': 'low_sodium',
        'avg_order_price': '201+',
        'browser_type': 'safari'
    },
    'Amy': {
        'dietary_preferences': {
            'vegan', 'vegetarian'
        },
        'avg_order_price': '21-50',
        'browser_type': 'edge'},
    }

def get_context(user):
    location_context = {'location': random.choice(['west', 'east', 'midwest'])}
    time_of_day = {'time_of_day': random.choice(['morning', 'afternoon', 'evening'])}
    app_type = {'application_type': random.choice(['edge', 'safari', 'edge_mobile', 'mobile_app'])}
    res = [user_profiles[user], location_context, time_of_day, app_type]
    return res

def get_random_users(k = 5):
    return random.choices(list(user_profiles.keys()), k=k)


def get_reward_score(user, actionid, context):
    reward_score = 0.0
    action = actions_and_features[actionid]
    
    if user == 'Bill':
        if action['attributes']['price'] < 10 and (context[1]['location'] !=  "midwest"):
            reward_score = 1.0
            print("Bill likes to be economical when he's not in the midwest visiting his friend Warren. He bought", actionid, "because it was below a price of $10.")
        elif (action['dietary_attributes']['low_carb'] == True) and (context[1]['location'] ==  "midwest"):
            reward_score = 1.0
            print("Bill is visiting his friend Warren in the midwest. There he's willing to spend more on food as long as it's low carb, so Bill bought" + actionid + ".")
            
        elif (action['attributes']['price'] >= 10) and (context[1]['location'] != "midwest"):
            print("Bill didn't buy", actionid, "because the price was too high when not visting his friend Warren in the midwest.")
            
        elif (action['dietary_attributes']['low_carb'] == False) and (context[1]['location'] ==  "midwest"):
            print("Bill didn't buy", actionid, "because it's not low-carb, and he's in the midwest visitng his friend Warren.")
             
    elif user == 'Satya':
        if action['dietary_attributes']['low_sodium'] == True:
            reward_score = 1.0
            print("Satya is health conscious, so he bought", actionid,"since it's low in sodium.")
        else:
            print("Satya did not buy", actionid, "because it's not low sodium.")   
            
    elif user == 'Amy':
        if (action['dietary_attributes']['vegan'] == True) or (action['dietary_attributes']['vegetarian'] == True):
            reward_score = 1.0
            print("Amy likes to eat plant-based foods, so she bought", actionid, "because it's vegan or vegetarian friendly.")       
        else:
            print("Amy did not buy", actionid, "because it's not vegan or vegetarian.")
                
    return reward_score
    # ...

Blok kode 2: Iterasi perulangan pembelajaran

Blok kode berikutnya menentukan fungsi run_personalizer_cycle dan memanggilnya dalam perulangan umpan balik pengguna sederhana. Ini menjalankan iterasi perulangan pembelajaran, di mana ia menghasilkan konteks (termasuk pelanggan), meminta peringkat tindakan dalam konteks tersebut menggunakan API Peringkat, menghitung skor hadiah, dan meneruskan skor tersebut kembali ke layanan Personalizer menggunakan REWARD API. Ini mencetak informasi yang relevan ke konsol di setiap langkah.

Dalam contoh ini, setiap panggilan Peringkat dilakukan untuk menentukan produk mana yang harus ditampilkan di bagian "Produk Unggulan". Kemudian panggilan Hadiah menunjukkan apakah produk unggulan dibeli oleh pengguna atau tidak. Hadiah dikaitkan dengan keputusan mereka melalui nilai umum EventId .

def run_personalizer_cycle():
    actions = get_actions()
    user_list = get_random_users()
    for user in user_list:
        print("------------")
        print("User:", user, "\n")
        context = get_context(user)
        print("Context:", context, "\n")
        
        rank_request = RankRequest(actions=actions, context_features=context)
        response = client.rank(rank_request=rank_request)
        print("Rank API response:", response, "\n")
        
        eventid = response.event_id
        actionid = response.reward_action_id
        print("Personalizer recommended action", actionid, "and it was shown as the featured product.\n")
        
        reward_score = get_reward_score(user, actionid, context)
        client.events.reward(event_id=eventid, value=reward_score)     
        print("\nA reward score of", reward_score , "was sent to Personalizer.")
        print("------------\n")

continue_loop = True
while continue_loop:
    run_personalizer_cycle()
    
    br = input("Press Q to exit, or any other key to run another loop: ")
    if(br.lower()=='q'):
        continue_loop = False

Jalankan program

Setelah semua kode di atas disertakan dalam file Python, Anda dapat menjalankannya dari direktori aplikasi Anda.

python personalizer-quickstart.py

Pada iterasi pertama, Personalizer akan merekomendasikan tindakan acak, karena belum melakukan pelatihan apa pun. Anda dapat secara opsional menjalankan lebih banyak iterasi. Setelah sekitar 10 menit, layanan akan mulai menunjukkan peningkatan dalam rekomendasinya.

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

Hasilkan banyak peristiwa untuk analisis (opsional)

Anda dapat dengan mudah menghasilkan, misalnya, 5.000 peristiwa dari skenario mulai cepat ini, yang cukup untuk mendapatkan pengalaman menggunakan mode Magang, Mode online, menjalankan evaluasi offline, dan membuat evaluasi fitur. Ganti perulangan while di blok kode di atas dengan kode berikut.

for i in range(0,1000):
    run_personalizer_cycle()

Kode sumber untuk mulai cepat ini tersedia di GitHub.

Unduh model terlatih

Jika Anda ingin mengunduh model Personalizer yang telah dilatih pada 5.000 peristiwa dari contoh di atas, kunjungi repositori Sampel Personalizer dan unduh file Personalizer_QuickStart_Model.zip . Lalu buka sumber daya Personalizer Anda di portal Azure, buka halaman Penyetelan dan tab Impor/ekspor, dan impor file.

Membersihkan sumber daya

Untuk membersihkan langganan layanan Azure AI, Anda dapat menghapus sumber daya atau menghapus grup sumber daya, yang akan menghapus sumber daya terkait.

Langkah berikutnya