Quickstart: Personalizer-clientbibliotheek

Belangrijk

Vanaf 20 september 2023 kunt u geen nieuwe Personalizer-resources maken. De Personalizer-service wordt op 1 oktober 2026 buiten gebruik gesteld.

Ga aan de slag met de Azure AI Personalizer-clientbibliotheken om een eenvoudige leerlus in te stellen. Een leerlus is een systeem van beslissingen en feedback: een toepassing vraagt een beslissingsclassificatie van de service aan en gebruikt vervolgens de beste keuze en berekent een beloningsscore van het resultaat. De beloningsscore wordt geretourneerd aan de service. Personalizer maakt na verloop van tijd gebruik van AI-algoritmen om betere beslissingen te nemen voor elke bepaalde context. Volg deze stappen om een voorbeeldtoepassing in te stellen.

Voorbeeldscenario

In deze quickstart wil een supermarkt e-retailer de omzet verhogen door relevante en gepersonaliseerde producten weer te geven aan elke klant op zijn website. Op de hoofdpagina bevindt zich een sectie Aanbevolen product waarin een bereid maaltijdproduct wordt weergegeven aan potentiële klanten. De e-retailer wil bepalen hoe het juiste product aan de juiste klant moet worden getoond om de kans op een aankoop te maximaliseren.

De Personalizer-service lost dit probleem op op een geautomatiseerde, schaalbare en aanpasbare manier op met behulp van versterking leren. U leert hoe u acties en hun functies, contextfuncties en beloningsscores maakt. U gebruikt de Personalizer-clientbibliotheek om aanroepen te doen naar de Rank- en Reward-API's.

Referentiedocumentatiebibliotheek | broncodepakket | (NuGet) | .NET-codevoorbeeld

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. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
    • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

Modelconfiguratie

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.

Change model update frequency

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.

Change reward wait time

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. Maak de toepassing vervolgens 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 Microsoft.Azure.CognitiveServices.Personalizer --version 1.0.0

Fooi

Als u de Visual Studio-IDE, gebruikt, is de clientbibliotheek beschikbaar als downloadbaar NuGet-pakket.

Codeblok 1: Voorbeeldgegevens genereren

