البدء السريع: مكتبة عميل Personalizer

هام

اعتبارا من 20 سبتمبر 2023، لن تتمكن من إنشاء موارد Personalizer جديدة. يتم إيقاف خدمة Personalizer في 1 أكتوبر 2026.

ابدأ مع مكتبات عميل Azure الذكاء الاصطناعي Personalizer لإعداد حلقة تعلم أساسية. حلقة التعلم هي نظام من القرارات والملاحظات: يطلب التطبيق تحديد مرتبة القرار من الخدمة، ثم يستخدم الخيار الأعلى مرتبة ويحسب درجة المكافأة من النتيجة. يقوم بإرجاع نقاط المكافأة إلى الخدمة. بمرور الوقت، يستخدم Personalizer خوارزميات الذكاء الاصطناعي لاتخاذ قرارات أفضل لأي سياق معين. اتبع هذه الخطوات لإعداد نموذج تطبيق.

سيناريو مثال

في هذا التشغيل السريع، يريد بائع التجزئة الإلكتروني للبقالة زيادة الإيرادات من خلال عرض المنتجات ذات الصلة والمخصصة لكل عميل على موقعه على الويب. في الصفحة الرئيسية، يوجد قسم "المنتج المميز" الذي يعرض منتج وجبة معد للعملاء المحتملين. يرغب بائع التجزئة الإلكتروني في تحديد كيفية إظهار المنتج المناسب للعميل المناسب من أجل زيادة احتمالية الشراء إلى أقصى حد.

تحل خدمة Personalizer هذه المشكلة بطريقة تلقائية وقابلة للتطوير وقابلة للتكيف باستخدام التعلم المعزز. ستتعلم كيفية إنشاء الإجراءات وميزاتها وميزات السياق ودرجات المكافأة. ستستخدم مكتبة عميل Personalizer لإجراء مكالمات إلى واجهات برمجة تطبيقات التنصيف والمكافأة.

الوثائق المرجعية | التعليمات البرمجية لمصدر المكتبة | الحزمة (NuGet) | نموذج التعليمات البرمجية لـ .NET

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • الإصدار الحالي من .NET Core.
  • بمجرد حصولك على اشتراك Azure، قم بإنشاء مورد Personalizer في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. بعد انتشاره، حدد "Go to resource".
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل تطبيقك بواجهة برمجة تطبيقات Personalizer. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في التشغيل السريع.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

تكوين النموذج

تغيير تكرار تحديث النموذج.

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير تكرار تحديث النموذج إلى 30 ثانية. ستدرب هذه المدة القصيرة النموذج بسرعة، ما يسمح لك بالاطلاع على كيفية تغيير الإجراء الموصى به لكل تكرار.

تغيير تكرار تحديث النموذج.

تغيير وقت انتظار المكافأة

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير وقت انتظار المكافأة إلى 10 دقائق. يحدد هذا المدة التي سينتظرها النموذج بعد إرسال توصية، لتلقي ملاحظات المكافأة من تلك التوصية. لن يحدث التدريب حتى انقضاء وقت انتظار المكافأة.

تغيير وقت انتظار المكافأة

إنشاء تطبيق C# جديد

إنشاء تطبيق جديد.NET Core في المحرر المفضل لديك أو IDE.

في نافذة وحدة تحكم (مثل cmd أو PowerShell أو Bash)، استخدم الأمر ⁧dotnet new⁩ لإنشاء تطبيق وحدة تحكم جديد بالاسم ⁧personalizer-quickstart⁩. يقوم هذا الأمر بإنشاء مشروع "Hello World" بسيط بلغة C# باستخدام ملف مصدر واحد: Program.cs.

dotnet new console -n personalizer-quickstart

غيّر دليلك إلى مجلد التطبيق المنشأ حديثاً. ثم أنشئ التطبيق باستخدام:

dotnet build

