Sdílet prostřednictvím


Začínáme s více sloty pro Azure AI Personalizátor

Důležité

Od 20. září 2023 nebudete moct vytvářet nové prostředky personalizace. Služba Personalizace se vyřadí z provozu 1. října 2026.

Přizpůsobení více slotů (Preview) umožňuje cílit na obsah ve webových rozloženích, karuselech a seznamech, kde se uživatelům zobrazí více než jedna akce (například produkt nebo část obsahu). Pomocí rozhraní API pro přizpůsobení s více sloty můžete mít modely AI v personalizaci zjistit, jaké kontexty uživatelů a produkty řídí určité chování, zvažování a učení se z umístění v uživatelském rozhraní. Personalizace může například zjistit, že některé produkty nebo obsah více kliknutí jako boční panel nebo zápatí než hlavní zvýraznění na stránce.

V této příručce se dozvíte, jak používat rozhraní API pro více slotů Personalizace.

Referenční dokumentace | Balíček zdrojového kódu | knihovny (NuGet) | Koncepční | ukázky více slotů

Předpoklady

  • Předplatné Azure: Můžete si ho vytvořit zdarma.
  • Aktuální verze .NET Core.
  • Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Personalizace, abyste získali svůj klíč a koncový bod. Po nasazení vyberte Přejít k prostředku.
    • K připojení aplikace k rozhraní API personalizace budete potřebovat klíč a koncový bod z prostředku, který vytvoříte. Klíč a koncový bod vložte do kódu níže v rychlém startu.
    • K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Nastavení

Upgrade instance personalizace na více slotů

Poznámka:

Přizpůsobení s více sloty (Preview) má vliv na další funkce služby Personalizace. Tuto změnu nelze vrátit zpět. Před povolením přizpůsobení s více sloty si přečtěte téma Přizpůsobení více slotů (Preview).

  1. Zakažte automatickou optimalizaci na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení, vypněte a uložte automatickou optimalizaci.

Poznámka:

Přizpůsobení více slotů nebude fungovat, pokud nezakážete automatickou optimalizaci. V budoucnu bude podporována automatická optimalizace pro přizpůsobení více slotů.

  1. Aktualizace personalizace na více slotů na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení vyberte Exportovat nastavení učení. Pole argumentů ve staženého souboru JSON začne na --cb_explore_adf. Změňte tento soubor na --ccb_explore_adf a uložte soubor. CB (kontextové bandity) a CCB (podmíněné kontextové bandity) jsou algoritmy Personalizace, které používá pro přizpůsobení s jedním slotem a více sloty. ADF (závislé na akcích) znamená, že se akce vyjadřují nebo identifikují s funkcemi.

Learning settings before change

Learning settings after change

Na stejné kartě na portálu v části Nastavení importu výuky vyhledejte naposledy upravený soubor JSON a nahrajte ho. Tím se vaše instance Personalizace aktualizuje tak, aby byla personalizátorem pro více slotů a nyní bude podporovat více slotů Rank and Rewards calls.

Změna frekvence aktualizace modelu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte frekvenci aktualizace modelu na 30 sekund. Tato krátká doba trvání model rychle vytrénuje a umožní vám zjistit, jak se doporučené akce mění pro každou iteraci.

Change model update frequency

Změna doby čekání na odměnu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte dobu čekání na odměnu na 10 minut. To určuje, jak dlouho bude model čekat po odeslání doporučení, aby od tohoto doporučení obdržel zpětnou vazbu o odměně. Trénování se neprojeví, dokud nepřejde doba čekání na odměnu.

Change reward wait time

Vytvoření nové aplikace jazyka C#

V preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) vytvořte novou aplikaci .NET Core.

V okně konzoly (například cmd, PowerShell nebo Bash) pomocí příkazu dotnet new vytvořte novou konzolovou aplikaci s názvem personalizer-quickstart. Tento příkaz vytvoří jednoduchý projekt "Hello World" C# s jedním zdrojovým souborem: Program.cs.

dotnet new console -n personalizer-quickstart

Změňte adresář na nově vytvořenou složku aplikace. Aplikaci můžete sestavit pomocí následujících:

dotnet build

Výstup sestavení by neměl obsahovat žádná upozornění ani chyby.

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

Instalace klientské knihovny

V adresáři aplikace nainstalujte klientskou knihovnu Personalizace pro .NET pomocí následujícího příkazu:

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

