Gyors útmutató: személyre szabott ügyféloldali kódtár

Személyre szabott tartalom megjelenítése ebben a rövid útmutatóban a személyre szabási szolgáltatással.

Ismerkedés a személyre szabott ügyféloldali kódtár használatába. Az alábbi lépéseket követve telepítheti a csomagot, és kipróbálhatja az alapszintű feladatokhoz tartozó példa kódját.

  • Range API – kiválasztja a legjobb elemet a műveletek közül, a tartalommal és környezettel kapcsolatban megadott valós idejű információk alapján.
  • Jutalom API – az üzleti igények alapján határozza meg a jutalom pontszámát, majd küldje el a személyre az API-val. Ez a pontszám lehet egyetlen érték, például 1, jó, 0 vagy rossz, vagy egy, az üzleti igények alapján létrehozott algoritmus.

Dokumentáció | Könyvtár forráskódja | Csomag (NuGet) | Példák

Előfeltételek

  • Azure-előfizetés – hozzon létre egyet ingyen
  • A .net Corejelenlegi verziója.
  • Ha már rendelkezik Azure-előfizetéssel, a Azure Portal a kulcs és a végpont beszerzéséhez. Az üzembe helyezést követően kattintson az erőforrás keresése elemre.
    • Az alkalmazás a személyre szabott API-hoz való összekapcsolásához szüksége lesz a létrehozott erőforrás kulcsára és végpontra. A kulcsot és a végpontot a rövid útmutató későbbi részében található kódra másolja.
    • Az ingyenes díjszabási csomag () segítségével F0 kipróbálhatja a szolgáltatást, és később is frissítheti az éles környezetben futó fizetős szintre.

Beállítás

A modell frissítési gyakoriságának módosítása

A Azure Portal a konfiguráció lapon a személyre szabott erőforrásban módosítsa a modell frissítésének gyakoriságát 10 másodpercre. Ez a rövid időtartam gyorsan betanítja a szolgáltatást, így megtekintheti, hogyan változik az egyes iterációk legfelső szintű művelete.

Modell frissítési gyakoriságának módosítása

Ha a rendszer először létrehoz egy személyre szabott hurkot, nem áll rendelkezésre modell, mert nem áll rendelkezésre jutalom API-hívás a betanításhoz. A rangsorban megjelenő hívások az egyes elemek esetében azonos valószínűségeket adnak vissza. Az alkalmazásnak mindig a RewardActionId kimenetével kell rangsorolnia a tartalmat.

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

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

A konzol ablakban (például cmd, PowerShell vagy bash) a DotNet new paranccsal hozzon létre egy új, a nevű Console-alkalmazást personalizer-quickstart . Ez a parancs egy egyszerű "Hello World" C#-projektet hoz létre egyetlen forrásfájl használatával: Program.cs .

dotnet new console -n personalizer-quickstart

Módosítsa a könyvtárat az újonnan létrehozott alkalmazás mappájába. Az alkalmazást az alábbiakkal hozhatja létre:

dotnet build

A Build kimenete nem tartalmazhat figyelmeztetést vagy hibát.

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

Az ügyféloldali kódtár telepítése

Telepítse az alkalmazás könyvtárában a .NET személyre szabott ügyféloldali kódtárat a következő paranccsal:

dotnet add package Microsoft.Azure.CognitiveServices.Personalizer --version 0.8.0-preview

Tipp

Ha a Visual Studio IDE-t használja, az ügyféloldali kódtár letölthető NuGet-csomagként érhető el.

A projekt könyvtárában nyissa meg a Program.cs fájlt az előnyben részesített szerkesztőben vagy az ide-ben. Adja hozzá a következőt az irányelvek használatával:

using Microsoft.Azure.CognitiveServices.Personalizer;
using Microsoft.Azure.CognitiveServices.Personalizer.Models;
using System;
using System.Collections.Generic;
using System.Linq;

Objektummodell

