Udostępnij za pośrednictwem


Rozpoczynanie pracy z wieloma miejscami dla usługi Personalizacja sztucznej inteligencji platformy Azure

Ważne

Od 20 września 2023 r. nie będzie można tworzyć nowych zasobów usługi Personalizacja. Usługa Personalizacja jest wycofywana 1 października 2026 r.

Personalizacja z wieloma miejscami (wersja zapoznawcza) umożliwia określanie zawartości docelowej w układach sieci Web, karuzelach i listach, w których użytkownicy wyświetlają więcej niż jedną akcję (np. produkt lub zawartość). Korzystając z interfejsów API z wieloma miejscami personalizacji, możesz mieć modele sztucznej inteligencji w usłudze Personalizacja, aby dowiedzieć się, jakie konteksty użytkowników i produkty napędzają pewne zachowania, biorąc pod uwagę i ucząc się od umieszczania w interfejsie użytkownika. Na przykład usługa Personalizacja może dowiedzieć się, że niektóre produkty lub zawartość mają więcej kliknięć jako pasek boczny lub stopkę niż jako główne wyróżnienie na stronie.

W tym przewodniku dowiesz się, jak używać interfejsów API z wieloma miejscami usługi Personalizacja.

Dokumentacja referencyjna — przykładowy | kod | źródłowy biblioteki źródłowej (NuGet) | Przykłady koncepcyjne | obejmujące wiele miejsc

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Bieżąca wersja platformy .NET Core.
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób usługi Personalizacja w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Po wdrożeniu wybierz pozycję Przejdź do zasobu.
    • Będziesz potrzebować klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API usługi Personalizacja. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
    • Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Konfigurowanie

Uaktualnianie wystąpienia usługi Personalizacja do wielu miejsc

Uwaga

Personalizacja z wieloma miejscami (wersja zapoznawcza) ma wpływ na inne funkcje usługi Personalizacja. Tej zmiany nie można cofnąć. Przed włączeniem personalizacji z wieloma miejscami zobacz Personalizacja z wieloma miejscami (wersja zapoznawcza).

  1. Wyłącz automatyczną optymalizację w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia, wyłącz i zapisz optymalizację automatyczną.

Uwaga

Personalizacja z wieloma miejscami nie będzie działać, chyba że wyłączysz optymalizację automatyczną. Automatyczna optymalizacja personalizacji w wielu miejscach będzie obsługiwana w przyszłości.

  1. Zaktualizuj usługę Personalizacja do wielu miejsc w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia wybierz pozycję Eksportuj ustawienia uczenia. Pole argumentów w pobranym pliku json rozpocznie się od --cb_explore_adf. Zmień to na --ccb_explore_adf i zapisz plik. CB (kontekstowe bandyci) i CCB (warunkowe kontekstowe bandyci) to algorytmy, których usługa Personalizacja używa odpowiednio do personalizacji z jednym miejscem i z wieloma miejscami. Funkcja ADF (funkcje zależne od akcji) oznacza, że akcje są wyrażane /identyfikowane z funkcjami.

Ustawienia uczenia przed zmianą

Ustawienia uczenia po zmianie

Na tej samej karcie w portalu w obszarze Importowanie ustawień uczenia przejdź do znalezienia ostatnio zmodyfikowanego pliku json i przekazania go. Spowoduje to zaktualizowanie wystąpienia usługi Personalizacja tak, aby było usługą personalizacji "Multi Slot" i będzie teraz obsługiwać połączenia rangi i nagrody w wielu miejscach.

Zmienianie częstotliwości aktualizacji modelu

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień częstotliwość aktualizacji modelu na 30 sekund. Ten krótki czas trwania będzie szybko trenował model, co pozwala zobaczyć, jak zmienia się zalecana akcja dla każdej iteracji.

Zmienianie częstotliwości aktualizacji modelu

Zmienianie czasu oczekiwania na nagrodę

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień czas oczekiwania na nagrodę na 10 minut. Określa to, jak długo model będzie czekał po wysłaniu rekomendacji, aby otrzymać opinię na temat nagrody od tego zalecenia. Trenowanie nie nastąpi, dopóki czas oczekiwania na nagrodę nie upłynął.

Zmień czas oczekiwania na nagrody

Tworzenie nowej aplikacji w języku C#

Utwórz nową aplikację platformy .NET Core w preferowanym edytorze lub środowisku IDE.