V adresáři projektu otevřete Program.cs soubor v preferovaném editoru nebo integrovaném vývojovém prostředí (IDE). Přidejte následující direktivy using:

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

Objektový model

Klient Personalizace je objekt PersonalizaceClient , který se ověřuje v Azure pomocí Azure.AzureKeyCredential, který obsahuje váš klíč.

Pokud chcete požádat o jednu nejlepší položku obsahu pro každý slot, vytvořte objekt PersonalrRankMultiSlotOptions a pak ho předejte PersonalrClient.RankMultiSlot. Metoda RankMultiSlot vrátí PersonalrMultiSlotRankResult.

Pokud chcete odeslat skóre odměny personalizaci, vytvořte PersonalrRewardMultiSlotOptions a pak ho předejte metodě PersonalrClient.RewardsMultiSlot spolu s odpovídajícím ID události.

Skóre odměny v tomto rychlém startu je triviální. V produkčním systému se určení toho, co má vliv na skóre odměny, a o tom, kolik může být složitým procesem, se můžete rozhodnout změnit v průběhu času. Toto rozhodnutí o návrhu by mělo být jedním z hlavních rozhodnutí v architektuře Personalizace.

Příklady kódu

Tyto fragmenty kódu ukazují, jak provádět následující úlohy s klientskou knihovnou Personalizace pro .NET:

Ověření klienta

V této části provedete dvě věci:

  • Zadání klíče a koncového bodu
  • Vytvoření klienta personalizace

Začněte přidáním následujících řádků do třídy Program. Nezapomeňte přidat klíč a koncový bod z prostředku Personalizace.

Důležité

Přejděte na Azure Portal. Pokud se prostředek Personalizace, který jste vytvořili v části Požadavky, úspěšně nasadil, klikněte v části Další kroky na tlačítko Přejít k prostředku. Klíč a koncový bod najdete na stránce klíče a koncového bodu prostředku v části Správa prostředků.

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí zvažte použití zabezpečeného způsobu ukládání a přístupu k vašim přihlašovacím údajům. Například 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>";

Dále vytvořte adresy URL pořadí a odměny.

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

Získání možností obsahu reprezentovaných jako akcí

Akce představují volby obsahu, ze kterých chcete personalizaci vybrat nejlepší položku obsahu. Do třídy Program přidejte následující metody, které představují sadu akcí a jejich funkcí.

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

Získání slotů

Sloty tvoří stránku, se kterou bude uživatel pracovat. Personalizace se rozhodne, která akce se má zobrazit v každém z definovaných slotů. Akce mohou být vyloučeny z konkrétních slotů, které se zobrazují jako ExcludeActions. BaselineAction je výchozí akce pro slot, která by se zobrazila bez použití personalizace.

Tento rychlý start obsahuje jednoduché funkce slotu. V produkčních systémech může být určení a vyhodnocenífunkcí nevýkonné.

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

Získání uživatelských předvoleb pro kontext

Přidejte do třídy Program následující metody, abyste získali vstup uživatele z příkazového řádku po dobu dne a typ zařízení, na které je uživatel zapnutý. Tyto metody se použijí jako kontextové funkce.

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

Obě metody používají metodu GetKey ke čtení výběru uživatele z příkazového řádku.

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

Vytvoření smyčky učení

Smyčka učení Personalizace je cyklus volání RankMultiSlot a RewardsMultiSlot . V tomto rychlém startu je za každým voláním pořadí přizpůsobení obsahu následovat volání odměny, které personalizátoru sdělí, jak dobře služba fungovala.

Následující kód prochází cyklus dotazování uživatele na jeho předvolby prostřednictvím příkazového řádku, odesláním těchto informací personalizaci vybrat nejlepší akci pro každý slot, prezentovat výběr zákazníkovi, který si vybere ze seznamu, a pak odeslat skóre odměny personalizaci signalizuje, jak dobře služba ve výběru udělala.

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

Podívejte se podrobněji na pořadí a odměny v následujících částech. Před spuštěním souboru kódu přidejte následující metody, které získají volby obsahu, získat sloty a odeslat žádosti o více slotů a odměny:

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

Žádost o nejlepší akci

K dokončení žádosti o pořadí program požádá uživatele o vytvoření Context volby obsahu. Požadavek obsahuje kontext, akce a sloty s příslušnými funkcemi a jedinečným ID události pro příjem odpovědi.

