Azure AI Personalizer에 대한 다중 슬롯 시작

Important

2023년 9월 20일부터 새로운 Personalizer 리소스를 만들 수 없습니다. Personalizer 서비스는 2026년 10월 1일에 사용 중지됩니다.

다중 슬롯 개인 설정(미리 보기)을 사용하면 사용자에게 둘 이상의 작업(예: 제품 또는 콘텐츠)이 표시되는 웹 레이아웃, 캐러셀 및 목록에서 콘텐츠를 대상으로 지정할 수 있습니다. Personalizer 다중 슬롯 API를 사용하면 Personalizer의 AI 모델이 사용자 인터페이스의 배치를 고려하고 학습하면서, 특정 동작을 구동하는 사용자 컨텍스트 및 제품을 학습할 수 있습니다. 예를 들어 Personalizer는 특정 제품 또는 콘텐츠가 페이지의 주요 강조 표시보다 사이드바 또는 바닥글로 더 많은 클릭을 발생시킨다는 것을 알 수 있습니다.

이 가이드에서는 Personalizer 다중 슬롯 API를 사용하는 방법에 대해 알아봅니다.

참조 설명서 | 라이브러리 소스 코드 | 패키지(NuGet) | 다중 슬롯 개념 | 샘플

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • 최신 버전의 .NET Core
  • Azure 구독이 있으면 Azure Portal에서 Personalizer 리소스를 만들어 키와 엔드포인트를 가져옵니다. 배포 후 리소스로 이동을 선택합니다.
    • 애플리케이션을 Personalizer API에 연결하려면 만든 리소스의 키와 엔드포인트가 필요합니다. 이 빠른 시작의 뒷부분에 나오는 코드에 키와 엔드포인트를 붙여넣습니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

설정

Personalizer 인스턴스를 다중 슬롯으로 업그레이드

참고 항목

다중 슬롯 개인 설정(미리 보기)은 Personalizer 서비스의 다른 기능에 영향을 줍니다. 이 변경 작업은 실행 취소할 수 없습니다. 다중 슬롯 개인 설정을 사용하도록 설정하기 전에 다중 슬롯 개인 설정(미리 보기)을 참조하세요.

  1. 자동 최적화 사용 안 함 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 자동 최적화를 끄고 저장합니다.

참고 항목

자동 최적화를 사용하지 않도록 설정해야 다중 슬롯 개인 설정이 작동합니다. 다중 슬롯 개인 설정에 대한 자동 최적화는 나중에 지원될 예정입니다.

  1. 다중 슬롯에 대한 Personalizer 업데이트 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 학습 설정 내보내기를 선택합니다. 다운로드한 json 파일의 인수 필드는 --cb_explore_adf로 시작됩니다. 이 필드를 --ccb_explore_adf로 변경하고 파일을 저장합니다. CB(Contextual Bandits) 및 CCB(Conditional Contextual Bandits)는 Personalizer에서 각각 단일 슬롯과 다중 슬롯 개인 설정에 사용하는 알고리즘입니다. ADF(작업 종속 기능)는 기능을 사용하여 작업을 표시/식별함을 의미합니다.

Learning settings before change

Learning settings after change

포털의 동일한 탭에 있는 학습 설정 가져오기에서 최근에 수정된 json 파일을 찾아 업로드합니다. 그러면 Personalizer 인스턴스가 "다중 슬롯" Personalizer로 업데이트되고 이제 다중 슬롯 순위 및 보상 호출이 지원됩니다.

모델 업데이트 빈도 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 모델 업데이트 빈도를 30초로 변경합니다. 이 짧은 기간은 모델을 빠르게 학습시켜 각 반복에 대해 권장 작업이 어떻게 변경되는지 확인할 수 있습니다.

Change model update frequency

보상 대기 시간 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 보상 대기 시간을 10분으로 변경합니다. 이는 모델이 권장 사항을 보낸 후 해당 권장 사항에서 보상 피드백을 받기 위해 대기하는 시간을 결정합니다. 보상 대기 시간이 지날 때까지 학습이 발생하지 않습니다.

Change reward wait time

새 C# 애플리케이션 만들기

선호하는 편집기 또는 IDE에서 .NET Core 애플리케이션을 새로 만듭니다.

콘솔 창(예: cmd, PowerShell 또는 Bash)에서 dotnet new 명령을 사용하여 personalizer-quickstart라는 새 콘솔 앱을 만듭니다. 이 명령은 Program.cs라는 단일 소스 파일을 사용하여 간단한 "Hello World" C# 프로젝트를 만듭니다.

dotnet new console -n personalizer-quickstart

새로 만든 앱 폴더로 디렉터리를 변경합니다. 다음을 통해 애플리케이션을 빌드할 수 있습니다.

dotnet build

빌드 출력에 경고나 오류가 포함되지 않아야 합니다.

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

클라이언트 라이브러리 설치

애플리케이션 디렉터리 내에서 다음 명령을 사용하여 .NET용 Personalizer 클라이언트 라이브러리를 설치합니다.

dotnet add package Azure.AI.Personalizer --version 2.0.0-beta.2

프로젝트 디렉터리의 원하는 편집기나 IDE에서 Program.cs 파일을 엽니다. 다음 using 지시문을 추가합니다.

using System;
using Azure;
using Azure.AI.Personalizer;
using System.Collections.Generic;
using System.Linq;

개체 모델

Personalizer 클라이언트는 키가 포함된 Azure.AzureKeyCredential을 사용하여 Azure에 인증하는 PersonalizerClient 개체입니다.

각 슬롯에 대한 최고의 단일 콘텐츠 항목을 물어보려면 PersonalizerRankMultiSlotOptions 개체를 만들고, PersonalizerClient.RankMultiSlot으로 전달합니다. RankMultiSlot 메서드는 PersonalizerMultiSlotRankResult를 반환합니다.

Personalizer에 보상 점수를 보내려면 PersonalizerRewardMultiSlotOptions를 만든 다음, 해당 이벤트 ID와 함께 PersonalizerClient.RewardMultiSlot 메서드에 전달합니다.

이 빠른 시작의 보상 채점은 간단합니다. 프로덕션 시스템에서 보상 점수에 영향을 주는 요소와 크기를 결정하는 것은 복잡한 프로세스일 수 있으며, 시간이 지남에 따라 변경될 수 있습니다. 이 설계 결정은 Personalizer 아키텍처에서 기본 설계 결정 중 하나여야 합니다.

코드 예제

