Azure AI Kişiselleştirme için çok yuvalı kullanmaya başlama

Önemli

20 Eylül 2023 tarihinden itibaren yeni Kişiselleştirme kaynakları oluşturamayacaksınız. Kişiselleştirme hizmeti 1 Ekim 2026'da kullanımdan kaldırılıyor.

Çok yuvalı kişiselleştirme (Önizleme), kullanıcılarınıza birden fazla eylemin (ürün veya içerik parçası gibi) gösterildiği web düzenleri, döngüler ve listelerdeki içeriği hedeflemenizi sağlar. Kişiselleştirme çok yuvalı API'ler sayesinde Kişiselleştirici'deki yapay zeka modellerinin kullanıcı arabiriminizdeki yerleştirmeyi göz önünde bulundurarak ve bu konumlardan öğrenerek belirli davranışları hangi kullanıcı bağlamlarının ve ürünlerin yönlendirebileceğini öğrenmesini sağlayabilirsiniz. Örneğin Kişiselleştirici, belirli ürünlerin veya içeriğin kenar çubuğu veya alt bilgi olarak sayfadaki ana vurgudan daha fazla tıklamayı yönlendirdiğini öğrenebilir.

Bu kılavuzda Kişiselleştirme çok yuvalı API'leri kullanmayı öğreneceksiniz.

Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (NuGet) | Çok yuvalı kavramsal Örnekler |

Ön koşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • .NET Core'un geçerli sürümü.
  • Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında bir Kişiselleştirme kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa git'i seçin.
    • Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız olacaktır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde aşağıdaki koda yapıştırın.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ayarlama

Kişiselleştirme örneğini Çok Yuvalı'ya yükseltme

Dekont

Çok yuvalı kişiselleştirme (Önizleme), Kişiselleştirme hizmetinin diğer işlevlerini etkiler. Bu değişiklik geri alınamaz. Çok yuvalı kişiselleştirmeyi etkinleştirmeden önce bkz . Çok yuvalı kişiselleştirme (Önizleme).

  1. Otomatik İyileştirmeyi Devre Dışı Bırak Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Otomatik İyileştirme'yi kapatın ve kaydedin.

Dekont

Otomatik İyileştirme'yi devre dışı bırakmadığınız sürece çok yuvalı kişiselleştirme çalışmaz. Çok yuvalı kişiselleştirme için otomatik iyileştirme gelecekte desteklenecektir.

  1. Kişiselleştirmeyi çok yuvalı olarak güncelleştirme Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Öğrenme ayarlarını dışarı aktar'ı seçin. İndirilen json dosyasındaki bağımsız değişkenler alanı --cb_explore_adf ile başlar. Bunu --ccb_explore_adf olarak değiştirin ve dosyayı kaydedin. CB (bağlamsal eşkıyalar) ve CCB (koşullu bağlamsal eşkıyalar), Kişiselleştirme'nin sırasıyla tek yuvalı ve çok yuvalı kişiselleştirme için kullandığı algoritmalardır. ADF (eyleme bağımlı özellikler), eylemlerin özelliklerle ifade edildiği / tanımlandığı anlamına gelir.

Learning settings before change

Learning settings after change

Portaldaki aynı sekmede, içeri aktarma öğrenme ayarları'nın altında en son değiştirilen json dosyanızı bulup karşıya yükleyin. Bu, Kişiselleştirme örneğinizi "Çok Yuvalı" Kişiselleştirme olacak şekilde güncelleştirir ve artık çok yuvalı Derece ve Ödül çağrılarını destekleyecektir.

Model güncelleştirme sıklığını değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.

Change model update frequency

Ödül bekleme süresini değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.

Change reward wait time

Yeni bir C# uygulaması oluşturma

Tercih ettiğiniz düzenleyicide veya IDE'de yeni bir .NET Core uygulaması oluşturun.

Bir konsol penceresinde (cmd, PowerShell veya Bash gibi), adlı personalizer-quickstartyeni bir konsol uygulaması oluşturmak için dotnet new komutunu kullanın. Bu komut, tek bir kaynak dosyasıyla basit bir "Merhaba Dünya" C# projesi oluşturur: Program.cs.