A személyre szabott ügyfél egy PersonalizerClient objektum, amely a kulcsot tartalmazó Microsoft. Rest. ServiceClientCredentials használatával hitelesíti az Azure-t.

Ha szeretné megkérdezni a tartalom egyetlen legjobb elemét, hozzon létre egy RankRequest, majd továbbítsa azt az ügyfélnek. Rangsor metódusa. A Rank metódus egy RankResponse ad vissza.

A jutalom pontszámának személyre szabásához hozzon létre egy RewardRequest, majd továbbítsa azt az ügyfélnek. Jutalmazási módszer.

A jutalom pontszám meghatározása ebben a rövid útmutatóban triviális. Éles rendszerekben annak meghatározása, hogy milyen hatással van a jutalom pontszáma , és hogy mekkora mértékben lehet egy összetett folyamat, dönthet úgy, hogy idővel változhat. Ennek a tervezési döntésnek a személyre szabott architektúrájának egyik elsődleges döntésének kell lennie.

Kódpéldák

Ezek a kódrészletek azt mutatják be, hogyan végezheti el a következő feladatokat a személyre szabott ügyféloldali kódtáraval a .NET-hez:

Az ügyfél hitelesítése

Ebben a szakaszban két dolgot kell tennie:

  • Adja meg a kulcsot és a végpontot
  • Személyre szabott ügyfél létrehozása

Először adja hozzá a következő sorokat a program osztályhoz. Ügyeljen arra, hogy hozzáadja a kulcsot és a végpontot a személyre szabott erőforrásból.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott személyre szabott erőforrás sikeresen telepítve lett, kattintson az Ugrás erőforrásra gombra a következő lépések alatt. A kulcsot és a végpontot az erőforrás- kezelés területen, az erőforrás kulcs és végpont lapján találja.

Ne felejtse el eltávolítani a kulcsot a kódból, ha elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben érdemes lehet biztonságos módszert használni a hitelesítő adatok tárolásához és eléréséhez. Például az Azure Key Vault.

private static readonly string ApiKey = "REPLACE-WITH-YOUR-PERSONALIZER-KEY";
private static readonly string ServiceEndpoint = "https://REPLACE-WITH-YOUR-PERSONALIZER-RESOURCE-NAME.cognitiveservices.azure.com";

Ezután adjon hozzá egy metódust a programhoz egy új személyre szabott ügyfél létrehozásához.

static PersonalizerClient InitializePersonalizerClient(string url)
{
    PersonalizerClient client = new PersonalizerClient(
        new ApiKeyServiceClientCredentials(ApiKey)) { Endpoint = url };

    return client;
}

Élelmiszeripari elemek beolvasása sorba besorolt műveletként

A műveletek azokat a tartalmi beállításokat jelentik, amelyeknek a személyre szabásával ki kell választania a legjobb tartalmi elemet. Adja hozzá a következő metódusokat a program osztályhoz a műveletek és a hozzájuk tartozó funkciók megjelenítéséhez.

static IList<RankableAction> GetActions()
{
    IList<RankableAction> actions = new List<RankableAction>
    {
        new RankableAction
        {
            Id = "pasta",
            Features =
            new List<object>() { new { taste = "salty", spiceLevel = "medium" }, new { nutritionLevel = 5, cuisine = "italian" } }
        },

        new RankableAction
        {
            Id = "ice cream",
            Features =
            new List<object>() { new { taste = "sweet", spiceLevel = "none" }, new { nutritionalLevel = 2 } }
        },

        new RankableAction
        {
            Id = "juice",
            Features =
            new List<object>() { new { taste = "sweet", spiceLevel = "none" }, new { nutritionLevel = 5 }, new { drink = true } }
        },

        new RankableAction
        {
            Id = "salad",
            Features =
            new List<object>() { new { taste = "salty", spiceLevel = "low" }, new { nutritionLevel = 8 } }
        }
    };

    return actions;
}