여기에 나와 있는 코드 조각에서는 .NET용 Personalizer 클라이언트 라이브러리를 사용하여 다음 작업을 수행하는 방법을 보여 줍니다.

클라이언트 인증

이 섹션에서는 다음과 같은 두 가지 작업을 수행합니다.

  • 키 및 엔드포인트 지정
  • Personalizer 클라이언트 만들기

프로그램 클래스에 다음 줄을 추가하여 시작합니다. Personalizer 리소스에서 키와 엔드포인트를 추가해야 합니다.

Important

Azure Portal로 이동합니다. 필수 구성 요소 섹션에서 만든 Personalizer 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 단추를 클릭합니다. 리소스 관리 아래에 있는 리소스의 키 및 엔드포인트 페이지에서 키 및 엔드포인트를 찾을 수 있습니다.

완료되면 코드에서 키를 제거하고 공개적으로 게시하지 마세요. 프로덕션의 경우 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용하는 것이 좋습니다. 예를 들어 Azure Key Vault입니다.

private const string ServiceEndpoint  = "https://REPLACE-WITH-YOUR-PERSONALIZER-RESOURCE-NAME.cognitiveservices.azure.com";
private const string ResourceKey = "<REPLACE-WITH-YOUR-PERSONALIZER-KEY>";

다음으로, 순위 및 보상 URL을 생성합니다.

static PersonalizerClient InitializePersonalizerClient(Uri url)
{
    return new PersonalizerClient(url, new AzureKeyCredential(ResourceKey));
}

작업으로 표현되는 콘텐츠 선택 항목 가져오기

작업은 Personalizer에서 최상의 콘텐츠 항목을 선택할 수 있는 콘텐츠 선택 항목을 나타냅니다. Program 클래스에 다음 메서드를 추가하여 작업 세트와 해당 기능을 표시합니다.

private static IList<PersonalizerRankableAction> GetActions()
{
    IList<PersonalizerRankableAction> actions = new List<PersonalizerRankableAction>
    {
        new PersonalizerRankableAction(
            id: "Red-Polo-Shirt-432",
            features:
            new List<object>() { new { onSale = "true", price = "20", category = "Clothing" } }
        ),

        new PersonalizerRankableAction(
            id: "Tennis-Racket-133",
            features:
            new List<object>() { new { onSale = "false", price = "70", category = "Sports" } }
        ),

        new PersonalizerRankableAction(
            id: "31-Inch-Monitor-771",
            features:
            new List<object>() { new { onSale = "true", price = "200", category = "Electronics" } }
        ),

        new PersonalizerRankableAction(
            id: "XBox-Series X-117",
            features:
            new List<object>() { new { onSale = "false", price = "499", category = "Electronics" } }
        )
    };

    return actions;
}

슬롯 가져오기

슬롯은 사용자가 상호 작용할 페이지를 구성합니다. Personalizer는 정의된 각 슬롯에 표시할 작업을 결정합니다. 동작은 ExcludeActions로 표시된 특정 슬롯에서 제외할 수 있습니다. BaselineAction은 Personalizer를 사용하지 않고 표시되는 슬롯에 대한 기본 작업입니다.

이 빠른 시작에는 간단한 슬롯 기능이 있습니다. 프로덕션 시스템에서 평가기능을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

private static IList<PersonalizerSlotOptions> GetSlots()
{
    IList<PersonalizerSlotOptions> slots = new List<PersonalizerSlotOptions>
    {
        new PersonalizerSlotOptions(
            id: "BigHeroPosition",
            features: new List<object>() { new { size = "large", position = "left" } },
            excludedActions: new List<string>() { "31-Inch-Monitor-771" },
            baselineAction: "Red-Polo-Shirt-432"

        ),

        new PersonalizerSlotOptions(
            id: "SmallSidebar",
            features: new List<object>() { new { size = "small", position = "right" } },
            excludedActions: new List<string>() { "Tennis-Racket-133" },
            baselineAction: "XBox-Series X-117"
        ),
    };

    return slots;
}

컨텍스트에 대한 사용자 기본 설정 검색

다음 메서드를 Program 클래스에 추가하여 하루 중 시간 및 사용자가 사용 중인 디바이스 유형에 대한 명령줄에서 사용자의 입력을 가져옵니다. 이러한 메서드는 컨텍스트 기능으로 사용됩니다.

static string GetTimeOfDayForContext()
{
    string[] timeOfDayFeatures = new string[] { "morning", "afternoon", "evening", "night" };

    Console.WriteLine("\nWhat time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night");
    if (!int.TryParse(GetKey(), out int timeIndex) || timeIndex < 1 || timeIndex > timeOfDayFeatures.Length)
    {
        Console.WriteLine("\nEntered value is invalid. Setting feature value to " + timeOfDayFeatures[0] + ".");
        timeIndex = 1;
    }

    return timeOfDayFeatures[timeIndex - 1];
}
static string GetDeviceForContext()
{
    string[] deviceFeatures = new string[] { "mobile", "tablet", "desktop" };

    Console.WriteLine("\nWhat is the device type (enter number)? 1. Mobile 2. Tablet 3. Desktop");
    if (!int.TryParse(GetKey(), out int deviceIndex) || deviceIndex < 1 || deviceIndex > deviceFeatures.Length)
    {
        Console.WriteLine("\nEntered value is invalid. Setting feature value to " + deviceFeatures[0] + ".");
        deviceIndex = 1;
    }

    return deviceFeatures[deviceIndex - 1];
}

두 메서드는 모두 GetKey 메서드를 사용하여 명령줄에서 사용자의 선택 항목을 읽습니다.

private static string GetKey()
{
    return Console.ReadKey().Key.ToString().Last().ToString().ToUpper();
}
private static IList<object> GetContext(string time, string device)
{
    return new List<object>()
    {
        new { time = time },
        new { device = device }
    };
}

학습 루프 만들기

Personalizer 학습 루프는 RankMultiSlotRewardMultiSlot 호출의 주기입니다. 이 빠른 시작에서는 각 순위 호출을 수행하여 콘텐츠를 맞춤 설정한 다음, 보상 호출을 수행하여 서비스에서 얼마나 잘 수행되었는지 Personalizer에 알려줍니다.

다음 코드는 명령줄을 통해 사용자에게 해당 기본 설정을 요청하고, 해당 정보를 Personalizer로 보내어 각 슬롯에 대한 최상의 작업을 선택하고, 고객에게 해당 선택 항목을 제시하여 목록에서 선택한 다음, 보상 점수를 Personalizer에 전달하여 서비스에서 얼마나 잘 지정했는지 알려주는 주기를 반복합니다.

