Amazon Web Services 한국 블로그

Amazon Personalize – 실시간 개인 맞춤 추천 API 서비스 정식 출시

실시간 개인 맞춤 추천 서비스인 Amazon Personalize를 정식 출시합니다. AWS re:Invent 2018에서 미리보기로  발표된 Amazon Personalize는 기계 학습과 관련한 경험이 없는 개발자도 자신의 애플리케이션에 개인 맞춤 추천 항목을 생성할 수 있는 완전 관리형 API 서비스입니다.

만약 동영상 서비스라면, 애플리케이션 내에서 적시에 제공되어야 하는 추천 영상이든, 꼭 필요한 순간 알림 이메일이든, 사용자의 데이터에 따라 제공되는 개인화 맞춤 경험을 고객에게 제공한다면 훨씬 큰 비즈니스 성과를 실현할 수 있습니다.

사실 효율적인 추천 시스템을 개발하기는 쉽지 않습니다. 실시간 개인화를 구축하고 최적화하고 배포하려면 분석, 응용 기계 학습, 소프트웨어 엔지니어링 및 시스템 운영에서 전문화된 지식이 필요합니다. 이러한 과제를 극복할 만한 지식, 기술, 경험을 갖춘 조직은 많지 않으며, 새로운 제품과 프로모션이 등장하거나 고객의 행동이 변화하는 데 비해 단순한 규칙 기반 시스템은 불안정하고 유지 관리 비용이 높습니다.

지난 20년간 Amazon.com은 제품 검색부터 결제까지 모든 단계에서 개인화된 구매 경험을 제공하도록 기계 학습 모델을 꾸준히 개선해왔습니다. Amazon Personalize는 이러한 유형의 솔루션에 일반적으로 뒤따르는 복잡한 인프라와 기계 학습을 다루지 않고도 맞춤형 모델을 구축할 수 있는 기능을 그대로 제공합니다.

Amazon Personalize는 활동 데이터(페이지 뷰, 가입, 구매 등)에서 고유한 신호와 함께, 고객 인구 통계 정보(나이, 위치 등)와 함께  뉴스 기사, 제품, 동영상, 음악 등 추천할 항목의 인벤토리를 제공합니다. 그러면, 자동으로 데이터를 처리 및 조사하고, 의미 있는 정보를 식별하고, 적절한 알고리즘을 선택하며, 사용자의 데이터에 맞춤화되고 API를 통해 액세스 가능한 개인화 모델을 학습시켜 최적화합니다. Amazon Personalize에서 분석되는 모든 데이터는 비공개로 보안이 유지되며 맞춤형 추천 항목을 제시하는 데에만 사용됩니다. 구축되는 모델은 전적으로 해당 사용자에게만 사용됩니다.

API 호출 한 번으로 사용자를 위한 추천 항목을 만들고 고객 경험을 개인화하여 채택률과 전환율을 높이고 마케팅 캠페인의 성과를 증진할 수 있습니다. 대표적으로 Domino’s Pizza는 Amazon Personalize를 이용하여 자사의 디지털 자산을 통해 프로모션 혜택과 같은 맞춤형 메시지를 제공하고 있습니다. Sony Interactive Entertainment는 Personalize와 Amazon SageMaker를 이용해 기계 학습 개발을 자동화, 가속화하는 한편, 대규모로 효과적인 개인화를 지원하고 있습니다.

Personalize는 24시간 언제든 호출할 수 있는 자신만의 Amazon.com 기계 학습 팀을 가지는 것과 같습니다.

Amazon Personalize 소개

Amazon Personalize는 Amazon S3에 저장된 사용자의 기록 데이터, 애플리케이션에서 실시간으로 전송되는 스트리밍 데이터, 또는 두 가지 모두를 기준으로 추천 항목을 제시할 수 있습니다.

따라서 고객이 추천 솔루션을 매우 다양한 방식으로 구축할 수 있습니다. 예를 들어 기록 데이터를 기반으로 초기 추천 시스템을 구축한 후 라이브 이벤트가 충분히 누적되었을 때 주기적으로 재학습시킬 수 있습니다. 또는 기록 데이터가 처음부터 확보되어 있는 경우 일정 기간 동안 이벤트를 수집한 후 추천 시스템을 구축할 수도 있습니다.

기록 데이터에 대해서는 이전 블로그 게시물에서 다룬 만큼, 여기서는 라이브 이벤트를 수집하는 방법을 중점으로 설명하겠습니다.

