Mulai menggunakan multi-slot 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.
Personalisasi multi-slot (Pratinjau) memungkinkan Anda menargetkan konten dalam tata letak web, carousel, dan daftar di mana lebih dari satu tindakan (seperti produk atau konten) ditampilkan kepada pengguna Anda. Dengan API multi-slot Personalizer, Anda dapat meminta model AI di Personalizer mempelajari konteks pengguna dan produk apa yang mendorong perilaku tertentu, mempertimbangkan dan belajar dari penempatan di antarmuka pengguna Anda. Misalnya, Personalizer dapat mengetahui bahwa produk atau konten tertentu mendorong lebih banyak klik sebagai bilah sisi atau catatan kaki daripada sebagai sorotan utama pada halaman.
Dalam panduan ini, Anda akan mempelajari cara menggunakan API multi-slot Personalizer.
Dokumentasi referensi | Kode sumber pustaka | Paket (NuGet) | Konseptual multi slot | Sampel
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. Tempelkan kunci dan titik akhir ke dalam kode di bawah ini nanti di mulai cepat.
- Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Persiapan
Meningkatkan instans Personalizer ke Multi-Slot
Catatan
Personalisasi multi-slot (Pratinjau) memengaruhi fungsionalitas lain dari layanan Personalizer. Perubahan ini tidak bisa dibatalkan. Sebelum Anda mengaktifkan personalisasi multi-slot, lihat Personalisasi multi-slot (Pratinjau).
- Nonaktifkan Pengoptimalan Otomatis Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, nonaktifkan Pengoptimalan Otomatis dan simpan.
Catatan
Personalisasi multi-slot tidak akan berfungsi kecuali Anda menonaktifkan Pengoptimalan Otomatis. Pengoptimalan Otomatis untuk personalisasi multi-slot akan didukung di masa depan.
- Perbarui Personalizer ke multi-slot Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, pilih Ekspor pengaturan pembelajaran. Bidang argumen dalam file json yang diunduh akan dimulai dengan --cb_explore_adf. Ubah ini menjadi --ccb_explore_adf dan simpan file. CB (bandit kontekstual) dan CCB (bandit kontekstual bersyarat) adalah algoritma yang digunakan Personalizer untuk personalisasi slot tunggal dan multi-slot secara berturut-turut. ADF (fitur dependen tindakan) berarti bahwa tindakan diekspresikan/diidentifikasi dengan fitur.
Di tab yang sama di portal, di bawah impor pengaturan pembelajaran telusuri untuk menemukan file json Anda yang baru saja dimodifikasi dan unggah. Ini akan memperbarui instance Personalizer Anda menjadi Personalizer "Multi Slot" dan sekarang akan mendukung panggilan Peringkat dan Hadiah multi-slot.
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.
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.
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
Dari direktori proyek, buka file Program.cs
di editor atau IDE pilihan Anda. Tambahkan hal berikut menggunakan instruksi:
using System;
using Azure;
using Azure.AI.Personalizer;
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 satu item terbaik konten untuk setiap slot, buat objek PersonalizerRankMultiSlotOptions , lalu teruskan ke PersonalizerClient.RankMultiSlot. Metode RankMultiSlot menampilkan PersonalizerMultiSlotRankResult.
Untuk mengirim skor hadiah ke Personalizer, buat PersonalizerRewardMultiSlotOptions, kemudian teruskan ke metode PersonalizerClient.RewardMultiSlot sekaligus dengan ID kejadian yang sesuai.
Skor hadiah dalam mulai cepat ini sepele. 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 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.
Ingatlah untuk menghapus kunci API dari kode Anda setelah 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.
static PersonalizerClient InitializePersonalizerClient(Uri url)
{
return new PersonalizerClient(url, new AzureKeyCredential(ResourceKey));
}
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.
private static IList<PersonalizerRankableAction> GetActions()
{
IList<PersonalizerRankableAction> actions = new List<PersonalizerRankableAction>
{
new PersonalizerRankableAction(
id: "Red-Polo-Shirt-432",
features:
new List<object>() { new { onSale = "true", price = "20", category = "Clothing" } }
),
new PersonalizerRankableAction(
id: "Tennis-Racket-133",
features:
new List<object>() { new { onSale = "false", price = "70", category = "Sports" } }
),
new PersonalizerRankableAction(
id: "31-Inch-Monitor-771",
features:
new List<object>() { new { onSale = "true", price = "200", category = "Electronics" } }
),
new PersonalizerRankableAction(
id: "XBox-Series X-117",
features:
new List<object>() { new { onSale = "false", price = "499", category = "Electronics" } }
)
};
return actions;
}
Dapatkan slot
Slot menyusun halaman yang akan berinteraksi dengan pengguna. Personalizer akan memutuskan tindakan mana yang akan ditampilkan di masing-masing slot yang ditentukan. Tindakan dapat dikecualikan dari slot tertentu, ditunjukkan sebagai ExcludeActions
.
BaselineAction
adalah tindakan default untuk slot, yang akan ditampilkan tanpa menggunakan Personalizer.
Mulai cepat ini memiliki fitur slot yang sederhana. Dalam sistem produksi, menentukan dan mengevaluasifitur dapat menjadi masalah yang tidak mudah.
private static IList<PersonalizerSlotOptions> GetSlots()
{
IList<PersonalizerSlotOptions> slots = new List<PersonalizerSlotOptions>
{
new PersonalizerSlotOptions(
id: "BigHeroPosition",
features: new List<object>() { new { size = "large", position = "left" } },
excludedActions: new List<string>() { "31-Inch-Monitor-771" },
baselineAction: "Red-Polo-Shirt-432"
),
new PersonalizerSlotOptions(
id: "SmallSidebar",
features: new List<object>() { new { size = "small", position = "right" } },
excludedActions: new List<string>() { "Tennis-Racket-133" },
baselineAction: "XBox-Series X-117"
),
};
return slots;
}
Mendapatkan preferensi pengguna untuk konteks
Tambahkan metode berikut ke kelas Program untuk mendapatkan masukan pengguna dari baris perintah untuk waktu dan jenis perangkat yang digunakan pengguna. Metode 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 GetDeviceForContext()
{
string[] deviceFeatures = new string[] { "mobile", "tablet", "desktop" };
Console.WriteLine("\nWhat is the device type (enter number)? 1. Mobile 2. Tablet 3. Desktop");
if (!int.TryParse(GetKey(), out int deviceIndex) || deviceIndex < 1 || deviceIndex > deviceFeatures.Length)
{
Console.WriteLine("\nEntered value is invalid. Setting feature value to " + deviceFeatures[0] + ".");
deviceIndex = 1;
}
return deviceFeatures[deviceIndex - 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 device)
{
return new List<object>()
{
new { time = time },
new { device = device }
};
}
Membuat perulangan pembelajaran
Perulangan pembelajaran Personalizer adalah siklus panggilan RankMultiSlot dan RewardMultiSlot. 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 (multislot rank and multislot reward).\n" +
$"Each iteration represents a user interaction and will demonstrate how context, actions, slots, 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();
IList<PersonalizerSlotOptions> slots = GetSlots();
PersonalizerClient client = InitializePersonalizerClient(new Uri(ServiceEndpoint));
do
{
Console.WriteLine("\nIteration: " + iteration++);
string timeOfDayFeature = GetTimeOfDayForContext();
string deviceFeature = GetDeviceForContext();
IList<object> currentContext = GetContext(timeOfDayFeature, deviceFeature);
string eventId = Guid.NewGuid().ToString();
var multiSlotRankOptions = new PersonalizerRankMultiSlotOptions(actions, slots, currentContext, eventId);
PersonalizerMultiSlotRankResult multiSlotRankResult = client.RankMultiSlot(multiSlotRankOptions);
for (int i = 0; i < multiSlotRankResult.Slots.Count(); ++i)
{
string slotId = multiSlotRankResult.Slots[i].SlotId;
Console.WriteLine($"\nPersonalizer service decided you should display: { multiSlotRankResult.Slots[i].RewardActionId} in slot {slotId}. Is this correct? (y/n)");
string answer = GetKey();
if (answer == "Y")
{
client.RewardMultiSlot(eventId, slotId, 1f);
Console.WriteLine("\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.");
}
else if (answer == "N")
{
client.RewardMultiSlot(eventId, slotId, 0f);
Console.WriteLine("\nYou didn't like the recommended item. The application will send Personalizer a reward of 0 for this choice of action for this slot.");
}
else
{
client.RewardMultiSlot(eventId, slotId, 0f);
Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended item.");
}
}
Console.WriteLine("\nPress q to break, any other key to continue:");
runLoop = !(GetKey() == "Q");
} while (runLoop);
}
Lihat lebih dekat panggilan peringkat dan hadiah di bagian berikut. Tambahkan metode berikut, yang mendapatkan pilihan konten, mendapatkan slot, dan mengirimkan permintaan peringkat dan hadiah multislot sebelum menjalankan file kode:
GetActions
GetSlots
GetTimeOfDayForContext
GetDeviceForContext
GetKey
GetContext
Meminta tindakan terbaik
Untuk menyelesaikan permintaan Rank, program meminta preferensi pengguna untuk membuat Context
dari pilihan konten. Permintaan tersebut berisi konteks, tindakan, dan slot sekaligus fiturnya, serta ID kejadian unik untuk menerima respons.
Mulai cepat ini memiliki fitur konteks waktu dan perangkat pengguna sederhana. Dalam sistem produksi, menentukan dan mengevaluasitindakan dan fitur dapat menjadi masalah yang rumit.
string timeOfDayFeature = GetTimeOfDayForContext();
string deviceFeature = GetDeviceForContext();
IList<object> currentContext = GetContext(timeOfDayFeature, deviceFeature);
string eventId = Guid.NewGuid().ToString();
var multiSlotRankOptions = new PersonalizerRankMultiSlotOptions(actions, slots, currentContext, eventId);
PersonalizerMultiSlotRankResult multiSlotRankResult = client.RankMultiSlot(multiSlotRankOptions);
Mengirim hadiah
Untuk mendapatkan skor hadiah untuk permintaan Hadiah, program mendapatkan pilihan pengguna untuk setiap slot melalui baris perintah, menetapkan nilai numerik (skor hadiah) ke pilihan, lalu mengirim ID peristiwa unik, ID slot, dan skor hadiah untuk setiap slot sebagai nilai numerik ke Hadiah API. Hadiah tidak perlu didefinisikan untuk setiap slot.
Mulai cepat ini menetapkan angka sederhana sebagai skor hadiah, yaitu nol atau 1. Dalam sistem produksi, menentukan kapan dan apa yang harus dikirim ke panggilan Reward dapat menjadi persoalan yang rumit, bergantung pada kebutuhan spesifik Anda.
for (int i = 0; i < multiSlotRankResult.Slots.Count(); ++i)
{
string slotId = multiSlotRankResult.Slots[i].SlotId;
Console.WriteLine($"\nPersonalizer service decided you should display: { multiSlotRankResult.Slots[i].RewardActionId} in slot {slotId}. Is this correct? (y/n)");
string answer = GetKey();
if (answer == "Y")
{
client.RewardMultiSlot(eventId, slotId, 1f);
Console.WriteLine("\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.");
}
else if (answer == "N")
{
client.RewardMultiSlot(eventId, slotId, 0f);
Console.WriteLine("\nYou didn't like the recommended item. The application will send Personalizer a reward of 0 for this choice of action for this slot.");
}
else
{
client.RewardMultiSlot(eventId, slotId, 0f);
Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended item.");
}
}
Jalankan program
Jalankan aplikasi dengan perintah run
dotnet dari direktori aplikasi Anda.
dotnet run
Kode sumber untuk mulai cepat ini tersedia.
Dokumentasi referensi | Sampel | Konseptual multislot
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 menyambungkan aplikasi Anda ke API Personalizer. Tempelkan kunci dan titik akhir ke dalam kode di bawah ini nanti di mulai cepat.
- Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Persiapan
Meningkatkan instans Personalizer ke Multi-Slot
Catatan
Personalisasi multi-slot (Pratinjau) memengaruhi fungsionalitas lain dari layanan Personalizer. Perubahan ini tidak bisa dibatalkan. Sebelum Anda mengaktifkan personalisasi multi-slot, lihat Personalisasi multi-slot (Pratinjau).
- Nonaktifkan Pengoptimalan Otomatis Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, nonaktifkan Pengoptimalan Otomatis dan simpan.
Catatan
Personalisasi multi-slot tidak akan berfungsi kecuali Anda menonaktifkan Pengoptimalan Otomatis. Pengoptimalan Otomatis untuk personalisasi multi-slot akan didukung di masa depan.
- Perbarui Personalizer ke multi-slot Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, pilih Ekspor pengaturan pembelajaran. Bidang argumen dalam file json yang diunduh akan dimulai dengan --cb_explore_adf. Ubah ini menjadi --ccb_explore_adf dan simpan file. CB (bandit kontekstual) dan CCB (bandit kontekstual bersyarat) adalah algoritma yang digunakan Personalizer untuk personalisasi slot tunggal dan multi-slot secara berturut-turut. ADF (fitur dependen tindakan) berarti bahwa tindakan diekspresikan/diidentifikasi dengan fitur.
Di tab yang sama di portal, di bawah impor pengaturan pembelajaran telusuri untuk menemukan file json Anda yang baru saja dimodifikasi dan unggah. Ini akan memperbarui instance Personalizer Anda menjadi Personalizer "Multi Slot" dan sekarang akan mendukung panggilan Peringkat dan Hadiah multi-slot.
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.
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.
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 aplikasi Node.js baru di editor atau IDE pilihan Anda bernama sample.js
dan buat variabel untuk titik akhir sumber daya dan kunci langganan Anda.
Penting
Buka portal 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.
Ingatlah untuk menghapus kunci API dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, pertimbangkan penggunaan cara aman untuk menyimpan dan mengakses informasi masuk Anda. Misalnya, Azure key vault.
const axios = require('axios');
const { v4: uuidv4 } = require('uuid');
const readline = require('readline-sync');
// The endpoint specific to your personalization service instance;
// e.g. https://<your-resource-name>.cognitiveservices.azure.com
const PersonalizationBaseUrl = '<REPLACE-WITH-YOUR-PERSONALIZER-ENDPOINT>';
// The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
const ResourceKey = '<REPLACE-WITH-YOUR-PERSONALIZER-KEY>';
Instal paket NPM untuk memulai cepat
npm install readline-sync uuid axios --save
Model objek
Untuk meminta item terbaik tunggal konten untuk setiap slot, buat rankRequest, lalu kirim permintaan posting ke multislot/rank. Respons tersebut kemudian diurai menjadirankResponse.
Untuk mengirim skor hadiah ke Personalizer, buat hadiah, lalu kirim permintaan posting ke multislot/events/{eventId}/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 mengirim permintaan HTTP untuk NodeJS:
Membuat URL dasar
Pada bagian ini Anda akan membangun Pangkat/URL Hadiah menggunakan url dasar dan permintaan {i>header
const MultiSlotRankUrl = PersonalizationBaseUrl.concat('personalizer/v1.1-preview.1/multislot/rank');
const MultiSlotRewardUrlBase = PersonalizationBaseUrl.concat('personalizer/v1.1-preview.1/multislot/events/');
const Headers = {
'ocp-apim-subscription-key': ResourceKey,
'Content-Type': 'application/json'
};
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 skrip untuk mewakili serangkaian tindakan dan fiturnya.
function getActions() {
return [
{
'id': 'Red-Polo-Shirt-432',
'features': [
{
'onSale': 'true',
'price': 20,
'category': 'Clothing'
}
]
},
{
'id': 'Tennis-Racket-133',
'features': [
{
'onSale': 'false',
'price': 70,
'category': 'Sports'
}
]
},
{
'id': '31-Inch-Monitor-771',
'features': [
{
'onSale': 'true',
'price': 200,
'category': 'Electronics'
}
]
},
{
'id': 'XBox-Series X-117',
'features': [
{
'onSale': 'false',
'price': 499,
'category': 'Electronics'
}
]
}
];
}
Mendapatkan preferensi pengguna untuk konteks
Tambahkan metode berikut ke skrip untuk mendapatkan masukan pengguna dari baris perintah untuk waktu dan jenis perangkat yang digunakan pengguna. Ini akan digunakan sebagai fitur konteks.
function getContextFeatures() {
const timeOfDayFeatures = ['morning', 'afternoon', 'evening', 'night'];
const deviceFeatures = ['mobile', 'tablet', 'desktop'];
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 device is the user on (enter number)? 1. mobile 2. tablet 3. desktop\n');
selection = parseInt(answer);
const device = selection >= 1 && selection <= 3 ? deviceFeatures[selection - 1] : deviceFeatures[0];
console.log('Selected features:\n');
console.log('Time of day: ' + timeOfDay + '\n');
console.log('Device: ' + device + '\n');
return [
{
'time': timeOfDay
},
{
'device': device
}
];
}
Dapatkan slot
Slot menyusun halaman yang akan berinteraksi dengan pengguna. Personalizer akan memutuskan tindakan mana yang akan ditampilkan di masing-masing slot yang ditentukan. Tindakan dapat dikecualikan dari slot tertentu, ditunjukkan sebagai ExcludeActions
.
BaselineAction
adalah tindakan default untuk slot yang akan ditampilkan tanpa menggunakan Personalizer.
Mulai cepat ini memiliki fitur slot yang sederhana. Dalam sistem produksi, menentukan dan mengevaluasifitur dapat menjadi masalah yang tidak mudah.
function getSlots() {
return [
{
'id': 'BigHeroPosition',
'features': [
{
'size': 'large',
'position': 'left',
}
],
'excludedActions': ['31-Inch-Monitor-771'],
'baselineAction': 'Red-Polo-Shirt-432'
},
{
'id': 'SmallSidebar',
'features': [
{
'size': 'small',
'position': 'right',
}
],
'excludedActions': ['Tennis-Racket-133'],
'baselineAction': 'XBox-Series X-117'
}
];
}
Membuat permintaan HTTP
Tambahkan fungsi ini untuk mengirimkan permintaan {i>posting
async function sendMultiSlotRank(rankRequest) {
try {
let response = await axios.post(MultiSlotRankUrl, rankRequest, { headers: Headers })
return response.data;
}
catch (err) {
if(err.response)
{
throw err.response.data
}
console.log(err)
throw err;
}
}
async function sendMultiSlotReward(rewardRequest, eventId) {
try {
let rewardUrl = MultiSlotRewardUrlBase.concat(eventId, '/reward');
let response = await axios.post(rewardUrl, rewardRequest, { headers: Headers })
}
catch (err) {
console.log(err);
throw err;
}
}
Dapatkan umpan balik untuk keputusan Personalizer
Menambahkan metode berikut ke skrip. Anda akan memberi sinyal jika Personalizer membuat keputusan yang baik untuk setiap slot melalui permintaan baris perintah.
function getRewardForSlot() {
let answer = readline.question('\nIs this correct? (y/n)\n').toUpperCase();
if (answer === 'Y') {
console.log('\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.\n');
return 1;
}
else if (answer === 'N') {
console.log('\nYou didn\'t like the recommended item.The application will send Personalizer a reward of 0 for this choice of action for this slot.\n');
return 0;
}
console.log('\nEntered choice is invalid. Service assumes that you didn\'t like the recommended item.\n');
return 0;
}
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.
let runLoop = true;
(async () => {
do {
let multiSlotRankRequest = {};
// Generate an ID to associate with the request.
multiSlotRankRequest.eventId = uuidv4();
// Get context information from the user.
multiSlotRankRequest.contextFeatures = getContextFeatures();
// Get the actions list to choose from personalization with their features.
multiSlotRankRequest.actions = getActions();
// Get the list of slots for which Personalizer will pick the best action.
multiSlotRankRequest.slots = getSlots();
multiSlotRankRequest.deferActivation = false;
try {
//Rank the actions for each slot
let multiSlotRankResponse = await sendMultiSlotRank(multiSlotRankRequest);
let multiSlotrewards = {};
multiSlotrewards.reward = [];
for (let i = 0; i < multiSlotRankResponse.slots.length; i++) {
console.log('\nPersonalizer service decided you should display: '.concat(multiSlotRankResponse.slots[i].rewardActionId, ' in slot ', multiSlotRankResponse.slots[i].id, '\n'));
let slotReward = {};
slotReward.slotId = multiSlotRankResponse.slots[i].id;
// User agrees or disagrees with Personalizer decision for slot
slotReward.value = getRewardForSlot();
multiSlotrewards.reward.push(slotReward);
}
// Send the rewards for the event
await sendMultiSlotReward(multiSlotrewards, multiSlotRankResponse.eventId);
let answer = readline.question('\nPress q to break, any other key to continue:\n').toUpperCase();
if (answer === 'Q') {
runLoop = false;
}
}
catch (err) {
console.log(err);
throw err;
}
} while (runLoop);
})()
Lihat lebih dekat panggilan peringkat dan hadiah di bagian berikut.
Tambahkan metode berikut, yang mendapatkan pilihan konten, mendapatkan preferensi pengguna untuk konteks, mendapatkan slot, Membuat permintaan HTTP, Dapatkan hadiah untuk setiap slot sebelum menjalankan file kode:
- getActions
- getContextFeatures
- getSlots
- sendRank
- sendReward
- getRewardForSlot
Meminta tindakan terbaik
Untuk menyelesaikan permintaan Peringkat, program meminta preferensi pengguna untuk membuat pilihan konten. Isi permintaan berisi konteks, tindakan, dan slot dengan fitur masing-masing. Metode sendMultiSlotRank
ini mengambil rankRequest dan menjalankan permintaan pangkat multi-slot.
Mulai cepat ini memiliki fitur konteks waktu dan perangkat pengguna sederhana. Dalam sistem produksi, menentukan dan mengevaluasitindakan dan fitur dapat menjadi masalah yang rumit.
let multiSlotRankRequest = {};
// Generate an ID to associate with the request.
multiSlotRankRequest.eventId = uuidv4();
// Get context information from the user.
multiSlotRankRequest.contextFeatures = getContextFeatures();
// Get the actions list to choose from personalization with their features.
multiSlotRankRequest.actions = getActions();
// Get the list of slots for which Personalizer will pick the best action.
multiSlotRankRequest.slots = getSlots();
multiSlotRankRequest.deferActivation = false;
//Rank the actions for each slot
try {
let multiSlotRankResponse = await sendMultiSlotRank(multiSlotRankRequest);
}
catch (err) {
console.log(err);
throw err;
}
Mengirim hadiah
Agar mendapatkan skor hadiah untuk permintaan Hadiah, program ini mendapatkan pilihan pengguna untuk setiap slot melalui baris perintah, menetapkan nilai numerik (skor hadiah) ke pilihan, lalu mengirim ID peristiwa unik, ID slot, dan skor hadiah untuk setiap slot ke metode sendMultiSlotReward
. Hadiah tidak perlu ditentukan untuk setiap slot.
Mulai cepat ini menetapkan angka sederhana sebagai skor hadiah, yaitu nol atau 1. Dalam sistem produksi, menentukan kapan dan apa yang harus dikirim ke panggilan Reward dapat menjadi persoalan yang rumit, bergantung pada kebutuhan spesifik Anda.
let multiSlotrewards = {};
multiSlotrewards.reward = [];
for (i = 0; i < multiSlotRankResponse.slots.length; i++) {
console.log('\nPersonalizer service decided you should display: '.concat(multiSlotRankResponse.slots[i].rewardActionId, ' in slot ', multiSlotRankResponse.slots[i].id, '\n'));
let slotReward = {};
slotReward.slotId = multiSlotRankResponse.slots[i].id;
// User agrees or disagrees with Personalizer decision for slot
slotReward.value = getRewardForSlot();
multiSlotrewards.reward.push(slotReward);
}
// Send the rewards for the event
await sendMultiSlotReward(multiSlotrewards, multiSlotRankResponse.eventId);
Jalankan program
Menjalankan aplikasi dengan Node.js dari direktori aplikasi Anda.
node sample.js
Kode sumber untuk mulai cepat ini tersedia.
Konseptual multi-slot | Sampel
Prasyarat
- Langganan Azure - Buat langganan secara gratis
- Python 3.x
- 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. Tempelkan kunci dan titik akhir ke dalam kode di bawah ini nanti di mulai cepat.
- Anda dapat menggunakan tingkat harga gratis (
F0
) untuk percobaan, lalu meningkatkannya ke tingkat berbayar untuk produksi.
Persiapan
Meningkatkan instans Personalizer ke Multi-Slot
Catatan
Personalisasi multi-slot (Pratinjau) memengaruhi fungsionalitas lain dari layanan Personalizer. Perubahan ini tidak bisa dibatalkan. Sebelum Anda mengaktifkan personalisasi multi-slot, lihat Personalisasi multi-slot (Pratinjau).
- Nonaktifkan Pengoptimalan Otomatis Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, nonaktifkan Pengoptimalan Otomatis dan simpan.
Catatan
Personalisasi multi-slot tidak akan berfungsi kecuali Anda menonaktifkan Pengoptimalan Otomatis. Pengoptimalan Otomatis untuk personalisasi multi-slot akan didukung di masa depan.
- Perbarui Personalizer ke multi-slot Di portal Azure, di sumber daya Personalizer, di bawah Manajemen Sumber Daya, pada halaman Pengaturan model dan pembelajaran, pilih Ekspor pengaturan pembelajaran. Bidang argumen dalam file json yang diunduh akan dimulai dengan --cb_explore_adf. Ubah ini menjadi --ccb_explore_adf dan simpan file. CB (bandit kontekstual) dan CCB (bandit kontekstual bersyarat) adalah algoritma yang digunakan Personalizer untuk personalisasi slot tunggal dan multi-slot secara berturut-turut. ADF (fitur dependen tindakan) berarti bahwa tindakan diekspresikan/diidentifikasi dengan fitur.
Di tab yang sama di portal, di bawah impor pengaturan pembelajaran telusuri untuk menemukan file json Anda yang baru saja dimodifikasi dan unggah. Ini akan memperbarui instance Personalizer Anda menjadi Personalizer "Multi Slot" dan sekarang akan mendukung panggilan Peringkat dan Hadiah multi-slot.
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.
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.
Membuat aplikasi Python baru
Buat file Python baru dan buat variabel untuk titik akhir sumber daya dan kunci langganan Anda.
Penting
Buka portal 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.
Ingatlah untuk menghapus kunci API dari kode Anda setelah selesai, dan jangan pernah mempostingnya secara publik. Untuk produksi, pertimbangkan penggunaan cara aman untuk menyimpan dan mengakses informasi masuk Anda. Misalnya, Azure key vault.
import json, uuid, requests
# The endpoint specific to your personalization service instance;
# e.g. https://<your-resource-name>.cognitiveservices.azure.com
PERSONALIZATION_BASE_URL = "<REPLACE-WITH-YOUR-PERSONALIZER-ENDPOINT>"
# The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
RESOURCE_KEY = "<REPLACE-WITH-YOUR-PERSONALIZER-KEY>"
Model objek
Untuk meminta item terbaik tunggal konten untuk setiap slot, buat rank_request, lalu kirim permintaan posting ke multislot/rank. Respons tersebut kemudian diuraikan menjadi rank_response.
Untuk mengirim skor hadiah ke Personalizer, buat hadiah, lalu kirim permintaan posting ke multislot/events/{eventId}/reward.
Pada mulai cepat ini, menentukan skor hadiah merupakan hal yang mudah. Dalam sistem produksi, penentuan dari yang memengaruhi skor hadiah dan dengan seberapa banyak pengaruhnya dapat menjadi proses yang kompleks yang 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 mengirim permintaan HTTP untuk Python:
Membuat URL dasar
Pada bagian ini Anda akan membangun Pangkat/URL Hadiah menggunakan url dasar dan permintaan {i>header
MULTI_SLOT_RANK_URL = '{0}personalizer/v1.1-preview.1/multislot/rank'.format(PERSONALIZATION_BASE_URL)
MULTI_SLOT_REWARD_URL_BASE = '{0}personalizer/v1.1-preview.1/multislot/events/'.format(PERSONALIZATION_BASE_URL)
HEADERS = {
'ocp-apim-subscription-key': RESOURCE_KEY,
'Content-Type': 'application/json'
}
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 skrip untuk mewakili serangkaian tindakan dan fiturnya.
def get_actions():
return [
{
"id": "Red-Polo-Shirt-432",
"features": [
{
"onSale": "true",
"price": 20,
"category": "Clothing"
}
]
},
{
"id": "Tennis-Racket-133",
"features": [
{
"onSale": "false",
"price": 70,
"category": "Sports"
}
]
},
{
"id": "31-Inch-Monitor-771",
"features": [
{
"onSale": "true",
"price": 200,
"category": "Electronics"
}
]
},
{
"id": "XBox-Series X-117",
"features": [
{
"onSale": "false",
"price": 499,
"category": "Electronics"
}
]
}
]
Mendapatkan preferensi pengguna untuk konteks
Tambahkan metode berikut ke skrip untuk mendapatkan masukan pengguna dari baris perintah untuk waktu dan jenis perangkat yang digunakan pengguna. Ini akan digunakan sebagai fitur konteks.
def get_context_features():
time_features = ["morning", "afternoon", "evening", "night"]
time_pref = input("What time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night\n")
try:
parsed_time = int(time_pref)
if(parsed_time <=0 or parsed_time > len(time_features)):
raise IndexError
time_of_day = time_features[parsed_time-1]
except (ValueError, IndexError):
print("Entered value is invalid. Setting feature value to", time_features[0] + ".")
time_of_day = time_features[0]
device_features = ['mobile', 'tablet', 'desktop']
device_pref = input("What type of device is the user on (enter number)? 1. mobile 2. tablet 3. desktop\n")
try:
parsed_device = int(device_pref)
if(parsed_device <=0 or parsed_device > len(device_features)):
raise IndexError
device = device_features[parsed_device-1]
except (ValueError, IndexError):
print("Entered value is invalid. Setting feature value to", device_features[0]+ ".")
device = device_features[0]
return [
{'time': time_of_day},
{'device': device}
]
Dapatkan slot
Slot menyusun halaman yang akan berinteraksi dengan pengguna. Personalizer akan memutuskan tindakan mana yang akan ditampilkan di masing-masing slot yang ditentukan. Tindakan dapat dikecualikan dari slot tertentu, ditunjukkan sebagai ExcludeActions
.
BaselineAction
adalah tindakan default untuk slot yang akan ditampilkan tanpa menggunakan Personalizer.
Mulai cepat ini memiliki fitur slot yang sederhana. Dalam sistem produksi, menentukan dan mengevaluasifitur dapat menjadi masalah yang tidak mudah.
def get_slots():
return [
{
"id": "BigHeroPosition",
"features": [
{
"size": "large",
"position": "left",
}
],
"excludedActions": ["31-Inch-Monitor-771"],
"baselineAction": "Red-Polo-Shirt-432"
},
{
"id": "SmallSidebar",
"features": [
{
"size": "small",
"position": "right",
}
],
"excludedActions": ["Tennis-Racket-133"],
"baselineAction": "XBox-Series X-117"
}
]
Membuat permintaan HTTP
Tambahkan fungsi ini untuk mengirimkan permintaan {i>posting
def send_multi_slot_rank(rank_request):
multi_slot_response = requests.post(MULTI_SLOT_RANK_URL, data=json.dumps(rank_request), headers=HEADERS)
if multi_slot_response.status_code != 201:
raise Exception(multi_slot_response.text)
return json.loads(multi_slot_response.text)
def send_multi_slot_reward(reward_request, event_id):
reward_url = '{0}{1}/reward'.format(MULTI_SLOT_REWARD_URL_BASE, event_id)
requests.post(reward_url, data=json.dumps(reward_request), headers=HEADERS)
Dapatkan umpan balik untuk keputusan Personalizer
Menambahkan metode berikut ke skrip. Anda akan memberi sinyal jika Personalizer membuat keputusan yang baik untuk setiap slot melalui permintaan baris perintah.
def get_reward_for_slot():
answer = input('\nIs this correct? (y/n)\n').upper()
if (answer == 'Y'):
print('\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.\n')
return 1
elif (answer == 'N'):
print('\nYou didn\'t like the recommended item.The application will send Personalizer a reward of 0 for this choice of action for this slot.\n')
return 0
print('\nEntered choice is invalid. Service assumes that you didn\'t like the recommended item.\n')
return 0
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.
run_loop = True
while run_loop:
eventId = str(uuid.uuid4())
context = get_context_features()
actions = get_actions()
slots = get_slots()
rank_request = {
"eventId": eventId,
"contextFeatures": context,
"actions": actions,
"slots": slots,
"deferActivation": False
}
#Rank the actions for each slot
multi_slot_rank_response = send_multi_slot_rank(rank_request)
multi_slot_rewards = {"reward": []}
for i in range(len(multi_slot_rank_response['slots'])):
print('\nPersonalizer service decided you should display: {0} in slot {1}\n'.format(multi_slot_rank_response['slots'][i]['rewardActionId'], multi_slot_rank_response['slots'][i]['id']))
slot_reward = {'slotId': multi_slot_rank_response['slots'][i]['id']}
# User agrees or disagrees with Personalizer decision for slot
slot_reward['value'] = get_reward_for_slot()
multi_slot_rewards['reward'].append(slot_reward)
# Send the rewards for the event
send_multi_slot_reward(multi_slot_rewards, multi_slot_rank_response['eventId'])
answer = input('\nPress q to break, any other key to continue:\n').upper()
if (answer == 'Q'):
run_loop = False
Lihat lebih dekat panggilan peringkat dan hadiah di bagian berikut.
Tambahkan metode berikut, yang mendapatkan pilihan konten, mendapatkan preferensi pengguna untuk konteks, mendapatkan slot, Membuat permintaan HTTP, Dapatkan hadiah untuk setiap slot sebelum menjalankan file kode:
- get_actions
- get_context_features
- get_slots
- send_rank
- send_reward
- get_reward_for_dsot
Meminta tindakan terbaik
Untuk menyelesaikan permintaan Peringkat, program meminta preferensi pengguna untuk membuat pilihan konten. Isi permintaan berisi konteks, tindakan, dan slot dengan fitur masing-masing. Metode send_multi_slot_rank
ini mengambil rankRequest dan menjalankan permintaan pangkat multi-slot.
Mulai cepat ini memiliki fitur konteks waktu dan perangkat pengguna sederhana. Dalam sistem produksi, menentukan dan mengevaluasitindakan dan fitur dapat menjadi masalah yang rumit.
eventId = str(uuid.uuid4())
context = get_context_features()
actions = get_actions()
slots = get_slots()
rank_request = {
"eventId": eventId,
"contextFeatures": context,
"actions": actions,
"slots": slots,
"deferActivation": False
}
#Rank the actions for each slot
multi_slot_rank_response = send_multi_slot_rank(rank_request)
Mengirim hadiah
Agar mendapatkan skor hadiah untuk permintaan Hadiah, program ini mendapatkan pilihan pengguna untuk setiap slot melalui baris perintah, menetapkan nilai numerik (skor hadiah) ke pilihan, lalu mengirim ID peristiwa unik, ID slot, dan skor hadiah untuk setiap slot ke metode send_multi_slot_reward
. Hadiah tidak perlu ditentukan untuk setiap slot.
Mulai cepat ini menetapkan angka sederhana sebagai skor hadiah, yaitu nol atau 1. Dalam sistem produksi, menentukan kapan dan apa yang harus dikirim ke panggilan Reward dapat menjadi persoalan yang rumit, bergantung pada kebutuhan spesifik Anda.
multi_slot_rewards = {"reward": []}
for i in range(len(multi_slot_rank_response['slots'])):
print('\nPersonalizer service decided you should display: {0} in slot {1}\n'.format(multi_slot_rank_response['slots'][i]['rewardActionId'], multi_slot_rank_response['slots'][i]['id']))
slot_reward = {'slotId': multi_slot_rank_response['slots'][i]['id']}
# User agrees or disagrees with Personalizer decision for slot
slot_reward['value'] = get_reward_for_slot()
multi_slot_rewards['reward'].append(slot_reward)
# Send the rewards for the event
send_multi_slot_reward(multi_slot_rewards, multi_slot_rank_response['eventId'])
Jalankan program
Menjalankan aplikasi dengan Python dari direktori aplikasi Anda.
python sample.py
Kode sumber untuk mulai cepat ini tersedia.