W oknie konsoli (takim jak cmd, PowerShell lub Bash) użyj polecenia dotnet new , aby utworzyć nową aplikację konsolową o nazwie personalizer-quickstart. To polecenie tworzy prosty projekt języka C# "Hello World" z jednym plikiem źródłowym: Program.cs.

dotnet new console -n personalizer-quickstart

Zmień katalog na nowo utworzony folder aplikacji. Aplikację można skompilować za pomocą następujących funkcji:

dotnet build

Dane wyjściowe kompilacji nie powinny zawierać żadnych ostrzeżeń ani błędów.

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

Instalowanie biblioteki klienta

W katalogu aplikacji zainstaluj bibliotekę klienta usługi Personalizacja dla platformy .NET za pomocą następującego polecenia:

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

W katalogu projektu otwórz Program.cs plik w preferowanym edytorze lub środowisku IDE. Dodaj następujące dyrektywy using:

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

Model obiektów

Klient personalizacji to obiekt PersonalrClient , który uwierzytelnia się na platformie Azure przy użyciu elementu Azure.AzureKeyCredential, który zawiera klucz.

Aby poprosić o pojedynczy najlepszy element zawartości dla każdego miejsca, utwórz obiekt PersonalrRankMultiSlotOptions , a następnie przekaż go do elementu PersonalrClient.RankMultiSlot. Metoda RankMultiSlot zwraca element PersonalrMultiSlotRankResult.

Aby wysłać wynik nagrody do usługi Personalizacja, utwórz element PersonalizacjaRewardMultiSlotOptions, a następnie przekaż go do metody PersonalrClient.RewardMultiSlot wraz z odpowiednim identyfikatorem zdarzenia.

Wynik nagrody w tym przewodniku Szybki start jest banalny. W systemie produkcyjnym określenie, co ma wpływ na wynik nagrody i ile może być złożonym procesem, który można zmienić w czasie. Ta decyzja projektowa powinna być jedną z głównych decyzji w architekturze personalizacji.

Przykłady kodu

Te fragmenty kodu pokazują, jak wykonać następujące zadania za pomocą biblioteki klienta personalizacji dla platformy .NET:

Uwierzytelnianie użytkownika

W tej sekcji wykonasz dwie czynności:

  • Określanie klucza i punktu końcowego
  • Tworzenie klienta usługi Personalizacja

Zacznij od dodania następujących wierszy do klasy Program. Pamiętaj, aby dodać klucz i punkt końcowy z zasobu usługi Personalizacja.

Ważne

Przejdź do portalu Azure Portal. Jeśli zasób personalizacji utworzony w sekcji Wymagania wstępne został wdrożony pomyślnie, kliknij przycisk Przejdź do zasobu w obszarze Następne kroki. Klucz i punkt końcowy można znaleźć na stronie klucza i punktu końcowego zasobu w obszarze zarządzanie zasobami.

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego rozważ użycie bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń. Na przykład usługa 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>";

Następnie skonstruuj adresy URL rangi i nagrody.

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

Pobieranie opcji zawartości reprezentowanych jako akcje

Akcje reprezentują opcje zawartości, z których usługa Personalizacja ma wybrać najlepszy element zawartości. Dodaj następujące metody do klasy Program, aby reprezentować zestaw akcji i ich funkcje.

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

Pobieranie miejsc

Miejsca tworzą stronę, z którą użytkownik będzie korzystać. Usługa Personalizacja zdecyduje, która akcja ma być wyświetlana w każdym ze zdefiniowanych miejsc. Akcje można wykluczyć z określonych miejsc, jak pokazano jako ExcludeActions. BaselineAction to domyślna akcja miejsca, która byłaby wyświetlana bez użycia usługi Personalizacja.

Ten przewodnik Szybki start zawiera proste funkcje miejsca. W systemach produkcyjnych określanie i ocenianie cech może być sprawą nietrygalną.

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

Pobieranie preferencji użytkownika dla kontekstu

Dodaj następujące metody do klasy Program, aby uzyskać dane wejściowe użytkownika z wiersza polecenia dla godziny dnia i typ urządzenia, na które użytkownik jest włączony. Te metody będą używane jako funkcje kontekstowe.

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

Obie metody używają GetKey metody , aby odczytać wybór użytkownika z wiersza polecenia.

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

Tworzenie pętli uczenia