يجب ألا يحتوي إخراج البناء على تحذيرات أو أخطاء.

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

تثبيت مكتبة العميل

ضمن دليل التطبيق، قم بتثبيت مكتبة العميل Personalizer لـ .NET مع الأمر التالي:

dotnet add package Microsoft.Azure.CognitiveServices.Personalizer --version 1.0.0

تلميح

إذا كنت تستخدم Visual Studio IDE، تتوفر مكتبة العميل كحزمة NuGet قابلة للتحميل.

كتلة التعليمات البرمجية 1: إنشاء بيانات نموذجية

يهدف Personalizer إلى التشغيل على التطبيقات التي تتلقى وتفسر البيانات في الوقت الفعلي. في هذا التشغيل السريع، ستستخدم نموذج التعليمات البرمجية لإنشاء إجراءات عملاء وهمية على موقع ويب البقالة. تحدد كتلة التعليمات البرمجية التالية ثلاث طرق رئيسية: GetActions و GetContext و GetRewardScore.

  • تقوم GetActions بإرجاع قائمة بالخيارات التي يحتاج موقع البقالة إلى ترتيبها. في هذا المثال، الإجراءات هي منتجات الوجبات. يحتوي كل خيار إجراء على تفاصيل (ميزات) قد تؤثر على سلوك المستخدم لاحقا. يتم استخدام الإجراءات كمدخل لواجهة برمجة تطبيقات Rank

  • يقوم GetContext بإرجاع زيارة عميل تمت محاكاتها. وهو يحدد التفاصيل العشوائية (ميزات السياق) مثل العميل الموجود والوقت من اليوم الذي تجري فيه الزيارة. بشكل عام، يمثل السياق الحالة الحالية للتطبيق أو النظام أو البيئة أو المستخدم. يتم استخدام كائن السياق كإدخل لواجهة برمجة تطبيقات Rank.

    ميزات السياق في هذا التشغيل السريع مبسطة. ومع ذلك، في نظام إنتاج حقيقي، فإن تصميم ميزاتك وتقييم فعاليتها أمر مهم. راجع الوثائق المرتبطة للحصول على إرشادات.

  • يقوم GetRewardScore بإرجاع درجة بين صفر وواحد يمثل نجاح تفاعل العميل. ويستخدم منطقا بسيطا لتحديد كيفية استجابة السياقات المختلفة لخيارات الإجراءات المختلفة. على سبيل المثال، سيعطي مستخدم معين دائما 1.0 للمنتجات النباتية والنباتية، و0.0 للمنتجات الأخرى. في سيناريو حقيقي، سيتعلم Personalizer تفضيلات المستخدم من البيانات المرسلة في استدعاءات واجهة برمجة التطبيقات Rank وReward. لن تقوم بتعريف هذه بشكل صريح كما هو الحال في مثال التعليمات البرمجية.

    في نظام إنتاج حقيقي، يجب تصميم نقاط المكافأة لتتماشى مع أهداف عملك ومؤشرات الأداء الرئيسية. قد يتطلب تحديد كيفية حساب مقياس المكافأة بعض التجريب.

    في التعليمات البرمجية أدناه، يتم ترميز تفضيلات المستخدمين واستجاباتهم للإجراءات بشكل مضمن كسلسلة من العبارات الشرطية، ويتم تضمين نص توضيحي في التعليمات البرمجية لأغراض توضيحية.

  1. ابحث عن المفتاح ونقطة النهاية.

    هام

    انتقل إلى مدخل Azure. إذا تم نشر مورد Personalizer الذي أنشأته في قسم المتطلبات الأساسية بنجاح، فانقر فوق الزر Go to Resource ضمن Next Steps. يمكنك العثور على مفتاحك ونقطة النهاية في صفحة المفتاح ونقطة النهاية للمورد ضمن إدارة المورد.

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، ضَع في اعتبارك استخدام طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها. على سبيل المثال، Azure key vault.

  2. افتح Program.cs في محرر نص أو IDE والصقها في التعليمات البرمجية التالية.

    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. الصَق مفتاحك ونقطة نهايتك داخل التعليمات البرمجية في المكان المُشار إليه. تحتوي نقطة النهاية على النموذج https://<your_resource_name>.cognitiveservices.azure.com/.

    هام

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. راجع مقالة أمان خدمات Azure الذكاء الاصطناعي للحصول على مزيد من المعلومات.

