Amazon Personalize를 사용하여 개인화되고 순위가 다시 매겨진 추천 생성 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Personalize를 사용하여 개인화되고 순위가 다시 매겨진 추천 생성

작성자: Mason Cahill(AWS), Matthew Chasse(AWS), Tayo Olajide(AWS)

코드 리포지토리: personalize-pet-recommendations

환경: PoC 또는 파일럿

기술: 머신 러닝 및 AI, 클라우드 네이티브, 인프라 DevOps, 서버리스

워크로드: 오픈 소스

AWS 서비스: AWS CloudFormation, 아마존 키네시스 데이터 파이어호스, AWS Lambda, 아마존 Personalize, AWS Step Functions

요약

이 패턴은 Amazon Personalize를 사용하여 해당 사용자의 실시간 사용자 상호 작용 데이터 수집을 기반으로 재순위 추천을 비롯한 개인화된 권장 사항을 생성하는 방법을 보여줍니다. 이 패턴에 사용된 예제 시나리오는 사용자의 상호 작용(예: 사용자가 방문하는 애완동물)을 기반으로 사용자를 위한 추천을 생성하는 애완동물 입양 웹사이트를 기반으로 합니다. 예제 시나리오를 따르면 Amazon Kinesis Data Streams를 사용하여 상호 작용 데이터를 수집하고, AWS Lambda를 사용하여 권장 사항을 생성하고 권장 사항의 순위를 조정하며, Amazon Data Firehose를 사용하여 Amazon Simple Storage Service (Amazon S3) 버킷에 데이터를 저장하는 방법을 배웁니다. 또한 AWS Step Functions를 사용하여 권장 사항을 생성하는 솔루션 버전(즉, 학습된 모델)을 관리하는 상태 머신을 구축하는 방법도 배웁니다.

사전 조건 및 제한 사항

사전 조건

제품 버전

  • Python 3.9

  • AWS CDK 2.23.0 이상

  • AWS CLI 2.7.27 이상

아키텍처

기술 스택

  • 아마존 데이터 파이어호스

  • Amazon Kinesis Data Streams

  • Amazon Personalize

  • Amazon Simple Storage Service(S3)

  • AWS Cloud Development Kit(AWS CDK)

  • AWS Command Line Interface(AWS CLI)

  • AWS Lambda

  • AWS Step Functions

대상 아키텍처

다음 다이어그램은 실시간 데이터를 Amazon Personalize로 수집하기 위한 파이프라인을 보여줍니다. 그런 다음 파이프라인은 해당 데이터를 사용하여 사용자를 위한 개인화되고 순위가 조정된 추천을 생성합니다.

Amazon Personalize에 사용되는 데이터 통합 아키텍처

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. Kinesis Data Streams는 Lambda 및 Firehose에서 처리하기 위해 실시간 사용자 데이터 (예: 방문한 애완동물 같은 이벤트) 를 수집합니다.

  2. Lambda 함수는 Kinesis Data Streams의 레코드를 처리하고 API 호출을 통해 레코드의 사용자 상호 작용을 Amazon Personalize의 이벤트 트래커에 추가합니다.

  3. 시간 기반 규칙은 Step Functions 상태 머신을 호출하고 Amazon Personalize의 이벤트 추적기의 이벤트를 사용하여 추천 및 순위 재지정 모델에 대한 새 솔루션 버전을 생성합니다.

  4. Amazon Personalize 캠페인은 새 솔루션 버전을 사용하도록 상태 머신에 의해 업데이트됩니다.

  5. Lambda는 Amazon Personalize 순위 조정 캠페인을 호출하여 권장 품목 목록의 순위를 다시 매깁니다.

  6. Lambda는 Amazon Personalize 추천 캠페인을 호출하여 권장 품목 목록을 검색합니다.

  7. Firehose는 이벤트를 과거 데이터로 액세스할 수 있는 S3 버킷에 저장합니다.

도구

AWS 도구

  • AWS Cloud Development Kit(AWS CDK)는 AWS 클라우드 인프라를 코드로 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.

  • AWS Command Line Interface (AWS CLI)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.

  • Amazon Data Firehose를 사용하면 지원되는 타사 서비스 공급자가 소유한 다른 AWS 서비스, 사용자 지정 HTTP 엔드포인트 및 HTTP 엔드포인트에 실시간 스트리밍 데이터를 전송할 수 있습니다.

  • Amazon Kinesis Data Streams를 사용하여 대규모 데이터 레코드 스트림을 실시간으로 수집하고 처리할 수 있습니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • Amazon Personalize는 데이터를 기반으로 사용자를 위한 품목 추천을 생성하는 데 도움이 되는 완전 관리형 기계 학습(ML) 서비스입니다.

  • AWS Step Functions는 Lambda 함수와 기타 AWS 서비스를 결합하여 비즈니스 크리티컬 애플리케이션을 구축할 수 있게 지원하는 서버리스 오케스트레이션 서비스입니다.

기타 도구

  • pytest는 작고 읽기 쉬운 테스트를 작성하기 위한 Python 프레임워크입니다.

  • Python은 범용 컴퓨터 프로그래밍 언어입니다.

코드

이 패턴의 코드는 GitHub Animal Recommender 리포지토리에서 사용할 수 있습니다. 이 리포지토리의 AWS CloudFormation 템플릿을 사용하여 예제 솔루션의 리소스를 배포할 수 있습니다.

참고: Amazon Personalize 솔루션 버전, 이벤트 추적기 및 캠페인은 기본 CloudFormation 리소스를 확장하는 사용자 지정 리소스 (인프라 내) 로 뒷받침됩니다.

에픽

작업설명필요한 기술

격리된 Python 환경을 생성합니다.