Pętla uczenia usługi Personalizacja to cykl wywołań RankMultiSlot i RewardMultiSlot . W tym przewodniku Szybki start każde wywołanie rangi, aby spersonalizować zawartość, następuje wywołanie nagrody, aby poinformować personalizację o tym, jak dobrze działa usługa.

Poniższy kod przechodzi przez cykl z pytaniem użytkownika o preferencje za pośrednictwem wiersza polecenia, wysyłając te informacje do personalizacji, aby wybrać najlepszą akcję dla każdego miejsca, przedstawiając wybór klientowi do wyboru spośród listy, a następnie wysyłając ocenę nagrody do personalizacji sygnalizując, jak dobrze usługa wykonała wybór.

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

Przyjrzyj się bliżej rangi i wywołaniom nagród w poniższych sekcjach. Dodaj następujące metody, które pobierają opcje zawartości, pobierają miejsca i wysyłają żądania klasyfikacji wielu miejsc i nagród przed uruchomieniem pliku kodu:

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

Zażądaj najlepszej akcji

Aby ukończyć żądanie rangi, program preferencji użytkownika o utworzenie Context opcji zawartości. Żądanie zawiera kontekst, akcje i miejsca z odpowiednimi funkcjami i unikatowym identyfikatorem zdarzenia w celu otrzymania odpowiedzi.

Ten przewodnik Szybki start zawiera proste funkcje kontekstowe dotyczące pory dnia i urządzenia użytkownika. W systemach produkcyjnych określanie i ocenianie akcji i funkcji może być sprawą nietrygalną.

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

Wyślij nagrodę

Aby uzyskać wynik nagrody dla żądania nagrody, program pobiera wybór użytkownika dla każdego miejsca za pośrednictwem wiersza polecenia, przypisuje do wyboru wartość liczbową (wynik nagrody), a następnie wysyła unikatowy identyfikator zdarzenia, identyfikator miejsca i wynik nagrody dla każdego miejsca jako wartość liczbową do interfejsu API nagrody. Nagroda nie musi być zdefiniowana dla każdego miejsca.

Ten przewodnik Szybki start przypisuje prostą liczbę jako wynik nagrody— zero lub 1. W systemach produkcyjnych określenie, kiedy i co należy wysłać do wywołania nagrody , może być sprawą nietrygalną, w zależności od konkretnych potrzeb.

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

Uruchamianie programu

Uruchom aplikację za pomocą polecenia dotnet run z katalogu aplikacji.

dotnet run

Program Szybki start zadaje kilka pytań w celu zebrania preferencji użytkownika, znanych jako funkcje, a następnie udostępnia akcję wierzchołka.

Kod źródłowy dla tego przewodnika Szybki start jest dostępny.

Dokumentacja referencyjna Przykłady koncepcyjne | obejmujące wiele miejsc |

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Zainstaluj Node.js i narzędzie NPM (zweryfikowane przy użyciu Node.js w wersji 14.16.0 i NPM 6.14.11).
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób usługi Personalizacja w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Po wdrożeniu wybierz pozycję Przejdź do zasobu.
    • Będziesz potrzebować klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API usługi Personalizacja. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
    • Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Konfigurowanie

Uaktualnianie wystąpienia usługi Personalizacja do wielu miejsc

Uwaga

Personalizacja z wieloma miejscami (wersja zapoznawcza) ma wpływ na inne funkcje usługi Personalizacja. Tej zmiany nie można cofnąć. Przed włączeniem personalizacji z wieloma miejscami zobacz Personalizacja z wieloma miejscami (wersja zapoznawcza).

  1. Wyłącz automatyczną optymalizację w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia, wyłącz i zapisz optymalizację automatyczną.

Uwaga

Personalizacja z wieloma miejscami nie będzie działać, chyba że wyłączysz optymalizację automatyczną. Automatyczna optymalizacja personalizacji w wielu miejscach będzie obsługiwana w przyszłości.

  1. Zaktualizuj usługę Personalizacja do wielu miejsc w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia wybierz pozycję Eksportuj ustawienia uczenia. Pole argumentów w pobranym pliku json rozpocznie się od --cb_explore_adf. Zmień to na --ccb_explore_adf i zapisz plik. CB (kontekstowe bandyci) i CCB (warunkowe kontekstowe bandyci) to algorytmy, których usługa Personalizacja używa odpowiednio do personalizacji z jednym miejscem i z wieloma miejscami. Funkcja ADF (funkcje zależne od akcji) oznacza, że akcje są wyrażane /identyfikowane z funkcjami.