static void Main(string[] args)
{
    Console.WriteLine($"Welcome to this Personalizer Quickstart!\n" +
    $"This code will help you understand how to use the Personalizer APIs (multislot rank and multislot reward).\n" +
    $"Each iteration represents a user interaction and will demonstrate how context, actions, slots, and rewards work.\n" +
    $"Note: Personalizer AI models learn from a large number of user interactions:\n" +
    $"You won't be able to tell the difference in what Personalizer returns by simulating a few events by hand.\n" +
    $"If you want a sample that focuses on seeing how Personalizer learns, see the Python Notebook sample.");

    int iteration = 1;
    bool runLoop = true;

    IList<PersonalizerRankableAction> actions = GetActions();
    IList<PersonalizerSlotOptions> slots = GetSlots();
    PersonalizerClient client = InitializePersonalizerClient(new Uri(ServiceEndpoint));

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

        string timeOfDayFeature = GetTimeOfDayForContext();
        string deviceFeature = GetDeviceForContext();

        IList<object> currentContext = GetContext(timeOfDayFeature, deviceFeature);

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

        var multiSlotRankOptions = new PersonalizerRankMultiSlotOptions(actions, slots, currentContext, eventId);
        PersonalizerMultiSlotRankResult multiSlotRankResult = client.RankMultiSlot(multiSlotRankOptions);

        for (int i = 0; i < multiSlotRankResult.Slots.Count(); ++i)
        {
            string slotId = multiSlotRankResult.Slots[i].SlotId;
            Console.WriteLine($"\nPersonalizer service decided you should display: { multiSlotRankResult.Slots[i].RewardActionId} in slot {slotId}. Is this correct? (y/n)");

            string answer = GetKey();

            if (answer == "Y")
            {
                client.RewardMultiSlot(eventId, slotId, 1f);
                Console.WriteLine("\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.");
            }
            else if (answer == "N")
            {
                client.RewardMultiSlot(eventId, slotId, 0f);
                Console.WriteLine("\nYou didn't like the recommended item. The application will send Personalizer a reward of 0 for this choice of action for this slot.");
            }
            else
            {
                client.RewardMultiSlot(eventId, slotId, 0f);
                Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended item.");
            }
        }

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

    } while (runLoop);
}

다음 섹션에서 순위 및 보상 호출에 대해 자세히 살펴보겠습니다. 코드 파일을 실행하기 전에 콘텐츠 선택 항목을 가져오고, 슬롯을 가져오고, 다중 슬롯 순위 및 보상 요청을 보내는 다음 메서드를 추가합니다.

  • GetActions
  • GetSlots
  • GetTimeOfDayForContext
  • GetDeviceForContext
  • GetKey
  • GetContext

최상의 작업 요청

프로그램에서는 순위 요청을 수행하기 위해 사용자의 기본 설정에서 Context 콘텐츠 선택 항목을 만들도록 요청합니다. 요청에는 응답을 받을 수 있는 컨텍스트, 작업 및 슬롯이 각각의 기능과 고유한 이벤트 ID가 포함되어 있습니다.

이 빠른 시작에는 시간 및 사용자 디바이스에 대한 간단한 컨텍스트 기능이 있습니다. 프로덕션 시스템에서 작업 및 기능을 결정하고 평가하는 것은 간단한 문제가 아닐 수 있습니다.

string timeOfDayFeature = GetTimeOfDayForContext();
string deviceFeature = GetDeviceForContext();

IList<object> currentContext = GetContext(timeOfDayFeature, deviceFeature);

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

var multiSlotRankOptions = new PersonalizerRankMultiSlotOptions(actions, slots, currentContext, eventId);
PersonalizerMultiSlotRankResult multiSlotRankResult = client.RankMultiSlot(multiSlotRankOptions);

보상 보내기

보상 요청의 보상 점수를 가져오기 위해 프로그램은 명령줄을 통해 각 슬롯에 대한 사용자의 선택 사항을 가져와서 숫자 값(보상 점수)을 각 선택 항목에 할당한 다음, 고유한 이벤트 ID, 슬롯 ID, 보상 점수를 숫자 값으로 보상 API에 보냅니다. 슬롯마다 보상을 정의할 필요가 없습니다.

이 빠른 시작에서는 0 또는 1의 간단한 숫자를 보상 점수로 할당합니다. 프로덕션 시스템에서 특정 요구 사항에 따라 보상 호출에 보내는 시기와 대상을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

for (int i = 0; i < multiSlotRankResult.Slots.Count(); ++i)
{
    string slotId = multiSlotRankResult.Slots[i].SlotId;
    Console.WriteLine($"\nPersonalizer service decided you should display: { multiSlotRankResult.Slots[i].RewardActionId} in slot {slotId}. Is this correct? (y/n)");

    string answer = GetKey();

    if (answer == "Y")
    {
        client.RewardMultiSlot(eventId, slotId, 1f);
        Console.WriteLine("\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.");
    }
    else if (answer == "N")
    {
        client.RewardMultiSlot(eventId, slotId, 0f);
        Console.WriteLine("\nYou didn't like the recommended item. The application will send Personalizer a reward of 0 for this choice of action for this slot.");
    }
    else
    {
        client.RewardMultiSlot(eventId, slotId, 0f);
        Console.WriteLine("\nEntered choice is invalid. Service assumes that you didn't like the recommended item.");
    }
}

프로그램 실행

애플리케이션 디렉터리에서 dotnet run 명령을 사용하여 애플리케이션을 실행합니다.

dotnet run

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

이 빠른 시작의 소스 코드가 제공됩니다.

참조 설명서 | 다중 슬롯 개념 | 샘플

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Node.js 및 NPM을 설치합니다(Node.js v14.16.0 및 NPM 6.14.11로 확인됨).
  • Azure 구독이 있으면 Azure Portal에서 Personalizer 리소스를 만들어 키와 엔드포인트를 가져옵니다. 배포 후 리소스로 이동을 선택합니다.
    • 애플리케이션을 Personalizer API에 연결하려면 만든 리소스의 키와 엔드포인트가 필요합니다. 이 빠른 시작의 뒷부분에 나오는 코드에 키와 엔드포인트를 붙여넣습니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

설정

Personalizer 인스턴스를 다중 슬롯으로 업그레이드

참고 항목