Personalizer is bedoeld om te worden uitgevoerd op toepassingen die realtime gegevens ontvangen en interpreteren. In deze quickstart gebruikt u voorbeeldcode om imaginaire klantacties te genereren op een boodschappenwebsite. Het volgende codeblok definieert drie belangrijke methoden: GetActions, GetContext en GetRewardScore.

  • GetActions retourneert een lijst met de keuzes die de boodschappenwebsite moet rangschikken. In dit voorbeeld zijn de acties maaltijdproducten. Elke actiekeuze heeft details (functies) die later van invloed kunnen zijn op gebruikersgedrag. Acties worden gebruikt als invoer voor de Rank-API

  • GetContext retourneert een gesimuleerd klantbezoek. Het selecteert gerandomiseerde details (contextfuncties) zoals welke klant aanwezig is en op welk tijdstip het bezoek plaatsvindt. Over het algemeen vertegenwoordigt een context de huidige status van uw toepassing, systeem, omgeving of gebruiker. Het contextobject wordt gebruikt als invoer voor de Rank-API.

    De contextfuncties in deze quickstart zijn simplistisch. In een echt productiesysteem is het ontwerpen van uw functies en het evalueren van hun effectiviteit echter belangrijk. Raadpleeg de gekoppelde documentatie voor hulp.

  • GetRewardScore retourneert een score tussen nul en één die het succes van een klantinteractie vertegenwoordigt. Er wordt gebruikgemaakt van eenvoudige logica om te bepalen hoe verschillende contexten reageren op verschillende actieopties. Een bepaalde gebruiker geeft bijvoorbeeld altijd een 1.0 voor vegetarische en veganistische producten en een 0,0 voor andere producten. In een echt scenario leert Personalizer gebruikersvoorkeuren van de gegevens die worden verzonden in Rank- en Reward-API-aanroepen. U definieert deze niet expliciet zoals in de voorbeeldcode.

    In een echt productiesysteem moet de beloningsscore worden ontworpen om te voldoen aan uw bedrijfsdoelstellingen en KPI's. Het bepalen hoe de beloningsmetriek moet worden berekend, kan enige experimenten vereisen.

    In de onderstaande code worden de voorkeuren en reacties van de gebruikers op de acties vastgelegd als een reeks voorwaardelijke instructies en wordt verklarende tekst opgenomen in de code voor demonstratiedoeleinden.

  1. Zoek uw sleutel en eindpunt.

    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.

  2. Open Program.cs in een teksteditor of IDE en plak de volgende code.

    using Microsoft.Azure.CognitiveServices.Personalizer;
    using Microsoft.Azure.CognitiveServices.Personalizer.Models;
    
    class Program
    {
        private static readonly string ApiKey = "REPLACE_WITH_YOUR_PERSONALIZER_KEY";
        private static readonly string ServiceEndpoint = "REPLACE_WITH_YOUR_ENDPOINT_URL";
    
        static PersonalizerClient InitializePersonalizerClient(string url)
        {
            PersonalizerClient client = new PersonalizerClient(
                new ApiKeyServiceClientCredentials(ApiKey))
            { Endpoint = url };
    
            return client;
        }
    
        static Dictionary<string, ActionFeatures> actions = new Dictionary<string, ActionFeatures>
        {
        {"pasta", new ActionFeatures(
                        new BrandInfo(company: "pasta_inc"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "Italian",
                            price: 12),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: false,
                            highProtein: false,
                            vegetarian: false,
                            lowFat: true,
                            lowSodium: true))},
        {"bbq", new ActionFeatures(
                        new BrandInfo(company: "ambisco"),
                        new ItemAttributes(
                            quantity: 2,
                            category: "bbq",
                            price: 20),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: true,
                            highProtein: true,
                            vegetarian: false,
                            lowFat: false,
                            lowSodium: false))},
        {"bao", new ActionFeatures(
                        new BrandInfo(company: "bao_and_co"),
                        new ItemAttributes(
                            quantity: 4,
                            category: "Chinese",
                            price: 8),
                        new DietaryAttributes(
                            vegan: false,
                            lowCarb: true,
                            highProtein: true,
                            vegetarian: false,
                            lowFat: true,
                            lowSodium: false))},
        {"hummus", new ActionFeatures(
                        new BrandInfo(company: "garbanzo_inc"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "Breakfast",
                            price: 5),
                        new DietaryAttributes(
                            vegan: true,
                            lowCarb: false,
                            highProtein: true,
                            vegetarian: true,
                            lowFat: false,
                            lowSodium: false))},
        {"veg_platter", new ActionFeatures(
                        new BrandInfo(company: "farm_fresh"),
                        new ItemAttributes(
                            quantity: 1,
                            category: "produce",
                            price: 7),
                        new DietaryAttributes(
                            vegan: true,
                            lowCarb: true,
                            highProtein: false,
                            vegetarian: true,
                            lowFat: true,
                            lowSodium: true ))},
    };
    
        static IList<RankableAction> GetActions()
        {
            IList<RankableAction> rankableActions = new List<RankableAction>();
            foreach (var action in actions)
            {
                rankableActions.Add(new RankableAction
                {
                    Id = action.Key,
                    Features = new List<object>() { action.Value }
                });
            }
    
            return rankableActions;
        }
    
        public class BrandInfo
        {
            public string Company { get; set; }
            public BrandInfo(string company)
            {
                Company = company;
            }
        }
    
        public class ItemAttributes
        {
            public int Quantity { get; set; }
            public string Category { get; set; }
            public double Price { get; set; }
            public ItemAttributes(int quantity, string category, double price)
            {
                Quantity = quantity;
                Category = category;
                Price = price;
            }
        }
    
        public class DietaryAttributes
        {
            public bool Vegan { get; set; }
            public bool LowCarb { get; set; }
            public bool HighProtein { get; set; }
            public bool Vegetarian { get; set; }
            public bool LowFat { get; set; }
            public bool LowSodium { get; set; }
            public DietaryAttributes(bool vegan, bool lowCarb, bool highProtein, bool vegetarian, bool lowFat, bool lowSodium)
            {
                Vegan = vegan;
                LowCarb = lowCarb;
                HighProtein = highProtein;
                Vegetarian = vegetarian;
                LowFat = lowFat;
                LowSodium = lowSodium;
    
            }
        }
    
        public class ActionFeatures
        {
            public BrandInfo BrandInfo { get; set; }
            public ItemAttributes ItemAttributes { get; set; }
            public DietaryAttributes DietaryAttributes { get; set; }
            public ActionFeatures(BrandInfo brandInfo, ItemAttributes itemAttributes, DietaryAttributes dietaryAttributes)
            {
                BrandInfo = brandInfo;
                ItemAttributes = itemAttributes;
                DietaryAttributes = dietaryAttributes;
            }
        }
    
        public static Context GetContext()
        {
            return new Context(
                    user: GetRandomUser(),
                    timeOfDay: GetRandomTimeOfDay(),
                    location: GetRandomLocation(),
                    appType: GetRandomAppType());
        }
    
        static string[] timesOfDay = new string[] { "morning", "afternoon", "evening" };
    
        static string[] locations = new string[] { "west", "east", "midwest" };
    
        static string[] appTypes = new string[] { "edge", "safari", "edge_mobile", "mobile_app" };
    
        static IList<UserProfile> users = new List<UserProfile>
    {
        new UserProfile(
            name: "Bill",
            dietaryPreferences: new Dictionary<string, bool> { { "low_carb", true } },
            avgOrderPrice: "0-20"),
        new UserProfile(
            name: "Satya",
            dietaryPreferences: new Dictionary<string, bool> { { "low_sodium", true} },
            avgOrderPrice: "201+"),
        new UserProfile(
            name: "Amy",
            dietaryPreferences: new Dictionary<string, bool> { { "vegan", true }, { "vegetarian", true } },
            avgOrderPrice: "21-50")
    };
    
        static string GetRandomTimeOfDay()
        {
            var random = new Random();
            var timeOfDayIndex = random.Next(timesOfDay.Length);
            Console.WriteLine($"TimeOfDay: {timesOfDay[timeOfDayIndex]}");
            return timesOfDay[timeOfDayIndex];
        }
    
        static string GetRandomLocation()
        {
            var random = new Random();
            var locationIndex = random.Next(locations.Length);
            Console.WriteLine($"Location: {locations[locationIndex]}");
            return locations[locationIndex];
        }
    
        static string GetRandomAppType()
        {
            var random = new Random();
            var appIndex = random.Next(appTypes.Length);
            Console.WriteLine($"AppType: {appTypes[appIndex]}");
            return appTypes[appIndex];
        }
    
        static UserProfile GetRandomUser()
        {
            var random = new Random();
            var userIndex = random.Next(users.Count);
            Console.WriteLine($"\nUser: {users[userIndex].Name}");
            return users[userIndex];
        }
    
        public class UserProfile
        {
            // Mark name as non serializable so that it is not part of the context features
            [NonSerialized()]
            public string Name;
            public Dictionary<string, bool> DietaryPreferences { get; set; }
            public string AvgOrderPrice { get; set; }
    
            public UserProfile(string name, Dictionary<string, bool> dietaryPreferences, string avgOrderPrice)
            {
                Name = name;
                DietaryPreferences = dietaryPreferences;
                AvgOrderPrice = avgOrderPrice;
            }
        }
    
        public class Context
        {
            public UserProfile User { get; set; }
            public string TimeOfDay { get; set; }
            public string Location { get; set; }
            public string AppType { get; set; }
    
            public Context(UserProfile user, string timeOfDay, string location, string appType)
            {
                User = user;
                TimeOfDay = timeOfDay;
                Location = location;
                AppType = appType;
            }
        }
        public static float GetRewardScore(Context context, string actionId)
        {
            float rewardScore = 0.0f;
            string userName = context.User.Name;
            ActionFeatures actionFeatures = actions[actionId];
            if (userName.Equals("Bill"))
            {
                if (actionFeatures.ItemAttributes.Price < 10 && !context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill likes to be economical when he's not in the midwest visiting his friend Warren. He bought {actionId} because it was below a price of $10.");
                }
                else if (actionFeatures.DietaryAttributes.LowCarb && context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill is visiting his friend Warren in the midwest. There he's willing to spend more on food as long as it's low carb, so Bill bought {actionId}.");
                }
                else if (actionFeatures.ItemAttributes.Price >= 10 && !context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill didn't buy {actionId} because the price was too high when not visting his friend Warren in the midwest.");
                }
                else if (actionFeatures.DietaryAttributes.LowCarb && context.Location.Equals("midwest"))
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nBill didn't buy {actionId} because it's not low-carb, and he's in the midwest visitng his friend Warren.");
                }
            }
            else if (userName.Equals("Satya"))
            {
                if (actionFeatures.DietaryAttributes.LowSodium)
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nSatya is health conscious, so he bought {actionId} since it's low in sodium.");
                }
                else
                {
                    Console.WriteLine($"\nSatya did not buy {actionId} because it's not low sodium.");
                }
            }
            else if (userName.Equals("Amy"))
            {
                if (actionFeatures.DietaryAttributes.Vegan || actionFeatures.DietaryAttributes.Vegetarian)
                {
                    rewardScore = 1.0f;
                    Console.WriteLine($"\nAmy likes to eat plant-based foods, so she bought {actionId} because it's vegan or vegetarian friendly.");
                }
                else
                {
                    Console.WriteLine($"\nAmy did not buy {actionId} because it's not vegan or vegetarian.");
                }
            }
            return rewardScore;
        }
        // ...
    
  3. Plak uw sleutel en eindpunt in de code waar aangegeven. Uw eindpunt heeft het formulier https://<your_resource_name>.cognitiveservices.azure.com/.

    Belangrijk

    Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het beveiligingsartikel over Azure AI-services voor meer informatie.