كتلة التعليمات البرمجية 2: تكرار حلقة التعلم

تحدد الكتلة التالية من التعليمات البرمجية الأسلوب الرئيسي وتغلق البرنامج النصي. يقوم بتشغيل تكرار حلقة تعلم، حيث يقوم بإنشاء سياق (بما في ذلك العميل)، ويطلب ترتيب الإجراءات في هذا السياق باستخدام واجهة برمجة تطبيقات Rank، ويحسب درجة المكافأة، ويمرر النقاط مرة أخرى إلى خدمة Personalizer باستخدام واجهة برمجة تطبيقات المكافأة. يقوم بطباعة المعلومات ذات الصلة إلى وحدة التحكم في كل خطوة.

في هذا المثال، يتم إجراء كل استدعاء Rank لتحديد المنتج الذي يجب عرضه في قسم "المنتج المميز". ثم يشير استدعاء Reward إلى ما إذا كان المستخدم قد اشترى المنتج المميز أم لا. ترتبط Rewards بقراراتها من خلال قيمة مشتركة EventId .

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

}

قم بتشغيل البرنامج.

قم بتشغيل التطبيق باستخدام الأمر dotnet dotnet run من دليل التطبيق الخاص بك.

dotnet run

في التكرار الأول، سيوصي Personalizer بإجراء عشوائي، لأنه لم يقم بأي تدريب حتى الآن. يمكنك اختياريا تشغيل المزيد من التكرارات. بعد حوالي 10 دقائق، ستبدأ الخدمة في إظهار التحسينات في توصياتها.

برنامج التشغيل السريع يسأل بضعة أسئلة لجمع تفضيلات المستخدم، والمعروفة باسم الميزات، ثم يوفر الإجراء أعلاه.

إنشاء العديد من الأحداث للتحليل (اختياري)

يمكنك بسهولة إنشاء 5000 حدث من سيناريو التشغيل السريع هذا، على سبيل المثال، وهو ما يكفي للحصول على خبرة في استخدام وضع المبتدئ ووضع الإنترنت، وتشغيل التقييمات دون اتصال، وإنشاء تقييمات الميزات. استبدل الأسلوب الرئيسي أعلاه ب:

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

تتوفر التعليمات البرمجية المصدر لهذا التشغيل السريع على GitHub.

حزمة الوثائق | المرجعية (npm) | نموذج التعليمات البرمجية للتشغيل السريع

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • قم بتثبيت Node.js وnpm (تم التحقق منهما باستخدام Node.js v14.16.0 وnpm 6.14.11).
  • بمجرد حصولك على اشتراك Azure، قم بإنشاء مورد Personalizer في مدخل Microsoft Azure للحصول على المفتاح ونقطة النهاية. بعد انتشاره، حدد "Go to resource".
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تقوم بإنشائه لتوصيل تطبيقك بواجهة برمجة تطبيقات Personalizer. ستلصق المفتاح ونقطة النهاية في التعليمات البرمجية أدناه لاحقًا في التشغيل السريع.
    • يمكنك استخدام مستوى التسعير الحر (F0) لتجربة الخدمة، والترقية لاحقًا إلى مستوى مدفوع للإنتاج.

تكوين النموذج

تغيير تكرار تحديث النموذج.

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير تكرار تحديث النموذج إلى 30 ثانية. ستدرب هذه المدة القصيرة النموذج بسرعة، ما يسمح لك بالاطلاع على كيفية تغيير الإجراء الموصى به لكل تكرار.