A környezet felhasználói beállításainak beolvasása

Adja hozzá a következő metódusokat a program osztályhoz, hogy beolvassa a felhasználó bemenetét a parancssorból a nap időpontjában és az aktuális élelmiszer-preferencia alapján. Ezek környezeti funkciókként lesznek felhasználva.

static string GetUsersTimeOfDay()
{
    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 GetUsersTastePreference()
{
    string[] tasteFeatures = new string[] { "salty", "sweet" };

    Console.WriteLine("\nWhat type of food would you prefer (enter number)? 1. salty 2. sweet");
    if (!int.TryParse(GetKey(), out int tasteIndex) || tasteIndex < 1 || tasteIndex > tasteFeatures.Length)
    {
        Console.WriteLine("\nEntered value is invalid. Setting feature value to " + tasteFeatures[0] + ".");
        tasteIndex = 1;
    }

    return tasteFeatures[tasteIndex - 1];
}

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

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

A tanulási hurok létrehozása

A személyre szabott tanulási hurok a Range és a jutalmazási hívások ciklusa. Ebben a rövid útmutatóban a tartalom személyre szabásához a rangsorban megjelenő minden egyes hívást egy jutalmazási hívás követ, amely alapján eldöntheti, hogy milyen jól teljesíti a szolgáltatást.

A következő kód hurkokat mutat be a felhasználónak a parancssorban való megadására, az információknak a személyre szabására való kiválasztásához, az ügyfélnek a listából való kiválasztásához, majd a jutalom pontszámának elküldéséhez, hogy a szolgáltatás milyen jól jelenjen meg a kiválasztásában.

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

    IList<RankableAction> actions = GetActions();

    PersonalizerClient client = InitializePersonalizerClient(ServiceEndpoint);

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

        string timeOfDayFeature = GetUsersTimeOfDay();
        string tasteFeature = GetUsersTastePreference();

        IList<object> currentContext = new List<object>() {
            new { time = timeOfDayFeature },
            new { taste = tasteFeature }
        };

        IList<string> excludeActions = new List<string> { "juice" };

        string eventId = Guid.NewGuid().ToString();

        var request = new RankRequest(actions, currentContext, excludeActions, eventId);
        RankResponse response = client.Rank(request);

        Console.WriteLine("\nPersonalizer service thinks you would like to have: " + response.RewardActionId + ". Is this correct? (y/n)");

        float reward = 0.0f;
        string answer = GetKey();

        if (answer == "Y")
        {
            reward = 1;
            Console.WriteLine("\nGreat! Enjoy your food.");
        }
        else if (answer == "N")
        {
            reward = 0;
            Console.WriteLine("\nYou didn't like the recommended food choice.");
        }
        else
        {
            Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended food choice.");
        }

        Console.WriteLine("\nPersonalizer service ranked the actions with the probabilities as below:");
        foreach (var rankedResponse in response.Ranking)
        {
            Console.WriteLine(rankedResponse.Id + " " + rankedResponse.Probability);
        }

        client.Reward(response.EventId, new RewardRequest(reward));

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

    } while (runLoop);
}

Adja hozzá a következő metódusokat, amelyek megkapják a tartalom választási lehetőségeita kódlap futtatása előtt:

  • GetActions
  • GetUsersTimeOfDay
  • GetUsersTastePreference
  • GetKey

A legjobb művelet kérése

A rangsorolási kérelem teljesítéséhez a program megkéri a felhasználó beállításait, hogy hozzon létre egy currentContext tartalom-választási lehetőséget. A folyamat létrehozhat olyan tartalmat, amely kizárható a műveletekből, a következő módon: excludeActions . A válasz fogadásához a Rank kérelemnek szüksége van a műveletekre és azok szolgáltatásaira, a LicenseManager CurrentContext szolgáltatásaira, a excludeActions és egy egyedi esemény-AZONOSÍTÓra.