Mac 및 Linux 설치

  1. 가상 환경을 수동으로 만들려면 터미널에서 $ python3 -m venv .venv 명령을 실행합니다.

  2. init 프로세스가 완료되면 $ source .venv/bin/activate 명령을 실행하여 가상 환경을 활성화합니다.

Windows 설정

가상 환경을 수동으로 만들려면 터미널에서 % .venv\Scripts\activate.bat 명령을 실행합니다.

DevOps 엔지니어

CloudFormation 템플릿을 합성하세요.

  1. 필요한 종속성을 설치하려면 터미널에서 $ pip install -r requirements.txt 명령을 실행합니다.

  2. AWS CLI에서 다음과 같은 환경 변수를 설정합니다

    • export ACCOUNT_ID=123456789

    • export CDK_DEPLOY_REGION=us-east-1

    • export CDK_ENVIRONMENT=dev

  3. config/{env}.yml 파일에서 Virtual Private Cloud(VPC) ID와 일치하도록 vpcId를 업데이트합니다.

  4. 이 코드의 CloudFormation 템플릿을 합성하려면 명령을 실행합니다. $ cdk synth

참고: 2단계에서는 CDK_ENVIRONMENTconfig/{env}.yml 파일을 참조합니다.

DevOps 엔지니어

리소스를 배포하고 인프라를 생성합니다.

솔루션 리소스를 배포하려면 ./deploy.sh 터미널에서 명령을 실행합니다.

이 명령은 필수 Python 종속성을 설치합니다. Python 스크립트는 S3 버킷과 AWS Key Management Service(AWS KMS) 키를 생성한 다음, 초기 모델 생성을 위한 시드 데이터를 추가합니다. 마지막으로 스크립트가 cdk deploy를 실행하여 나머지 인프라를 생성합니다.

참고: 초기 모델 학습은 스택 생성 중에 이루어집니다. 스택 생성 완료까지 최대 2시간이 걸릴 수 있습니다.

DevOps 엔지니어

관련 리소스

추가 정보

페이로드 및 응답 예시

Lambda 함수 권장 사항

권장 사항을 검색하려면 다음 형식의 페이로드와 함께 Lambda 함수 권장 사항 에 요청을 제출합니다.

{ "userId": "3578196281679609099", "limit": 6 }

다음 예제 응답은 동물 그룹 목록을 포함합니다.

[{"id": "1-domestic short hair-1-1"}, {"id": "1-domestic short hair-3-3"}, {"id": "1-domestic short hair-3-2"}, {"id": "1-domestic short hair-1-2"}, {"id": "1-domestic short hair-3-1"}, {"id": "2-beagle-3-3"},

userId 필드를 생략하면 함수는 일반적인 권장 사항을 반환합니다.

Lambda 함수 순위 재지정

순위 재지정을 사용하려면 Lambda 함수 순위 재지정에 요청을 제출합니다. 페이로드에는 userId의 순위를 다시 매길 모든 항목 ID와 해당 메타데이터가 포함되어 있습니다. 다음 예제 데이터는 animal_species_id(1=cat, 2=dog)에는 Oxford Pets 클래스를 사용하고 animal_age_idanimal_size_id에는 정수 1~5를 사용합니다.

{ "userId":"12345", "itemMetadataList":[ { "itemId":"1", "animalMetadata":{ "animal_species_id":"2", "animal_primary_breed_id":"Saint_Bernard", "animal_size_id":"3", "animal_age_id":"2" } }, { "itemId":"2", "animalMetadata":{ "animal_species_id":"1", "animal_primary_breed_id":"Egyptian_Mau", "animal_size_id":"1", "animal_age_id":"1" } }, { "itemId":"3", "animalMetadata":{ "animal_species_id":"2", "animal_primary_breed_id":"Saint_Bernard", "animal_size_id":"3", "animal_age_id":"2" } } ] }

Lambda 함수는 이러한 항목의 순위를 다시 지정한 다음 Amazon Personalize의 직접 응답과 항목 ID가 포함된 정렬된 목록을 반환합니다. 이 목록은 항목이 속한 동물 그룹과 점수의 순위 목록입니다. Amazon Personalize는 사용자 개인화개인화 순위 레시피를 사용하여 권장 사항의 각 항목에 대한 점수를 포함합니다. 이러한 점수는 사용자가 다음에 선택할 Amazon Personalize의 상대적 확실성을 나타냅니다. 점수가 높을수록 확실성이 높아집니다.

{ "ranking":[ "1", "3", "2" ], "personalizeResponse":{ "ResponseMetadata":{ "RequestId":"a2ec0417-9dcd-4986-8341-a3b3d26cd694", "HTTPStatusCode":200, "HTTPHeaders":{ "date":"Thu, 16 Jun 2022 22:23:33 GMT", "content-type":"application/json", "content-length":"243", "connection":"keep-alive", "x-amzn-requestid":"a2ec0417-9dcd-4986-8341-a3b3d26cd694" }, "RetryAttempts":0 }, "personalizedRanking":[ { "itemId":"2-Saint_Bernard-3-2", "score":0.8947961 }, { "itemId":"1-Siamese-1-1", "score":0.105204 } ], "recommendationId":"RID-d97c7a87-bd4e-47b5-a89b-ac1d19386aec" } }

Amazon Kinesis 페이로드

Amazon Kinesis로 전송할 페이로드의 형식은 다음과 같습니다.

{ "Partitionkey": "randomstring", "Data": { "userId": "12345", "sessionId": "sessionId4545454", "eventType": "DetailView", "animalMetadata": { "animal_species_id": "1", "animal_primary_breed_id": "Russian_Blue", "animal_size_id": "1", "animal_age_id": "2" }, "animal_id": "98765" } }

참고: 인증되지 않은 사용자의 경우 userId 필드가 제거됩니다.