Share via


Ismerkedés az Azure AI Personalizer többhelyes használatával

Fontos

2023. szeptember 20-tól nem hozhat létre új Personalizer-erőforrásokat. A Personalizer szolgáltatás 2026. október 1-jén megszűnik.

A többhelyes személyre szabás (előzetes verzió) lehetővé teszi, hogy olyan webes elrendezésekben, körhintákban és listákban lévő tartalmakat célozzon meg, ahol egynél több művelet (például termék vagy tartalom) jelenik meg a felhasználók számára. A Personalizer többhelyes API-ival a Personalizer AI-modelljeiből megtudhatja, hogy milyen felhasználói környezetek és termékek vezetnek bizonyos viselkedéseket, figyelembe véve és tanulva az elhelyezést a felhasználói felületen. A Personalizer például megtanulhatja, hogy egyes termékek vagy tartalmak oldalsávként vagy láblécként több kattintást hajtanak, mint egy oldal fő kiemeléseként.

Ebben az útmutatóban megtudhatja, hogyan használhatja a Personalizer többhelyes API-kat.

Referenciadokumentáció Kódtár forráskódcsomagja | (NuGet) | Többhelyes | elméleti minták |

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás
  • A .NET Core aktuális verziója.
  • Miután megkapta az Azure-előfizetését, hozzon létre egy Personalizer-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az üzembe helyezés után válassza az Ugrás az erőforrásra lehetőséget.
    • Az alkalmazás a Personalizer API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsára és végpontjára. Illessze be a kulcsot és a végpontot az alábbi kódba a rövid útmutató későbbi részében.
    • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Beállítás

A Personalizer-példány frissítése többhelyesre

Megjegyzés:

A többhelyes személyre szabás (előzetes verzió) hatással van a Personalizer szolgáltatás egyéb funkcióira. Ez a módosítás nem vonható vissza. A többhelyes személyre szabás engedélyezése előtt tekintse meg a többhelyes személyre szabás (előzetes verzió) című témakört.

  1. Tiltsa le az automatikus optimalizálást az Azure Portalon, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon, kapcsolja ki és mentse az automatikus optimalizálást.

Megjegyzés:

A többhelyes személyre szabás csak akkor működik, ha letiltja az automatikus optimalizálást. A többhelyes személyre szabás automatikus optimalizálása a jövőben támogatott lesz.

  1. Frissítse a Personalizert több pontra az Azure PortalOn, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon válassza a Tanulási beállítások exportálása lehetőséget. A letöltött json-fájl argumentummezője a --cb_explore_adf kezdetű lesz. Módosítsa a következőre: --ccb_explore_adf , és mentse a fájlt. A CB (környezetfüggő banditák) és a CCB (feltételes környezetfüggő banditák) azok az algoritmusok, amelyeket a Personalizer az egyhelyes és a többhelyes személyre szabáshoz használ. Az ADF (műveletfüggő funkciók) azt jelenti, hogy a műveletek jellemzőkkel vannak kifejezve/ azonosítva.

Learning settings before change

Learning settings after change

A portál ugyanazon lapján az Importálási tanulási beállítások területen keresse meg a nemrég módosított json-fájlt, és töltse fel. Ez frissíti a Personalizer-példányt "Multi Slot" Personalizer-ként, és mostantól támogatja a többhelyes Rang- és Reward-hívásokat.

A modellfrissítés gyakoriságának módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a modellfrissítés gyakoriságát 30 másodpercre. Ez a rövid időtartam gyorsan betaníthatja a modellt, így láthatja, hogyan változik az egyes iterációkhoz javasolt művelet.

Change model update frequency

A jutalom várakozási idejének módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a Reward várakozási idejét 10 percre. Ez határozza meg, hogy a modell mennyi ideig fog várni a javaslat elküldése után, hogy megkapja a javaslat jutalom-visszajelzését. A betanítás addig nem történik meg, amíg a jutalom várakozási ideje el nem telik.