Tento rychlý start obsahuje jednoduché kontextové funkce denního a uživatelského zařízení. Vprodukčních

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

Odeslání odměny

Pokud chcete získat skóre odměny pro žádost o odměnu, program získá výběr uživatele pro každý slot prostřednictvím příkazového řádku, přiřadí k výběru číselnou hodnotu (skóre odměny), pak odešle jedinečné ID události, ID slotu a skóre odměny pro každý slot jako číselnou hodnotu do rozhraní API odměny. Pro každý slot není potřeba definovat odměnu.

V tomto rychlém startu se přiřadí jednoduché číslo jako skóre odměny, a to buď nula, nebo 1. V produkčníchsystémechch

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

Spuštění programu

Spusťte aplikaci příkazem dotnet run z adresáře vaší aplikace.

dotnet run

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

Zdrojový kód pro tento rychlý start je k dispozici.

Referenční dokumentace | ke koncepčním ukázkovým ukázkovým více | slotů

Předpoklady

  • Předplatné Azure: Můžete si ho vytvořit zdarma.
  • Nainstalujte Node.js a NPM (ověřeno pomocí Node.js v14.16.0 a NPM 6.14.11).
  • Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Personalizace, abyste získali svůj klíč a koncový bod. Po nasazení vyberte Přejít k prostředku.
    • K připojení aplikace k rozhraní API personalizace budete potřebovat klíč a koncový bod z prostředku, který vytvoříte. Klíč a koncový bod vložte do kódu níže v rychlém startu.
    • K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Nastavení

Upgrade instance personalizace na více slotů

Poznámka:

Přizpůsobení s více sloty (Preview) má vliv na další funkce služby Personalizace. Tuto změnu nelze vrátit zpět. Před povolením přizpůsobení s více sloty si přečtěte téma Přizpůsobení více slotů (Preview).

  1. Zakažte automatickou optimalizaci na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení, vypněte a uložte automatickou optimalizaci.

Poznámka:

Přizpůsobení více slotů nebude fungovat, pokud nezakážete automatickou optimalizaci. V budoucnu bude podporována automatická optimalizace pro přizpůsobení více slotů.

  1. Aktualizace personalizace na více slotů na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení vyberte Exportovat nastavení učení. Pole argumentů ve staženého souboru JSON začne na --cb_explore_adf. Změňte tento soubor na --ccb_explore_adf a uložte soubor. CB (kontextové bandity) a CCB (podmíněné kontextové bandity) jsou algoritmy Personalizace, které používá pro přizpůsobení s jedním slotem a více sloty. ADF (závislé na akcích) znamená, že se akce vyjadřují nebo identifikují s funkcemi.

Learning settings before change

Learning settings after change

Na stejné kartě na portálu v části Nastavení importu výuky vyhledejte naposledy upravený soubor JSON a nahrajte ho. Tím se vaše instance Personalizace aktualizuje tak, aby byla personalizátorem pro více slotů a nyní bude podporovat více slotů Rank and Rewards calls.

Změna frekvence aktualizace modelu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte frekvenci aktualizace modelu na 30 sekund. Tato krátká doba trvání model rychle vytrénuje a umožní vám zjistit, jak se doporučené akce mění pro každou iteraci.

Change model update frequency

Změna doby čekání na odměnu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte dobu čekání na odměnu na 10 minut. To určuje, jak dlouho bude model čekat po odeslání doporučení, aby od tohoto doporučení obdržel zpětnou vazbu o odměně. Trénování se neprojeví, dokud nepřejde doba čekání na odměnu.

Change reward wait time

Vytvoření nové aplikace Node.js

V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro vaši aplikaci nový adresář a přejděte do něj.

mkdir myapp && cd myapp

Spuštěním npm init -y příkazu vytvořte package.json soubor.

npm init -y

Vytvořte novou aplikaci Node.js v preferovaném editoru nebo integrovaném vývojovém prostředí ( sample.js IDE) a vytvořte proměnné pro koncový bod vašeho prostředku a klíč předplatného.

Důležité

Přejděte na Azure Portal. Pokud se prostředek Personalizace, který jste vytvořili v části Požadavky, úspěšně nasadil, klikněte v části Další kroky na tlačítko Přejít k prostředku. Klíč a koncový bod najdete na stránce klíče a koncového bodu prostředku v části Správa prostředků.

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí zvažte použití zabezpečeného způsobu ukládání a přístupu k vašim přihlašovacím údajům. Například 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>';