Ustawienia uczenia przed zmianą

Ustawienia uczenia po zmianie

Na tej samej karcie w portalu w obszarze Importowanie ustawień uczenia przejdź do znalezienia ostatnio zmodyfikowanego pliku json i przekazania go. Spowoduje to zaktualizowanie wystąpienia usługi Personalizacja tak, aby było usługą personalizacji "Multi Slot" i będzie teraz obsługiwać połączenia rangi i nagrody w wielu miejscach.

Zmienianie częstotliwości aktualizacji modelu

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień częstotliwość aktualizacji modelu na 30 sekund. Ten krótki czas trwania będzie szybko trenował model, co pozwala zobaczyć, jak zmienia się zalecana akcja dla każdej iteracji.

Zmienianie częstotliwości aktualizacji modelu

Zmienianie czasu oczekiwania na nagrodę

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień czas oczekiwania na nagrodę na 10 minut. Określa to, jak długo model będzie czekał po wysłaniu rekomendacji, aby otrzymać opinię na temat nagrody od tego zalecenia. Trenowanie nie nastąpi, dopóki czas oczekiwania na nagrodę nie upłynął.

Zmień czas oczekiwania na nagrody

Tworzenie nowej aplikacji Node.js

W oknie konsoli (na przykład cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji i przejdź do niego.

mkdir myapp && cd myapp

Uruchom polecenie , npm init -y aby utworzyć package.json plik.

npm init -y

Utwórz nową aplikację Node.js w preferowanym edytorze lub środowisku IDE o nazwie sample.js i utwórz zmienne dla punktu końcowego zasobu i klucza subskrypcji.

Ważne

Przejdź do portalu Azure Portal. Jeśli zasób personalizacji utworzony w sekcji Wymagania wstępne został wdrożony pomyślnie, kliknij przycisk Przejdź do zasobu w obszarze Następne kroki. Klucz i punkt końcowy można znaleźć na stronie klucza i punktu końcowego zasobu w obszarze zarządzanie zasobami.

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego rozważ użycie bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń. Na przykład usługa 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>';

Instalowanie pakietów NPM na potrzeby przewodnika Szybki start

npm install readline-sync uuid axios --save

Model obiektów

Aby poprosić o pojedynczy najlepszy element zawartości dla każdego miejsca, utwórz element rankRequest, a następnie wyślij żądanie post do multislot/rank. Odpowiedź jest następnie analizowana w rangiResponse.

Aby wysłać wynik nagrody do usługi Personalizacja, utwórz nagrodę, a następnie wyślij żądanie post do multislot/events/{eventId}/reward.

Określenie wyniku nagrody w tym przewodniku Szybki start jest proste. W systemie produkcyjnym określenie, co ma wpływ na wynik nagrody i ile może być złożonym procesem, który można zmienić w czasie. Ta decyzja projektowa powinna być jedną z głównych decyzji w architekturze personalizacji.

Przykłady kodu

Te fragmenty kodu pokazują, jak wykonać następujące zadania, wysyłając żądania HTTP dla środowiska NodeJS:

Tworzenie podstawowych adresów URL

W tej sekcji skonstruujesz adresy URL rangi/nagrody przy użyciu podstawowego adresu URL i nagłówków żądań przy użyciu klucza zasobu.

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

Pobieranie opcji zawartości reprezentowanych jako akcje

Akcje reprezentują opcje zawartości, z których usługa Personalizacja ma wybrać najlepszy element zawartości. Dodaj następujące metody do skryptu, aby reprezentować zestaw akcji i ich funkcje.

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

Pobieranie preferencji użytkownika dla kontekstu

Dodaj następujące metody do skryptu, aby pobrać dane wejściowe użytkownika z wiersza polecenia przez godzinę dnia i typ urządzenia, na które użytkownik jest włączony. Będą one używane jako funkcje kontekstowe.

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

Pobieranie miejsc

Miejsca tworzą stronę, z którą użytkownik będzie korzystać. Usługa Personalizacja zdecyduje, która akcja ma być wyświetlana w każdym ze zdefiniowanych miejsc. Akcje można wykluczyć z określonych miejsc, jak pokazano jako ExcludeActions. BaselineAction jest domyślną akcją dla miejsca, które zostałoby wyświetlone bez użycia usługi Personalizacja.

Ten przewodnik Szybki start zawiera proste funkcje miejsca. W systemach produkcyjnych określanie i ocenianie cech może być sprawą nietrygalną.

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

Tworzenie żądań HTTP

Dodaj te funkcje, aby wysyłać żądania ogłaszane do punktu końcowego usługi Personalizacja na potrzeby wywołań rangi i nagrody dla wielu miejsc.

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

Uzyskiwanie opinii na temat decyzji dotyczących personalizacji

Dodaj następującą metodę do skryptu. Sygnalizujesz, że usługa Personalizacja podjęła dobrą decyzję dla każdego miejsca za pośrednictwem wiersza polecenia.

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

Tworzenie pętli uczenia

Pętla szkoleniowa Personalizacja to cykl wywołań rangi i nagrody . W tym przewodniku Szybki start każde wywołanie rangi, aby spersonalizować zawartość, następuje wywołanie nagrody, aby poinformować personalizację o tym, jak dobrze działa usługa.

Poniższy kod przechodzi przez cykl z pytaniem użytkownika o preferencje za pośrednictwem wiersza polecenia, wysyłając te informacje do personalizacji, aby wybrać najlepszą akcję dla każdego miejsca, przedstawiając wybór klientowi do wyboru spośród listy, a następnie wysyłając ocenę nagrody do personalizacji sygnalizując, jak dobrze usługa wykonała wybór.

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

Przyjrzyj się bliżej rangi i wywołaniom nagród w poniższych sekcjach.

Dodaj następujące metody, które pobierają opcje zawartości, pobierają preferencje użytkownika dla kontekstu, pobierają miejsca, wysyłają żądania HTTP, pobierają nagrodę dla każdego miejsca przed uruchomieniem pliku kodu:

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

Zażądaj najlepszej akcji

Aby ukończyć żądanie rangi, program prosi użytkownika o preferencje dotyczące tworzenia zawartości. Treść żądania zawiera kontekst, akcje i miejsca z odpowiednimi funkcjami. Metoda sendMultiSlotRank przyjmuje klasę rankRequest i wykonuje żądanie rangi z wieloma miejscami.

Ten przewodnik Szybki start zawiera proste funkcje kontekstowe dotyczące pory dnia i urządzenia użytkownika. W systemach produkcyjnych określanie i ocenianie akcji i funkcji może być sprawą nietrygalną.

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

Wyślij nagrodę

Aby uzyskać wynik nagrody dla żądania nagrody, program pobiera wybór użytkownika dla każdego miejsca za pośrednictwem wiersza polecenia, przypisuje do wyboru wartość liczbową (wynik nagrody), a następnie wysyła unikatowy identyfikator zdarzenia, identyfikator miejsca i wynik nagrody dla każdego miejsca do sendMultiSlotReward metody. Nagroda nie musi być zdefiniowana dla każdego miejsca.

Ten przewodnik Szybki start przypisuje prostą liczbę jako wynik nagrody— zero lub 1. W systemach produkcyjnych określenie, kiedy i co należy wysłać do wywołania nagrody , może być sprawą nietrygalną, w zależności od konkretnych potrzeb.

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

Uruchamianie programu

Uruchom aplikację z Node.js z katalogu aplikacji.

node sample.js

Program Szybki start zadaje kilka pytań w celu zebrania preferencji użytkownika, znanych jako funkcje, a następnie udostępnia akcję wierzchołka.

Kod źródłowy dla tego przewodnika Szybki start jest dostępny.

Przykłady koncepcyjne | obejmujące wiele miejsc

Wymagania wstępne

  • Subskrypcja platformy Azure — utwórz bezpłatnie
  • Python 3.x
  • Po utworzeniu subskrypcji platformy Azure utwórz zasób usługi Personalizacja w witrynie Azure Portal, aby uzyskać klucz i punkt końcowy. Po wdrożeniu wybierz pozycję Przejdź do zasobu.
    • Będziesz potrzebować klucza i punktu końcowego z utworzonego zasobu, aby połączyć aplikację z interfejsem API usługi Personalizacja. Wklej klucz i punkt końcowy do poniższego kodu w dalszej części przewodnika Szybki start.
    • Możesz użyć warstwy cenowej bezpłatna (F0), aby wypróbować usługę, a następnie uaktualnić ją do warstwy płatnej dla środowiska produkcyjnego.

Konfigurowanie

Uaktualnianie wystąpienia usługi Personalizacja do wielu miejsc

Uwaga

Personalizacja z wieloma miejscami (wersja zapoznawcza) ma wpływ na inne funkcje usługi Personalizacja. Tej zmiany nie można cofnąć. Przed włączeniem personalizacji z wieloma miejscami zobacz Personalizacja z wieloma miejscami (wersja zapoznawcza).

  1. Wyłącz automatyczną optymalizację w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia, wyłącz i zapisz optymalizację automatyczną.

Uwaga

Personalizacja z wieloma miejscami nie będzie działać, chyba że wyłączysz optymalizację automatyczną. Automatyczna optymalizacja personalizacji w wielu miejscach będzie obsługiwana w przyszłości.

  1. Zaktualizuj usługę Personalizacja do wielu miejsc w witrynie Azure Portal w zasobie Personalizacja w obszarze Zarządzanie zasobami na stronie Ustawienia modelu i uczenia wybierz pozycję Eksportuj ustawienia uczenia. Pole argumentów w pobranym pliku json rozpocznie się od --cb_explore_adf. Zmień to na --ccb_explore_adf i zapisz plik. CB (kontekstowe bandyci) i CCB (warunkowe kontekstowe bandyci) to algorytmy, których usługa Personalizacja używa odpowiednio do personalizacji z jednym miejscem i z wieloma miejscami. Funkcja ADF (funkcje zależne od akcji) oznacza, że akcje są wyrażane /identyfikowane z funkcjami.

Ustawienia uczenia przed zmianą

Ustawienia uczenia po zmianie

Na tej samej karcie w portalu w obszarze Importowanie ustawień uczenia przejdź do znalezienia ostatnio zmodyfikowanego pliku json i przekazania go. Spowoduje to zaktualizowanie wystąpienia usługi Personalizacja tak, aby było usługą personalizacji "Multi Slot" i będzie teraz obsługiwać połączenia rangi i nagrody w wielu miejscach.

Zmienianie częstotliwości aktualizacji modelu

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień częstotliwość aktualizacji modelu na 30 sekund. Ten krótki czas trwania będzie szybko trenował model, co pozwala zobaczyć, jak zmienia się zalecana akcja dla każdej iteracji.

Zmienianie częstotliwości aktualizacji modelu

Zmienianie czasu oczekiwania na nagrodę

W witrynie Azure Portal przejdź do strony Konfiguracja zasobu usługi Personalizacja i zmień czas oczekiwania na nagrodę na 10 minut. Określa to, jak długo model będzie czekał po wysłaniu rekomendacji, aby otrzymać opinię na temat nagrody od tego zalecenia. Trenowanie nie nastąpi, dopóki czas oczekiwania na nagrodę nie upłynął.

Zmień czas oczekiwania na nagrody

Tworzenie nowej aplikacji w języku Python

Utwórz nowy plik języka Python i utwórz zmienne dla punktu końcowego zasobu i klucza subskrypcji.

Ważne

Przejdź do portalu Azure Portal. Jeśli zasób personalizacji utworzony w sekcji Wymagania wstępne został wdrożony pomyślnie, kliknij przycisk Przejdź do zasobu w obszarze Następne kroki. Klucz i punkt końcowy można znaleźć na stronie klucza i punktu końcowego zasobu w obszarze zarządzanie zasobami.

Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego rozważ użycie bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń. Na przykład usługa 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 obiektów

Aby poprosić o pojedynczy najlepszy element zawartości dla każdego miejsca, utwórz rank_request, a następnie wyślij żądanie post do multislot/rangi. Odpowiedź jest następnie analizowana w rank_response.

Aby wysłać wynik nagrody do usługi Personalizacja, utwórz nagrodę, a następnie wyślij żądanie post do multislot/events/{eventId}/reward.

W tym przewodniku Szybki start określenie wyniku nagrody jest proste. W systemie produkcyjnym określenie, co ma wpływ na wynik nagrody i o ile może być złożonym procesem, który można zmienić w czasie. Ta decyzja projektowa powinna być jedną z głównych decyzji w architekturze personalizacji.

Przykłady kodu

Te fragmenty kodu pokazują, jak wykonywać następujące zadania, wysyłając żądania HTTP dla języka Python:

Tworzenie podstawowych adresów URL

W tej sekcji skonstruujesz adresy URL rangi/nagrody przy użyciu podstawowego adresu URL i nagłówków żądań przy użyciu klucza zasobu.

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

Pobieranie opcji zawartości reprezentowanych jako akcje

Akcje reprezentują opcje zawartości, z których usługa Personalizacja ma wybrać najlepszy element zawartości. Dodaj następujące metody do skryptu, aby reprezentować zestaw akcji i ich funkcje.

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

Pobieranie preferencji użytkownika dla kontekstu

Dodaj następujące metody do skryptu, aby pobrać dane wejściowe użytkownika z wiersza polecenia przez godzinę dnia i typ urządzenia, na które użytkownik jest włączony. Będą one używane jako funkcje kontekstowe.

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

Pobieranie miejsc

Miejsca tworzą stronę, z którą użytkownik będzie korzystać. Usługa Personalizacja zdecyduje, która akcja ma być wyświetlana w każdym ze zdefiniowanych miejsc. Akcje można wykluczyć z określonych miejsc, jak pokazano jako ExcludeActions. BaselineAction jest domyślną akcją dla miejsca, które zostałoby wyświetlone bez użycia usługi Personalizacja.

Ten przewodnik Szybki start zawiera proste funkcje miejsca. W systemach produkcyjnych określanie i ocenianie cech może być sprawą nietrygalną.

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

Tworzenie żądań HTTP

Dodaj te funkcje, aby wysyłać żądania ogłaszane do punktu końcowego usługi Personalizacja na potrzeby wywołań rangi i nagrody dla wielu miejsc.

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)