Change reward wait time

Új C#-alkalmazás létrehozása

Hozzon létre egy új .NET Core-alkalmazást az előnyben részesített szerkesztőben vagy IDE-ben.

Egy konzolablakban (például parancsmag, PowerShell vagy Bash) a dotnet new paranccsal hozzon létre egy új, a névvel personalizer-quickstartellátott konzolalkalmazást. Ez a parancs egy egyszerű ""Helló világ!" alkalmazás" C#-projektet hoz létre egyetlen forrásfájllal: Program.cs.

dotnet new console -n personalizer-quickstart

Módosítsa a könyvtárat az újonnan létrehozott alkalmazásmappára. Az alkalmazást a következőkkel hozhatja létre:

dotnet build

A buildkimenet nem tartalmazhat figyelmeztetést vagy hibát.

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

Telepítse az ügyfélkódtárat

Az alkalmazáskönyvtárban telepítse a .NET-hez készült Personalizer ügyfélkódtárat a következő paranccsal:

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

Nyissa meg a fájlt a projektkönyvtárban az Program.cs előnyben részesített szerkesztőben vagy IDE-ben. Adja hozzá az alábbi irányelveket:

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

Objektummodell

A Personalizer-ügyfél egy PersonalizerClient objektum, amely az Azure-ban az Azure.AzureKeyCredential használatával hitelesíti a kulcsot.

Ha meg szeretné kérdezni az egyes pontokhoz tartozó tartalom egyetlen legjobb elemét, hozzon létre egy PersonalizerRankMultiSlotOptions objektumot, majd adja át a PersonalizerClient.RankMultiSlotnak. A RankMultiSlot metódus egy PersonalizerMultiSlotRankResult értéket ad vissza.

Ha jutalompontot szeretne küldeni a Personalizernek, hozzon létre egy PersonalizerRewardMultiSlotOptions értéket, majd adja át a PersonalizerClient.RewardMultiSlot metódusnak a megfelelő eseményazonosítóval együtt.

A rövid útmutatóban szereplő jutalompontszám triviális. Egy éles rendszerben annak meghatározása, hogy mi befolyásolja a jutalompontszámot , és hogy mennyi lehet egy összetett folyamat, amelyet idővel megváltoztathat. Ennek a tervezési döntésnek kell lennie a Personalizer-architektúra egyik elsődleges döntésének.

Kódpéldák

Ezek a kódrészletek bemutatják, hogyan végezheti el a következő feladatokat a .NET-hez készült Personalizer ügyfélkódtárral:

Az ügyfél hitelesítése

Ebben a szakaszban két dolgot fog elvégezni:

  • A kulcs és a végpont megadása
  • Personalizer-ügyfél létrehozása

Először adja hozzá a következő sorokat a Program osztályhoz. Mindenképpen adja hozzá a kulcsot és a végpontot a Personalizer-erőforrásból.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott Personalizer-erőforrás sikeresen üzembe lett helyezve, kattintson az Ugrás az erőforrásra gombra a Következő lépések csoportban. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben fontolja meg a hitelesítő adatok biztonságos tárolását és elérését. Például az 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>";

Ezután hozza létre a Rangsor és a Reward URL-címeket.

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

Tartalomválasztási lehetőségek lekérése műveletként

A műveletek azokat a tartalomválasztásokat jelölik, amelyek közül a Personalizer a legjobb tartalomelemet szeretné kiválasztani. Adja hozzá a következő metódusokat a Program osztályhoz a műveletek és azok funkcióinak megjelenítéséhez.

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

Pontok lekérése

A pontok alkotják azt a lapot, amelyet a felhasználó használni fog. A Personalizer dönti el, hogy melyik művelet jelenjen meg a megadott pontok mindegyikében. A műveletek kizárhatók bizonyos pontokból, amelyek a ExcludeActionskövetkezőképpen jelennek meg: . BaselineAction A pont alapértelmezett művelete, amely a Personalizer használata nélkül lett volna megjelenítve.