تغيير تكرار تحديث النموذج.

تغيير وقت انتظار المكافأة

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير وقت انتظار المكافأة إلى 10 دقائق. يحدد هذا المدة التي سينتظرها النموذج بعد إرسال توصية، لتلقي ملاحظات المكافأة من تلك التوصية. لن يحدث التدريب حتى انقضاء وقت انتظار المكافأة.

تغيير وقت انتظار المكافأة

إنشاء تطبيق Node.js جديد

في إطار نافذة وحدة التحكم (مثل cmd أو PowerShell أو Bash)، يمكنك إنشاء دليل جديد لتطبيقك وانتقل إليه.

mkdir myapp && cd myapp

استخدم الأمر npm init -y لإنشاء ملف.package.json

npm init -y

إنشاء برنامج نصي Node.js جديد في المحرر المفضل لديك أو IDE المسمى personalizer-quickstart.js وإنشاء متغيرات لنقطة نهاية المورد ومفتاح الاشتراك.

تثبيت مكتبة العميل

تثبيت مكتبة عميل Personalizer لـNode.js من خلال الأمر التالي:

npm install @azure/cognitiveservices-personalizer --save

تثبيت حزم npm المتبقية لهذا التشغيل السريع:

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

كتلة التعليمات البرمجية 1: إنشاء بيانات نموذجية

يهدف Personalizer إلى التشغيل على التطبيقات التي تتلقى وتفسر البيانات في الوقت الفعلي. في هذا التشغيل السريع، ستستخدم نموذج التعليمات البرمجية لإنشاء إجراءات عملاء وهمية على موقع ويب البقالة. تحدد كتلة التعليمات البرمجية التالية ثلاث طرق رئيسية: getActionsList و getContextFeaturesList و getReward.

  • تقوم getActionsList بإرجاع قائمة بالخيارات التي يحتاج موقع البقالة إلى ترتيبها. في هذا المثال، الإجراءات هي منتجات الوجبات. يحتوي كل خيار إجراء على تفاصيل (ميزات) قد تؤثر على سلوك المستخدم لاحقا. يتم استخدام الإجراءات كمدخل لواجهة برمجة تطبيقات Rank

  • يقوم getContextFeaturesList بإرجاع زيارة عميل تمت محاكاتها. وهو يحدد التفاصيل العشوائية (ميزات السياق) مثل العميل الموجود والوقت من اليوم الذي تجري فيه الزيارة. بشكل عام، يمثل السياق الحالة الحالية للتطبيق أو النظام أو البيئة أو المستخدم. يتم استخدام كائن السياق كإدخل لواجهة برمجة تطبيقات Rank.

    ميزات السياق في هذا التشغيل السريع مبسطة. ومع ذلك، في نظام إنتاج حقيقي، فإن تصميم ميزاتك وتقييم فعاليتها أمر مهم. راجع الوثائق المرتبطة للحصول على إرشادات.

  • يطالب getReward المستخدم بتسجيل توصية الخدمة على أنها نجاح أو فشل. تقوم بإرجاع درجة بين صفر وأخرى تمثل نجاح تفاعل العميل. في سيناريو حقيقي، سيتعلم Personalizer تفضيلات المستخدم من تفاعلات العملاء في الوقت الحقيقي.

    في نظام إنتاج حقيقي، يجب تصميم نقاط المكافأة لتتماشى مع أهداف عملك ومؤشرات الأداء الرئيسية. قد يتطلب تحديد كيفية حساب مقياس المكافأة بعض التجريب.

افتح personalizer-quickstart.js في محرر نصوص أو IDE والصقها في التعليمات البرمجية أدناه.

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

كتلة التعليمات البرمجية 2: تكرار حلقة التعلم