Codeblok 2: De leerlus herhalen

Het volgende codeblok definieert de hoofdmethode en sluit het script af. Er wordt een iteratie van een leerlus uitgevoerd, waarin een context wordt gegenereerd (inclusief een klant), een classificatie van acties in die context aanvraagt met behulp van de Rank-API, de beloningsscore berekent en die score teruggeeft aan de Personalizer-service met behulp van de Reward-API. Bij elke stap worden relevante informatie naar de console afgedrukt.

In dit voorbeeld wordt elke Rank-aanroep uitgevoerd om te bepalen welk product moet worden weergegeven in de sectie Aanbevolen product. Vervolgens geeft de beloningsaanroep aan of het aanbevolen product al dan niet is gekocht door de gebruiker. Rewards worden gekoppeld aan hun beslissingen via een gemeenschappelijke EventId waarde.

    static void Main(string[] args)
    {
        int iteration = 1;
        bool runLoop = true;

        // Get the actions list to choose from personalizer with their features.
        IList<RankableAction> actions = GetActions();

        // Initialize Personalizer client.
        PersonalizerClient client = InitializePersonalizerClient(ServiceEndpoint);

        do
        {
            Console.WriteLine("\nIteration: " + iteration++);

            // Get context information.
            Context context = GetContext();

            // Create current context from user specified data.
            IList<object> currentContext = new List<object>() {
            context
        };

            // Generate an ID to associate with the request.
            string eventId = Guid.NewGuid().ToString();

            // Rank the actions
            var request = new RankRequest(actions: actions, contextFeatures: currentContext, eventId: eventId);
            RankResponse response = client.Rank(request);

            Console.WriteLine($"\nPersonalizer service thinks {context.User.Name} would like to have: {response.RewardActionId}.");

            float reward = GetRewardScore(context, response.RewardActionId);

            // Send the reward for the action based on user response.
            client.Reward(response.EventId, new RewardRequest(reward));

            Console.WriteLine("\nPress q to break, any other key to continue:");
            runLoop = !(GetKey() == "Q");

        } while (runLoop);
    }

        private static string GetKey()
    {
        return Console.ReadKey().Key.ToString().Last().ToString().ToUpper();
    }

}