dotnet new console -n personalizer-quickstart

Dizininizi yeni oluşturulan uygulama klasörüyle değiştirin. Uygulamayı şu şekilde oluşturabilirsiniz:

dotnet build

Derleme çıkışı hiçbir uyarı veya hata içermemelidir.

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

İstemci kitaplığını yükleme

Uygulama dizininde, .NET için Kişiselleştirme istemci kitaplığını aşağıdaki komutla yükleyin:

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

Proje dizininden dosyayı tercih ettiğiniz düzenleyicide veya IDE'de açın Program.cs . Aşağıdaki kullanım yönergelerini ekleyin:

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

Nesne modeli

Kişiselleştirme istemcisi, anahtarınızı içeren Azure.AzureKeyCredential kullanarak Azure'da kimlik doğrulaması yapan bir PersonalizerClient nesnesidir.

Her yuva için içeriğin en iyi tek öğesini istemek için bir PersonalizerRankMultiSlotOptions nesnesi oluşturun ve bunu PersonalizerClient.RankMultiSlot dosyasına geçirin. RankMultiSlot yöntemi bir PersonalizerMultiSlotRankResult döndürür.

Personalizer'a ödül puanı göndermek için bir PersonalizerRewardMultiSlotOptions oluşturun, ardından bunu ilgili olay kimliğiyle birlikte PersonalizerClient.RewardMultiSlot yöntemine geçirin.

Bu hızlı başlangıçtaki ödül puanı önemsizdir. Bir üretim sisteminde, ödül puanını neyin etkilediğinin belirlenmesi ve zaman içinde değişmeye karar verebileceğiniz karmaşık bir sürecin ne kadar olabileceği. Bu tasarım kararı, Kişiselleştirme mimarinizdeki birincil kararlardan biri olmalıdır.

Kod örnekleri

Bu kod parçacıkları, .NET için Kişiselleştirme istemci kitaplığıyla aşağıdaki görevlerin nasıl yapılacağını gösterir:

İstemcinin kimliğini doğrulama

Bu bölümde iki şey yapacaksınız:

  • Anahtarınızı ve uç noktanızı belirtin
  • Kişiselleştirme istemcisi oluşturma

Program sınıfınıza aşağıdaki satırları ekleyerek başlayın. Kişiselleştirme kaynağınızdan anahtarınızı ve uç noktanızı eklediğinizden emin olun.

Önemli

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.

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

Ardından Derece ve Ödül URL'lerini oluştur.

static PersonalizerClient InitializePersonalizerClient(Uri url)
{
    return new PersonalizerClient(url, new AzureKeyCredential(ResourceKey));
}

Eylem olarak temsil edilen içerik seçeneklerini alma

Eylemler, Kişiselleştirme'nin en iyi içerik öğesini seçmesini istediğiniz içerik seçimlerini gösterir. Eylem kümesini ve özelliklerini göstermek için Program sınıfına aşağıdaki yöntemleri ekleyin.

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

Yuvaları alma

Yuvalar, kullanıcının etkileşim kuracağı sayfayı oluşturur. Kişiselleştirici, tanımlanan yuvaların her birinde hangi eylemin görüntüleneceğine karar verir. Eylemler olarak ExcludeActionsgösterilen belirli yuvaların dışında tutulabilir. BaselineAction , yuva için varsayılan eylemdir ve Bu eylem Kişiselleştirici kullanılmadan görüntülenirdi.

Bu hızlı başlangıçta basit yuva özellikleri vardır. Üretim sistemlerinde özelliklerin belirlenmesi ve değerlendirilmesiönemsiz bir konu olabilir.

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

Bağlam için kullanıcı tercihlerini alma

Günün saati ve kullanıcının üzerinde olduğu cihaz türü için komut satırından kullanıcının girişini almak için Program sınıfına aşağıdaki yöntemleri ekleyin. Bu yöntemler bağlam özellikleri olarak kullanılır.

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