Uzyskiwanie opinii na temat decyzji dotyczących personalizacji

Dodaj następującą metodę do skryptu. Sygnalizujesz, że usługa Personalizacja podjęła dobrą decyzję dla każdego miejsca za pośrednictwem wiersza polecenia.

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

Tworzenie pętli uczenia

Pętla szkoleniowa Personalizacja to cykl wywołań rangi i nagrody . W tym przewodniku Szybki start każde wywołanie rangi, aby spersonalizować zawartość, następuje wywołanie nagrody, aby poinformować personalizację o tym, jak dobrze działa usługa.

Poniższy kod przechodzi przez cykl z pytaniem użytkownika o preferencje za pośrednictwem wiersza polecenia, wysyłając te informacje do personalizacji, aby wybrać najlepszą akcję dla każdego miejsca, przedstawiając wybór klientowi do wyboru spośród listy, a następnie wysyłając ocenę nagrody do personalizacji sygnalizując, jak dobrze usługa wykonała wybór.

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

Przyjrzyj się bliżej rangi i wywołaniom nagród w poniższych sekcjach.

Dodaj następujące metody, które pobierają opcje zawartości, pobierają preferencje użytkownika dla kontekstu, pobierają miejsca, wysyłają żądania HTTP, pobierają nagrodę dla każdego miejsca przed uruchomieniem pliku kodu:

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