Het programma uitvoeren

Voer de toepassing uit vanuit uw toepassingsmap met de opdracht dotnet dotnet run.

dotnet run

Tijdens de eerste iteratie raadt Personalizer een willekeurige actie aan, omdat deze nog geen training heeft uitgevoerd. U kunt desgewenst meer iteraties uitvoeren. Na ongeveer 10 minuten begint de service verbeteringen in de aanbevelingen weer te geven.

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

Veel gebeurtenissen genereren voor analyse (optioneel)

U kunt eenvoudig 5000 gebeurtenissen genereren uit dit snelstartscenario. Dit is voldoende om ervaring te krijgen met de modus Apprentice en online, offline evaluaties uit te voeren en functie-evaluaties te maken. Vervang de bovenstaande hoofdmethode door:

    static void Main(string[] args)
    {
    int iteration = 1;
    int runLoop = 0;

    // Get the actions list to choose from personalizer with their features.
    IList<RankableAction> actions = GetActions();

    // Initialize Personalizer client.
    PersonalizerClient client = InitializePersonalizerClient(ServiceEndpoint);

    do
    {
        Console.WriteLine("\nIteration: " + iteration++);

        // Get context information.
        Context context = GetContext();

        // Create current context from user specified data.
        IList<object> currentContext = new List<object>() {
            context
        };

        // Generate an ID to associate with the request.
        string eventId = Guid.NewGuid().ToString();

        // Rank the actions
        var request = new RankRequest(actions: actions, contextFeatures: currentContext, eventId: eventId);
        RankResponse response = client.Rank(request);

        Console.WriteLine($"\nPersonalizer service thinks {context.User.Name} would like to have: {response.RewardActionId}.");

        float reward = GetRewardScore(context, response.RewardActionId);

        // Send the reward for the action based on user response.
        client.Reward(response.EventId, new RewardRequest(reward));

        runLoop = runLoop + 1;

    } while (runLoop < 1000);
}

De broncode voor deze quickstart is beschikbaar op GitHub.

Referentiedocumentatiebibliotheek |broncodepakket | (npm) | Quickstart-codevoorbeeld

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 uw toepassing te verbinden met de Personalizer-API. Later in de quickstart plakt u uw sleutel en eindpunt in de onderstaande code.
    • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.

Modelconfiguratie

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.

Change model update frequency

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.

Change reward wait time

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 nieuw Node.js-script in uw favoriete editor of IDE met de naam personalizer-quickstart.js en maak variabelen voor het eindpunt en de abonnementssleutel van uw resource.

De clientbibliotheek installeren

Installeer de Personalizer-clientbibliotheek voor Node.js met de volgende opdracht:

npm install @azure/cognitiveservices-personalizer --save

Installeer de resterende NPM-pakketten voor deze quickstart:

npm install @azure/ms-rest-azure-js @azure/ms-rest-js readline-sync uuid --save

Codeblok 1: Voorbeeldgegevens genereren