تحدد الكتلة التالية من التعليمات البرمجية الأسلوب الرئيسي وتغلق البرنامج النصي. يقوم بتشغيل تكرار حلقة تعلم، حيث يطلب من المستخدم تفضيلاته في سطر الأوامر ويرسل هذه المعلومات إلى Personalizer لتحديد أفضل إجراء. يقدم الإجراء المحدد للمستخدم، الذي يختار استخدام سطر الأوامر. ثم يرسل درجة مكافأة إلى خدمة Personalizer للإشارة إلى مدى جودة الخدمة في اختيارها.

حلقة التعلم الشخصية هي دورة من استدعاءات الرتبةوالمكافأة. في هذا التشغيل السريع، كل استدعاء للرتبة لإضفاء طابع شخصي على المحتوى يتبعه استدعاء للمكافأة؛ لإخبار Personalizer بمدى جودة أداء الخدمة.

  1. أضف التعليمات البرمجية أدناه إلى personalizer-quickstart.js.

  2. ابحث عن المفتاح ونقطة النهاية. تحتوي نقطة النهاية على النموذج https://<your_resource_name>.cognitiveservices.azure.com/.

    هام

    انتقل إلى مدخل Azure. إذا تم نشر مورد Personalizer الذي أنشأته في قسم المتطلبات الأساسية بنجاح، فانقر فوق الزر Go to Resource ضمن Next Steps. يمكنك العثور على مفتاحك ونقطة النهاية في صفحة المفتاح ونقطة النهاية للمورد ضمن إدارة المورد.

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، ضَع في اعتبارك استخدام طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها. على سبيل المثال، Azure key vault.

  3. الصَق مفتاحك ونقطة نهايتك داخل التعليمات البرمجية في المكان المُشار إليه.

    هام

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات حول الأمان، راجع مقالة أمان خدمات Azure الذكاء الاصطناعي.

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

قم بتشغيل البرنامج.

قم بتشغيل التطبيق باستخدام الأمر Node.js من دليل التطبيق الخاص بك.

node personalizer-quickstart.js

التكرار من خلال عدد قليل من حلقات التعلم. بعد حوالي 10 دقائق، ستبدأ الخدمة في إظهار التحسينات في توصياتها.

تتوفر التعليمات البرمجية المصدر لهذا التشغيل السريع على GitHub.

الوثائق المرجعية | التعليمات البرمجية لمصدر المكتبة | الحزمة (pypi) | نموذج التعليمات البرمجية للبداية السريعة

المتطلبات الأساسية

  • اشتراك Azure - إنشاء اشتراك مجانًا
  • Python 3.x
  • بمجرد إعداد اشتراك Azure، قم بإنشاء مورد Personalizer في مدخل Microsoft Azure والحصول على المفتاح ونقطة النهاية. بعد انتشاره، حدد "Go to resource".
    • ستحتاج إلى المفتاح ونقطة النهاية من المورد الذي تم إنشاؤه لتوصيل تطبيقك بواجهة برمجة تطبيقات Personalizer، والتي ستلصقها في التعليمات البرمجية للبدء السريع أدناه.
    • يمكنك استخدام مستوى التسعير المجاني (F0) لتجربة الخدمة، ثم الترقية إلى فئة مدفوعة للإنتاج في وقت لاحق.

تكوين النموذج

تغيير تكرار تحديث النموذج.

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير تكرار تحديث النموذج إلى 30 ثانية. ستدرب هذه المدة القصيرة النموذج بسرعة، ما يسمح لك بالاطلاع على كيفية تغيير الإجراء الموصى به لكل تكرار.

تغيير تكرار تحديث النموذج.

تغيير وقت انتظار المكافأة

في مدخل Microsoft Azure، انتقل إلى صفحة تكوين مورد Personalizer، وغير وقت انتظار المكافأة إلى 10 دقائق. يحدد هذا المدة التي سينتظرها النموذج بعد إرسال توصية، لتلقي ملاحظات المكافأة من تلك التوصية. لن يحدث التدريب حتى انقضاء وقت انتظار المكافأة.