개괄적인 프로세스는 다음과 같습니다.

  1. 애플리케이션에서 전송된 이벤트를 저장하기 위해 데이터 세트 그룹을 생성합니다.
  2. 상호 작용 데이터 세트를 생성하고 스키마를 정의합니다(이 단계에서는 데이터가 필요 없음).
  3. Amazon Personalize로 이벤트를 전송하기 위해 이벤트 추적기를 생성합니다.
  4. Amazon Personalize로 이벤트를 전송하기 시작합니다.
  5. 추천 레시피를 선택하거나, AutoML을 통해 Amazon Personalize가 추천 레시피를 자동으로 선택하게 합니다.
  6. 솔루션을 생성합니다. 즉, 데이터 세트에 대한 레시피를 학습시킵니다.
  7. 캠페인을 생성하고 항목 추천을 시작합니다.

데이터 세트 그룹 생성

영화 추천의 클릭 스트림을 캡처하려는 경우를 예로 들어보겠습니다. 초기 설정 마법사를 사용하여 해당 이벤트를 저장할 데이터 세트 그룹을 생성합니다. 구축을 시작하는 데 사용할 기록 데이터가 없다고 가정해보겠습니다. 모든 이벤트는 클릭 스트림에 의해 생성되며 이벤트 수집 SDK를 사용하여 수집됩니다.

데이터 세트 그룹을 생성할 때는 이름만 지정하면 됩니다.

그런 다음 사용자가 항목과 상호 작용하는 방식(좋아요, 클릭 등)을 보여 주는 상호 작용 데이터 세트를 생성해야 합니다. 물론 데이터를 설명하는 스키마도 정의해야 합니다. 이 예에서는 Amazon Personalize에서 제공되는 기본 스키마를 사용하겠습니다.

원한다면 데이터 세트에 기록 데이터를 추가하기 위해 이 단계에서 가져오기 작업을 정의할 수 있습니다. 위에서 언급했듯이 모든 데이터는 스트림에서 생성되므로 이 단계는 건너뜁니다.

이벤트 추적기 구성

다음 단계로, 스트리밍 이벤트를 데이터 세트 그룹으로 전송할 수 있도록 이벤트 추적기를 생성합니다.

1분 정도 지나면 추적기가 준비됩니다. 이벤트를 전송할 때 필요하므로 추적 ID를 기록해 둡니다.

데이터 세트 생성

Amazon Personalize는 이벤트 추적기를 생성할 때 해당 이벤트 추적기와 연결된 데이터 세트 그룹에 새 데이터 세트를 자동으로 생성합니다. 이 데이터 세트에는 다음 정보를 저장하도록 명확히 정의된 스키마가 설정되어 있습니다.

  • user_idsession_id: 이 두 값은 애플리케이션에 의해 정의됩니다.
  • tracking_id: 이벤트 추적기 ID입니다.
  • timestamp, item_id, event_type, event_value: 이벤트 자체를 설명하는 값들이며, 애플리케이션에서 전달되어야 합니다.

다음 두 가지 방법으로 이 데이터 세트로 실시간 이벤트를 전송할 수 있습니다.

  • AWS SDK를 통해 서버 측으로 전송: 수집은 코드가 AWS 내부(예: Amazon EC2 또는 AWS Lambda) 또는 외부 중 어디에서 호스팅되는지에 관계없이 모든 소스에서 수행될 수 있습니다.
  • AWS Amplify JavaScript 라이브러리 사용

두 가지 옵션을 모두 살펴보겠습니다.

AWS SDK기반 실시간 이벤트 전송

이 프로세스는 매우 간단합니다. PutEvents API를 사용하여 단일 이벤트 또는 최대 10개의 이벤트 목록을 전송하면 됩니다. 물론 AWS SDK를 사용할 수도 있습니다. 저는 Python을 즐겨 사용하기 때문에 boto3 SDK를 사용하여 이벤트를 전송하는 방법을 보여 드리자면 다음과 같습니다.

import boto3
personalize_events = boto3.client('personalize-events')
personalize_events.put_events(
    trackingId = <TRACKING_ID>,
    userId = <USER_ID>,
    sessionId = <SESSION_ID>,
    eventList = [
      {
          "eventId": "event1",
          "sentAt": 1549959198,
          "eventType": "rating",
          "properties": """{\"itemId\": \"123\", \"eventValue\": \"4\"}"""
      },
      {
          "eventId": "event2",
          "sentAt": 1549959205,
          "eventType": "rating",
          "properties": """{\"itemId\": \"456\", \"eventValue\": \"2\"}"""
      }
    ]
)