다중 슬롯 개인 설정(미리 보기)은 Personalizer 서비스의 다른 기능에 영향을 줍니다. 이 변경 작업은 실행 취소할 수 없습니다. 다중 슬롯 개인 설정을 사용하도록 설정하기 전에 다중 슬롯 개인 설정(미리 보기)을 참조하세요.

  1. 자동 최적화 사용 안 함 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 자동 최적화를 끄고 저장합니다.

참고 항목

자동 최적화를 사용하지 않도록 설정해야 다중 슬롯 개인 설정이 작동합니다. 다중 슬롯 개인 설정에 대한 자동 최적화는 나중에 지원될 예정입니다.

  1. 다중 슬롯에 대한 Personalizer 업데이트 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 학습 설정 내보내기를 선택합니다. 다운로드한 json 파일의 인수 필드는 --cb_explore_adf로 시작됩니다. 이 필드를 --ccb_explore_adf로 변경하고 파일을 저장합니다. CB(Contextual Bandits) 및 CCB(Conditional Contextual Bandits)는 Personalizer에서 각각 단일 슬롯과 다중 슬롯 개인 설정에 사용하는 알고리즘입니다. ADF(작업 종속 기능)는 기능을 사용하여 작업을 표시/식별함을 의미합니다.

Learning settings before change

Learning settings after change

포털의 동일한 탭에 있는 학습 설정 가져오기에서 최근에 수정된 json 파일을 찾아 업로드합니다. 그러면 Personalizer 인스턴스가 "다중 슬롯" Personalizer로 업데이트되고 이제 다중 슬롯 순위 및 보상 호출이 지원됩니다.

모델 업데이트 빈도 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 모델 업데이트 빈도를 30초로 변경합니다. 이 짧은 기간은 모델을 빠르게 학습시켜 각 반복에 대해 권장 작업이 어떻게 변경되는지 확인할 수 있습니다.

Change model update frequency

보상 대기 시간 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 보상 대기 시간을 10분으로 변경합니다. 이는 모델이 권장 사항을 보낸 후 해당 권장 사항에서 보상 피드백을 받기 위해 대기하는 시간을 결정합니다. 보상 대기 시간이 지날 때까지 학습이 발생하지 않습니다.

Change reward wait time

새 Node.js 애플리케이션 만들기

콘솔 창(예: cmd, PowerShell 또는 Bash)에서 앱에 대한 새 디렉터리를 만들고 이 디렉터리로 이동합니다.

mkdir myapp && cd myapp

npm init -y 명령을 실행하여 package.json 파일을 만듭니다.

npm init -y

기본 설정된 편집기 또는 IDE에서 sample.js라는 새 Node.js 애플리케이션을 만들고 리소스의 엔드포인트 및 구독 키에 대한 변수를 만듭니다.

Important

Azure Portal로 이동합니다. 필수 구성 요소 섹션에서 만든 Personalizer 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 단추를 클릭합니다. 리소스 관리 아래에 있는 리소스의 키 및 엔드포인트 페이지에서 키 및 엔드포인트를 찾을 수 있습니다.

완료되면 코드에서 키를 제거하고 공개적으로 게시하지 마세요. 프로덕션의 경우 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용하는 것이 좋습니다. 예를 들어 Azure Key Vault입니다.

const axios = require('axios');
const { v4: uuidv4 } = require('uuid');
const readline = require('readline-sync');
// The endpoint specific to your personalization service instance; 
// e.g. https://<your-resource-name>.cognitiveservices.azure.com
const PersonalizationBaseUrl = '<REPLACE-WITH-YOUR-PERSONALIZER-ENDPOINT>';
// The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
const ResourceKey = '<REPLACE-WITH-YOUR-PERSONALIZER-KEY>';

빠른 시작용 NPM 패키지 설치

npm install readline-sync uuid axios --save

개체 모델

각 슬롯에 대한 콘텐츠의 가장 적합한 단일 항목을 요청하려면 rankRequest를 만든 다음, 게시 요청을 multislot/rank로 보냅니다. 그러면 응답이 rankResponse로 구문 분석됩니다.

Personalizer에 보상 점수를 보내려면 rewards를 만든 다음, 게시 요청을 multislot/events/{eventId}/reward에 보냅니다.

이 빠른 시작에서 보상 점수를 결정하는 방법은 간단합니다. 프로덕션 시스템에서 보상 점수에 영향을 주는 요소와 크기를 결정하는 것은 복잡한 프로세스일 수 있으며, 시간이 지남에 따라 변경될 수 있습니다. 이 설계 결정은 Personalizer 아키텍처에서 기본 설계 결정 중 하나여야 합니다.

코드 예제

이러한 코드 조각에서는 NodeJS에 대한 HTTP 요청을 전송하여 다음 작업을 수행하는 방법을 보여 줍니다.

기본 URL 만들기

이 섹션에서는 기본 URL을 사용하는 순위/보상 URL 및 리소스 키를 사용하는 요청 헤더를 구성합니다.

const MultiSlotRankUrl = PersonalizationBaseUrl.concat('personalizer/v1.1-preview.1/multislot/rank');
const MultiSlotRewardUrlBase = PersonalizationBaseUrl.concat('personalizer/v1.1-preview.1/multislot/events/');
const Headers = {
    'ocp-apim-subscription-key': ResourceKey,
    'Content-Type': 'application/json'
};

작업으로 표현되는 콘텐츠 선택 항목 가져오기

작업은 Personalizer에서 최상의 콘텐츠 항목을 선택할 수 있는 콘텐츠 선택 항목을 나타냅니다. 스크립트에 다음 메서드를 추가하여 동작 집합과 해당 기능을 표시합니다.

function getActions() {
    return [
        {
            'id': 'Red-Polo-Shirt-432',
            'features': [
                {
                    'onSale': 'true',
                    'price': 20,
                    'category': 'Clothing'
                }
            ]
        },
        {
            'id': 'Tennis-Racket-133',
            'features': [
                {
                    'onSale': 'false',
                    'price': 70,
                    'category': 'Sports'
                }
            ]
        },
        {
            'id': '31-Inch-Monitor-771',
            'features': [
                {
                    'onSale': 'true',
                    'price': 200,
                    'category': 'Electronics'
                }
            ]
        },
        {
            'id': 'XBox-Series X-117',
            'features': [
                {
                    'onSale': 'false',
                    'price': 499,
                    'category': 'Electronics'
                }
            ]
        }
    ];
}

컨텍스트에 대한 사용자 기본 설정 검색

스크립트에 다음 메서드를 추가하여 명령줄에서 시간 및 사용자가 사용 중인 디바이스 유형에 대한 사용자의 입력을 가져옵니다. 이러한 메서드는 컨텍스트 기능으로 사용됩니다.

