Hızlı Başlangıç: Kişiselleştirme istemci kitaplığı
Önemli
20 Eylül 2023 tarihinden itibaren yeni Kişiselleştirme kaynakları oluşturamayacaksınız. Kişiselleştirme hizmeti 1 Ekim 2026'da kullanımdan kaldırılıyor.
Temel bir öğrenme döngüsü ayarlamak için Azure AI Kişiselleştirme istemci kitaplıklarını kullanmaya başlayın. Öğrenme döngüsü bir karar ve geri bildirim sistemidir: Bir uygulama hizmetten bir karar derecelendirmesi talep eder, ardından en üst sıradaki seçimi kullanır ve sonuçtan bir ödül puanı hesaplar. Ödül puanını hizmete döndürür. Zaman içinde Kişiselleştirici, belirli bir bağlamda daha iyi kararlar almak için yapay zeka algoritmalarını kullanır. Örnek bir uygulama ayarlamak için bu adımları izleyin.
Örnek senaryo
Bu hızlı başlangıçta, bir market e-perakendecisi web sitesinde her müşteriye ilgili ve kişiselleştirilmiş ürünler göstererek geliri artırmak istiyor. Ana sayfada, potansiyel müşterilere hazırlanan bir yemek ürününü gösteren bir "Öne Çıkan Ürün" bölümü vardır. E-perakendeci, satın alma olasılığını en üst düzeye çıkarmak için doğru ürünün doğru müşteriye nasıl gösterileceğini belirlemek istiyor.
Kişiselleştirme hizmeti, pekiştirici öğrenmeyi kullanarak bu sorunu otomatik, ölçeklenebilir ve uyarlanabilir bir şekilde çözer. Eylemleri ve bunların özelliklerini, bağlam özelliklerini ve ödül puanlarını oluşturmayı öğreneceksiniz. Rank ve Reward API'lerine çağrı yapmak için Kişiselleştirme istemci kitaplığını kullanacaksınız.
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (NuGet) | .NET kod örneği
Önkoşullar
- Azure aboneliği - Ücretsiz olarak oluşturun
- .NET Core'un geçerli sürümü.
- Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında bir Kişiselleştirme kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa git'i seçin.
- Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız olacaktır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde aşağıdaki koda yapıştıracaksınız.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
Model yapılandırması
Model güncelleştirme sıklığını değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.
Ödül bekleme süresini değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.
Yeni bir C# uygulaması oluşturma
Tercih ettiğiniz düzenleyicide veya IDE'de yeni bir .NET Core uygulaması oluşturun.
Bir konsol penceresinde (cmd, PowerShell veya Bash gibi), adlı personalizer-quickstart
yeni bir konsol uygulaması oluşturmak için komutunu kullanındotnet new
. Bu komut, tek bir kaynak dosyasıyla basit bir "Merhaba Dünya" C# projesi oluşturur: Program.cs
.
dotnet new console -n personalizer-quickstart
Dizininizi yeni oluşturulan uygulama klasörüyle değiştirin. Ardından aşağıdakilerle uygulamayı derleyin:
dotnet build
Derleme çıkışı hiçbir uyarı veya hata içermemelidir.
...
Build succeeded.
0 Warning(s)
0 Error(s)
...
İstemci kitaplığını yükleme
Uygulama dizininde, .NET için Kişiselleştirme istemci kitaplığını aşağıdaki komutla yükleyin:
dotnet add package Microsoft.Azure.CognitiveServices.Personalizer --version 1.0.0
İpucu
Visual Studio IDE kullanıyorsanız, istemci kitaplığı indirilebilir bir NuGet paketi olarak kullanılabilir.
Kod bloğu 1: Örnek veri oluşturma
Kişiselleştirme, gerçek zamanlı verileri alan ve yorumlayan uygulamalarda çalışacak şekilde tasarlanmıştır. Bu hızlı başlangıçta, bir market web sitesinde hayali müşteri eylemleri oluşturmak için örnek kodu kullanacaksınız. Aşağıdaki kod bloğu üç temel yöntemi tanımlar: GetActions, GetContext ve GetRewardScore.
GetActions , market web sitesinin derecelendirmesi gereken seçeneklerin listesini döndürür. Bu örnekte eylemler yemek ürünleridir. Her eylem seçimi, daha sonra kullanıcı davranışını etkileyebilecek ayrıntılara (özelliklere) sahiptir. Eylemler, Rank API'sinde giriş olarak kullanılır
GetContext , sanal müşteri ziyaretini döndürür. Hangi müşterinin mevcut olduğu ve ziyaretin hangi saatte gerçekleştiği gibi rastgele ayrıntıları (bağlam özellikleri) seçer. Genel olarak bağlam uygulamanızın, sisteminizin, ortamınızın veya kullanıcınızın geçerli durumunu temsil eder. Bağlam nesnesi, Rank API'sinin girişi olarak kullanılır.
Bu hızlı başlangıçtaki bağlam özellikleri basit bir işlemdir. Ancak gerçek bir üretim sisteminde özelliklerinizi tasarlamak ve bunların verimliliğini değerlendirmek önemlidir. Yönergeler için bağlantılı belgelere bakın.
GetRewardScore , bir müşteri etkileşiminin başarısını temsil eden sıfır ile bir arasında bir puan döndürür. Farklı bağlamların farklı eylem seçeneklerine nasıl yanıt verdiğini belirlemek için basit mantık kullanır. Örneğin, belirli bir kullanıcı vejetaryen ve vegan ürünler için her zaman 1.0 ve diğer ürünler için 0.0 verir. Gerçek bir senaryoda Kişiselleştirme, Rank ve Reward API çağrılarında gönderilen verilerden kullanıcı tercihlerini öğrenir. Bunları örnek kodda olduğu gibi açıkça tanımlamayacaksınız.
Gerçek bir üretim sisteminde ödül puanı, iş hedeflerinize ve KPI'lerinize uygun şekilde tasarlanmalıdır. Ödül ölçümünü hesaplamayı belirlemek için biraz deneme gerekebilir.
Aşağıdaki kodda, kullanıcıların eylemlere yönelik tercihleri ve yanıtları bir dizi koşullu deyim olarak sabit olarak kodlanmıştır ve açıklayıcı metin, açıklayıcı amaçlarla koda dahil edilir.
Anahtarınızı ve uç noktanızı bulun.
Önemli
Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.
Program.cs bir metin düzenleyicisinde veya IDE'de açın ve aşağıdaki kodu yapıştırın.
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; } // ...
Anahtarınızı ve uç noktanızı kodda belirtilen konuma yapıştırın. Uç noktanız biçimindedir
https://<your_resource_name>.cognitiveservices.azure.com/
.
Kod bloğu 2: Öğrenme döngüsünü yineleme
Sonraki kod bloğu, ana yöntemi tanımlar ve betiği kapatır. Bir bağlam oluşturduğu (müşteri dahil) bir öğrenme döngüsü yinelemesi çalıştırır, Sıralama API'sini kullanarak bu bağlamdaki eylemlerin derecelendirmesini ister, ödül puanını hesaplar ve Ödül API'sini kullanarak bu puanı Kişiselleştirme hizmetine geri geçirir. Her adımda konsola ilgili bilgileri yazdırır.
Bu örnekte, "Öne Çıkan Ürün" bölümünde hangi ürünün görüntülenmesi gerektiğini belirlemek için her Derece çağrısı yapılır. Ardından Reward çağrısı, öne çıkan ürünün kullanıcı tarafından satın alınıp alınmadığını belirtir. Ödüller, ortak EventId
bir değer aracılığıyla kararlarıyla ilişkilendirilir.
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();
}
}
Programı çalıştırma
Uygulamayı uygulama dizininizdeki dotnet dotnet run
komutuyla çalıştırın.
dotnet run
İlk yinelemede Kişiselleştirici, henüz herhangi bir eğitim yapmadığından rastgele bir eylem önerir. İsteğe bağlı olarak daha fazla yineleme çalıştırabilirsiniz. Yaklaşık 10 dakika sonra hizmet, önerilerinde iyileştirmeler göstermeye başlar.
Analiz için birçok olay oluşturma (isteğe bağlı)
Bu hızlı başlangıç senaryosundan kolayca 5.000 olay oluşturabilirsiniz. Bu, Çırak modu ve Çevrimiçi modu kullanma, çevrimdışı değerlendirmeleri çalıştırma ve özellik değerlendirmeleri oluşturma deneyimi elde etmek için yeterlidir. Yukarıdaki ana yöntemi şununla değiştirin:
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);
}
Başvuru belgeleri | Paketi (npm) | Hızlı Başlangıç kod örneği
Önkoşullar
- Azure aboneliği - Ücretsiz olarak oluşturun
- Node.js ve npm'yi yükleyin (Node.js v14.16.0 ve npm 6.14.11 ile doğrulanır).
- Azure aboneliğinizi aldıktan sonra anahtarınızı ve uç noktanızı almak için Azure portalında bir Kişiselleştirme kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa git'i seçin.
- Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız olacaktır. Anahtarınızı ve uç noktanızı hızlı başlangıcın ilerleyen bölümlerinde aşağıdaki koda yapıştıracaksınız.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilirsiniz.
Model yapılandırması
Model güncelleştirme sıklığını değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.
Ödül bekleme süresini değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.
Yeni bir Node.js uygulaması oluşturma
Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.
mkdir myapp && cd myapp
npm init -y
Bir dosya oluşturmak package.json
için komutunu çalıştırın.
npm init -y
Tercih ettiğiniz düzenleyicide veya IDE'de adlı personalizer-quickstart.js
yeni bir Node.js betiği oluşturun ve kaynağınızın uç noktası ve abonelik anahtarı için değişkenler oluşturun.
İstemci kitaplığını yükleme
Node.js için Kişiselleştirme istemci kitaplığını aşağıdaki komutla yükleyin:
npm install @azure/cognitiveservices-personalizer --save
Bu hızlı başlangıç için kalan npm paketlerini yükleyin:
npm install @azure/ms-rest-azure-js @azure/ms-rest-js readline-sync uuid --save
Kod bloğu 1: Örnek veri oluşturma
Kişiselleştirme, gerçek zamanlı verileri alan ve yorumlayan uygulamalarda çalışacak şekilde tasarlanmıştır. Bu hızlı başlangıçta, bir market web sitesinde hayali müşteri eylemleri oluşturmak için örnek kodu kullanacaksınız. Aşağıdaki kod bloğu üç temel yöntemi tanımlar: getActionsList, getContextFeaturesList ve getReward.
getActionsList , market web sitesinin derecelendirmesi gereken seçeneklerin listesini döndürür. Bu örnekte eylemler yemek ürünleridir. Her eylem seçimi, daha sonra kullanıcı davranışını etkileyebilecek ayrıntılara (özelliklere) sahiptir. Eylemler, Rank API'sinde giriş olarak kullanılır
getContextFeaturesList , sanal bir müşteri ziyareti döndürür. Hangi müşterinin mevcut olduğu ve ziyaretin hangi saatte gerçekleştiği gibi rastgele ayrıntıları (bağlam özellikleri) seçer. Genel olarak bağlam uygulamanızın, sisteminizin, ortamınızın veya kullanıcınızın geçerli durumunu temsil eder. Bağlam nesnesi, Rank API'sinin girişi olarak kullanılır.
Bu hızlı başlangıçtaki bağlam özellikleri basit bir işlemdir. Ancak gerçek bir üretim sisteminde özelliklerinizi tasarlamak ve bunların verimliliğini değerlendirmek önemlidir. Yönergeler için bağlantılı belgelere bakın.
getReward , kullanıcıdan hizmetin önerisini başarılı veya başarısız olarak puanlamasını ister. Sıfır ile müşteri etkileşiminin başarısını temsil eden bir puan döndürür. Gerçek bir senaryoda, Kişiselleştirici gerçek zamanlı müşteri etkileşimlerinden kullanıcı tercihlerini öğrenecektir.
Gerçek bir üretim sisteminde ödül puanı, iş hedeflerinize ve KPI'lerinize uygun şekilde tasarlanmalıdır. Ödül ölçümünü hesaplamayı belirlemek için biraz deneme gerekebilir.
personalizer-quickstart.js bir metin düzenleyicisinde veya IDE'de açın ve aşağıdaki kodu yapıştırın.
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
}
]
}
];
}
Kod bloğu 2: Öğrenme döngüsünü yineleme
Sonraki kod bloğu, ana yöntemi tanımlar ve betiği kapatır. Kullanıcıya komut satırında tercihlerini sorduğu ve en iyi eylemi seçmek için bu bilgileri Kişiselleştirme'ye gönderdiği bir öğrenme döngüsü yinelemesi çalıştırır. Seçili eylemi, komut satırını kullanarak bir seçim yapan kullanıcıya sunar. Ardından, hizmetin seçiminde ne kadar iyi olduğunu işaret etmek için Kişiselleştirme hizmetine bir ödül puanı gönderir.
Kişiselleştirme öğrenme döngüsü, Rank ve Reward çağrılarının bir döngüsüdür. Bu hızlı başlangıçta, içeriği kişiselleştirmek için yapılan her Sıralama çağrısının ardından Hizmetin ne kadar iyi performans sergilediğini kişiselleştirmek için bir Reward çağrısı yapılır.
aşağıdaki kodu personalizer-quickstart.js ekleyin.
Anahtarınızı ve uç noktanızı bulun. Uç noktanız biçimindedir
https://<your_resource_name>.cognitiveservices.azure.com/
.Önemli
Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.
Anahtarınızı ve uç noktanızı kodda belirtilen konuma yapıştırın.
Önemli
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Güvenlik hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.
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));
Programı çalıştırma
Uygulamayı uygulama dizininizden Node.js komutuyla çalıştırın.
node personalizer-quickstart.js
Birkaç öğrenme döngüsüyle yineleme yapın. Yaklaşık 10 dakika sonra hizmet, önerilerinde iyileştirmeler göstermeye başlar.
Başvuru belgeleri | Kitaplık kaynak kodu | Paketi (pypi) | Hızlı başlangıç kodu örneği
Önkoşullar
- Azure aboneliği - Ücretsiz olarak oluşturun
- Python 3.x
- Azure aboneliğiniz ayarlandıktan sonra Azure portalında bir Kişiselleştirme kaynağı oluşturun ve anahtarınızı ve uç noktanızı alın. Dağıtıldıktan sonra Kaynağa git'i seçin.
- Uygulamanızı Kişiselleştirme API'sine bağlamak için oluşturulan kaynaktan alınan anahtara ve uç noktaya ihtiyacınız olacak ve bu anahtarı aşağıdaki hızlı başlangıç koduna yapıştıracaksınız.
- Hizmeti denemek için ücretsiz fiyatlandırma katmanını (
F0
) kullanabilir ve daha sonra üretim için ücretli bir katmana yükseltebilirsiniz.
Model yapılandırması
Model güncelleştirme sıklığını değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Model güncelleştirme sıklığını 30 saniye olarak değiştirin. Bu kısa süre modeli hızla eğiterek önerilen eylemin her yineleme için nasıl değiştiğini görmenizi sağlar.
Ödül bekleme süresini değiştirme
Azure portalında Kişiselleştirme kaynağınızın Yapılandırma sayfasına gidin ve Ödül bekleme süresini 10 dakika olarak değiştirin. Bu, bir öneri gönderdikten sonra modelin öneriden ödül geri bildirimi almak için ne kadar bekleyeceğini belirler. Ödül bekleme süresi geçene kadar eğitim gerçekleşmez.
Yeni Python uygulaması oluşturma
personalizer-quickstart.py adlı yeni bir Python dosyası oluşturun.
İstemci kitaplığını yükleme
Kişiselleştirici istemci kitaplığını pip ile yükleyin:
pip install azure-cognitiveservices-personalizer
Kod bloğu 1: Örnek veri oluşturma
Kişiselleştirme, gerçek zamanlı verileri alan ve yorumlayan uygulamalarda çalışacak şekilde tasarlanmıştır. Bu hızlı başlangıcın amacı doğrultusunda, bir market web sitesinde hayali müşteri eylemleri oluşturmak için örnek kodu kullanacaksınız. Aşağıdaki kod bloğu üç temel işlevi tanımlar: get_actions, get_context ve get_reward_score.
get_actions, market web sitesinin derecelendirmesi gereken seçeneklerin listesini döndürür. Bu örnekte eylemler yemek ürünleridir. Her eylem seçimi, daha sonra kullanıcı davranışını etkileyebilecek ayrıntılara (özelliklere) sahiptir. Eylemler, Rank API'sinde giriş olarak kullanılır
get_context, sanal müşteri ziyaretini döndürür. Hangi müşterinin mevcut olduğu ve ziyaretin hangi saatte gerçekleştiği gibi rastgele ayrıntıları (bağlam özellikleri) seçer. Genel olarak bağlam uygulamanızın, sisteminizin, ortamınızın veya kullanıcınızın geçerli durumunu temsil eder. Bağlam nesnesi, Rank API'sinin girişi olarak kullanılır.
Bu hızlı başlangıçtaki bağlam özellikleri basit bir işlemdir. Ancak gerçek bir üretim sisteminde, özelliklerinizi tasarlamak ve bunların verimliliğini değerlendirmek çok önemlidir. Yönergeler için bağlantılı belgelere bakın.
get_reward_score, sıfır ile müşteri etkileşiminin başarısını temsil eden bir puan döndürür. Farklı bağlamların farklı eylem seçeneklerine nasıl yanıt vereceğini belirlemek için basit mantık kullanır. Örneğin, belirli bir kullanıcı vejetaryen ve vegan ürünler için her zaman 1.0 ve diğer ürünler için 0.0 verir. Gerçek bir senaryoda Kişiselleştirme, Rank ve Reward API çağrılarında gönderilen verilerden kullanıcı tercihlerini öğrenir. Bunları örnek kodda olduğu gibi açıkça tanımlamayacaksınız.
Gerçek bir üretim sisteminde ödül puanı, iş hedeflerinize ve KPI'lerinize uygun şekilde tasarlanmalıdır. Ödül ölçümünü hesaplamayı belirlemek için biraz deneme gerekebilir.
Aşağıdaki kodda, kullanıcıların eylemlere yönelik tercihleri ve yanıtları bir dizi koşullu deyim olarak sabit olarak kodlanmıştır ve açıklayıcı metin, açıklayıcı amaçlarla koda dahil edilir.
Kişiselleştirme betiğini ayarlamak için bu adımları izleyin.
Anahtarınızı ve uç noktanızı bulun.
Önemli
Azure portalına gidin. Önkoşullar bölümünde oluşturduğunuz Kişiselleştirme kaynağı başarıyla dağıtıldıysa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için kimlik bilgilerinizi depolamak ve bunlara erişmek için güvenli bir yol kullanmayı göz önünde bulundurun. Örneğin, Azure anahtar kasası.
personalizer-quickstart.py bir metin düzenleyicisinde veya IDE'de açın ve aşağıdaki kodu yapıştırın.
Anahtarınızı ve uç noktanızı kodda belirtilen konuma yapıştırın. Uç noktanız biçimindedir
https://<your_resource_name>.cognitiveservices.azure.com/
.
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
# ...
Kod bloğu 2: Öğrenme döngüsünü yineleme
Sonraki kod bloğu, run_personalizer_cycle işlevini tanımlar ve basit bir kullanıcı geri bildirim döngüsünde çağırır. Bir bağlam oluşturduğu (müşteri dahil) bir öğrenme döngüsü yinelemesi çalıştırır, Sıralama API'sini kullanarak bu bağlamdaki eylemlerin derecelendirmesini ister, ödül puanını hesaplar ve Ödül API'sini kullanarak bu puanı Kişiselleştirme hizmetine geri geçirir. Her adımda konsola ilgili bilgileri yazdırır.
Bu örnekte, "Öne Çıkan Ürün" bölümünde hangi ürünün görüntülenmesi gerektiğini belirlemek için her Derece çağrısı yapılır. Ardından Reward çağrısı, öne çıkan ürünün kullanıcı tarafından satın alınıp alınmadığını belirtir. Ödüller, ortak EventId
bir değer aracılığıyla kararlarıyla ilişkilendirilir.
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
Programı çalıştırma
Yukarıdaki kodun tümü Python dosyanıza eklendikten sonra uygulama dizininizden çalıştırabilirsiniz.
python personalizer-quickstart.py
İlk yinelemede Kişiselleştirici, henüz herhangi bir eğitim yapmadığından rastgele bir eylem önerir. İsteğe bağlı olarak daha fazla yineleme çalıştırabilirsiniz. Yaklaşık 10 dakika sonra hizmet, önerilerinde iyileştirmeler göstermeye başlar.
Analiz için birçok olay oluşturma (isteğe bağlı)
Bu hızlı başlangıç senaryosundan kolayca 5.000 olay oluşturabilirsiniz. Bu, Çırak modu, Çevrimiçi mod, çevrimdışı değerlendirmeler çalıştırma ve özellik değerlendirmeleri oluşturma deneyimi elde etmek için yeterlidir. while
Yukarıdaki kod bloğundaki döngüsünü aşağıdaki kodla değiştirin.
for i in range(0,1000):
run_personalizer_cycle()
Eğitilen modeli indirme
Yukarıdaki örnekten 5.000 olay üzerinde eğitilmiş bir Kişiselleştirme modeli indirmek isterseniz Kişiselleştirme Örnekleri deposunu ziyaret edin ve Personalizer_QuickStart_Model.zip dosyasını indirin. Ardından Azure portalında Kişiselleştirme kaynağınıza gidin, Kurulum sayfasına ve İçeri/dışarı aktarma sekmesine gidin ve dosyayı içeri aktarın.
Kaynakları temizleme
Azure AI hizmetleri aboneliğinizi temizlemek için kaynağı silebilir veya kaynak grubunu silebilirsiniz; bu da ilişkili kaynakları siler.