Ez a rövid útmutató a napszak és a felhasználói élelmiszer-beállítások egyszerű kontextusát tartalmazza. Az éles rendszerekben a műveletek és szolgáltatások meghatározása és értékelése nem triviális kérdés lehet.

string timeOfDayFeature = GetUsersTimeOfDay();
string tasteFeature = GetUsersTastePreference();

IList<object> currentContext = new List<object>() {
    new { time = timeOfDayFeature },
    new { taste = tasteFeature }
};

IList<string> excludeActions = new List<string> { "juice" };

string eventId = Guid.NewGuid().ToString();

var request = new RankRequest(actions, currentContext, excludeActions, eventId);
RankResponse response = client.Rank(request);

Jutalom küldése

Ahhoz, hogy a jutalom pontszáma a jutalom iránti kérelemben legyen elküldve, a program beolvassa a felhasználó kijelölését a parancssorból, hozzárendel egy numerikus értéket a kijelöléshez, majd elküldi az egyedi eseményazonosító és a jutalom pontszámát a jutalmazási API-nak megfelelő numerikus értékként.

Ez a rövid útmutató egy egyszerű számot rendel hozzá a jutalom pontszámához, vagy nulla vagy 1 értéket. Az éles rendszerekben az adott igényektől függően nem triviális kérdés lehet annak meghatározása, hogy mikor és mit kell elküldeni a jutalmazási hívásnak.

float reward = 0.0f;
string answer = GetKey();

if (answer == "Y")
{
    reward = 1;
    Console.WriteLine("\nGreat! Enjoy your food.");
}
else if (answer == "N")
{
    reward = 0;
    Console.WriteLine("\nYou didn't like the recommended food choice.");
}
else
{
    Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended food choice.");
}

Console.WriteLine("\nPersonalizer service ranked the actions with the probabilities as below:");
foreach (var rankedResponse in response.Ranking)
{
    Console.WriteLine(rankedResponse.Id + " " + rankedResponse.Probability);
}

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

A program futtatása

Futtassa az alkalmazást a DotNet run paranccsal az alkalmazás könyvtárából.

dotnet run

A gyors üzembe helyezési program néhány kérdést tesz fel a felhasználói preferenciák (más néven funkciók) összegyűjtésére, majd megadja a legfontosabb műveletet.

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

Referenciadokumentáció | Kódtár forráskódja | Csomag (NPM) | Minták

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • ANode.js npm aktuális verziója.
  • Miután megvan az Azure-előfizetése, hozzon létre egy Personalizer-erőforrást, és hozzon létre egy Personalizer-erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után kattintson az Erőforráshoz való ugrás gombra.
    • Az alkalmazás Personalizer API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsra és végpontra. A kulcsot és a végpontot a rövid útmutató későbbi, alábbi kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre éles F0 környezetben.

Beállítása

A modell frissítési gyakoriságának módosítása

A Azure Portal a konfiguráció lapon a személyre szabott erőforrásban módosítsa a modell frissítésének gyakoriságát 10 másodpercre. Ez a rövid időtartam gyorsan betanítja a szolgáltatást, így megtekintheti, hogyan változik az egyes iterációk legfelső szintű művelete.

Modell frissítési gyakoriságának módosítása

Ha a rendszer először létrehoz egy személyre szabott hurkot, nem áll rendelkezésre modell, mert nem áll rendelkezésre jutalom API-hívás a betanításhoz. A rangsorban megjelenő hívások az egyes elemek esetében azonos valószínűségeket adnak vissza. Az alkalmazásnak mindig a RewardActionId kimenetével kell rangsorolnia a tartalmat.

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

Egy konzolablakban (például cmd, PowerShell vagy Bash) hozzon létre egy új könyvtárat az alkalmazáshoz, és navigáljon hozzá.

mkdir myapp && cd myapp

Fájl npm init -y létrehozásához futtassa az package.json parancsot.

npm init -y