Personalizer is bedoeld om te worden uitgevoerd op toepassingen die realtime gegevens ontvangen en interpreteren. In deze quickstart gebruikt u voorbeeldcode om imaginaire klantacties te genereren op een boodschappenwebsite. Het volgende codeblok definieert drie belangrijke methoden: getActionsList, getContextFeaturesList en getReward.

  • getActionsList retourneert een lijst met de keuzes die de kruidenierswebsite moet rangschikken. In dit voorbeeld zijn de acties maaltijdproducten. Elke actiekeuze heeft details (functies) die later van invloed kunnen zijn op gebruikersgedrag. Acties worden gebruikt als invoer voor de Rank-API

  • getContextFeaturesList retourneert een gesimuleerd klantbezoek. Het selecteert gerandomiseerde details (contextfuncties) zoals welke klant aanwezig is en op welk tijdstip het bezoek plaatsvindt. Over het algemeen vertegenwoordigt een context de huidige status van uw toepassing, systeem, omgeving of gebruiker. Het contextobject wordt gebruikt als invoer voor de Rank-API.

    De contextfuncties in deze quickstart zijn simplistisch. In een echt productiesysteem is het ontwerpen van uw functies en het evalueren van hun effectiviteit echter belangrijk. Raadpleeg de gekoppelde documentatie voor hulp.

  • getReward vraagt de gebruiker om de aanbeveling van de service te beoordelen als geslaagd of mislukt. Het retourneert een score tussen nul en één die het succes van een klantinteractie vertegenwoordigt. In een echt scenario leert Personalizer gebruikersvoorkeuren van realtime interacties van klanten.

    In een echt productiesysteem moet de beloningsscore worden ontworpen om te voldoen aan uw bedrijfsdoelstellingen en KPI's. Het bepalen hoe de beloningsmetriek moet worden berekend, kan enige experimenten vereisen.

Open personalizer-quickstart.js in een teksteditor of IDE en plak de onderstaande code.

const uuidv1 = require('uuid/v1');
const Personalizer = require('@azure/cognitiveservices-personalizer');
const CognitiveServicesCredentials = require('@azure/ms-rest-azure-js').CognitiveServicesCredentials;
const readline = require('readline-sync');

function getReward() {
  const answer = readline.question("\nIs this correct (y/n)\n");
  if (answer.toLowerCase() === 'y') {
    console.log("\nGreat| Enjoy your food.");
    return 1;
  }
  console.log("\nYou didn't like the recommended food choice.");
  return 0;
}

function getContextFeaturesList() {
  const timeOfDayFeatures = ['morning', 'afternoon', 'evening', 'night'];
  const tasteFeatures = ['salty', 'sweet'];

  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 food would you prefer (enter number)? 1. salty 2. sweet\n");
  selection = parseInt(answer);
  const taste = selection >= 1 && selection <= 2 ? tasteFeatures[selection - 1] : tasteFeatures[0];

  console.log("Selected features:\n");
  console.log("Time of day: " + timeOfDay + "\n");
  console.log("Taste: " + taste + "\n");

  return [
    {
      "time": timeOfDay
    },
    {
      "taste": taste
    }
  ];
}

function getExcludedActionsList() {
  return [
    "juice"
  ];
}

function getActionsList() {
  return [
    {
      "id": "pasta",
      "features": [
        {
          "taste": "salty",
          "spiceLevel": "medium"
        },
        {
          "nutritionLevel": 5,
          "cuisine": "italian"
        }
      ]
    },
    {
      "id": "ice cream",
      "features": [
        {
          "taste": "sweet",
          "spiceLevel": "none"
        },
        {
          "nutritionalLevel": 2
        }
      ]
    },
    {
      "id": "juice",
      "features": [
        {
          "taste": "sweet",
          "spiceLevel": "none"
        },
        {
          "nutritionLevel": 5
        },
        {
          "drink": true
        }
      ]
    },
    {
      "id": "salad",
      "features": [
        {
          "taste": "salty",
          "spiceLevel": "low"
        },
        {
          "nutritionLevel": 8
        }
      ]
    }
  ];
}

Codeblok 2: De leerlus herhalen

