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
Feljegyzé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.
- 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.
Feljegyzé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.
- 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.
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.
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.
Ú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-quickstart
ellátott konzolalkalmazást. Ez a parancs létrehoz egy egyszerű "„Helló világ!” alkalmazás" C# projektet 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 ExcludeActions
kö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ése nem 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ése nem 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
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 és az NPM-et (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
Feljegyzé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.
- 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.
Feljegyzé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.
- 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.
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.
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.
Ú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 ExcludeActions
kö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ése nem 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ése nem 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 az alkalmazáskönyvtárból származó Node.js.
node sample.js
A rövid útmutató forráskódja elérhető.
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
Feljegyzé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.
- 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.
Feljegyzé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.
- 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.
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.
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.
Ú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 ExcludeActions
kö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ése nem 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ése nem 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
A rövid útmutató forráskódja elérhető.