Hozzon létre egy Node.js nevű szerkesztőben vagy IDE-ban, és hozzon létre változókat az erőforrás végpontja és sample.js előfizetési kulcsa számára.

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott személyre szabott erőforrás sikeresen telepítve lett, kattintson az Ugrás erőforrásra gombra a következő lépések alatt. A kulcsot és a végpontot az erőforrás- kezelés területen, az erőforrás kulcs és végpont lapján találja.

Ne felejtse el eltávolítani a kulcsot a kódból, ha elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben érdemes lehet biztonságos módszert használni a hitelesítő adatok tárolásához és eléréséhez. Például az Azure Key Vault.

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

// The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
const serviceKey = "<REPLACE-WITH-YOUR-PERSONALIZER-KEY>";

// The endpoint specific to your personalization service instance; 
// e.g. https://<your-resource-name>.cognitiveservices.azure.com
const baseUri = "https://<REPLACE-WITH-YOUR-PERSONALIZER-ENDPOINT>.cognitiveservices.azure.com";

A Personalizer Node.js kódtárának telepítése

Telepítse a Personalizer ügyféloldali kódtárat Node.js következő paranccsal:

npm install @azure/cognitiveservices-personalizer --save

Telepítse a fennmaradó NPM-csomagokat ehhez a rövid útmutatóhoz:

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

Objektummodell

A Personalizer-ügyfél egy PersonalizerClient objektum, amely a kulcsot tartalmazó Microsoft.Rest.ServiceClientCredentials használatával hitelesíti az Azure-t.

A tartalom egyetlen legjobb elemének lekért létrehozásához hozzon létre egy RankRequestelemet, majd továbbküldi azt az ügyfélnek. Rank metódus. A Rank metódus egy RankResponse értéket ad vissza.

Ha megjutalmat kell küldenie a Personalizernek, hozzon létre egy RewardRequest-et,majd továbbküldje azt az Events osztály Reward metódusának.

A jutalom meghatározása ebben a rövid útmutatóban triviális. Éles rendszerekben annak meghatározása, hogy mi befolyásolja a jutalompontszámot, és hogy mennyi lehet egy összetett folyamat, amelyet idővel változhat. Ez a Personalizer architektúra egyik elsődleges tervezési döntésének kell lennie.

Kódpéldák

Ezek a kódrészletek a következőket mutatják be a Personalizer ügyféloldali kódtárának Node.js:

Az ügyfél hitelesítése

Példányositsa PersonalizerClient a és serviceKey a baseUri példányát, amelyet korábban hozott létre.

const credentials = new CognitiveServicesCredentials(serviceKey);

// Initialize Personalization client.
const personalizerClient = new Personalizer.PersonalizerClient(credentials, baseUri);

Műveletekként ábrázolt tartalom választási lehetőségeinek lekérte

A műveletek azokat a tartalomválasztásokat képviselik, amelyekből a Personalizer a legjobb tartalomelemet választja ki. Adja hozzá a következő metódusokat a Program osztályhoz, amelyek a műveletkészletet és azok funkcióit képviselik.

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

A tanulási ciklus létrehozása

A Personalizer tanulási ciklus a Rangsor és a Reward hívások ciklusa. Ebben a rövid útmutatóban a tartalmak személyre szabása érdekében minden Rank-hívást egy Reward hívás követ, amely tudatja a Personalizer szolgáltatással, hogy milyen jól teljesített a szolgáltatás.

Az alábbi kód egy cikluson megy keresztül, és megkéri a felhasználót a parancssorban a preferenciáira, és elküldi az adatokat a Personalizernek, hogy válassza ki a legjobb műveletet, és bemutatja a listában kiválasztható lehetőséget az ügyfélnek, majd egy jutalmat küld a Personalizernek, jelezve, hogy milyen jól tette a szolgáltatás a választását.

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

Az alábbi szakaszokban közelebbről is megvizsgáljuk a rangsorolási és a jutalomhívásokat.