Het volgende codeblok definieert de hoofdmethode en sluit het script af. Er wordt een iteratie van een leerlus uitgevoerd, waarin de gebruiker zijn voorkeuren op de opdrachtregel vraagt en die informatie naar Personalizer verzendt om de beste actie te selecteren. De geselecteerde actie wordt weergegeven aan de gebruiker, die een keuze maakt met behulp van de opdrachtregel. Vervolgens wordt een beloningsscore naar de Personalizer-service verzonden om aan te geven hoe goed de service in de selectie heeft gedaan.

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.

  1. Voeg de onderstaande code toe aan personalizer-quickstart.js.

  2. Zoek uw sleutel en eindpunt. Uw eindpunt heeft het formulier https://<your_resource_name>.cognitiveservices.azure.com/.

    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.

  3. Plak uw sleutel en eindpunt in de code waar aangegeven.

    Belangrijk

    Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel Over beveiliging van Azure AI-services voor meer informatie over beveiliging .

    async function main() {
    
        // The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
        const serviceKey = "PASTE_YOUR_PERSONALIZER_SUBSCRIPTION_KEY_HERE";
      
        // The endpoint specific to your personalization service instance; 
        // e.g. https://<your-resource-name>.cognitiveservices.azure.com
        const baseUri = "PASTE_YOUR_PERSONALIZER_ENDPOINT_HERE";
      
        const credentials = new CognitiveServicesCredentials(serviceKey);
      
        // Initialize Personalization client.
        const personalizerClient = new Personalizer.PersonalizerClient(credentials, baseUri);
      
      
        let runLoop = true;
      
        do {
      
          let rankRequest = {}
      
          // Generate an ID to associate with the request.
          rankRequest.eventId = uuidv1();
      
          // Get context information from the user.
          rankRequest.contextFeatures = getContextFeaturesList();
      
          // Get the actions list to choose from personalization with their features.
          rankRequest.actions = getActionsList();
      
          // Exclude an action for personalization ranking. This action will be held at its current position.
          rankRequest.excludedActions = getExcludedActionsList();
      
          rankRequest.deferActivation = false;
      
          // Rank the actions
          const rankResponse = await personalizerClient.rank(rankRequest);
      
          console.log("\nPersonalization service thinks you would like to have:\n")
          console.log(rankResponse.rewardActionId);
      
          // Display top choice to user, user agrees or disagrees with top choice
          const reward = getReward();
      
          console.log("\nPersonalization service ranked the actions with the probabilities as below:\n");
          for (let i = 0; i < rankResponse.ranking.length; i++) {
            console.log(JSON.stringify(rankResponse.ranking[i]) + "\n");
          }
      
          // Send the reward for the action based on user response.
      
          const rewardRequest = {
            value: reward
          }
      
          await personalizerClient.events.reward(rankRequest.eventId, rewardRequest);
      
          runLoop = continueLoop();
      
        } while (runLoop);
      }
      
      function continueLoop() {
        const answer = readline.question("\nPress q to break, any other key to continue.\n")
        if (answer.toLowerCase() === 'q') {
          return false;
        }
        return true;
      }
    
    main()
    .then(result => console.log("done"))
    .catch(err=> console.log(err));
    

Het programma uitvoeren

Voer de toepassing uit met de opdracht Node.js vanuit de toepassingsmap.

node personalizer-quickstart.js

Een paar leerlussen doorlopen. Na ongeveer 10 minuten begint de service verbeteringen in de aanbevelingen weer te geven.

De broncode voor deze quickstart is beschikbaar op GitHub.

Referentiedocumentatiebibliotheek | broncodepakket | (pypi) | Quickstart-codevoorbeeld

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement
  • Python 3.x
  • Zodra uw Azure-abonnement is ingesteld, maakt u een Personalizer-resource in Azure Portal en haalt u uw sleutel en eindpunt op. Nadat de app is geïmplementeerd, selecteert u Ga naar resource.
    • U hebt de sleutel en het eindpunt van de gemaakte resource nodig om uw toepassing te verbinden met de Personalizer-API, die u in de onderstaande snelstartcode plakt.
    • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen en vervolgens op een later tijdstip een upgrade uit te voeren naar een betaalde laag voor productie.

Modelconfiguratie

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.

Change model update frequency

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.

Change reward wait time

Een nieuwe Python-toepassing maken

Maak een nieuw Python-bestand met de naam personalizer-quickstart.py.

De clientbibliotheek installeren

Installeer de Personalizer-clientbibliotheek met pip:

pip install azure-cognitiveservices-personalizer

Codeblok 1: Voorbeeldgegevens genereren

Personalizer is bedoeld om te worden uitgevoerd op toepassingen die realtime gegevens ontvangen en interpreteren. Voor deze quickstart gebruikt u voorbeeldcode om imaginaire klantacties te genereren op een supermarktwebsite. In het volgende codeblok worden drie belangrijke functies gedefinieerd: get_actions, get_context en get_reward_score.

  • get_actions retourneert een lijst met de keuzes die de kruidenierswebsite moet rangschikken. In dit voorbeeld zijn de acties maaltijdproducten. Elke actiekeuze heeft details (functies) die later van invloed kunnen zijn op gebruikersgedrag. Acties worden gebruikt als invoer voor de Rank-API

  • get_context een gesimuleerd klantbezoek retourneert. Het selecteert gerandomiseerde details (contextfuncties) zoals welke klant aanwezig is en op welk tijdstip het bezoek plaatsvindt. Over het algemeen vertegenwoordigt een context de huidige status van uw toepassing, systeem, omgeving of gebruiker. Het contextobject wordt gebruikt als invoer voor de Rank-API.

    De contextfuncties in deze quickstart zijn simplistisch. In een echt productiesysteem is het ontwerpen van uw functies en het evalueren van hun effectiviteit echter erg belangrijk. Raadpleeg de gekoppelde documentatie voor hulp.

  • get_reward_score retourneert een score tussen nul en één die het succes van een klantinteractie vertegenwoordigt. Er wordt gebruikgemaakt van eenvoudige logica om te bepalen hoe verschillende contexten reageren op verschillende actieopties. Een bepaalde gebruiker geeft bijvoorbeeld altijd een 1.0 voor vegetarische en veganistische producten en een 0,0 voor andere producten. In een echt scenario leert Personalizer gebruikersvoorkeuren van de gegevens die worden verzonden in Rank- en Reward-API-aanroepen. U definieert deze niet expliciet zoals in de voorbeeldcode.

    In een echt productiesysteem moet de beloningsscore worden ontworpen om te voldoen aan uw bedrijfsdoelstellingen en KPI's. Het bepalen hoe de beloningsmetriek moet worden berekend, kan enige experimenten vereisen.

    In de onderstaande code worden de voorkeuren en reacties van de gebruikers op de acties vastgelegd als een reeks voorwaardelijke instructies en wordt verklarende tekst opgenomen in de code voor demonstratiedoeleinden.