تغيير وقت انتظار المكافأة

إنشاء تطبيق Python جديد

إنشاء ملف Python جديد يسمى personalizer-quickstart.py.

تثبيت مكتبة العميل

تثبيت مكتبة عميل Personalizer مع pip:

pip install azure-cognitiveservices-personalizer

كتلة التعليمات البرمجية 1: إنشاء بيانات نموذجية

يهدف Personalizer إلى التشغيل على التطبيقات التي تتلقى وتفسر البيانات في الوقت الفعلي. لغرض هذا التشغيل السريع، ستستخدم نموذج التعليمات البرمجية لإنشاء إجراءات عملاء خيالية على موقع ويب للبقالة. تحدد كتلة التعليمات البرمجية التالية ثلاث وظائف رئيسية: get_actions get_context get_reward_score.

  • get_actions بإرجاع قائمة بالخيارات التي يحتاج موقع البقالة إلى ترتيبها. في هذا المثال، الإجراءات هي منتجات الوجبات. يحتوي كل خيار إجراء على تفاصيل (ميزات) قد تؤثر على سلوك المستخدم لاحقا. يتم استخدام الإجراءات كمدخل لواجهة برمجة تطبيقات Rank

  • get_context بإرجاع زيارة عميل تمت محاكاتها. وهو يحدد التفاصيل العشوائية (ميزات السياق) مثل العميل الموجود والوقت من اليوم الذي تجري فيه الزيارة. بشكل عام، يمثل السياق الحالة الحالية للتطبيق أو النظام أو البيئة أو المستخدم. يتم استخدام كائن السياق كإدخل لواجهة برمجة تطبيقات Rank.

    ميزات السياق في هذا التشغيل السريع مبسطة. ومع ذلك، في نظام إنتاج حقيقي، فإن تصميم ميزاتك وتقييم فعاليتها أمر مهم جدا. راجع الوثائق المرتبطة للحصول على إرشادات.

  • get_reward_score بإرجاع درجة بين صفر وآخر يمثل نجاح تفاعل العميل. ويستخدم منطقا بسيطا لتحديد كيفية استجابة السياقات المختلفة لخيارات الإجراءات المختلفة. على سبيل المثال، سيعطي مستخدم معين دائما 1.0 للمنتجات النباتية والنباتية، و0.0 للمنتجات الأخرى. في سيناريو حقيقي، سيتعلم Personalizer تفضيلات المستخدم من البيانات المرسلة في استدعاءات واجهة برمجة التطبيقات Rank وReward. لن تقوم بتعريف هذه بشكل صريح كما هو الحال في مثال التعليمات البرمجية.

    في نظام إنتاج حقيقي، يجب تصميم نقاط المكافأة لتتماشى مع أهداف عملك ومؤشرات الأداء الرئيسية. قد يتطلب تحديد كيفية حساب مقياس المكافأة بعض التجريب.

    في التعليمات البرمجية أدناه، يتم ترميز تفضيلات المستخدمين واستجاباتهم للإجراءات بشكل مضمن كسلسلة من العبارات الشرطية، ويتم تضمين نص توضيحي في التعليمات البرمجية لأغراض توضيحية.