예제 애플리케이션에서 영화 123을 4로 평가했고, 영화 456을 2로 평가했습니다. 적절한 추적 식별자를 사용하여 2개의 이벤트를 이벤트 추적기로 전송합니다.

  • eventId: 애플리케이션별 식별자입니다.
  • sentAt: 스키마에 정의된 timestamp 속성과 일치하는 타임스탬프입니다. 이 값은 Unix Epoch(1970년 1월 1일 00:00:00.000 UTC)를 기준으로 하며 표준 시간대에 따라 다릅니다.
  • eventType: 스키마에 정의된 event_type 속성과 일치하는 이벤트 유형입니다.
  • properties: 스키마에 정의된 item_idevent_value 속성과 일치하는 항목 ID와 이벤트 값입니다.

다음은 Java로 작성된 유사한 코드 스니핏입니다.

List<Event> eventList = new ArrayList<>();
eventList.add(new Event().withProperties(properties).withType(eventType));
PutEventsRequest request = new PutEventsRequest()
  .withTrackingId(<TRACKING_ID>)
  .withUserId(<USER_ID>)
  .withSessionId(<SESSION_ID>)
  .withEventList(eventList);
client.putEvents(request)

이제 개념은 이해하셨으리라 생각합니다.

AWS Amplify기반 실시간 이벤트 전송

AWS Amplify는 AWS를 기반으로 한 모바일 앱과 웹 앱을 생성, 구성, 구현하는 데 유용한 JavaScript 라이브러리입니다. 이 라이브러리는 Amazon Personalize의 이벤트 추적 서비스에 통합되어 있습니다.

이벤트를 전송하려면 먼저 두 가지 설정 단계를 거쳐야 합니다. 자세히 설명하면 너무 장황해질 수 있으니, Amazon Personalize 설명서에서 자세한 지침을 참조하시기 바랍니다.

  • 사용자를 인증하기 위해 Amazon Cognito에서 ID 풀을 생성합니다.
  • 풀 ID와 추적기 ID를 사용하여 Amazon Personalize 플러그인을 구성합니다.

이 두 단계를 완료하면 Amazon Personalize로 이벤트를 전송할 수 있습니다. 이벤트 유형에 텍스트 문자열을 사용해도 되지만, 두 가지 특별한 형식이 있다는 점을 기억해 두십시오.

  • Identify를 사용하면 특정 사용자의 userId를 Amazon Personalize로 전송할 수 있습니다. 그러면 userId가 이후 호출에서 선택적인 파라미터가 됩니다.
  • MediaAutoTrack은 미디어 이벤트의 재생, 일시 중지 및 다시 시작 위치를 자동으로 계산하며, Amazon Personalize는 이 위치를 이벤트 값으로 사용합니다.

다음은 AWS Amplify를 사용하여 샘플 이벤트를 전송하는 코드 예제입니다.

Analytics.record({
    eventType: "Identify",
    properties: {
      "userId": "<USER_ID>"
    }
}, "AmazonPersonalize");
Analytics.record({
    eventType: "<EVENT_TYPE>",
    properties: {
      "itemId": "<ITEM_ID>",
      "eventValue": "<EVENT_VALUE>"
    }
}, "AmazonPersonalize");
Analytics.record({
    eventType: "MediaAutoTrack",
    properties: {
      "itemId": "<ITEM_ID>",
      "domElementId": "MEDIA DOM ELEMENT ID"
    }
}, "AmazonPersonalize");

보다시피 이 코드도 상당히 간단합니다.

추천 솔루션 생성

이제 이벤트를 수집하는 방법을 알았으니, 추천 솔루션의 학습 방법을 정의해보도록 하겠습니다.

먼저 레시피를 선택해야 합니다. 레시피는 알고리즘보다 훨씬 더 유용합니다. 미리 정의된 기능 변환, 알고리즘에 대한 초기 파라미터 및 자동 모델 튜닝 기능도 포함되어 있습니다. 따라서 레시피를 사용하면 개인화에 대한 전문 지식이 필요하지 않습니다. Amazon Personalize에는 다양한 사용 사례에 적합한 다수의 레시피가 포함되어 있습니다.

하지만 기계 학습에 이제 막 입문한 개발자라면 사용 사례에 가장 적합한 레시피를 선택하기가 어려울 수 있습니다. 걱정할 필요는 없습니다. 앞서 언급한 바와 같이 Amazon Personalize는 최적의 레시피를 자동으로 검색하는 새로운 기술인 AutoML을 지원합니다. 이 기술을 활성화하겠습니다. 또한 이 단계에서 Amazon Personalize가 레시피 파라미터를 자동으로 튜닝하도록 설정하겠습니다.

이 모든 작업은 AWS 콘솔에서 간단히 수행할 수 있습니다. 하지만 앞으로 자동으로 설정되도록 하는 편이 간편하므로, AWS CLI를 대신 사용하도록 하겠습니다.