Instalace balíčků NPM pro rychlý start

npm install readline-sync uuid axios --save

Objektový model

Pokud chcete požádat o jednu nejlepší položku obsahu pro každý slot, vytvořte požadavek rankRequest a odešlete žádost o příspěvek do vícelotů/pořadí. Odpověď se pak parsuje do pořadíResponse.

Pokud chcete poslat skóre odměny personalizaci, vytvořte odměny a odešlete žádost o příspěvek na vícelotů/událostí/{eventId}/odměna.

Určení skóre odměny je v tomto rychlém startu triviální. V produkčním systému se určení toho, co má vliv na skóre odměny, a o tom, kolik může být složitým procesem, se můžete rozhodnout změnit v průběhu času. Toto rozhodnutí o návrhu by mělo být jedním z hlavních rozhodnutí v architektuře Personalizace.

Příklady kódu

Tyto fragmenty kódu ukazují, jak provádět následující úlohy odesláním požadavků HTTP pro NodeJS:

Vytvoření základních adres URL

V této části vytvoříte adresy URL pro Rank /Rewards pomocí základní adresy URL a hlaviček požadavků pomocí klíče prostředku.

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

Získání možností obsahu reprezentovaných jako akcí

Akce představují volby obsahu, ze kterých chcete personalizaci vybrat nejlepší položku obsahu. Do skriptu přidejte následující metody, které představují sadu akcí a jejich funkce.

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

Získání uživatelských předvoleb pro kontext

Do skriptu přidejte následující metody pro získání vstupu uživatele z příkazového řádku po dobu dne a typ zařízení, ve které je uživatel zapnutý. Tyto funkce se použijí jako kontextové funkce.

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

Získání slotů

Sloty tvoří stránku, se kterou bude uživatel pracovat. Personalizace se rozhodne, která akce se má zobrazit v každém z definovaných slotů. Akce mohou být vyloučeny z konkrétních slotů, které se zobrazují jako ExcludeActions. BaselineAction je výchozí akce pro slot, který by se zobrazil bez použití personalizace.

Tento rychlý start obsahuje jednoduché funkce slotu. V produkčních systémech může být určení a vyhodnocenífunkcí nevýkonné.

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

Vytváření požadavků HTTP

Přidejte tyto funkce, které posílají žádosti do koncového bodu Personalizace pro více slotů a volání odměn.

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

Získejte zpětnou vazbu k rozhodování o personalizaci

Do skriptu přidejte následující metodu. Signalizujete, jestli personalizace provedla dobré rozhodnutí pro každý slot prostřednictvím příkazového řádku.

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

Vytvoření smyčky učení

Smyčka učení Personalizace je cyklus volání Rank a Rewards . V tomto rychlém startu je za každým voláním pořadí přizpůsobení obsahu následovat volání odměny, které personalizátoru sdělí, jak dobře služba fungovala.

Následující kód prochází cyklus dotazování uživatele na jeho předvolby prostřednictvím příkazového řádku, odesláním těchto informací personalizaci vybrat nejlepší akci pro každý slot, prezentovat výběr zákazníkovi, který si vybere ze seznamu, a pak odeslat skóre odměny personalizaci signalizuje, jak dobře služba ve výběru udělala.

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

Podívejte se podrobněji na pořadí a odměny v následujících částech.

Přidejte následující metody, které získají volby obsahu, získat uživatelské předvolby pro kontext, získat sloty, Vytvořit požadavky HTTP, Získat odměnu pro každý slot před spuštěním souboru kódu:

  • getActions
  • getContextFeatures
  • getSlots
  • sendRank
  • SendReward
  • getRewardForSlot

Žádost o nejlepší akci

K dokončení žádosti o pořadí program požádá předvolby uživatele, aby vytvořil volby obsahu. Text požadavku obsahuje kontext, akce a sloty s příslušnými funkcemi. Metoda sendMultiSlotRank přebírá požadavek rankRequest a spustí požadavek pořadí více slotů.

Tento rychlý start obsahuje jednoduché kontextové funkce denního a uživatelského zařízení. Vprodukčních

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

Odeslání odměny

Pokud chcete získat skóre odměny pro žádost o odměnu, program získá výběr uživatele pro každý slot prostřednictvím příkazového řádku, přiřadí k výběru číselnou hodnotu (skóre odměny), pak odešle jedinečné ID události, ID slotu a skóre odměny pro každý slot metodě sendMultiSlotReward . Pro každý slot nemusí být definována odměna.