Ez a rövid útmutató egyszerű pontfunkciókkal rendelkezik. Az éles rendszerekben a jellemzők meghatározása és kiértékelésenem triviális kérdés lehet.

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

Felhasználói beállítások lekérése a környezethez

Adja hozzá a következő metódusokat a Program osztályhoz, hogy lekérje a felhasználó bemenetét a parancssorból a nap idejére és a felhasználó által bekapcsolva lévő eszköz típusára vonatkozóan. Ezek a metódusok környezeti funkciókként lesznek használva.

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

Mindkét módszer a GetKey metódus használatával olvassa be a felhasználó kijelölését a parancssorból.

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

A tanulási ciklus létrehozása

A Personalizer tanulási ciklus a RankMultiSlot és RewardMultiSlot hívások ciklusa. Ebben a rövid útmutatóban a tartalom személyre szabása érdekében minden Rang-hívást egy Reward-hívás követ, amely tájékoztatja a Személyreszabót a szolgáltatás teljesítményéről.

A következő kód végighalad egy cikluson, amely során megkérdezi a felhasználót a beállításokról a parancssoron keresztül, és elküldi ezeket az információkat a Personalizernek, hogy az egyes pontokhoz a legjobb műveletet válassza ki, és a listából válassza ki az ügyfelet, majd küldjön egy jutalompontszámot a Personalizernek, jelezve, hogy a szolgáltatás milyen jól teljesített a kiválasztás során.

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

Tekintse meg közelebbről a rang- és jutalomhívásokat a következő szakaszokban. A kódfájl futtatása előtt adja hozzá a következő módszereket, amelyek lekérik a tartalomválasztást, a pontok lekérését, valamint a többhelyes rangsor- és jutalomkérések küldését:

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

A legjobb művelet kérése

A Rangsor kérés teljesítéséhez a program megkéri a felhasználót, hogy hozzon létre egy tartalomválasztást Context . A kérés tartalmazza a megfelelő funkciókkal rendelkező környezetet, műveleteket és tárolóhelyeket, valamint egy egyedi eseményazonosítót a válasz fogadásához.

Ez a rövid útmutató a nap és a felhasználói eszköz egyszerű környezeti funkcióit tartalmazza. Az éles rendszerekben a műveletek és funkciók meghatározása és értékelésenem triviális kérdés lehet.

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

Jutalom küldése

A Reward-kérelem jutalompontszámának lekéréséhez a program a parancssoron keresztül megkapja a felhasználó által kiválasztott pontot az egyes pontokhoz, numerikus értéket (jutalompontszámot) rendel a kijelöléshez, majd az egyes pontok egyedi eseményazonosítóját, pontazonosítóját és jutalompontszámát numerikus értékként elküldi a Reward API-nak. Az egyes pontokhoz nem szükséges jutalom meghatározása.

Ez a rövid útmutató egy egyszerű számot rendel jutalompontként, nullát vagy 1-et. Éles rendszerekben annak meghatározása, hogy mikor és mit küldjön a Reward hívásnak, az adott igényektől függően nem triviális kérdés lehet.

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

A program futtatása

Futtassa az alkalmazást a dotnet run paranccsal az alkalmazáskönyvtárból.

dotnet run

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

A rövid útmutató forráskódja elérhető.

Referenciadokumentáció többhelyes | elméleti minták |

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás
  • Telepítse a Node.js-t és az NPM-et (a Node.js 14.16.0-s és NPM 6.14.11-s verzióval ellenőrizve).
  • Miután megkapta az Azure-előfizetését, hozzon létre egy Personalizer-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az üzembe helyezés után válassza az Ugrás az erőforrásra lehetőséget.
    • Az alkalmazás a Personalizer API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsára és végpontjára. Illessze be a kulcsot és a végpontot az alábbi kódba a rövid útmutató későbbi részében.
    • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Beállítás