Her iki yöntem de komut satırından kullanıcının seçimini okumak için yöntemini kullanır GetKey .

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

Öğrenme döngüsünü oluşturma

Kişiselleştirme öğrenme döngüsü RankMultiSlot ve RewardMultiSlot çağrılarının bir döngüsüdür. Bu hızlı başlangıçta, içeriği kişiselleştirmek için yapılan her Sıralama çağrısının ardından Hizmetin ne kadar iyi performans sergilediğini kişiselleştirmek için bir Reward çağrısı yapılır.

Aşağıdaki kod, kullanıcıya komut satırı üzerinden tercihlerini sorma döngüsü boyunca döngü yapar, bu bilgileri Her yuva için en iyi eylemi seçmesi için Kişiselleştirme'ye gönderir, listeden seçim yapmak üzere müşteriye seçimi sunar ve ardından hizmetin seçiminde ne kadar iyi olduğunu gösteren bir ödül puanı Kişiselleştirme'ye gönderir.

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

Aşağıdaki bölümlerde derece ve ödül çağrılarına daha yakından bakın. Kod dosyasını çalıştırmadan önce içerik seçimlerini alan, yuvaları alan ve çok yuvalı derecelendirme ve ödül istekleri gönderen aşağıdaki yöntemleri ekleyin:

  • GetActions
  • GetSlots
  • GetTimeOfDayForContext
  • GetDeviceForContext
  • GetKey
  • GetContext

En iyi eylemi isteme

Derece isteğini tamamlamak için program, kullanıcının tercihlerinden içerik seçimlerinden birini Context oluşturmasını ister. İstek, yanıt almak için ilgili özellikleri ve benzersiz bir olay kimliğiyle bağlamı, eylemleri ve yuvaları içerir.

Bu hızlı başlangıçta günün saati ve kullanıcı cihazının basit bağlam özellikleri vardır. Üretim sistemlerinde eylemlerin ve özelliklerin belirlenmesi ve değerlendirilmesi önemsiz bir konu olabilir.

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

Ödül gönder

Ödül isteğinin ödül puanını almak için, program komut satırı aracılığıyla kullanıcının her yuva için seçimini alır, seçime bir sayısal değer (ödül puanı) atar, ardından ödül API'sine sayısal değer olarak benzersiz olay kimliğini, yuva kimliğini ve her yuva için ödül puanını gönderir. Her yuva için bir ödülün tanımlanması gerekmez.

Bu hızlı başlangıçta, ödül puanı olarak basit bir sayı (sıfır veya 1) atanır. Üretim sistemlerinde, Özel ihtiyaçlarınıza bağlı olarak Reward çağrısına ne zaman ve ne gönderileceğini belirlemek önemsiz bir konu olabilir.

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.");
    }
}

Programı çalıştırma

Uygulamayı uygulama dizininizdeki dotnet run komutuyla çalıştırın.

dotnet run

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

Bu hızlı başlangıcın kaynak kodu kullanılabilir.

Başvuru belgeleri | Çok yuvalı kavramsal | Örnekler

Ön koşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Node.js ve NPM'yi yükleyin (Node.js v14.16.0 ve NPM 6.14.11 ile doğrulanır).
  • Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında bir Kişiselleştirme kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa git'i seçin.
    • Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız olacaktır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde aşağıdaki koda yapıştırın.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ayarlama

Kişiselleştirme örneğini Çok Yuvalı'ya yükseltme

Dekont

Çok yuvalı kişiselleştirme (Önizleme), Kişiselleştirme hizmetinin diğer işlevlerini etkiler. Bu değişiklik geri alınamaz. Çok yuvalı kişiselleştirmeyi etkinleştirmeden önce bkz . Çok yuvalı kişiselleştirme (Önizleme).

  1. Otomatik İyileştirmeyi Devre Dışı Bırak Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Otomatik İyileştirme'yi kapatın ve kaydedin.

Dekont