function getContextFeatures() {
    const timeOfDayFeatures = ['morning', 'afternoon', 'evening', 'night'];
    const deviceFeatures = ['mobile', 'tablet', 'desktop'];

    let answer = readline.question('\nWhat time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night\n');
    let selection = parseInt(answer);
    const timeOfDay = selection >= 1 && selection <= 4 ? timeOfDayFeatures[selection - 1] : timeOfDayFeatures[0];

    answer = readline.question('\nWhat type of device is the user on (enter number)? 1. mobile 2. tablet 3. desktop\n');
    selection = parseInt(answer);
    const device = selection >= 1 && selection <= 3 ? deviceFeatures[selection - 1] : deviceFeatures[0];

    console.log('Selected features:\n');
    console.log('Time of day: ' + timeOfDay + '\n');
    console.log('Device: ' + device + '\n');

    return [
        {
            'time': timeOfDay
        },
        {
            'device': device
        }
    ];
}

슬롯 가져오기

슬롯은 사용자가 상호 작용할 페이지를 구성합니다. Personalizer는 정의된 각 슬롯에 표시할 작업을 결정합니다. 동작은 ExcludeActions로 표시된 특정 슬롯에서 제외할 수 있습니다. BaselineAction은 Personalizer를 사용하지 않고 표시되는 슬롯에 대한 기본 동작입니다.

이 빠른 시작에는 간단한 슬롯 기능이 있습니다. 프로덕션 시스템에서 평가기능을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

function getSlots() {
    return [
        {
            'id': 'BigHeroPosition',
            'features': [
                {
                    'size': 'large',
                    'position': 'left',
                }
            ],
            'excludedActions': ['31-Inch-Monitor-771'],
            'baselineAction': 'Red-Polo-Shirt-432'
        },
        {
            'id': 'SmallSidebar',
            'features': [
                {
                    'size': 'small',
                    'position': 'right',
                }
            ],
            'excludedActions': ['Tennis-Racket-133'],
            'baselineAction': 'XBox-Series X-117'
        }
    ];
}

HTTP 요청하기

이러한 함수를 추가하여 다중 슬롯 순위 및 보상 호출에 대한 게시 요청을 Personalizer 엔드포인트로 보냅니다.

async function sendMultiSlotRank(rankRequest) {
    try {
        let response = await axios.post(MultiSlotRankUrl, rankRequest, { headers: Headers })
        return response.data;
    }
    catch (err) {
        if(err.response)
        {
            throw err.response.data
        }
        console.log(err)
        throw err;
    }
}
async function sendMultiSlotReward(rewardRequest, eventId) {
    try {
        let rewardUrl = MultiSlotRewardUrlBase.concat(eventId, '/reward');
        let response = await axios.post(rewardUrl, rewardRequest, { headers: Headers })
    }
    catch (err) {
        console.log(err);
        throw err;
    }
}

Personalizer 결정에 대한 피드백 얻기

스크립트에 다음 메서드를 추가합니다. 명령줄 프롬프트를 통해 Personalizer가 각 슬롯에 대해 좋은 결정을 내렸는지 여부를 알릴 수 있습니다.

function getRewardForSlot() {
    let answer = readline.question('\nIs this correct? (y/n)\n').toUpperCase();
    if (answer === 'Y') {
        console.log('\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.\n');
        return 1;
    }
    else if (answer === 'N') {
        console.log('\nYou didn\'t like the recommended item.The application will send Personalizer a reward of 0 for this choice of action for this slot.\n');
        return 0;
    }
    console.log('\nEntered choice is invalid. Service assumes that you didn\'t like the recommended item.\n');
    return 0;
}

학습 루프 만들기

Personalizer 학습 루프는 순위보상 호출의 주기입니다. 이 빠른 시작에서는 각 순위 호출을 수행하여 콘텐츠를 맞춤 설정한 다음, 보상 호출을 수행하여 서비스에서 얼마나 잘 수행되었는지 Personalizer에 알려줍니다.

다음 코드는 명령줄을 통해 사용자에게 해당 기본 설정을 요청하고, 해당 정보를 Personalizer로 보내어 각 슬롯에 대한 최상의 작업을 선택하고, 고객에게 해당 선택 항목을 제시하여 목록에서 선택한 다음, 보상 점수를 Personalizer에 전달하여 서비스에서 얼마나 잘 지정했는지 알려주는 주기를 반복합니다.

let runLoop = true;

(async () => {
    do {

        let multiSlotRankRequest = {};

        // Generate an ID to associate with the request.
        multiSlotRankRequest.eventId = uuidv4();

        // Get context information from the user.
        multiSlotRankRequest.contextFeatures = getContextFeatures();

        // Get the actions list to choose from personalization with their features.
        multiSlotRankRequest.actions = getActions();

        // Get the list of slots for which Personalizer will pick the best action.
        multiSlotRankRequest.slots = getSlots();

        multiSlotRankRequest.deferActivation = false;

        try {
            //Rank the actions for each slot
            let multiSlotRankResponse = await sendMultiSlotRank(multiSlotRankRequest);
            let multiSlotrewards = {};
            multiSlotrewards.reward = [];
    
            for (let i = 0; i < multiSlotRankResponse.slots.length; i++) {
                console.log('\nPersonalizer service decided you should display: '.concat(multiSlotRankResponse.slots[i].rewardActionId, ' in slot ', multiSlotRankResponse.slots[i].id, '\n'));
    
                let slotReward = {};
                slotReward.slotId = multiSlotRankResponse.slots[i].id;
                // User agrees or disagrees with Personalizer decision for slot
                slotReward.value = getRewardForSlot();
                multiSlotrewards.reward.push(slotReward);
            }
    
            // Send the rewards for the event
            await sendMultiSlotReward(multiSlotrewards, multiSlotRankResponse.eventId);
    
            let answer = readline.question('\nPress q to break, any other key to continue:\n').toUpperCase();
            if (answer === 'Q') {
                runLoop = false;
            }
        }
        catch (err) {
            console.log(err);
            throw err;
        }



    } while (runLoop);
})()

다음 섹션에서 순위 및 보상 호출에 대해 자세히 살펴보겠습니다.

콘텐츠 선택 항목을 가져오고, 컨텍스트에 대한 사용자 기본 설정을 가져오고, 슬롯을 가져오고, HTTP 요청을 수행하고, 코드 파일을 실행하기 전에 각 슬롯에 대해 보상을 받는 다음 메서드를 추가합니다.

  • getActions
  • getContextFeatures
  • getSlots
  • sendRank
  • sendReward
  • getRewardForSlot

