Aan de slag met meerdere sites voor Azure AI Personalizer
Belangrijk
Vanaf 20 september 2023 kunt u geen nieuwe Personalizer-resources maken. De Personalizer-service wordt op 1 oktober 2026 buiten gebruik gesteld.
Met personalisatie met meerdere sleufs (preview) kunt u inhoud in webindelingen, carrousels en lijsten instellen waar meer dan één actie (zoals een product of stukje inhoud) wordt weergegeven aan uw gebruikers. Met Api's voor meerdere sleufs van Personalizer kunt u de AI-modellen in Personalizer laten weten welke gebruikerscontexten en producten bepaald gedrag stimuleren, rekening houdend met en leren van de plaatsing in uw gebruikersinterface. Personalizer kan bijvoorbeeld leren dat bepaalde producten of inhoud meer klikken als zijbalk of voettekst aandrijven dan als hoofdmarkering op een pagina.
In deze handleiding leert u hoe u de Personalizer-API's met meerdere sleuf gebruikt.
Referentiedocumentatiebibliotheek | broncodepakket | (NuGet) | Multi-slot conceptvoorbeelden |
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- De huidige versie van .NET Core.
- Zodra u uw Azure-abonnement hebt, maakt u een Personalizer-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, selecteert u Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Personalizer-API. Plak uw sleutel en eindpunt verderop in de onderstaande code in de quickstart.
- U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
Personalizer-exemplaar upgraden naar Multi-Slot
Notitie
Personalisatie met meerdere sleufs (preview) heeft invloed op andere functionaliteit van de Personalizer-service. Deze wijziging kan niet ongedaan worden gemaakt. Voordat u persoonlijke instellingen voor meerdere sleufs inschakelt, raadpleegt u Persoonlijke instellingen voor meerdere sleufs (preview).
- Schakel Automatische optimalisatie uitschakelen in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen automatische optimalisatie uit en sla deze op.
Notitie
Persoonlijke instellingen voor meerdere sites werken alleen als u Automatische optimalisatie uitschakelt. Automatische optimalisatie voor persoonlijke instellingen met meerdere sleufs wordt in de toekomst ondersteund.
- Werk Personalizer bij naar meerdere sleuf in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen de optie Leerinstellingen exporteren. Het argumentveld in het gedownloade json-bestand begint met --cb_explore_adf. Wijzig dit in --ccb_explore_adf en sla het bestand op. CB (contextuele bandieten) en CCB (voorwaardelijke contextuele bandieten) zijn respectievelijk de algoritmen die Personalizer gebruikt voor personalisatie met één sleuf en meerdere sleufs. ADF (actieafhankelijke functies) betekent dat de acties worden uitgedrukt/geïdentificeerd met functies.
Blader op hetzelfde tabblad in de portal onder Leerinstellingen importeren naar het onlangs gewijzigde JSON-bestand en upload het. Hiermee wordt uw Personalizer-exemplaar bijgewerkt naar een Personalizer met meerdere sleufs en wordt nu ondersteuning geboden voor Rank- en Reward-aanroepen met meerdere sleufs.
Bijwerkfrequentie voor model wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de frequentie van de modelupdate in 30 seconden. Met deze korte duur wordt het model snel getraind, zodat u kunt zien hoe de aanbevolen actie voor elke iteratie verandert.
De beloningswachttijd wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de wachttijd voor beloning in 10 minuten. Dit bepaalt hoe lang het model wacht na het verzenden van een aanbeveling, om de beloningsfeedback van die aanbeveling te ontvangen. Training vindt pas plaats als de wachttijd voor de beloning is verstreken.
Een nieuwe C#-toepassing maken
Maak een nieuwe .NET Core-toepassing in uw favoriete editor of IDE.
Gebruik in een consolevenster (zoals cmd, PowerShell of Bash) de opdracht dotnet new
om een nieuwe console-app te maken met de naam personalizer-quickstart
. Met deze opdracht maakt u een eenvoudig Hallo wereld-C#-project met één bronbestand: Program.cs
.
dotnet new console -n personalizer-quickstart
Wijzig uw map in de zojuist gemaakte app-map. U kunt de toepassing maken met:
dotnet build
De build-uitvoer mag geen waarschuwingen of fouten bevatten.
...
Build succeeded.
0 Warning(s)
0 Error(s)
...
De clientbibliotheek installeren
Installeer in de toepassingsmap de Personalizer-clientbibliotheek voor .NET met de volgende opdracht:
dotnet add package Azure.AI.Personalizer --version 2.0.0-beta.2
Open vanuit de projectmap bestand Program.cs
in uw favoriete editor of IDE. Voeg het volgende toe met behulp van de instructies:
using System;
using Azure;
using Azure.AI.Personalizer;
using System.Collections.Generic;
using System.Linq;
Objectmodel
De Personalizer-client is een PersonalizerClient-object dat wordt geverifieerd bij Azure met behulp van Azure.AzureKeyCredential, die uw sleutel bevat.
Als u het beste item van de inhoud voor elke site wilt vragen, maakt u een PersonalizerRankMultiSlotOptions-object en geeft u het vervolgens door aan PersonalizerClient.RankMultiSlot. De methode RankMultiSlot retourneert een PersonalizerMultiSlotRankResult.
Als u een beloningsscore naar Personalizer wilt verzenden, maakt u een PersonalizerRewardMultiSlotOptions en geeft u deze door aan de methode PersonalizerClient.RewardMultiSlot , samen met de bijbehorende gebeurtenis-id.
De beloningsscore in deze quickstart is triviaal. In een productiesysteem kan de bepaling wat van invloed is op de beloningsscore en in welke mate, een complex proces zijn, dat u in de loop van de tijd zou kunnen wijzigen. Deze ontwerpbeslissing moet een van de belangrijkste beslissingen in uw Personalizer-architectuur zijn.
Codevoorbeelden
Deze codefragmenten laten zien hoe u de volgende taken kunt uitvoeren met de Personalizer-clientbibliotheek voor .NET:
De client verifiëren
In deze sectie doet u twee dingen:
- Uw sleutel en eindpunt opgeven
- Personalizer-client maken
Voeg eerst de volgende regels toe aan de klasse Programma. Denk erom dat u de sleutel en het eindpunt van uw Personalizer-resource toevoegt.
Belangrijk
Ga naar de Azure Portal. Als de Personalizer-resource die u in de sectie Vereisten hebt gemaakt, succesvol is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Bijvoorbeeld 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>";
Vervolgens maakt u de RANK- en Reward-URL's.
static PersonalizerClient InitializePersonalizerClient(Uri url)
{
return new PersonalizerClient(url, new AzureKeyCredential(ResourceKey));
}
Inhoudskeuzes ophalen die worden weergegeven als acties
Acties vertegenwoordigen de inhoudskeuzes waaruit Personalizer het beste inhoudsitem moet selecteren. Voeg de volgende methoden aan de klasse Programma toe om de reeks acties en hun functies te representeren.
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;
}
Sites ophalen
Sites vormen de pagina waarmee de gebruiker communiceert. Personalizer bepaalt welke actie moet worden weergegeven in elk van de gedefinieerde sites. Acties kunnen worden uitgesloten van specifieke sites, weergegeven als ExcludeActions
. BaselineAction
is de standaardactie voor de site, die zou zijn weergegeven zonder het gebruik van Personalizer.
Deze quickstart bevat eenvoudige sitefuncties. In productiesystemen kan het bepalen en evalueren van functies een niet-triviale kwestie zijn.
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;
}
Gebruikersvoorkeuren voor context ophalen
Voeg de volgende methoden toe aan de klasse Program om de invoer van een gebruiker vanaf de opdrachtregel voor het tijdstip van de dag op te halen en het type apparaat waarop de gebruiker zich bevindt. Deze methoden worden gebruikt als contextfuncties.
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];
}
Beide methoden maken gebruik van de methode GetKey
om de vanaf de opdrachtregel selectie van de gebruiker te lezen.
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 }
};
}
De leerlus maken
De Personalizer-leerlus is een cyclus van RankMultiSlot - en RewardMultiSlot-aanroepen . In deze quickstart wordt elke Positie-oproep, voor het personaliseren van de inhoud, gevolgd door een Beloning-oproep om Personalizer te laten weten hoe goed de service is uitgevoerd.
De volgende code doorloopt een cyclus van het vragen van de gebruikers hun voorkeuren via de opdrachtregel, het verzenden van die informatie naar Personalizer om de beste actie voor elke site te selecteren, de selectie aan de klant te presenteren uit de lijst en vervolgens een beloningsscore te verzenden naar Personalizer die aangeeft hoe goed de service in de selectie heeft gedaan.
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);
}
Bekijk de Rank- en Reward-aanroepen in de volgende secties. Voeg de volgende methoden toe, waarmee de inhoudskeuzen worden getypen, sites worden getypen en aanvragen met meerdere sites worden verzonden voordat u het codebestand uitvoert:
GetActions
GetSlots
GetTimeOfDayForContext
GetDeviceForContext
GetKey
GetContext
De beste actie aanvragen
Als u de Positie-aanvraag wilt voltooien, wordt naar de voorkeuren van de gebruiker gevraagd om een Context
van de inhoudskeuzes te maken. De aanvraag bevat de context, acties en slots met hun respectieve functies en een unieke gebeurtenis-id, om een antwoord te ontvangen.
Deze quickstart bevat eenvoudige contextfuncties van het tijdstip van de dag en het apparaat van de gebruiker. In productiesystemen kan het bepalen en evalueren van acties en kenmerken een ingewikkelde zaak zijn.
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);
Een beloning verzenden
Als u de beloningsscore voor de Beloningsaanvraag wilt ophalen, krijgt het programma de selectie van de gebruiker voor elke site via de opdrachtregel, wijst u een numerieke waarde (beloningsscore) toe aan de selectie en verzendt u vervolgens de unieke gebeurtenis-id, slot-id en de beloningsscore voor elke site als de numerieke waarde naar de Reward-API. Er hoeft geen beloning te worden gedefinieerd voor elke site.
In deze quickstart wordt een eenvoudig getal, een 0 of een 1, aan een beloningsscore toegewezen. In productiesystemen kan het bepalen van wanneer en wat er naar de Beloning-oproep moet worden gezonden een ingewikkelde zaak zijn, afhankelijk van uw specifieke behoeften.
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.");
}
}
Het programma uitvoeren
Voer de toepassing uit vanuit uw toepassingsmap met de opdracht dotnet run
.
dotnet run
De broncode voor deze quickstart is beschikbaar.
Referentiedocumentatie conceptuele | | voorbeelden van meerdere sleuf
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- Installeer Node.js en NPM (geverifieerd met Node.js v14.16.0 en NPM 6.14.11).
- Zodra u uw Azure-abonnement hebt, maakt u een Personalizer-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, selecteert u Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Personalizer-API. Plak uw sleutel en eindpunt verderop in de onderstaande code in de quickstart.
- U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
Personalizer-exemplaar upgraden naar Multi-Slot
Notitie
Personalisatie met meerdere sleufs (preview) heeft invloed op andere functionaliteit van de Personalizer-service. Deze wijziging kan niet ongedaan worden gemaakt. Voordat u persoonlijke instellingen voor meerdere sleufs inschakelt, raadpleegt u Persoonlijke instellingen voor meerdere sleufs (preview).
- Schakel Automatische optimalisatie uitschakelen in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen automatische optimalisatie uit en sla deze op.
Notitie
Persoonlijke instellingen voor meerdere sites werken alleen als u Automatische optimalisatie uitschakelt. Automatische optimalisatie voor persoonlijke instellingen met meerdere sleufs wordt in de toekomst ondersteund.
- Werk Personalizer bij naar meerdere sleuf in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen de optie Leerinstellingen exporteren. Het argumentveld in het gedownloade json-bestand begint met --cb_explore_adf. Wijzig dit in --ccb_explore_adf en sla het bestand op. CB (contextuele bandieten) en CCB (voorwaardelijke contextuele bandieten) zijn respectievelijk de algoritmen die Personalizer gebruikt voor personalisatie met één sleuf en meerdere sleufs. ADF (actieafhankelijke functies) betekent dat de acties worden uitgedrukt/geïdentificeerd met functies.
Blader op hetzelfde tabblad in de portal onder Leerinstellingen importeren naar het onlangs gewijzigde JSON-bestand en upload het. Hiermee wordt uw Personalizer-exemplaar bijgewerkt naar een Personalizer met meerdere sleufs en wordt nu ondersteuning geboden voor Rank- en Reward-aanroepen met meerdere sleufs.
Bijwerkfrequentie voor model wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de frequentie van de modelupdate in 30 seconden. Met deze korte duur wordt het model snel getraind, zodat u kunt zien hoe de aanbevolen actie voor elke iteratie verandert.
De beloningswachttijd wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de wachttijd voor beloning in 10 minuten. Dit bepaalt hoe lang het model wacht na het verzenden van een aanbeveling, om de beloningsfeedback van die aanbeveling te ontvangen. Training vindt pas plaats als de wachttijd voor de beloning is verstreken.
Een nieuwe Node.js-toepassing maken
Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor de app, en navigeer naar deze map.
mkdir myapp && cd myapp
Voer de opdracht npm init -y
uit om een bestand package.json
te maken.
npm init -y
Maak een nieuwe Node.js-toepassing in uw voorkeurseditor of IDE met de naam sample.js
en maak variabelen voor het eindpunt en de abonnementssleutel van uw resource.
Belangrijk
Ga naar de Azure Portal. Als de Personalizer-resource die u in de sectie Vereisten hebt gemaakt, succesvol is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Bijvoorbeeld 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>';
De NPM-pakketten installeren voor quickstart
npm install readline-sync uuid axios --save
Objectmodel
Als u het beste item van de inhoud voor elke site wilt vragen, maakt u een rankRequest en verzendt u vervolgens een postaanvraag naar multislot/rank. Het antwoord wordt vervolgens geparseerd in een rankResponse.
Als u een beloningsscore naar Personalizer wilt verzenden, maakt u een beloning en verzendt u vervolgens een postaanvraag naar multislot/events/{eventId}/reward.
Het bepalen van de beloningsscore in deze quickstart is triviaal. In een productiesysteem kan de bepaling wat van invloed is op de beloningsscore en in welke mate, een complex proces zijn, dat u in de loop van de tijd zou kunnen wijzigen. Deze ontwerpbeslissing moet een van de belangrijkste beslissingen in uw Personalizer-architectuur zijn.
Codevoorbeelden
Deze codefragmenten laten zien hoe u de volgende taken kunt uitvoeren door HTTP-aanvragen voor NodeJS te verzenden:
Basis-URL's maken
In deze sectie maakt u de Rank/Reward-URL's met behulp van de basis-URL en de aanvraagheaders met behulp van de resourcesleutel.
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'
};
Inhoudskeuzes ophalen die worden weergegeven als acties
Acties vertegenwoordigen de inhoudskeuzes waaruit Personalizer het beste inhoudsitem moet selecteren. Voeg de volgende methoden toe aan het script om de set acties en de bijbehorende functies weer te geven.
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'
}
]
}
];
}
Gebruikersvoorkeuren voor context ophalen
Voeg de volgende methoden toe aan het script om de invoer van een gebruiker op te halen vanaf de opdrachtregel voor het tijdstip van de dag en het type apparaat waarop de gebruiker zich bevindt. Deze worden als contextkenmerken gebruikt.
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
}
];
}
Sites ophalen
Sites vormen de pagina waarmee de gebruiker communiceert. Personalizer bepaalt welke actie moet worden weergegeven in elk van de gedefinieerde sites. Acties kunnen worden uitgesloten van specifieke sites, weergegeven als ExcludeActions
. BaselineAction
is de standaardactie voor de sleuf die zonder het gebruik van Personalizer zou zijn weergegeven.
Deze quickstart bevat eenvoudige sitefuncties. In productiesystemen kan het bepalen en evalueren van functies een niet-triviale kwestie zijn.
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-aanvragen maken
Voeg deze functies toe om postaanvragen te verzenden naar het Personalizer-eindpunt voor rank- en reward-aanroepen met meerdere sleufs.
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;
}
}
Feedback krijgen voor Personalizer-beslissingen
Voeg de volgende methode toe aan het script. U geeft aan of Personalizer een goede beslissing heeft genomen voor elke site via de opdrachtregelprompt.
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;
}
De leerlus maken
De Personalizer-leerlus is een cyclus van Positie- en Beloning-aanroepen. In deze quickstart wordt elke Positie-oproep, voor het personaliseren van de inhoud, gevolgd door een Beloning-oproep om Personalizer te laten weten hoe goed de service is uitgevoerd.
De volgende code doorloopt een cyclus van het vragen van de gebruikers hun voorkeuren via de opdrachtregel, het verzenden van die informatie naar Personalizer om de beste actie voor elke site te selecteren, de selectie aan de klant te presenteren uit de lijst en vervolgens een beloningsscore te verzenden naar Personalizer die aangeeft hoe goed de service in de selectie heeft gedaan.
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);
})()
Bekijk de Rank- en Reward-aanroepen in de volgende secties.
Voeg de volgende methoden toe, die de inhoudskeuzen ophalen, gebruikersvoorkeuren voor context ophalen, de sites ophalen, HTTP-aanvragen maken, beloning krijgen voor elke site voordat u het codebestand uitvoert:
- getActions
- getContextFeatures
- getSlots
- sendRank
- sendReward
- getRewardForSlot
De beste actie aanvragen
Als u de Positie-aanvraag wilt voltooien, wordt naar de voorkeuren van de gebruiker gevraagd om inhoudskeuzes te maken. De hoofdtekst van de aanvraag bevat de context, acties en sleuven met hun respectieve functies. De sendMultiSlotRank
methode neemt een rankRequest in en voert de rank-aanvraag met meerdere sites uit.
Deze quickstart bevat eenvoudige contextfuncties van het tijdstip van de dag en het apparaat van de gebruiker. In productiesystemen kan het bepalen en evalueren van acties en kenmerken een ingewikkelde zaak zijn.
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;
}
Een beloning verzenden
Als u de beloningsscore voor de Beloningsaanvraag wilt ophalen, haalt het programma de selectie van de gebruiker op voor elke site via de opdrachtregel, wijst u een numerieke waarde (beloningsscore) toe aan de selectie en verzendt u vervolgens de unieke gebeurtenis-id, slot-id en de beloningsscore voor elke site naar de sendMultiSlotReward
methode. Er hoeft geen beloning te worden gedefinieerd voor elke site.
In deze quickstart wordt een eenvoudig getal, een 0 of een 1, aan een beloningsscore toegewezen. In productiesystemen kan het bepalen van wanneer en wat er naar de Beloning-oproep moet worden gezonden een ingewikkelde zaak zijn, afhankelijk van uw specifieke behoeften.
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);
Het programma uitvoeren
Voer de toepassing uit met de Node.js vanuit uw toepassingsmap.
node sample.js
De broncode voor deze quickstart is beschikbaar.
Conceptuele | voorbeelden met meerdere sleuf
Vereisten
- Azure-abonnement: Krijg een gratis abonnement
- Python 3.x
- Zodra u uw Azure-abonnement hebt, maakt u een Personalizer-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, selecteert u Ga naar resource.
- U hebt de sleutel en het eindpunt nodig van de resource die u maakt, om de toepassing te verbinden met de Personalizer-API. Plak uw sleutel en eindpunt verderop in de onderstaande code in de quickstart.
- U kunt de gratis prijscategorie (
F0
) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
Instellen
Personalizer-exemplaar upgraden naar Multi-Slot
Notitie
Personalisatie met meerdere sleufs (preview) heeft invloed op andere functionaliteit van de Personalizer-service. Deze wijziging kan niet ongedaan worden gemaakt. Voordat u persoonlijke instellingen voor meerdere sleufs inschakelt, raadpleegt u Persoonlijke instellingen voor meerdere sleufs (preview).
- Schakel Automatische optimalisatie uitschakelen in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen automatische optimalisatie uit en sla deze op.
Notitie
Persoonlijke instellingen voor meerdere sites werken alleen als u Automatische optimalisatie uitschakelt. Automatische optimalisatie voor persoonlijke instellingen met meerdere sleufs wordt in de toekomst ondersteund.
- Werk Personalizer bij naar meerdere sleuf in Azure Portal, in de Personalizer-resource, onder Resourcebeheer, op de pagina Model- en leerinstellingen de optie Leerinstellingen exporteren. Het argumentveld in het gedownloade json-bestand begint met --cb_explore_adf. Wijzig dit in --ccb_explore_adf en sla het bestand op. CB (contextuele bandieten) en CCB (voorwaardelijke contextuele bandieten) zijn respectievelijk de algoritmen die Personalizer gebruikt voor personalisatie met één sleuf en meerdere sleufs. ADF (actieafhankelijke functies) betekent dat de acties worden uitgedrukt/geïdentificeerd met functies.
Blader op hetzelfde tabblad in de portal onder Leerinstellingen importeren naar het onlangs gewijzigde JSON-bestand en upload het. Hiermee wordt uw Personalizer-exemplaar bijgewerkt naar een Personalizer met meerdere sleufs en wordt nu ondersteuning geboden voor Rank- en Reward-aanroepen met meerdere sleufs.
Bijwerkfrequentie voor model wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de frequentie van de modelupdate in 30 seconden. Met deze korte duur wordt het model snel getraind, zodat u kunt zien hoe de aanbevolen actie voor elke iteratie verandert.
De beloningswachttijd wijzigen
Ga in Azure Portal naar de configuratiepagina van uw Personalizer-resource en wijzig de wachttijd voor beloning in 10 minuten. Dit bepaalt hoe lang het model wacht na het verzenden van een aanbeveling, om de beloningsfeedback van die aanbeveling te ontvangen. Training vindt pas plaats als de wachttijd voor de beloning is verstreken.
Een nieuwe Python-toepassing maken
Maak een nieuw Python-bestand en maak variabelen voor het eindpunt en de abonnementssleutel van uw resource.
Belangrijk
Ga naar de Azure Portal. Als de Personalizer-resource die u in de sectie Vereisten hebt gemaakt, succesvol is geïmplementeerd, klikt u op de knop Ga naar resource onder Volgende stappen. U vindt uw sleutel en eindpunt op de pagina Sleutel en eindpunt van de resource, onder Resourcebeheer.
Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Overweeg om voor productie een veilige manier te gebruiken voor het opslaan en openen van uw referenties. Bijvoorbeeld 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>"
Objectmodel
Als u het beste item van de inhoud voor elke site wilt vragen, maakt u een rank_request en verzendt u vervolgens een postaanvraag naar multislot/rang. Het antwoord wordt vervolgens geparseerd in een rank_response.
Als u een beloningsscore naar Personalizer wilt verzenden, maakt u een beloning en verzendt u vervolgens een postaanvraag naar multislot/events/{eventId}/reward.
In deze quickstart is het bepalen van de beloningsscore triviaal. In een productiesysteem bepaalt u wat van invloed is op de beloningsscore en hoeveel kan een complex proces zijn dat u in de loop van de tijd kunt wijzigen. Deze ontwerpbeslissing moet een van de belangrijkste beslissingen in uw Personalizer-architectuur zijn.
Codevoorbeelden
Deze codefragmenten laten zien hoe u de volgende taken kunt uitvoeren door HTTP-aanvragen voor Python te verzenden:
Basis-URL's maken
In deze sectie maakt u de Rank/Reward-URL's met behulp van de basis-URL en de aanvraagheaders met behulp van de resourcesleutel.
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'
}
Inhoudskeuzes ophalen die worden weergegeven als acties
Acties vertegenwoordigen de inhoudskeuzes waaruit Personalizer het beste inhoudsitem moet selecteren. Voeg de volgende methoden toe aan het script om de set acties en de bijbehorende functies weer te geven.
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"
}
]
}
]
Gebruikersvoorkeuren voor context ophalen
Voeg de volgende methoden toe aan het script om de invoer van een gebruiker op te halen vanaf de opdrachtregel voor het tijdstip van de dag en het type apparaat waarop de gebruiker zich bevindt. Deze worden als contextkenmerken gebruikt.
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}
]
Sites ophalen
Sites vormen de pagina waarmee de gebruiker communiceert. Personalizer bepaalt welke actie moet worden weergegeven in elk van de gedefinieerde sites. Acties kunnen worden uitgesloten van specifieke sites, weergegeven als ExcludeActions
. BaselineAction
is de standaardactie voor de sleuf die zonder het gebruik van Personalizer zou zijn weergegeven.
Deze quickstart bevat eenvoudige sitefuncties. In productiesystemen kan het bepalen en evalueren van functies een niet-triviale kwestie zijn.
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-aanvragen maken
Voeg deze functies toe om postaanvragen te verzenden naar het Personalizer-eindpunt voor rank- en reward-aanroepen met meerdere sleufs.
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)
Feedback krijgen voor Personalizer-beslissingen
Voeg de volgende methode toe aan het script. U geeft aan of Personalizer een goede beslissing heeft genomen voor elke site via de opdrachtregelprompt.
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
De leerlus maken
De Personalizer-leerlus is een cyclus van Positie- en Beloning-aanroepen. In deze quickstart wordt elke Positie-oproep, voor het personaliseren van de inhoud, gevolgd door een Beloning-oproep om Personalizer te laten weten hoe goed de service is uitgevoerd.
De volgende code doorloopt een cyclus van het vragen van de gebruikers hun voorkeuren via de opdrachtregel, het verzenden van die informatie naar Personalizer om de beste actie voor elke site te selecteren, de selectie aan de klant te presenteren uit de lijst en vervolgens een beloningsscore te verzenden naar Personalizer die aangeeft hoe goed de service in de selectie heeft gedaan.
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
Bekijk de Rank- en Reward-aanroepen in de volgende secties.
Voeg de volgende methoden toe, die de inhoudskeuzen ophalen, gebruikersvoorkeuren voor context ophalen, de sites ophalen, HTTP-aanvragen maken, beloning krijgen voor elke site voordat u het codebestand uitvoert:
- get_actions
- get_context_features
- get_slots
- send_rank
- send_reward
- get_reward_for_dsot
De beste actie aanvragen
Als u de Positie-aanvraag wilt voltooien, wordt naar de voorkeuren van de gebruiker gevraagd om inhoudskeuzes te maken. De hoofdtekst van de aanvraag bevat de context, acties en sleuven met hun respectieve functies. De send_multi_slot_rank
methode neemt een rankRequest in en voert de rank-aanvraag met meerdere sites uit.
Deze quickstart bevat eenvoudige contextfuncties van het tijdstip van de dag en het apparaat van de gebruiker. In productiesystemen kan het bepalen en evalueren van acties en kenmerken een ingewikkelde zaak zijn.
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)
Een beloning verzenden
Als u de beloningsscore voor de Beloningsaanvraag wilt ophalen, haalt het programma de selectie van de gebruiker op voor elke site via de opdrachtregel, wijst u een numerieke waarde (beloningsscore) toe aan de selectie en verzendt u vervolgens de unieke gebeurtenis-id, slot-id en de beloningsscore voor elke site naar de send_multi_slot_reward
methode. Er hoeft geen beloning te worden gedefinieerd voor elke site.
In deze quickstart wordt een eenvoudig getal, een 0 of een 1, aan een beloningsscore toegewezen. In productiesystemen kan het bepalen van wanneer en wat er naar de Beloning-oproep moet worden gezonden een ingewikkelde zaak zijn, afhankelijk van uw specifieke behoeften.
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'])
Het programma uitvoeren
Voer de toepassing uit met Python vanuit uw toepassingsmap.
python sample.py
De broncode voor deze quickstart is beschikbaar.