A kódfájl futtatása előtt adja hozzá a következőmetódusokat, amelyek lekérte a tartalomválasztásokat:

  • getActionsList
  • getContextFeaturesList

A legjobb művelet kérése

A Rank kérés befejezéséhez a program a felhasználó beállításait kéri a tartalom választási lehetőségeinek létrehozásához. A folyamat létrehozhat a műveletekből kizárni képes tartalmakat, amelyek a következőként jelennek meg: excludeActions . A Rangsorolás kérésnek szüksége van a műveletekre és azok funkcióira, a currentContext funkciókra, az excludeActions-re és egy egyedi rangsoresemény-azonosítóra a rangsorolt válasz fogadása érdekében.

Ez a rövid útmutató egyszerű környezeti funkciókkal rendelkezik a nap adott időszakában és a felhasználói élelmiszerekkel kapcsolatban. Éles rendszerekben a műveletek és funkciók meghatározása és kiértékelése nem triviális dolog lehet.

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

Jutalma küldése

A Reward kérésben elküldhető reward pontszám lekérése esetén a program lekérte a felhasználó kiválasztását a parancssorból, numerikus értéket rendel a kijelöléshez, majd numerikus értékként elküldi az egyedi eseményazonosítót és a jutalmat a Reward API-nak.

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

const rewardRequest = {
  value: reward
}

await personalizerClient.events.reward(rankRequest.eventId, rewardRequest);

A program futtatása

Futtassa az alkalmazást az Node.js könyvtárból származó fájlokkal.

node sample.js

A gyorsindítási program feltesz néhány kérdést a felhasználói beállítások ( más néven funkciók) gyűjtése érdekében, majd a legfontosabb műveletet biztosítja.

Referenciadokumentáció | Kódtár forráskódja | Csomag (pypi) | Minták

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen
  • Python 3.x
  • Ha már rendelkezik Azure-előfizetéssel, hozzon létre egy Personalizer-erőforrást, és hozzon létre egy Personalizer-erőforrást a Azure Portal a kulcs és a végpont lekért létrehozásához. Az üzembe helyezés után kattintson az Erőforráshoz való ugrás gombra.
    • Az alkalmazás Personalizer API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsra és végpontra. A kulcsot és a végpontot a rövid útmutató későbbi, alábbi kódába fogja beilleszteni.
    • Az ingyenes tarifacsomag ( ) használatával kipróbálhatja a szolgáltatást, és később frissíthet fizetős szolgáltatási szintre éles F0 környezetben.

Beállítása

A modell frissítési gyakoriságának módosítása

A Azure Portal a konfiguráció lapon a személyre szabott erőforrásban módosítsa a modell frissítésének gyakoriságát 10 másodpercre. Ez a rövid időtartam gyorsan betanítja a szolgáltatást, így megtekintheti, hogyan változik az egyes iterációk legfelső szintű művelete.

Modell frissítési gyakoriságának módosítása

Ha a rendszer először létrehoz egy személyre szabott hurkot, nem áll rendelkezésre modell, mert nem áll rendelkezésre jutalom API-hívás a betanításhoz. A rangsorban megjelenő hívások az egyes elemek esetében azonos valószínűségeket adnak vissza. Az alkalmazásnak mindig a RewardActionId kimenetével kell rangsorolnia a tartalmat.

Az ügyféloldali kódtár telepítése

A Python telepítése után a következővel telepítheti az ügyféloldali kódtárat:

pip install azure-cognitiveservices-personalizer

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

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

Fontos

Nyissa meg az Azure Portalt. Ha az Előfeltételek szakaszban létrehozott személyre szabott erőforrás sikeresen telepítve lett, kattintson az Ugrás erőforrásra gombra a következő lépések alatt. A kulcsot és a végpontot az erőforrás- kezelés területen, az erőforrás kulcs és végpont lapján találja.