V tomto rychlém startu se přiřadí jednoduché číslo jako skóre odměny, a to buď nula, nebo 1. V produkčníchsystémechch

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

Spuštění programu

Spusťte aplikaci s Node.js z adresáře vaší aplikace.

node sample.js

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

Zdrojový kód pro tento rychlý start je k dispozici.

Koncepční | ukázky s více sloty

Předpoklady

  • Předplatné Azure: Můžete si ho vytvořit zdarma.
  • Python 3.x
  • Jakmile budete mít předplatné Azure, vytvořte na webu Azure Portal prostředek Personalizace, abyste získali svůj klíč a koncový bod. Po nasazení vyberte Přejít k prostředku.
    • K připojení aplikace k rozhraní API personalizace budete potřebovat klíč a koncový bod z prostředku, který vytvoříte. Klíč a koncový bod vložte do kódu níže v rychlém startu.
    • K vyzkoušení služby můžete použít cenovou úroveňF0 Free a později upgradovat na placenou úroveň pro produkční prostředí.

Nastavení

Upgrade instance personalizace na více slotů

Poznámka:

Přizpůsobení s více sloty (Preview) má vliv na další funkce služby Personalizace. Tuto změnu nelze vrátit zpět. Před povolením přizpůsobení s více sloty si přečtěte téma Přizpůsobení více slotů (Preview).

  1. Zakažte automatickou optimalizaci na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení, vypněte a uložte automatickou optimalizaci.

Poznámka:

Přizpůsobení více slotů nebude fungovat, pokud nezakážete automatickou optimalizaci. V budoucnu bude podporována automatická optimalizace pro přizpůsobení více slotů.

  1. Aktualizace personalizace na více slotů na webu Azure Portal v prostředku Personalizace v části Správa prostředků na stránce Nastavení modelu a učení vyberte Exportovat nastavení učení. Pole argumentů ve staženého souboru JSON začne na --cb_explore_adf. Změňte tento soubor na --ccb_explore_adf a uložte soubor. CB (kontextové bandity) a CCB (podmíněné kontextové bandity) jsou algoritmy Personalizace, které používá pro přizpůsobení s jedním slotem a více sloty. ADF (závislé na akcích) znamená, že se akce vyjadřují nebo identifikují s funkcemi.

Learning settings before change

Learning settings after change

Na stejné kartě na portálu v části Nastavení importu výuky vyhledejte naposledy upravený soubor JSON a nahrajte ho. Tím se vaše instance Personalizace aktualizuje tak, aby byla personalizátorem pro více slotů a nyní bude podporovat více slotů Rank and Rewards calls.

Změna frekvence aktualizace modelu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte frekvenci aktualizace modelu na 30 sekund. Tato krátká doba trvání model rychle vytrénuje a umožní vám zjistit, jak se doporučené akce mění pro každou iteraci.

Change model update frequency

Změna doby čekání na odměnu

Na webu Azure Portal přejděte na stránku Konfigurace prostředku Personalizace a změňte dobu čekání na odměnu na 10 minut. To určuje, jak dlouho bude model čekat po odeslání doporučení, aby od tohoto doporučení obdržel zpětnou vazbu o odměně. Trénování se neprojeví, dokud nepřejde doba čekání na odměnu.

Change reward wait time

Vytvoření nové aplikace v Pythonu

Vytvořte nový soubor Pythonu a vytvořte proměnné pro koncový bod vašeho prostředku a klíč předplatného.

Důležité

Přejděte na Azure Portal. Pokud se prostředek Personalizace, který jste vytvořili v části Požadavky, úspěšně nasadil, klikněte v části Další kroky na tlačítko Přejít k prostředku. Klíč a koncový bod najdete na stránce klíče a koncového bodu prostředku v části Správa prostředků.

Nezapomeňte klíč z kódu odebrat, až to budete hotovi, a nikdy ho veřejně neposílejte. V produkčním prostředí zvažte použití zabezpečeného způsobu ukládání a přístupu k vašim přihlašovacím údajům. Například 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>"

Objektový model

Pokud chcete požádat o jednu nejlepší položku obsahu pro každý slot, vytvořte rank_request a odešlete žádost o příspěvek do vícelotů/pořadí. Odpověď se pak parsuje do rank_response.