$ aws personalize create-solution \
  --name jsimon-movieclick-solution \ 
  --perform-auto-ml --perform-hpo \
  --dataset-group-arn $DATASET_GROUP_ARN

이제 솔루션을 학습시킬 준비가 되었습니다. 서버에 대해서는 신경 쓰지 않아도 됩니다. 학습은 완전 관리형 인프라에서 이루어집니다.

$ aws personalize create-solution-version \
  --solution-arn $SOLUTION_ARN 

학습이 완료되면 해당 솔루션 버전을 사용해 추천 캠페인을 생성할 수 있습니다.

추천 캠페인 배포

이 단계에서도 서버에 대해서는 신경 쓸 필요가 없습니다. 캠페인은 수신 트래픽에 따라 자동으로 조정됩니다. 지원하려는 TPS(초당 트랜잭션 수)의 최소 수만 정의하면 됩니다.

이 수는 모델을 호스팅할 초기 플릿을 사이징하는 데 사용됩니다. 또한 추천 서비스에 대해 부과하는 요금에도 영향을 미칩니다(TPS 1시간당 0.20 USD). 이 예에서는 파라미터를 10으로 설정합니다. 초기에 시간당 2 USD를 부과한다는 의미입니다. 트래픽이 10TPS를 초과하면 Personalize가 확장되어 새 TPS 설정에 따라 요금이 증가합니다. 트래픽이 감소하면 Personalize가 축소되지만 최소 TPS 설정 미만으로는 축소되지 않습니다.

$ aws personalize create-campaign \
  --name jsimon-movieclick-campaign \
  --min-provisioned-tps 10 \
  --solution-version-arn $SOLUTION_VERSION_ARN

나중에 새로운 솔루션 버전으로 캠페인을 업데이트해야 할 경우 UpdateCampaign API를 사용하고 새 솔루션 버전의 ARN을 전달하기만 하면 됩니다.

캠페인이 배포되고 나면 새 영화를 제대로 추천하는지 간단히 테스해볼 수 있습니다.

신규 항목 실시간 추천

이보다 더 간단할 수는 없죠? 사용자 ID를 전달하기만 하면 추천 항목이 수신되니까요.

$ aws personalize-rec get-recommendations \
--campaign-arn $CAMPAIGN_ARN \
--user-id 123 --query "itemList[*].itemId"
["1210", "260", "2571", "110", "296", "1193", ...]

이제 추천 모델을 애플리케이션에 통합할 준비가 되었습니다. 예를 들어 웹 애플리케이션에서 권장 영화 목록을 표시하도록 하려면 다음 단계를 구현해야 합니다.

  • 원하는 언어로 GetRecommendations API를 사용하여 캠페인을 호출하고 지정된 사용자에 대해 영화 추천 항목을 수신합니다.
  • 백엔드에서 영화 메타데이터(이미지 URL, 제목, 장르, 개봉 날짜 등)를 읽습니다.
  • 사용자의 브라우저에서 렌더링할 HTML 코드를 생성합니다.

Amazon Personalize 작동 방식

Jake Wells라는 제 동료는 실제로 책을 추천하는 웹 애플리케이션을 만들었습니다. Jake는 1,900만 건이 넘는 서적 리뷰가 포함된 공개용 데이터 세트를 사용해 먼저 Amazon SageMaker에서 호스팅되는 노트북으로 데이터를 정리하고 준비했습니다. 그런 다음 Amazon Personalize로 추천 모델을 학습시키고, 추천 프로세스를 시연하는 간단한 웹 애플리케이션을 작성했습니다. 이 프로젝트는 따로 블로그 게시물을 통해 소개해야 할 만큼 훌륭합니다.

정식 출시

기록 데이터를 사용하든, 이벤트 스트림을 사용하든, 간단한 API 호출 몇 번으로 추천 모델을 학습시키고 배포할 수 있습니다. 기계 학습에 대한 지식이 전혀 없어도 되므로, thinkwithwp.com/personalize를 방문해 도전해보고 의견을 들려 주시기 바랍니다.

Amazon Personalize는 미국 동부(오하이오), 미국 동부(버지니아 북부), 미국 서부(오레곤), 아시아 태평양(도쿄), 아시아 태평양(싱가포르), EU(아일랜드) 리전에서 제공됩니다.

또한 이 서비스는 AWS 프리 티어의 일부로도 제공됩니다. 등록 후 첫 2개월 동안은 다음과 같은 혜택이 제공됩니다.
1. 데이터 처리 및 저장: 매월 최대 20GB
2. 학습: 매월 최대 100시간
3. 예측: 매월 최대 50TPS 시간의 실시간 추천

여러분의 피드백을 기다리겠습니다.

Julien;