Volg deze stappen om het Personalizer-script in te stellen.

  1. Zoek uw sleutel en eindpunt.

    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.

  2. Open personalizer-quickstart.py in een teksteditor of IDE en plak de onderstaande code.

  3. Plak uw sleutel en eindpunt in de code waar aangegeven. Uw eindpunt heeft het formulier https://<your_resource_name>.cognitiveservices.azure.com/.

    Belangrijk

    Vergeet niet de sleutel uit uw code te verwijderen wanneer u klaar bent, en maak deze sleutel nooit openbaar. Gebruik voor productie een veilige methode om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie de beveiliging van Azure AI-services voor meer informatie.

from azure.cognitiveservices.personalizer import PersonalizerClient
from azure.cognitiveservices.personalizer.models import RankableAction, RewardRequest, RankRequest
from msrest.authentication import CognitiveServicesCredentials

import datetime, json, os, time, uuid, random

key = "paste_your_personalizer_key_here"
endpoint = "paste_your_personalizer_endpoint_here"

# Instantiate a Personalizer client
client = PersonalizerClient(endpoint, CognitiveServicesCredentials(key))

actions_and_features = {
    'pasta': {
        'brand_info': {
            'company':'pasta_inc'
        }, 
        'attributes': {
            'qty':1, 'cuisine':'italian',
            'price':12
        },
        'dietary_attributes': {
            'vegan': False,
            'low_carb': False,
            'high_protein': False,
            'vegetarian': False,
            'low_fat': True,
            'low_sodium': True
        }
    },
    'bbq': {
        'brand_info' : {
            'company': 'ambisco'
        },
        'attributes': {
            'qty': 2,
            'category': 'bbq',
            'price': 20
        }, 
        'dietary_attributes': {
            'vegan': False,
            'low_carb': True,
            'high_protein': True,
            'vegetarian': False,
            'low_fat': False,
            'low_sodium': False
        }
    },
    'bao': {
        'brand_info': {
            'company': 'bao_and_co'
        },
        'attributes': {
            'qty': 4,
            'category': 'chinese',
            'price': 8
        }, 
        'dietary_attributes': {
            'vegan': False,
            'low_carb': True,
            'high_protein': True,
            'vegetarian': False,
            'low_fat': True,
            'low_sodium': False
        }
    },
    'hummus': {
        'brand_info' : { 
            'company': 'garbanzo_inc'
        },
        'attributes' : {
            'qty': 1,
            'category': 'breakfast',
            'price': 5
        }, 
        'dietary_attributes': {
            'vegan': True, 
            'low_carb': False,
            'high_protein': True,
            'vegetarian': True,
            'low_fat': False, 
            'low_sodium': False
        }
    },
    'veg_platter': {
        'brand_info': {
            'company': 'farm_fresh'
        }, 
        'attributes': {
            'qty': 1,
            'category': 'produce', 
            'price': 7
        },
        'dietary_attributes': {
            'vegan': True,
            'low_carb': True,
            'high_protein': False,
            'vegetarian': True,
            'low_fat': True,
            'low_sodium': True
        }
    }
}

def get_actions():
    res = []
    for action_id, feat in actions_and_features.items():
        action = RankableAction(id=action_id, features=[feat])
        res.append(action)
    return res

user_profiles = {
    'Bill': {
        'dietary_preferences': 'low_carb', 
        'avg_order_price': '0-20',
        'browser_type': 'edge'
    },
    'Satya': {
        'dietary_preferences': 'low_sodium',
        'avg_order_price': '201+',
        'browser_type': 'safari'
    },
    'Amy': {
        'dietary_preferences': {
            'vegan', 'vegetarian'
        },
        'avg_order_price': '21-50',
        'browser_type': 'edge'},
    }

def get_context(user):
    location_context = {'location': random.choice(['west', 'east', 'midwest'])}
    time_of_day = {'time_of_day': random.choice(['morning', 'afternoon', 'evening'])}
    app_type = {'application_type': random.choice(['edge', 'safari', 'edge_mobile', 'mobile_app'])}
    res = [user_profiles[user], location_context, time_of_day, app_type]
    return res

def get_random_users(k = 5):
    return random.choices(list(user_profiles.keys()), k=k)