A Personalizer-példány frissítése többhelyesre

Megjegyzés:

A többhelyes személyre szabás (előzetes verzió) hatással van a Personalizer szolgáltatás egyéb funkcióira. Ez a módosítás nem vonható vissza. A többhelyes személyre szabás engedélyezése előtt tekintse meg a többhelyes személyre szabás (előzetes verzió) című témakört.

  1. Tiltsa le az automatikus optimalizálást az Azure Portalon, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon, kapcsolja ki és mentse az automatikus optimalizálást.

Megjegyzés:

A többhelyes személyre szabás csak akkor működik, ha letiltja az automatikus optimalizálást. A többhelyes személyre szabás automatikus optimalizálása a jövőben támogatott lesz.

  1. Frissítse a Personalizert több pontra az Azure PortalOn, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon válassza a Tanulási beállítások exportálása lehetőséget. A letöltött json-fájl argumentummezője a --cb_explore_adf kezdetű lesz. Módosítsa a következőre: --ccb_explore_adf , és mentse a fájlt. A CB (környezetfüggő banditák) és a CCB (feltételes környezetfüggő banditák) azok az algoritmusok, amelyeket a Personalizer az egyhelyes és a többhelyes személyre szabáshoz használ. Az ADF (műveletfüggő funkciók) azt jelenti, hogy a műveletek jellemzőkkel vannak kifejezve/ azonosítva.

Learning settings before change

Learning settings after change

A portál ugyanazon lapján az Importálási tanulási beállítások területen keresse meg a nemrég módosított json-fájlt, és töltse fel. Ez frissíti a Personalizer-példányt "Multi Slot" Personalizer-ként, és mostantól támogatja a többhelyes Rang- és Reward-hívásokat.

A modellfrissítés gyakoriságának módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a modellfrissítés gyakoriságát 30 másodpercre. Ez a rövid időtartam gyorsan betaníthatja a modellt, így láthatja, hogyan változik az egyes iterációkhoz javasolt művelet.

Change model update frequency

A jutalom várakozási idejének módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a Reward várakozási idejét 10 percre. Ez határozza meg, hogy a modell mennyi ideig fog várni a javaslat elküldése után, hogy megkapja a javaslat jutalom-visszajelzését. A betanítás addig nem történik meg, amíg a jutalom várakozási ideje el nem telik.

Change reward wait time

Új Node.js-alkalmazás létrehozása

Egy konzolablakban (pl. cmd, PowerShell vagy Bash) hozzon létre egy új mappát az alkalmazásnak, majd navigáljon oda.

mkdir myapp && cd myapp

Futtassa a npm init -y parancsot egy package.json fájl létrehozásához.

npm init -y

Hozzon létre egy új Node.js-alkalmazást az előnyben részesített szerkesztőben vagy IDE-ben, sample.js és hozzon létre változókat az erőforrás végpontjához és előfizetési kulcsához.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott Personalizer-erőforrás sikeresen üzembe lett helyezve, kattintson az Ugrás az erőforrásra gombra a Következő lépések csoportban. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben fontolja meg a hitelesítő adatok biztonságos tárolását és elérését. Például az 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>';

Az NPM-csomagok telepítése gyorsútmutatóhoz

npm install readline-sync uuid axios --save

Objektummodell

Ha az egyes pontokhoz tartozó tartalom egyetlen legjobb elemét szeretné kérni, hozzon létre egy rankRequestet, majd küldjön egy post requestt a multislot/rank címre. A válasz ezután egy rankResponse-ra lesz elemezve.

Ha jutalompontot szeretne küldeni a Personalizernek, hozzon létre egy jutalmakat, majd küldjön egy utólagos kérést a multislot/events/{eventId}/reward címre.