Ne felejtse el eltávolítani a kulcsot a kódból, ha elkészült, és soha ne tegye közzé nyilvánosan. Éles környezetben érdemes lehet biztonságos módszert használni a hitelesítő adatok tárolásához és eléréséhez. Például az Azure Key Vault.

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

key = "<paste-your-personalizer-key-here>"
endpoint = "<paste-your-personalizer-endpoint-here>"

Objektummodell

A Personalizer-ügyfél egy PersonalizerClient objektum, amely a Kulcsot tartalmazó Microsoft.Rest.ServiceClientCredentials használatával hitelesít az Azure-ban.

A tartalom egyetlen legjobb elemének lekért létrehozásához hozzon létre egy RankRequestelemet, majd adja át az ügyfélnek. Rank metódus. A Rank metódus egy RankResponse értéket ad vissza.

Ha a Personalizernek szeretné elküldeni a jutalmat, állítsa be az eseményazonosítót és a jutalompontszám (érték) értékét, hogy a rendszer elküldje a Reward metódusnak az EventOperations osztályon.

A jutalom meghatározása ebben a rövid útmutatóban triviális. Éles rendszerekben annak meghatározása, hogy mi befolyásolja a jutalompontszámot, és hogy mennyi lehet egy összetett folyamat, amelyet idővel változhat. Ez a Personalizer architektúra egyik elsődleges tervezési döntésének kell lennie.

Kódpéldák

Ezek a kódrészletek a következőket mutatják be a Pythonhoz készült Personalizer ügyfélkódtár használatával:

Az ügyfél hitelesítése

Példányositsa PersonalizerClient a és key a endpoint et, amelyet korábban hozott létre.

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

Műveletekként ábrázolt tartalom választási lehetőségeinek lekérte

A műveletek azokat a tartalomválasztásokat képviselik, amelyek közül a Personalizer a legjobb tartalomelemet választja ki. Adja hozzá a következő metódusokat a Program osztályhoz, amelyek a műveletkészletet és azok funkcióit képviselik.

def get_actions():
    action1 = RankableAction(id='pasta', features=[{"taste":"salty", "spice_level":"medium"},{"nutrition_level":5,"cuisine":"italian"}])
    action2 = RankableAction(id='ice cream', features=[{"taste":"sweet", "spice_level":"none"}, { "nutritional_level": 2 }])
    action3 = RankableAction(id='juice', features=[{"taste":"sweet", 'spice_level':'none'}, {'nutritional_level': 5}, {'drink':True}])
    action4 = RankableAction(id='salad', features=[{'taste':'salty', 'spice_level':'none'},{'nutritional_level': 2}])
    return [action1, action2, action3, action4]
def get_user_timeofday():
    res={}
    time_features = ["morning", "afternoon", "evening", "night"]
    time = input("What time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night\n")
    try:
        ptime = int(time)
        if(ptime<=0 or ptime>len(time_features)):
            raise IndexError
        res['time_of_day'] = time_features[ptime-1]
    except (ValueError, IndexError):
        print("Entered value is invalid. Setting feature value to", time_features[0] + ".")
        res['time_of_day'] = time_features[0]
    return res
def get_user_preference():
    res = {}
    taste_features = ['salty','sweet']
    pref = input("What type of food would you prefer? Enter number 1.salty 2.sweet\n")
    
    try:
        ppref = int(pref)
        if(ppref<=0 or ppref>len(taste_features)):
            raise IndexError
        res['taste_preference'] = taste_features[ppref-1]
    except (ValueError, IndexError):
        print("Entered value is invalid. Setting feature value to", taste_features[0]+ ".")
        res['taste_preference'] = taste_features[0]
    return res

A tanulási ciklus létrehozása

A Personalizer tanulási ciklus a Rangsor és a Reward hívások ciklusa. Ebben a rövid útmutatóban minden ranghívást a tartalom személyre szabása érdekében egy díjhívás követ, amely megszabja a Personalizernek, hogy milyen jól teljesített a szolgáltatás.