Pokud chcete poslat skóre odměny personalizaci, vytvořte odměny a odešlete žádost o příspěvek na vícelotů/událostí/{eventId}/odměna.

V tomto rychlém startu je určení skóre odměny triviální. V produkčním systému je určení toho, co má vliv na skóre odměny a o kolik může být složitý proces, který se můžete rozhodnout změnit v průběhu času. Toto rozhodnutí o návrhu by mělo být jedním z hlavních rozhodnutí v architektuře Personalizace.

Příklady kódu

Tyto fragmenty kódu ukazují, jak provádět následující úlohy odesláním požadavků HTTP pro Python:

Vytvoření základních adres URL

V této části vytvoříte adresy URL pro Rank /Rewards pomocí základní adresy URL a hlaviček požadavků pomocí klíče prostředku.

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

Získání možností obsahu reprezentovaných jako akcí

Akce představují volby obsahu, ze kterých chcete personalizaci vybrat nejlepší položku obsahu. Do skriptu přidejte následující metody, které představují sadu akcí a jejich funkce.

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

Získání uživatelských předvoleb pro kontext

Do skriptu přidejte následující metody pro získání vstupu uživatele z příkazového řádku po dobu dne a typ zařízení, ve které je uživatel zapnutý. Tyto funkce se použijí jako kontextové funkce.

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

Získání slotů

Sloty tvoří stránku, se kterou bude uživatel pracovat. Personalizace se rozhodne, která akce se má zobrazit v každém z definovaných slotů. Akce mohou být vyloučeny z konkrétních slotů, které se zobrazují jako ExcludeActions. BaselineAction je výchozí akce pro slot, který by se zobrazil bez použití personalizace.

Tento rychlý start obsahuje jednoduché funkce slotu. V produkčních systémech může být určení a vyhodnocenífunkcí nevýkonné.

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

Vytváření požadavků HTTP

Přidejte tyto funkce, které posílají žádosti do koncového bodu Personalizace pro více slotů a volání odměn.

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)

Získejte zpětnou vazbu k rozhodování o personalizaci

Do skriptu přidejte následující metodu. Signalizujete, jestli personalizace provedla dobré rozhodnutí pro každý slot prostřednictvím příkazového řádku.

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

Vytvoření smyčky učení

Smyčka učení Personalizace je cyklus volání Rank a Rewards . V tomto rychlém startu je za každým voláním pořadí přizpůsobení obsahu následovat volání odměny, které personalizátoru sdělí, jak dobře služba fungovala.

Následující kód prochází cyklus dotazování uživatele na jeho předvolby prostřednictvím příkazového řádku, odesláním těchto informací personalizaci vybrat nejlepší akci pro každý slot, prezentovat výběr zákazníkovi, který si vybere ze seznamu, a pak odeslat skóre odměny personalizaci signalizuje, jak dobře služba ve výběru udělala.

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

Podívejte se podrobněji na pořadí a odměny v následujících částech.

Přidejte následující metody, které získají volby obsahu, získat uživatelské předvolby pro kontext, získat sloty, Vytvořit požadavky HTTP, Získat odměnu pro každý slot před spuštěním souboru kódu:

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

Žádost o nejlepší akci

K dokončení žádosti o pořadí program požádá předvolby uživatele, aby vytvořil volby obsahu. Text požadavku obsahuje kontext, akce a sloty s příslušnými funkcemi. Metoda send_multi_slot_rank přebírá požadavek rankRequest a spustí požadavek pořadí více slotů.

Tento rychlý start obsahuje jednoduché kontextové funkce denního a uživatelského zařízení. Vprodukčních

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)

Odeslání odměny

Pokud chcete získat skóre odměny pro žádost o odměnu, program získá výběr uživatele pro každý slot prostřednictvím příkazového řádku, přiřadí k výběru číselnou hodnotu (skóre odměny), pak odešle jedinečné ID události, ID slotu a skóre odměny pro každý slot metodě send_multi_slot_reward . Pro každý slot nemusí být definována odměna.

V tomto rychlém startu se přiřadí jednoduché číslo jako skóre odměny, a to buď nula, nebo 1. V produkčníchsystémechch

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

Spuštění programu

Spusťte aplikaci pomocí Pythonu z adresáře vaší aplikace.

python sample.py

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

Zdrojový kód pro tento rychlý start je k dispozici.

Další kroky