A jutalompont meghatározása ebben a rövid útmutatóban triviális. Egy éles rendszerben annak meghatározása, hogy mi befolyásolja a jutalompontszámot , és hogy mennyi lehet egy összetett folyamat, amelyet idővel megváltoztathat. Ennek a tervezési döntésnek kell lennie a Personalizer-architektúra egyik elsődleges döntésének.

Kódpéldák

Ezek a kódrészletek bemutatják, hogyan végezheti el a következő feladatokat a NodeJS HTTP-kéréseinek elküldésével:

Alap URL-címek létrehozása

Ebben a szakaszban a Rangsor/ Reward URL-címeket az alap URL-címmel és a kérésfejlécekkel fogja létrehozni az erőforráskulcs használatával.

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

Tartalomválasztási lehetőségek lekérése műveletként

A műveletek azokat a tartalomválasztásokat jelölik, amelyek közül a Personalizer a legjobb tartalomelemet szeretné kiválasztani. Adja hozzá a következő metódusokat a szkripthez a műveletek és azok funkcióinak megjelenítéséhez.

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

Felhasználói beállítások lekérése a környezethez

Adja hozzá a következő metódusokat a szkripthez, hogy lekérje a felhasználó bemenetét a parancssorból a nap idejére és a felhasználó által használt eszköz típusára vonatkozóan. Ezek környezeti funkciókként lesznek használva.

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

Pontok lekérése

A pontok alkotják azt a lapot, amelyet a felhasználó használni fog. A Personalizer dönti el, hogy melyik művelet jelenjen meg a megadott pontok mindegyikében. A műveletek kizárhatók bizonyos pontokból, amelyek a ExcludeActionskövetkezőképpen jelennek meg: . BaselineAction Az a pont alapértelmezett művelete, amely a Personalizer használata nélkül lett volna megjelenítve.

Ez a rövid útmutató egyszerű pontfunkciókkal rendelkezik. Az éles rendszerekben a jellemzők meghatározása és kiértékelésenem triviális kérdés lehet.

function getSlots() {
    return [
        {
            'id': 'BigHeroPosition',
            'features': [
                {
                    'size': 'large',
                    'position': 'left',
                }
            ],
            'excludedActions': ['31-Inch-Monitor-771'],
            'baselineAction': 'Red-Polo-Shirt-432'
        },
        {
            'id': 'SmallSidebar',
            'features': [
                {
                    'size': 'small',
                    'position': 'right',
                }
            ],
            'excludedActions': ['Tennis-Racket-133'],
            'baselineAction': 'XBox-Series X-117'
        }
    ];
}

HTTP-kérések létrehozása

Adja hozzá ezeket a függvényeket a többhelyes rangsorolás és jutalomhívások személyre szabási végpontjára irányuló utólagos kérések küldéséhez.

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

Visszajelzés kérése a Személyre szabó döntésekhez

Adja hozzá a következő metódust a szkripthez. Jelezheti, hogy a Personalizer jó döntést hozott-e az egyes pontokhoz parancssori parancssoron keresztül.

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

A tanulási ciklus létrehozása

A Personalizer tanulási ciklus a Rang- és Reward-hívások ciklusa. Ebben a rövid útmutatóban a tartalom személyre szabása érdekében minden Rang-hívást egy Reward-hívás követ, amely tájékoztatja a Személyreszabót a szolgáltatás teljesítményéről.

A következő kód végighalad egy cikluson, amely során megkérdezi a felhasználót a beállításokról a parancssoron keresztül, és elküldi ezeket az információkat a Personalizernek, hogy az egyes pontokhoz a legjobb műveletet válassza ki, és a listából válassza ki az ügyfelet, majd küldjön egy jutalompontszámot a Personalizernek, jelezve, hogy a szolgáltatás milyen jól teljesített a kiválasztás során.

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

Tekintse meg közelebbről a rang- és jutalomhívásokat a következő szakaszokban.