اتبع هذه الخطوات لإعداد البرنامج النصي Personalizer.

  1. ابحث عن المفتاح ونقطة النهاية.

    هام

    انتقل إلى مدخل Azure. إذا تم نشر مورد Personalizer الذي أنشأته في قسم المتطلبات الأساسية بنجاح، فانقر فوق الزر Go to Resource ضمن Next Steps. يمكنك العثور على مفتاحك ونقطة النهاية في صفحة المفتاح ونقطة النهاية للمورد ضمن إدارة المورد.

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، ضَع في اعتبارك استخدام طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها. على سبيل المثال، Azure key vault.

  2. افتح personalizer-quickstart.py في محرر نصوص أو IDE والصقها في التعليمات البرمجية أدناه.

  3. الصَق مفتاحك ونقطة نهايتك داخل التعليمات البرمجية في المكان المُشار إليه. تحتوي نقطة النهاية على النموذج https://<your_resource_name>.cognitiveservices.azure.com/.

    هام

    تذكر إزالة المفتاح من التعليمة البرمجية عند الانتهاء، وعدم توزيعها علناً. للإنتاج، استخدم طريقة آمنة لتخزين بيانات الاعتماد والوصول إليها مثل Azure Key Vault. لمزيد من المعلومات، راجع أمان خدمات Azure الذكاء الاصطناعي.

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
    # ...

كتلة التعليمات البرمجية 2: تكرار حلقة التعلم

تحدد الكتلة التالية من التعليمات البرمجية الدالة run_personalizer_cycle وتستدعيها في حلقة ملاحظات مستخدم بسيطة. يقوم بتشغيل تكرار حلقة تعلم، حيث يقوم بإنشاء سياق (بما في ذلك العميل)، ويطلب ترتيب الإجراءات في هذا السياق باستخدام واجهة برمجة تطبيقات Rank، ويحسب درجة المكافأة، ويمرر النقاط مرة أخرى إلى خدمة Personalizer باستخدام واجهة برمجة تطبيقات المكافأة. يقوم بطباعة المعلومات ذات الصلة إلى وحدة التحكم في كل خطوة.

في هذا المثال، يتم إجراء كل استدعاء Rank لتحديد المنتج الذي يجب عرضه في قسم "المنتج المميز". ثم يشير استدعاء Reward إلى ما إذا كان المستخدم قد اشترى المنتج المميز أم لا. ترتبط Rewards بقراراتها من خلال قيمة مشتركة EventId .

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

قم بتشغيل البرنامج.

بمجرد تضمين جميع التعليمات البرمجية أعلاه في ملف Python الخاص بك، يمكنك تشغيله من دليل التطبيق الخاص بك.

python personalizer-quickstart.py

في التكرار الأول، سيوصي Personalizer بإجراء عشوائي، لأنه لم يقم بأي تدريب حتى الآن. يمكنك اختياريا تشغيل المزيد من التكرارات. بعد حوالي 10 دقائق، ستبدأ الخدمة في إظهار التحسينات في توصياتها.

برنامج التشغيل السريع يسأل بضعة أسئلة لجمع تفضيلات المستخدم، والمعروفة باسم الميزات، ثم يوفر الإجراء أعلاه.

إنشاء العديد من الأحداث للتحليل (اختياري)

يمكنك بسهولة إنشاء، على سبيل المثال، 5000 حدث من سيناريو التشغيل السريع هذا، وهو ما يكفي للحصول على خبرة في استخدام وضع المبتدئ، ووضع الإنترنت، وتشغيل التقييمات دون اتصال، وإنشاء تقييمات الميزات. استبدل التكرار while الحلقي في كتلة التعليمات البرمجية أعلاه بالتعليمات البرمجية التالية.

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

تتوفر التعليمات البرمجية المصدر لهذا التشغيل السريع على GitHub.

تنزيل النموذج المدرب

إذا كنت ترغب في تنزيل نموذج Personalizer تم تدريبه على 5000 حدث من المثال أعلاه، تفضل بزيارة مستودع Personalizer Samples وقم بتنزيل ملف Personalizer_QuickStart_Model.zip . ثم انتقل إلى مورد Personalizer في مدخل Microsoft Azure، وانتقل إلى صفحة الإعداد وعلامة التبويب استيراد/تصدير ، واستيراد الملف.

تنظيف الموارد

لتنظيف اشتراك خدمات Azure الذكاء الاصطناعي، يمكنك حذف المورد أو حذف مجموعة الموارد، والتي ستحذف أي موارد مقترنة.

الخطوات التالية