Otomatik İyileştirme'yi devre dışı bırakmadığınız sürece çok yuvalı kişiselleştirme çalışmaz. Çok yuvalı kişiselleştirme için otomatik iyileştirme gelecekte desteklenecektir.

  1. Kişiselleştirmeyi çok yuvalı olarak güncelleştirme Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Öğrenme ayarlarını dışarı aktar'ı seçin. İndirilen json dosyasındaki bağımsız değişkenler alanı --cb_explore_adf ile başlar. Bunu --ccb_explore_adf olarak değiştirin ve dosyayı kaydedin. CB (bağlamsal eşkıyalar) ve CCB (koşullu bağlamsal eşkıyalar), Kişiselleştirme'nin sırasıyla tek yuvalı ve çok yuvalı kişiselleştirme için kullandığı algoritmalardır. ADF (eyleme bağımlı özellikler), eylemlerin özelliklerle ifade edildiği / tanımlandığı anlamına gelir.

Learning settings before change

Learning settings after change

Portaldaki aynı sekmede, içeri aktarma öğrenme ayarları'nın altında en son değiştirilen json dosyanızı bulup karşıya yükleyin. Bu, Kişiselleştirme örneğinizi "Çok Yuvalı" Kişiselleştirme olacak şekilde güncelleştirir ve artık çok yuvalı Derece ve Ödül çağrılarını destekleyecektir.

Model güncelleştirme sıklığını değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.

Change model update frequency

Ödül bekleme süresini değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.

Change reward wait time

Yeni bir Node.js uygulaması oluşturma

Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.

mkdir myapp && cd myapp

npm init -y Bir dosya oluşturmak package.json için komutunu çalıştırın.

npm init -y

Tercih ettiğiniz düzenleyicide veya IDE'de adlı sample.js yeni bir Node.js uygulaması oluşturun ve kaynağınızın uç noktası ve abonelik anahtarı için değişkenler oluşturun.

Önemli

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.

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

Hızlı başlangıç için NPM paketlerini yükleme

npm install readline-sync uuid axios --save

Nesne modeli

Her yuva için içeriğin en iyi tek öğesini istemek için bir rankRequest oluşturun, ardından multislot/rank'a bir gönderi isteği gönderin. Ardından yanıt rankResponse olarak ayrıştırılır.

Kişiselleştirme'ye ödül puanı göndermek için bir ödül oluşturun, ardından multislot/events/{eventId}/reward adresine bir gönderi isteği gönderin.

Ödül puanını belirlemek, bu hızlı başlangıçta önemsizdir. Bir üretim sisteminde, ödül puanını neyin etkilediğinin belirlenmesi ve zaman içinde değişmeye karar verebileceğiniz karmaşık bir sürecin ne kadar olabileceği. Bu tasarım kararı, Kişiselleştirme mimarinizdeki birincil kararlardan biri olmalıdır.

Kod örnekleri

Bu kod parçacıkları, NodeJS için HTTP istekleri göndererek aşağıdaki görevleri nasıl yapacağınızı gösterir:

Temel URL'ler oluşturma

Bu bölümde, temel URL'yi ve kaynak anahtarını kullanarak istek üst bilgilerini kullanarak Derece / Ödül URL'lerini oluşturacaksınız.

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

Eylem olarak temsil edilen içerik seçeneklerini alma

Eylemler, Kişiselleştirme'nin en iyi içerik öğesini seçmesini istediğiniz içerik seçimlerini gösterir. Eylem kümesini ve özelliklerini göstermek için betike aşağıdaki yöntemleri ekleyin.

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

Bağlam için kullanıcı tercihlerini alma

Günün saati ve kullanıcının üzerinde olduğu cihaz türü için komut satırından kullanıcının girişini almak için betike aşağıdaki yöntemleri ekleyin. Bunlar bağlam özellikleri olarak kullanılır.

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

Yuvaları alma

Yuvalar, kullanıcının etkileşim kuracağı sayfayı oluşturur. Kişiselleştirici, tanımlanan yuvaların her birinde hangi eylemin görüntüleneceğine karar verir. Eylemler olarak ExcludeActionsgösterilen belirli yuvaların dışında tutulabilir. BaselineAction , Kişiselleştirici kullanılmadan görüntülenecek yuva için varsayılan eylemdir.