Adja hozzá a következő módszereket, amelyek lekérik a tartalomválasztást, lekérik a felhasználói beállításokat a környezethez, lekérik a helyeket, HTTP-kéréseket hajtanak végre, a kódfájl futtatása előtt jutalmát kapják meg az egyes pontokhoz :

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

A legjobb művelet kérése

A Rangsor kérés teljesítéséhez a program megkéri a felhasználót, hogy hozzon létre tartalomválasztási lehetőségeket. A kérelem törzse tartalmazza a kontextust, a műveleteket és a megfelelő funkciókkal rendelkező tárolóhelyeket. A sendMultiSlotRank metódus a rankRequest függvényt veszi fel, és végrehajtja a többhelyes rangkérést.

Ez a rövid útmutató a nap és a felhasználói eszköz egyszerű környezeti funkcióit tartalmazza. Az éles rendszerekben a műveletek és funkciók meghatározása és értékelésenem triviális kérdés lehet.

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

Jutalom küldése

A Jutalomkérés jutalompontszámának lekéréséhez a program a parancssoron keresztül megkapja a felhasználó által kiválasztott pontot az egyes pontokhoz, numerikus értéket (jutalompontszámot) rendel a kijelöléshez, majd elküldi az egyes pontok egyedi eseményazonosítóját, pontazonosítóját és jutalompontszámát a sendMultiSlotReward metódusnak. Nem kell jutalomként definiálni az egyes pontokhoz.

Ez a rövid útmutató egy egyszerű számot rendel jutalompontként, nullát vagy 1-et. Éles rendszerekben annak meghatározása, hogy mikor és mit küldjön a Reward hívásnak, az adott igényektől függően nem triviális kérdés lehet.

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

A program futtatása

Futtassa az alkalmazást a Node.js-sel az alkalmazáskönyvtárból.

node sample.js

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

A rövid útmutató forráskódja elérhető.

Többhelyes fogalmi | minták

Előfeltételek

  • Azure-előfizetés – Ingyenes létrehozás
  • Python 3.x
  • Miután megkapta az Azure-előfizetését, hozzon létre egy Personalizer-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az üzembe helyezés után válassza az Ugrás az erőforrásra lehetőséget.
    • Az alkalmazás a Personalizer API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsára és végpontjára. Illessze be a kulcsot és a végpontot az alábbi kódba a rövid útmutató későbbi részében.
    • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Beállítás

A Personalizer-példány frissítése többhelyesre

Megjegyzés:

A többhelyes személyre szabás (előzetes verzió) hatással van a Personalizer szolgáltatás egyéb funkcióira. Ez a módosítás nem vonható vissza. A többhelyes személyre szabás engedélyezése előtt tekintse meg a többhelyes személyre szabás (előzetes verzió) című témakört.

  1. Tiltsa le az automatikus optimalizálást az Azure Portalon, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon, kapcsolja ki és mentse az automatikus optimalizálást.

Megjegyzés:

A többhelyes személyre szabás csak akkor működik, ha letiltja az automatikus optimalizálást. A többhelyes személyre szabás automatikus optimalizálása a jövőben támogatott lesz.

  1. Frissítse a Personalizert több pontra az Azure PortalOn, a Personalizer erőforrás Erőforrás-kezelés területén, a Modell és a tanulás beállításai lapon válassza a Tanulási beállítások exportálása lehetőséget. A letöltött json-fájl argumentummezője a --cb_explore_adf kezdetű lesz. Módosítsa a következőre: --ccb_explore_adf , és mentse a fájlt. A CB (környezetfüggő banditák) és a CCB (feltételes környezetfüggő banditák) azok az algoritmusok, amelyeket a Personalizer az egyhelyes és a többhelyes személyre szabáshoz használ. Az ADF (műveletfüggő funkciók) azt jelenti, hogy a műveletek jellemzőkkel vannak kifejezve/ azonosítva.

Learning settings before change

Learning settings after change