최상의 작업 요청

프로그램에서는 순위 요청을 수행하기 위해 사용자의 기본 설정에서 콘텐츠 선택 항목을 만들도록 요청합니다. 요청 본문에는 해당 기능이 있는 컨텍스트, 작업, 슬롯 등이 포함됩니다. sendMultiSlotRank 메서드는 rankRequest를 가져오고 다중 슬롯 순위 요청을 실행합니다.

이 빠른 시작에는 시간 및 사용자 디바이스에 대한 간단한 컨텍스트 기능이 있습니다. 프로덕션 시스템에서 작업 및 기능을 결정하고 평가하는 것은 간단한 문제가 아닐 수 있습니다.

let multiSlotRankRequest = {};

// Generate an ID to associate with the request.
multiSlotRankRequest.eventId = uuidv4();

// Get context information from the user.
multiSlotRankRequest.contextFeatures = getContextFeatures();

// Get the actions list to choose from personalization with their features.
multiSlotRankRequest.actions = getActions();

// Get the list of slots for which Personalizer will pick the best action.
multiSlotRankRequest.slots = getSlots();

multiSlotRankRequest.deferActivation = false;

//Rank the actions for each slot
try {
    let multiSlotRankResponse = await sendMultiSlotRank(multiSlotRankRequest);
}
catch (err) {
    console.log(err);
    throw err;
}

보상 보내기

보상 요청에 대한 보상 점수를 가져오기 위해 프로그램은 명령줄을 통해 각 슬롯에 대한 사용자의 선택 사항을 가져와서 숫자 값(보상 점수)을 각 선택 항목에 할당한 다음, 고유한 이벤트 ID, 슬롯 ID 및 보상 점수를 sendMultiSlotReward 메서드에 보냅니다. 각 슬롯에 대해 보상을 정의할 필요가 없습니다.

이 빠른 시작에서는 0 또는 1의 간단한 숫자를 보상 점수로 할당합니다. 프로덕션 시스템에서 특정 요구 사항에 따라 보상 호출에 보내는 시기와 대상을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

let multiSlotrewards = {};
multiSlotrewards.reward = [];

for (i = 0; i < multiSlotRankResponse.slots.length; i++) {
    console.log('\nPersonalizer service decided you should display: '.concat(multiSlotRankResponse.slots[i].rewardActionId, ' in slot ', multiSlotRankResponse.slots[i].id, '\n'));

    let slotReward = {};
    slotReward.slotId = multiSlotRankResponse.slots[i].id;
    // User agrees or disagrees with Personalizer decision for slot
    slotReward.value = getRewardForSlot();
    multiSlotrewards.reward.push(slotReward);
}

// Send the rewards for the event
await sendMultiSlotReward(multiSlotrewards, multiSlotRankResponse.eventId);

프로그램 실행

애플리케이션 디렉터리에서 Node.js를 사용하여 애플리케이션을 실행합니다.

node sample.js

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

이 빠른 시작의 소스 코드가 제공됩니다.

다중 슬롯 개념 | 샘플

필수 조건

  • Azure 구독 - 체험 구독 만들기
  • Python 3.x
  • Azure 구독이 있으면 Azure Portal에서 Personalizer 리소스를 만들어 키와 엔드포인트를 가져옵니다. 배포 후 리소스로 이동을 선택합니다.
    • 애플리케이션을 Personalizer API에 연결하려면 만든 리소스의 키와 엔드포인트가 필요합니다. 이 빠른 시작의 뒷부분에 나오는 코드에 키와 엔드포인트를 붙여넣습니다.
    • 평가판 가격 책정 계층(F0)을 통해 서비스를 사용해보고, 나중에 프로덕션용 유료 계층으로 업그레이드할 수 있습니다.

설정

Personalizer 인스턴스를 다중 슬롯으로 업그레이드

참고 항목

다중 슬롯 개인 설정(미리 보기)은 Personalizer 서비스의 다른 기능에 영향을 줍니다. 이 변경 작업은 실행 취소할 수 없습니다. 다중 슬롯 개인 설정을 사용하도록 설정하기 전에 다중 슬롯 개인 설정(미리 보기)을 참조하세요.

  1. 자동 최적화 사용 안 함 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 자동 최적화를 끄고 저장합니다.

참고 항목

자동 최적화를 사용하지 않도록 설정해야 다중 슬롯 개인 설정이 작동합니다. 다중 슬롯 개인 설정에 대한 자동 최적화는 나중에 지원될 예정입니다.

  1. 다중 슬롯에 대한 Personalizer 업데이트 Azure Portal에 있는 모델 및 학습 설정 페이지의 리소스 관리 아래 Personalizer 리소스에서 학습 설정 내보내기를 선택합니다. 다운로드한 json 파일의 인수 필드는 --cb_explore_adf로 시작됩니다. 이 필드를 --ccb_explore_adf로 변경하고 파일을 저장합니다. CB(Contextual Bandits) 및 CCB(Conditional Contextual Bandits)는 Personalizer에서 각각 단일 슬롯과 다중 슬롯 개인 설정에 사용하는 알고리즘입니다. ADF(작업 종속 기능)는 기능을 사용하여 작업을 표시/식별함을 의미합니다.

Learning settings before change

Learning settings after change

포털의 동일한 탭에 있는 학습 설정 가져오기에서 최근에 수정된 json 파일을 찾아 업로드합니다. 그러면 Personalizer 인스턴스가 "다중 슬롯" Personalizer로 업데이트되고 이제 다중 슬롯 순위 및 보상 호출이 지원됩니다.

모델 업데이트 빈도 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 모델 업데이트 빈도를 30초로 변경합니다. 이 짧은 기간은 모델을 빠르게 학습시켜 각 반복에 대해 권장 작업이 어떻게 변경되는지 확인할 수 있습니다.

Change model update frequency

보상 대기 시간 변경

Azure Portal에서 Personalizer 리소스의 구성 페이지로 이동하고 보상 대기 시간을 10분으로 변경합니다. 이는 모델이 권장 사항을 보낸 후 해당 권장 사항에서 보상 피드백을 받기 위해 대기하는 시간을 결정합니다. 보상 대기 시간이 지날 때까지 학습이 발생하지 않습니다.

Change reward wait time

새 Python 애플리케이션 만들기

새 Python 파일을 만들고 리소스의 엔드포인트 및 구독 키에 대한 변수를 만듭니다.