Bu hızlı başlangıçta basit yuva özellikleri vardır. Üretim sistemlerinde özelliklerin belirlenmesi ve değerlendirilmesiönemsiz bir konu olabilir.

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

HTTP istekleri oluşturma

Çok yuvalı sıralama ve ödül çağrıları için Kişiselleştirme uç noktasına gönderi istekleri göndermek için bu işlevleri ekleyin.

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

Kişiselleştirme kararları için geri bildirim alma

Betiğine aşağıdaki yöntemi ekleyin. Kişiselleştirme'nin komut satırı istemi aracılığıyla her yuva için iyi bir karar vermiş olup olmadığını bildirirsiniz.

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

Öğrenme döngüsünü oluşturma

Kişiselleştirme öğrenme döngüsü, Rank ve Reward çağrılarının bir döngüsüdür. Bu hızlı başlangıçta, içeriği kişiselleştirmek için yapılan her Sıralama çağrısının ardından Hizmetin ne kadar iyi performans sergilediğini kişiselleştirmek için bir Reward çağrısı yapılır.

Aşağıdaki kod, kullanıcıya komut satırı üzerinden tercihlerini sorma döngüsü boyunca döngü yapar, bu bilgileri Her yuva için en iyi eylemi seçmesi için Kişiselleştirme'ye gönderir, listeden seçim yapmak üzere müşteriye seçimi sunar ve ardından hizmetin seçiminde ne kadar iyi olduğunu gösteren bir ödül puanı Kişiselleştirme'ye gönderir.

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

Aşağıdaki bölümlerde derece ve ödül çağrılarına daha yakından bakın.

Kod dosyasını çalıştırmadan önce içerik seçimlerini alan, bağlam için kullanıcı tercihlerini alan, yuvaları alan, HTTP isteğinde bulunan, Her yuva için ödül alan aşağıdaki yöntemleri ekleyin:

  • getActions
  • getContextFeatures
  • getSlots
  • sendRank
  • sendReward
  • getRewardForSlot

En iyi eylemi isteme

Derece isteğini tamamlamak için program, kullanıcının içerik seçenekleri oluşturma tercihlerini ister. İstek gövdesi bağlamı, eylemleri ve yuvaları ilgili özellikleriyle birlikte içerir. sendMultiSlotRank yöntemi bir rankRequest alır ve çok yuvalı sıralama isteğini yürütür.

Bu hızlı başlangıçta günün saati ve kullanıcı cihazının basit bağlam özellikleri vardır. Üretim sistemlerinde eylemlerin ve özelliklerin belirlenmesi ve değerlendirilmesi önemsiz bir konu olabilir.

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

Ödül gönder

Ödül isteğinin ödül puanını almak için, program kullanıcının komut satırından her yuva için seçimini alır, seçime bir sayısal değer (ödül puanı) atar, ardından benzersiz olay kimliğini, yuva kimliğini ve her yuva için ödül puanını sendMultiSlotReward yönteme gönderir. Her yuva için bir ödül tanımlanması gerekmez.

Bu hızlı başlangıçta, ödül puanı olarak basit bir sayı (sıfır veya 1) atanır. Üretim sistemlerinde, Özel ihtiyaçlarınıza bağlı olarak Reward çağrısına ne zaman ve ne gönderileceğini belirlemek önemsiz bir konu olabilir.

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

Programı çalıştırma

Uygulamayı uygulama dizininizdeki Node.js ile çalıştırın.

node sample.js

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

Bu hızlı başlangıcın kaynak kodu kullanılabilir.

Çok yuvalı kavramsal | Örnekler

Ön koşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Python 3.x
  • Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında bir Kişiselleştirme kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa git'i seçin.
    • Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız olacaktır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde aşağıdaki koda yapıştırın.
    • Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (F0) kullanabilirsiniz.

Ayarlama

Kişiselleştirme örneğini Çok Yuvalı'ya yükseltme

Dekont