A portál ugyanazon lapján az Importálási tanulási beállítások területen keresse meg a nemrég módosított json-fájlt, és töltse fel. Ez frissíti a Personalizer-példányt "Multi Slot" Personalizer-ként, és mostantól támogatja a többhelyes Rang- és Reward-hívásokat.

A modellfrissítés gyakoriságának módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a modellfrissítés gyakoriságát 30 másodpercre. Ez a rövid időtartam gyorsan betaníthatja a modellt, így láthatja, hogyan változik az egyes iterációkhoz javasolt művelet.

Change model update frequency

A jutalom várakozási idejének módosítása

Az Azure Portalon nyissa meg a Personalizer-erőforrás konfigurációs oldalát, és módosítsa a Reward várakozási idejét 10 percre. Ez határozza meg, hogy a modell mennyi ideig fog várni a javaslat elküldése után, hogy megkapja a javaslat jutalom-visszajelzését. A betanítás addig nem történik meg, amíg a jutalom várakozási ideje el nem telik.

Change reward wait time

Új Python-alkalmazás létrehozása

Hozzon létre egy új Python-fájlt, és hozzon létre változókat az erőforrás végpontjához és előfizetési kulcsához.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott Personalizer-erőforrás sikeresen üzembe lett helyezve, kattintson az Ugrás az erőforrásra gombra a Következő lépések csoportban. A kulcsot és a végpontot az erőforrás kulcs- és végpontoldalán, az erőforrás-kezelés alatt találja.

Ne felejtse el eltávolítani a kulcsot a kódból, amikor elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben fontolja meg a hitelesítő adatok biztonságos tárolását és elérését. Például az 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>"

Objektummodell

Ha az egyes pontokhoz a tartalom egyetlen legjobb elemét szeretné kérni, hozzon létre egy rank_request, majd küldjön egy post requestt a multislot/rank címre. A válasz ezután egy rank_response lesz elemezve.

Ha jutalompontot szeretne küldeni a Personalizernek, hozzon létre egy jutalmakat, majd küldjön egy utólagos kérést a multislot/events/{eventId}/reward címre.

Ebben a rövid útmutatóban a jutalompont meghatározása triviális. Éles rendszerben annak meghatározása, hogy mi befolyásolja a jutalompontszámot , és hogy mennyi lehet egy összetett folyamat, amelyet idővel megváltoztathat. Ennek a tervezési döntésnek kell lennie a Personalizer-architektúra egyik elsődleges döntésének.

Kódpéldák

Ezek a kódrészletek bemutatják, hogyan végezheti el a következő feladatokat a Python http-kéréseinek küldésével:

Alap URL-címek létrehozása

Ebben a szakaszban a Rangsor/ Reward URL-címeket az alap URL-címmel és a kérésfejlécekkel fogja létrehozni az erőforráskulcs használatával.

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

Tartalomválasztási lehetőségek lekérése műveletként

A műveletek azokat a tartalomválasztásokat jelölik, amelyek közül a Personalizer a legjobb tartalomelemet szeretné kiválasztani. Adja hozzá a következő metódusokat a szkripthez a műveletek és azok funkcióinak megjelenítéséhez.

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

Felhasználói beállítások lekérése a környezethez

Adja hozzá a következő metódusokat a szkripthez, hogy lekérje a felhasználó bemenetét a parancssorból a nap idejére és a felhasználó által használt eszköz típusára vonatkozóan. Ezek környezeti funkciókként lesznek használva.

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

Pontok lekérése

A pontok alkotják azt a lapot, amelyet a felhasználó használni fog. A Personalizer dönti el, hogy melyik művelet jelenjen meg a megadott pontok mindegyikében. A műveletek kizárhatók bizonyos pontokból, amelyek a ExcludeActionskövetkezőképpen jelennek meg: . BaselineAction Az a pont alapértelmezett művelete, amely a Personalizer használata nélkül lett volna megjelenítve.