Important

Azure Portal로 이동합니다. 필수 구성 요소 섹션에서 만든 Personalizer 리소스가 성공적으로 배포된 경우 다음 단계 아래에서 리소스로 이동 단추를 클릭합니다. 리소스 관리 아래에 있는 리소스의 키 및 엔드포인트 페이지에서 키 및 엔드포인트를 찾을 수 있습니다.

완료되면 코드에서 키를 제거하고 공개적으로 게시하지 마세요. 프로덕션의 경우 자격 증명을 안전하게 저장하고 액세스하는 방법을 사용하는 것이 좋습니다. 예를 들어 Azure Key Vault입니다.

import json, uuid, requests

# The endpoint specific to your personalization service instance; 
# e.g. https://<your-resource-name>.cognitiveservices.azure.com
PERSONALIZATION_BASE_URL = "<REPLACE-WITH-YOUR-PERSONALIZER-ENDPOINT>"
# The key specific to your personalization service instance; e.g. "0123456789abcdef0123456789ABCDEF"
RESOURCE_KEY = "<REPLACE-WITH-YOUR-PERSONALIZER-KEY>"

개체 모델

각 슬롯에 대한 콘텐츠의 가장 적합한 단일 항목을 요청하려면 rank_request를 만든 다음, 게시 요청을 multislot/rank에 보냅니다. 그러면 응답이 rank_response로 구문 분석됩니다.

Personalizer에 보상 점수를 보내려면 rewards를 만든 다음, 게시 요청을 multislot/events/{eventId}/reward에 보냅니다.

이 빠른 시작에서 보상 점수를 결정하는 방법은 간단합니다. 프로덕션 시스템에서 보상 점수에 영향을 주는 요소와 크기를 결정하는 것은 복잡한 프로세스일 수 있으며, 시간이 지남에 따라 변경될 수 있습니다. 이 설계 결정은 Personalizer 아키텍처에서 기본 설계 결정 중 하나여야 합니다.

코드 예제

이러한 코드 조각에서는 Python에 대한 HTTP 요청을 전송하여 다음 작업을 수행하는 방법을 보여 줍니다.

기본 URL 만들기

이 섹션에서는 기본 URL을 사용하는 순위/보상 URL 및 리소스 키를 사용하는 요청 헤더를 구성합니다.

MULTI_SLOT_RANK_URL = '{0}personalizer/v1.1-preview.1/multislot/rank'.format(PERSONALIZATION_BASE_URL)
MULTI_SLOT_REWARD_URL_BASE = '{0}personalizer/v1.1-preview.1/multislot/events/'.format(PERSONALIZATION_BASE_URL)
HEADERS = {
    'ocp-apim-subscription-key': RESOURCE_KEY,
    'Content-Type': 'application/json'
}

작업으로 표현되는 콘텐츠 선택 항목 가져오기

작업은 Personalizer에서 최상의 콘텐츠 항목을 선택할 수 있는 콘텐츠 선택 항목을 나타냅니다. 스크립트에 다음 메서드를 추가하여 동작 집합과 해당 기능을 표시합니다.

def get_actions():
    return [
        {
            "id": "Red-Polo-Shirt-432",
            "features": [
                {
                    "onSale": "true",
                    "price": 20,
                    "category": "Clothing"
                }
            ]
        },
        {
            "id": "Tennis-Racket-133",
            "features": [
                {
                    "onSale": "false",
                    "price": 70,
                    "category": "Sports"
                }
            ]
        },
        {
            "id": "31-Inch-Monitor-771",
            "features": [
                {
                    "onSale": "true",
                    "price": 200,
                    "category": "Electronics"
                }
            ]
        },
        {
            "id": "XBox-Series X-117",
            "features": [
                {
                    "onSale": "false",
                    "price": 499,
                    "category": "Electronics"
                }
            ]
        }
    ]

컨텍스트에 대한 사용자 기본 설정 검색

스크립트에 다음 메서드를 추가하여 명령줄에서 시간 및 사용자가 사용 중인 디바이스 유형에 대한 사용자의 입력을 가져옵니다. 이러한 메서드는 컨텍스트 기능으로 사용됩니다.

def get_context_features():
    time_features = ["morning", "afternoon", "evening", "night"]
    time_pref = input("What time of day is it (enter number)? 1. morning 2. afternoon 3. evening 4. night\n")
    try:
        parsed_time = int(time_pref)
        if(parsed_time <=0 or parsed_time > len(time_features)):
            raise IndexError
        time_of_day = time_features[parsed_time-1]
    except (ValueError, IndexError):
        print("Entered value is invalid. Setting feature value to", time_features[0] + ".")
        time_of_day = time_features[0]

    device_features = ['mobile', 'tablet', 'desktop']
    device_pref = input("What type of device is the user on (enter number)? 1. mobile 2. tablet 3. desktop\n")
    try:
        parsed_device = int(device_pref)
        if(parsed_device <=0 or parsed_device > len(device_features)):
            raise IndexError
        device = device_features[parsed_device-1]
    except (ValueError, IndexError):
        print("Entered value is invalid. Setting feature value to", device_features[0]+ ".")
        device = device_features[0]

    return [
        {'time': time_of_day},
        {'device': device}
        ]

슬롯 가져오기

슬롯은 사용자가 상호 작용할 페이지를 구성합니다. Personalizer는 정의된 각 슬롯에 표시할 작업을 결정합니다. 동작은 ExcludeActions로 표시된 특정 슬롯에서 제외할 수 있습니다. BaselineAction은 Personalizer를 사용하지 않고 표시되는 슬롯에 대한 기본 동작입니다.

이 빠른 시작에는 간단한 슬롯 기능이 있습니다. 프로덕션 시스템에서 평가기능을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

def get_slots():
    return [
        {
            "id": "BigHeroPosition",
            "features": [
                {
                    "size": "large",
                    "position": "left",
                }
            ],
            "excludedActions": ["31-Inch-Monitor-771"],
            "baselineAction": "Red-Polo-Shirt-432"
        },
        {
            "id": "SmallSidebar",
            "features": [
                {
                    "size": "small",
                    "position": "right",
                }
            ],
            "excludedActions": ["Tennis-Racket-133"],
            "baselineAction": "XBox-Series X-117"
        }
    ]

HTTP 요청하기

이러한 함수를 추가하여 다중 슬롯 순위 및 보상 호출에 대한 게시 요청을 Personalizer 엔드포인트로 보냅니다.