Çok yuvalı kişiselleştirme (Önizleme), Kişiselleştirme hizmetinin diğer işlevlerini etkiler. Bu değişiklik geri alınamaz. Çok yuvalı kişiselleştirmeyi etkinleştirmeden önce bkz . Çok yuvalı kişiselleştirme (Önizleme).

  1. Otomatik İyileştirmeyi Devre Dışı Bırak Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Otomatik İyileştirme'yi kapatın ve kaydedin.

Dekont

Otomatik İyileştirme'yi devre dışı bırakmadığınız sürece çok yuvalı kişiselleştirme çalışmaz. Çok yuvalı kişiselleştirme için otomatik iyileştirme gelecekte desteklenecektir.

  1. Kişiselleştirmeyi çok yuvalı olarak güncelleştirme Azure portalında, Kişiselleştirme kaynağında, Kaynak Yönetimi'nin altında, Model ve öğrenme ayarları sayfasında Öğrenme ayarlarını dışarı aktar'ı seçin. İndirilen json dosyasındaki bağımsız değişkenler alanı --cb_explore_adf ile başlar. Bunu --ccb_explore_adf olarak değiştirin ve dosyayı kaydedin. CB (bağlamsal eşkıyalar) ve CCB (koşullu bağlamsal eşkıyalar), Kişiselleştirme'nin sırasıyla tek yuvalı ve çok yuvalı kişiselleştirme için kullandığı algoritmalardır. ADF (eyleme bağımlı özellikler), eylemlerin özelliklerle ifade edildiği / tanımlandığı anlamına gelir.

Learning settings before change

Learning settings after change

Portaldaki aynı sekmede, içeri aktarma öğrenme ayarları'nın altında en son değiştirilen json dosyanızı bulup karşıya yükleyin. Bu, Kişiselleştirme örneğinizi "Çok Yuvalı" Kişiselleştirme olacak şekilde güncelleştirir ve artık çok yuvalı Derece ve Ödül çağrılarını destekleyecektir.

Model güncelleştirme sıklığını değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.

Change model update frequency

Ödül bekleme süresini değiştirme

Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.

Change reward wait time

Yeni Python uygulaması oluşturma

Yeni bir Python dosyası oluşturun ve kaynağınızın uç noktası ve abonelik anahtarı için değişkenler oluşturun.

Önemli

Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.

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>"

Nesne modeli

Her yuva için içeriğin en iyi tek öğesini istemek için bir rank_request oluşturun ve ardından multislot/rank'a bir gönderi isteği gönderin. Yanıt daha sonra bir rank_response ayrıştırılır.

Kişiselleştirme'ye ödül puanı göndermek için bir ödül oluşturun, ardından multislot/events/{eventId}/reward adresine bir gönderi isteği gönderin.

Bu hızlı başlangıçta, ödül puanının belirlenmesi önemsizdir. Bir üretim sisteminde, ödül puanını neyin etkilediğinin belirlenmesi ve zaman içinde değiştirmeye karar verebileceğiniz karmaşık bir sürecin ne kadar olabileceği. Bu tasarım kararı, Kişiselleştirme mimarinizdeki birincil kararlardan biri olmalıdır.

Kod örnekleri

Bu kod parçacıkları, Python için HTTP istekleri göndererek aşağıdaki görevleri nasıl yapacağınızı gösterir:

Temel URL'ler oluşturma

Bu bölümde, temel URL'yi ve kaynak anahtarını kullanarak istek üst bilgilerini kullanarak Derece / Ödül URL'lerini oluşturacaksınız.

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

Eylem olarak temsil edilen içerik seçeneklerini alma

Eylemler, Kişiselleştirme'nin en iyi içerik öğesini seçmesini istediğiniz içerik seçimlerini gösterir. Eylem kümesini ve özelliklerini göstermek için betike aşağıdaki yöntemleri ekleyin.

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

Bağlam için kullanıcı tercihlerini alma

Günün saati ve kullanıcının üzerinde olduğu cihaz türü için komut satırından kullanıcının girişini almak için betike aşağıdaki yöntemleri ekleyin. Bunlar bağlam özellikleri olarak kullanılır.

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