Ez a rövid útmutató egyszerű pontfunkciókkal rendelkezik. Az éles rendszerekben a jellemzők meghatározása és kiértékelésenem triviális kérdés lehet.

def get_slots():
    return [
        {
            "id": "BigHeroPosition",
            "features": [
                {
                    "size": "large",
                    "position": "left",
                }
            ],
            "excludedActions": ["31-Inch-Monitor-771"],
            "baselineAction": "Red-Polo-Shirt-432"
        },
        {
            "id": "SmallSidebar",
            "features": [
                {
                    "size": "small",
                    "position": "right",
                }
            ],
            "excludedActions": ["Tennis-Racket-133"],
            "baselineAction": "XBox-Series X-117"
        }
    ]

HTTP-kérések létrehozása

Adja hozzá ezeket a függvényeket a többhelyes rangsorolás és jutalomhívások személyre szabási végpontjára irányuló utólagos kérések küldéséhez.

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)

Visszajelzés kérése a Személyre szabó döntésekhez

Adja hozzá a következő metódust a szkripthez. Jelezheti, hogy a Personalizer jó döntést hozott-e az egyes pontokhoz parancssori parancssoron keresztül.

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

A tanulási ciklus létrehozása

A Personalizer tanulási ciklus a Rang- és Reward-hívások ciklusa. Ebben a rövid útmutatóban a tartalom személyre szabása érdekében minden Rang-hívást egy Reward-hívás követ, amely tájékoztatja a Személyreszabót a szolgáltatás teljesítményéről.

A következő kód végighalad egy cikluson, amely során megkérdezi a felhasználót a beállításokról a parancssoron keresztül, és elküldi ezeket az információkat a Personalizernek, hogy az egyes pontokhoz a legjobb műveletet válassza ki, és a listából válassza ki az ügyfelet, majd küldjön egy jutalompontszámot a Personalizernek, jelezve, hogy a szolgáltatás milyen jól teljesített a kiválasztás során.

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

Tekintse meg közelebbről a rang- és jutalomhívásokat a következő szakaszokban.

Adja hozzá a következő módszereket, amelyek lekérik a tartalomválasztást, lekérik a felhasználói beállításokat a környezethez, lekérik a helyeket, HTTP-kéréseket hajtanak végre, a kódfájl futtatása előtt jutalmát kapják meg az egyes pontokhoz :

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

A legjobb művelet kérése

A Rangsor kérés teljesítéséhez a program megkéri a felhasználót, hogy hozzon létre tartalomválasztási lehetőségeket. A kérelem törzse tartalmazza a kontextust, a műveleteket és a megfelelő funkciókkal rendelkező tárolóhelyeket. A send_multi_slot_rank metódus a rankRequest függvényt veszi fel, és végrehajtja a többhelyes rangkérést.

Ez a rövid útmutató a nap és a felhasználói eszköz egyszerű környezeti funkcióit tartalmazza. Az éles rendszerekben a műveletek és funkciók meghatározása és értékelésenem triviális kérdés lehet.

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)

Jutalom küldése

A Jutalomkérés jutalompontszámának lekéréséhez a program a parancssoron keresztül megkapja a felhasználó által kiválasztott pontot az egyes pontokhoz, numerikus értéket (jutalompontszámot) rendel a kijelöléshez, majd elküldi az egyes pontok egyedi eseményazonosítóját, pontazonosítóját és jutalompontszámát a send_multi_slot_reward metódusnak. Nem kell jutalomként definiálni az egyes pontokhoz.

Ez a rövid útmutató egy egyszerű számot rendel jutalompontként, nullát vagy 1-et. Éles rendszerekben annak meghatározása, hogy mikor és mit küldjön a Reward hívásnak, az adott igényektől függően nem triviális kérdés lehet.

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

A program futtatása

Futtassa az alkalmazást a Pythonnal az alkalmazáskönyvtárból.

python sample.py

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

A rövid útmutató forráskódja elérhető.

Következő lépések