def send_multi_slot_rank(rank_request):
multi_slot_response = requests.post(MULTI_SLOT_RANK_URL, data=json.dumps(rank_request), headers=HEADERS)
if multi_slot_response.status_code != 201:
    raise Exception(multi_slot_response.text)
return json.loads(multi_slot_response.text)
def send_multi_slot_reward(reward_request, event_id):
    reward_url = '{0}{1}/reward'.format(MULTI_SLOT_REWARD_URL_BASE, event_id)
    requests.post(reward_url, data=json.dumps(reward_request), headers=HEADERS)

Personalizer 결정에 대한 피드백 얻기

스크립트에 다음 메서드를 추가합니다. 명령줄 프롬프트를 통해 Personalizer가 각 슬롯에 대해 좋은 결정을 내렸는지 여부를 알릴 수 있습니다.

def get_reward_for_slot():
    answer = input('\nIs this correct? (y/n)\n').upper()
    if (answer == 'Y'):
        print('\nGreat! The application will send Personalizer a reward of 1 so it learns from this choice of action for this slot.\n')
        return 1
    elif (answer == 'N'):
        print('\nYou didn\'t like the recommended item.The application will send Personalizer a reward of 0 for this choice of action for this slot.\n')
        return 0
    print('\nEntered choice is invalid. Service assumes that you didn\'t like the recommended item.\n')
    return 0

학습 루프 만들기

Personalizer 학습 루프는 순위보상 호출의 주기입니다. 이 빠른 시작에서는 각 순위 호출을 수행하여 콘텐츠를 맞춤 설정한 다음, 보상 호출을 수행하여 서비스에서 얼마나 잘 수행되었는지 Personalizer에 알려줍니다.

다음 코드는 명령줄을 통해 사용자에게 해당 기본 설정을 요청하고, 해당 정보를 Personalizer로 보내어 각 슬롯에 대한 최상의 작업을 선택하고, 고객에게 해당 선택 항목을 제시하여 목록에서 선택한 다음, 보상 점수를 Personalizer에 전달하여 서비스에서 얼마나 잘 지정했는지 알려주는 주기를 반복합니다.

run_loop = True

while run_loop:

    eventId = str(uuid.uuid4())
    context = get_context_features()
    actions = get_actions()
    slots = get_slots()

    rank_request = {
        "eventId": eventId,
        "contextFeatures": context,
        "actions": actions,
        "slots": slots,
        "deferActivation": False
      }

    #Rank the actions for each slot
    multi_slot_rank_response = send_multi_slot_rank(rank_request)
    multi_slot_rewards = {"reward": []}

    for i in range(len(multi_slot_rank_response['slots'])):
        print('\nPersonalizer service decided you should display: {0} in slot {1}\n'.format(multi_slot_rank_response['slots'][i]['rewardActionId'], multi_slot_rank_response['slots'][i]['id']))

        slot_reward = {'slotId': multi_slot_rank_response['slots'][i]['id']}
        # User agrees or disagrees with Personalizer decision for slot
        slot_reward['value'] = get_reward_for_slot()
        multi_slot_rewards['reward'].append(slot_reward)

    # Send the rewards for the event
    send_multi_slot_reward(multi_slot_rewards, multi_slot_rank_response['eventId'])

    answer = input('\nPress q to break, any other key to continue:\n').upper()
    if (answer == 'Q'):
        run_loop = False

다음 섹션에서 순위 및 보상 호출에 대해 자세히 살펴보겠습니다.

콘텐츠 선택 항목을 가져오고, 컨텍스트에 대한 사용자 기본 설정을 가져오고, 슬롯을 가져오고, HTTP 요청을 수행하고, 코드 파일을 실행하기 전에 각 슬롯에 대해 보상을 받는 다음 메서드를 추가합니다.

  • get_actions
  • get_context_features
  • get_slots
  • send_rank
  • send_reward
  • get_reward_for_dsot

최상의 작업 요청

프로그램에서는 순위 요청을 수행하기 위해 사용자의 기본 설정에서 콘텐츠 선택 항목을 만들도록 요청합니다. 요청 본문에는 해당 기능이 있는 컨텍스트, 작업, 슬롯 등이 포함됩니다. send_multi_slot_rank 메서드는 rankRequest를 가져오고 다중 슬롯 순위 요청을 실행합니다.

이 빠른 시작에는 시간 및 사용자 디바이스에 대한 간단한 컨텍스트 기능이 있습니다. 프로덕션 시스템에서 작업 및 기능을 결정하고 평가하는 것은 간단한 문제가 아닐 수 있습니다.

eventId = str(uuid.uuid4())
context = get_context_features()
actions = get_actions()
slots = get_slots()

rank_request = {
    "eventId": eventId,
    "contextFeatures": context,
    "actions": actions,
    "slots": slots,
    "deferActivation": False
    }

#Rank the actions for each slot
multi_slot_rank_response = send_multi_slot_rank(rank_request)

보상 보내기

보상 요청에 대한 보상 점수를 가져오기 위해 프로그램은 명령줄을 통해 각 슬롯에 대한 사용자의 선택 사항을 가져와서 숫자 값(보상 점수)을 각 선택 항목에 할당한 다음, 고유한 이벤트 ID, 슬롯 ID 및 보상 점수를 send_multi_slot_reward 메서드에 보냅니다. 각 슬롯에 대해 보상을 정의할 필요가 없습니다.

이 빠른 시작에서는 0 또는 1의 간단한 숫자를 보상 점수로 할당합니다. 프로덕션 시스템에서 특정 요구 사항에 따라 보상 호출에 보내는 시기와 대상을 결정하는 것은 간단한 문제가 아닐 수 있습니다.

multi_slot_rewards = {"reward": []}

for i in range(len(multi_slot_rank_response['slots'])):
    print('\nPersonalizer service decided you should display: {0} in slot {1}\n'.format(multi_slot_rank_response['slots'][i]['rewardActionId'], multi_slot_rank_response['slots'][i]['id']))

    slot_reward = {'slotId': multi_slot_rank_response['slots'][i]['id']}
    # User agrees or disagrees with Personalizer decision for slot
    slot_reward['value'] = get_reward_for_slot()
    multi_slot_rewards['reward'].append(slot_reward)

# Send the rewards for the event
send_multi_slot_reward(multi_slot_rewards, multi_slot_rank_response['eventId'])

프로그램 실행

애플리케이션 디렉터리에서 Python을 사용하여 애플리케이션을 실행합니다.

python sample.py

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

이 빠른 시작의 소스 코드가 제공됩니다.

다음 단계