Az alábbi kód ciklikusan megkérdezi a felhasználót a parancssorból, elküldi az információkat a Personalizernek, hogy válassza ki a legjobb műveletet, bemutatja a listában választható lehetőséget az ügyfélnek, majd egy jutalmat küld a Personalizernek, jelezve, hogy milyen jól választott a szolgáltatás.

keep_going = True
while keep_going:

    eventid = str(uuid.uuid4())

    context = [get_user_preference(), get_user_timeofday()]
    actions = get_actions()

    rank_request = RankRequest( actions=actions, context_features=context, excluded_actions=['juice'], event_id=eventid)
    response = client.rank(rank_request=rank_request)
    
    print("Personalizer service ranked the actions with the probabilities listed below:")
    
    rankedList = response.ranking
    for ranked in rankedList:
        print(ranked.id, ':',ranked.probability)

    print("Personalizer thinks you would like to have", response.reward_action_id+".")
    answer = input("Is this correct?(y/n)\n")[0]

    reward_val = "0.0"
    if(answer.lower()=='y'):
        reward_val = "1.0"
    elif(answer.lower()=='n'):
        reward_val = "0.0"
    else:
        print("Entered choice is invalid. Service assumes that you didn't like the recommended food choice.")

    client.events.reward(event_id=eventid, value=reward_val)

    br = input("Press Q to exit, any other key to continue: ")
    if(br.lower()=='q'):
        keep_going = False

A kódfájl futtatása előtt adja hozzá a következő metódusokat, amelyek lekérte a tartalomválasztásokat:

  • get_user_preference
  • get_user_timeofday
  • get_actions

A legjobb művelet kérése

A Rank kérés befejezéséhez a program megkéri a felhasználó beállításait, hogy hozzanak létre egy currentContent tartalomválasztási lehetőséget. A folyamat létrehozhat a műveletekből kizárni képes tartalmakat, amelyek a következőként jelennek meg: excludeActions . A Rank kérésnek szüksége van a műveletekre és azok funkcióira, a currentContext funkciókra, az excludeActions-re és egy egyedi eseményazonosítóra a válasz fogadása érdekében.

Ez a rövid útmutató egyszerű környezeti funkciókkal rendelkezik a nap adott időszakában és a felhasználói élelmiszerekkel kapcsolatban. Éles rendszerekben a műveletek és funkciók meghatározása és kiértékelése nem triviális dolog lehet.

rank_request = RankRequest( actions=actions, context_features=context, excluded_actions=['juice'], event_id=eventid)
response = client.rank(rank_request=rank_request)

Jutalmi díj küldése

A Reward kérésben küldhető jutalompontszám lekérése esetén a program lekérte a felhasználó által kiválasztott adatokat a parancssorból, numerikus értéket rendel a kijelöléshez, majd elküldi az egyedi eseményazonosítót és a jutalmat numerikus értékként a Reward API-nak.

Ez a rövid útmutató egy egyszerű számot rendel hozzá jutalompontszámként, amely nulla vagy 1 lehet. Éles rendszerekben az adott igényektől függően nem triviális tényező lehet annak meghatározása, hogy mikor és mit kell küldeni a Reward hívásnak.

reward_val = "0.0"
if(answer.lower()=='y'):
    reward_val = "1.0"
elif(answer.lower()=='n'):
    reward_val = "0.0"
else:
    print("Entered choice is invalid. Service assumes that you didn't like the recommended food choice.")

client.events.reward(event_id=eventid, value=reward_val)

A program futtatása

Futtassa az alkalmazást a pythonnal az alkalmazás könyvtárából.

python sample.py

A gyorsindítási program feltehet néhány kérdést a felhasználói beállítások,más néven a funkciók gyűjtése érdekében, majd a legfontosabb műveletet biztosítja.

Az erőforrások eltávolítása

Ha Cognitive Services-előfizetést szeretne törölni, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlésével a hozzá társított egyéb erőforrások is törlődnek.

Következő lépések