def get_reward_score(user, actionid, context):
    reward_score = 0.0
    action = actions_and_features[actionid]
    
    if user == 'Bill':
        if action['attributes']['price'] < 10 and (context[1]['location'] !=  "midwest"):
            reward_score = 1.0
            print("Bill likes to be economical when he's not in the midwest visiting his friend Warren. He bought", actionid, "because it was below a price of $10.")
        elif (action['dietary_attributes']['low_carb'] == True) and (context[1]['location'] ==  "midwest"):
            reward_score = 1.0
            print("Bill is visiting his friend Warren in the midwest. There he's willing to spend more on food as long as it's low carb, so Bill bought" + actionid + ".")
            
        elif (action['attributes']['price'] >= 10) and (context[1]['location'] != "midwest"):
            print("Bill didn't buy", actionid, "because the price was too high when not visting his friend Warren in the midwest.")
            
        elif (action['dietary_attributes']['low_carb'] == False) and (context[1]['location'] ==  "midwest"):
            print("Bill didn't buy", actionid, "because it's not low-carb, and he's in the midwest visitng his friend Warren.")
             
    elif user == 'Satya':
        if action['dietary_attributes']['low_sodium'] == True:
            reward_score = 1.0
            print("Satya is health conscious, so he bought", actionid,"since it's low in sodium.")
        else:
            print("Satya did not buy", actionid, "because it's not low sodium.")   
            
    elif user == 'Amy':
        if (action['dietary_attributes']['vegan'] == True) or (action['dietary_attributes']['vegetarian'] == True):
            reward_score = 1.0
            print("Amy likes to eat plant-based foods, so she bought", actionid, "because it's vegan or vegetarian friendly.")       
        else:
            print("Amy did not buy", actionid, "because it's not vegan or vegetarian.")
                
    return reward_score
    # ...

Codeblok 2: De leerlus herhalen

Het volgende codeblok definieert de run_personalizer_cycle functie en roept deze aan in een eenvoudige feedbacklus van gebruikers. Er wordt een iteratie van een leerlus uitgevoerd, waarin een context wordt gegenereerd (inclusief een klant), een classificatie van acties in die context aanvraagt met behulp van de Rank-API, de beloningsscore berekent en die score teruggeeft aan de Personalizer-service met behulp van de Reward-API. Bij elke stap worden relevante informatie naar de console afgedrukt.

In dit voorbeeld wordt elke Rank-aanroep uitgevoerd om te bepalen welk product moet worden weergegeven in de sectie Aanbevolen product. Vervolgens geeft de beloningsaanroep aan of het aanbevolen product al dan niet is gekocht door de gebruiker. Rewards worden gekoppeld aan hun beslissingen via een gemeenschappelijke EventId waarde.

def run_personalizer_cycle():
    actions = get_actions()
    user_list = get_random_users()
    for user in user_list:
        print("------------")
        print("User:", user, "\n")
        context = get_context(user)
        print("Context:", context, "\n")
        
        rank_request = RankRequest(actions=actions, context_features=context)
        response = client.rank(rank_request=rank_request)
        print("Rank API response:", response, "\n")
        
        eventid = response.event_id
        actionid = response.reward_action_id
        print("Personalizer recommended action", actionid, "and it was shown as the featured product.\n")
        
        reward_score = get_reward_score(user, actionid, context)
        client.events.reward(event_id=eventid, value=reward_score)     
        print("\nA reward score of", reward_score , "was sent to Personalizer.")
        print("------------\n")

continue_loop = True
while continue_loop:
    run_personalizer_cycle()
    
    br = input("Press Q to exit, or any other key to run another loop: ")
    if(br.lower()=='q'):
        continue_loop = False

Het programma uitvoeren

Zodra alle bovenstaande code is opgenomen in uw Python-bestand, kunt u deze uitvoeren vanuit de toepassingsmap.

python personalizer-quickstart.py

Tijdens de eerste iteratie raadt Personalizer een willekeurige actie aan, omdat deze nog geen training heeft uitgevoerd. U kunt desgewenst meer iteraties uitvoeren. Na ongeveer 10 minuten begint de service verbeteringen in de aanbevelingen weer te geven.

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

Veel gebeurtenissen genereren voor analyse (optioneel)

U kunt eenvoudig 5000 gebeurtenissen genereren uit dit snelstartscenario. Dit is voldoende om ervaring te krijgen met de apprentice-modus, de onlinemodus, het uitvoeren van offlineevaluaties en het maken van functie-evaluaties. Vervang de while lus in het bovenstaande codeblok door de volgende code.

for i in range(0,1000):
    run_personalizer_cycle()

De broncode voor deze quickstart is beschikbaar op GitHub.

Het getrainde model downloaden

Als u een Personalizer-model wilt downloaden dat is getraind op 5000 gebeurtenissen uit het bovenstaande voorbeeld, gaat u naar de opslagplaats Personalizer Samples en downloadt u het bestand Personalizer_QuickStart_Model.zip . Ga vervolgens naar uw Personalizer-resource in Azure Portal, ga naar de pagina Setup en het tabblad Importeren/exporteren en importeer het bestand.

Resources opschonen

Als u uw Azure AI-servicesabonnement wilt opschonen, kunt u de resource verwijderen of de resourcegroep verwijderen, waardoor alle gekoppelde resources worden verwijderd.

Volgende stappen