Zażądaj najlepszej akcji

Aby ukończyć żądanie rangi, program prosi użytkownika o preferencje dotyczące tworzenia zawartości. Treść żądania zawiera kontekst, akcje i miejsca z odpowiednimi funkcjami. Metoda send_multi_slot_rank przyjmuje klasę rankRequest i wykonuje żądanie rangi z wieloma miejscami.

Ten przewodnik Szybki start zawiera proste funkcje kontekstowe dotyczące pory dnia i urządzenia użytkownika. W systemach produkcyjnych określanie i ocenianie akcji i funkcji może być sprawą nietrygalną.

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)

Wyślij nagrodę

Aby uzyskać wynik nagrody dla żądania nagrody, program pobiera wybór użytkownika dla każdego miejsca za pośrednictwem wiersza polecenia, przypisuje do wyboru wartość liczbową (wynik nagrody), a następnie wysyła unikatowy identyfikator zdarzenia, identyfikator miejsca i wynik nagrody dla każdego miejsca do send_multi_slot_reward metody. Nagroda nie musi być zdefiniowana dla każdego miejsca.

Ten przewodnik Szybki start przypisuje prostą liczbę jako wynik nagrody— zero lub 1. W systemach produkcyjnych określenie, kiedy i co należy wysłać do wywołania nagrody , może być sprawą nietrygalną, w zależności od konkretnych potrzeb.

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

Uruchamianie programu

Uruchom aplikację przy użyciu języka Python z katalogu aplikacji.

python sample.py

Program Szybki start zadaje kilka pytań w celu zebrania preferencji użytkownika, znanych jako funkcje, a następnie udostępnia akcję wierzchołka.

Kod źródłowy dla tego przewodnika Szybki start jest dostępny.

Następne kroki