Yuvaları alma

Yuvalar, kullanıcının etkileşim kuracağı sayfayı oluşturur. Kişiselleştirici, tanımlanan yuvaların her birinde hangi eylemin görüntüleneceğine karar verir. Eylemler olarak ExcludeActionsgösterilen belirli yuvaların dışında tutulabilir. BaselineAction , Kişiselleştirici kullanılmadan görüntülenecek yuva için varsayılan eylemdir.

Bu hızlı başlangıçta basit yuva özellikleri vardır. Üretim sistemlerinde özelliklerin belirlenmesi ve değerlendirilmesiönemsiz bir konu olabilir.

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

HTTP istekleri oluşturma

Çok yuvalı sıralama ve ödül çağrıları için Kişiselleştirme uç noktasına gönderi istekleri göndermek için bu işlevleri ekleyin.

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)

Kişiselleştirme kararları için geri bildirim alma

Betiğine aşağıdaki yöntemi ekleyin. Kişiselleştirme'nin komut satırı istemi aracılığıyla her yuva için iyi bir karar vermiş olup olmadığını bildirirsiniz.

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

Öğrenme döngüsünü oluşturma

Kişiselleştirme öğrenme döngüsü, Rank ve Reward çağrılarının bir döngüsüdür. Bu hızlı başlangıçta, içeriği kişiselleştirmek için yapılan her Sıralama çağrısının ardından Hizmetin ne kadar iyi performans sergilediğini kişiselleştirmek için bir Reward çağrısı yapılır.

Aşağıdaki kod, kullanıcıya komut satırı üzerinden tercihlerini sorma döngüsü boyunca döngü yapar, bu bilgileri Her yuva için en iyi eylemi seçmesi için Kişiselleştirme'ye gönderir, listeden seçim yapmak üzere müşteriye seçimi sunar ve ardından hizmetin seçiminde ne kadar iyi olduğunu gösteren bir ödül puanı Kişiselleştirme'ye gönderir.

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

Aşağıdaki bölümlerde derece ve ödül çağrılarına daha yakından bakın.

Kod dosyasını çalıştırmadan önce içerik seçimlerini alan, bağlam için kullanıcı tercihlerini alan, yuvaları alan, HTTP isteğinde bulunan, Her yuva için ödül alan aşağıdaki yöntemleri ekleyin:

  • get_actions
  • get_context_features
  • get_slots
  • send_rank
  • send_reward
  • get_reward_for_dsot

En iyi eylemi isteme

Derece isteğini tamamlamak için program, kullanıcının içerik seçenekleri oluşturma tercihlerini ister. İstek gövdesi bağlamı, eylemleri ve yuvaları ilgili özellikleriyle birlikte içerir. send_multi_slot_rank yöntemi bir rankRequest alır ve çok yuvalı sıralama isteğini yürütür.

Bu hızlı başlangıçta günün saati ve kullanıcı cihazının basit bağlam özellikleri vardır. Üretim sistemlerinde eylemlerin ve özelliklerin belirlenmesi ve değerlendirilmesi önemsiz bir konu olabilir.

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)

Ödül gönder

Ödül isteğinin ödül puanını almak için, program kullanıcının komut satırından her yuva için seçimini alır, seçime bir sayısal değer (ödül puanı) atar, ardından benzersiz olay kimliğini, yuva kimliğini ve her yuva için ödül puanını send_multi_slot_reward yönteme gönderir. Her yuva için bir ödül tanımlanması gerekmez.

Bu hızlı başlangıçta, ödül puanı olarak basit bir sayı (sıfır veya 1) atanır. Üretim sistemlerinde, Özel ihtiyaçlarınıza bağlı olarak Reward çağrısına ne zaman ve ne gönderileceğini belirlemek önemsiz bir konu olabilir.

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'])

Programı çalıştırma

Uygulamayı uygulama dizininizden Python ile çalıştırın.

python sample.py

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

Bu hızlı başlangıcın kaynak kodu kullanılabilir.

Sonraki adımlar