AWS 기술 블로그

Amazon Personalize와 Amazon OpenSearch Service를 사용한 AI기반 개인화 검색 구현하기

본 게시물은 AWS Machine Learning Blog에 James Jory 님, Reagan Rosario님이 공저한 “Unlock personalized experiences powered by AI using Amazon Personalize and Amazon OpenSearch Service” 원문을 한국어로 번역 및 편집한 글입니다.

OpenSearch는 검색, 분석, 보안 모니터링, 통합 가시성 애플리케이션을 위한 확장 가능하고 유연하며 확장 가능한 오픈 소스 소프트웨어 제품군으로, Apache 2.0 라이선스를 따릅니다. Amazon OpenSearch Service는 AWS 클라우드에서 OpenSearch를 간편하게 배포, 확장, 운영할 수 있는 완전 관리형 서비스입니다.

OpenSearch는 BM-25라는 확률적 순위 프레임워크를 사용하여 관련성 점수를 계산합니다. 특정 키워드가 문서에 더 자주 나타나는 경우 BM-25는 해당 문서에 더 높은 관련성 점수를 할당합니다. 하지만, 이 BM-25 프레임워크는 클릭률이나 구매 데이터와 같은 사용자 행동은 고려하지 않습니다.

검색 기능을 개선하는 것은 웹사이트나 애플리케이션의 전반적인 사용자 경험과 참여도를 향상시키는 데 있어 필수적인 요소입니다. 검색 트래픽은 사용자가 적극적으로 특정 항목을 찾고 있기 때문에 구매 의도가 높은 것으로 간주되며, 검색 트래픽은 비검색 방문자보다 평균적으로 최대 2배 더 많이 특정 항목으로 유입되는 것으로 나타났습니다. 기업은’ 클릭’, ‘좋아요’, ‘구매’와 같은 사용자 상호 작용 데이터를 사용하여 검색 관련성을 개선함으로써 이러한 트래픽을 활용하고 사용자가 원하는 항목을 찾지 못해 세션을 포기하는 사례를 줄일 수 있습니다. 검색 결과의 품질을 개선함으로써 기업은 고객 참여도, 만족도, 충성도를 크게 향상시키고 구매 전환율을 높여 궁극적으로 수익성과 성공률을 높일 수 있습니다.

Amazon Personalize를 사용하면 Amazon.com에서 20년 이상 사용된 것과 동일한 머신 러닝(ML) 기술을 사용하여 애플리케이션에 정교한 개인화 기능을 추가할 수 있습니다. 이 서비스는 ML 전문 지식없이 손쉽게 개인화 기능을 구축할 수 있습니다.

Amazon Personalize는 기기 유형, 위치, 시간 또는 기타 제공한 정보 등 사용자에 대한 상황별 정보를 기반으로 추천을 자동으로 조정할 수 있도록 지원합니다. ‘구매 기록’, ‘평점’, ‘좋아요’ 등의 사용자 및 애플리케이션 내 상호 작용에 대한 과거 데이터를 Amazon Personalize에 제공합니다. Amazon Personalize에 알맞는 데이터 형식으로 Amazon Simple Storage Service(Amazon S3)에 CSV 파일에서 대용량 기록 데이터 세트를 한꺼번에 가져와서 Amazon Personalize에 추가할 수 있습니다. Amazon Personalize 콘솔 또는 API를 사용하여 레코드를 가져와서 데이터를 점진적으로 추가할 수도 있습니다. 기록 데이터를 가져온 후에는 사용자 상호작용 이벤트를 전송하여 새로운 데이터를 실시간으로 계속 제공할 수 있습니다. 제품 추천과 같이 해결하려는 사용 사례에 따라 해당 목표에 최적화된 사전 구축된 레시피를 선택합니다. Amazon Personalize는 데이터를 분석하고 레시피의 매개 변수를 기반으로 사용자 및 애플리케이션에 최적화된 개인화된 추천을 생성하기 위해 맞춤형 ML 모델을 학습시킵니다. 모델이 학습된 후에는 사용자를 위한 실시간 개인화 추천을 생성할 수 있습니다.

새로 출시된 Amazon Personalized Search Plugin for Amazon OpenSearch Service을 사용하면 사용자 상호 작용 기록과 관심사를 사용하여 검색 결과를 향상시킬 수 있습니다. Personalized-Ranking과 같은 Amazon Personalize 레시피를 활용하면, OpenSearch Service에서 검색 결과를 가져올 때 사용자의 관심사를 기반으로 관련 항목을 재 정렬하여 검색 결과를 개선할 수 있습니다.

이 게시글에서는 Amazon Personalize Search Ranking plugin with OpenSearch Service와 통합하여 개인화된 검색 환경을 구현하는 방법을 설명합니다. 이 게시글에서는 AWS Marketplace에서 제공되는 영화, TV 및 유명인 콘텐츠에 대한 세계에서 가장 권위 있는 소스인 IMDb의 데이터 세트와 다양한 영화에 대한 사용자 순위로 구성된 미네소타 대학교의 GroupLens 연구소에서 준비한 MovieLens 데이터 세트를 사용하여 Amazon Personalize 아티팩트를 구축합니다.

솔루션 개요

이 솔루션은 아래의 아키텍처로 구성됩니다.

워크플로에는 아래의 단계를 따릅니다.

  1. 사용자가 웹사이트나 포털을 통해 검색 요청을 합니다. 이 검색 요청은 OpenSearch Service로 전송됩니다.
  2. OpenSearch Service 인덱스에서 상위 N개의 검색 결과가 반환되고 플러그인으로 전송되어 Amazon Personalize 캠페인에 대한 입력을 사전 처리하고 준비합니다.
  3. 요청은 다시 순위가 지정된 검색 결과를 얻기 위해 Amazon Personalize로 전송됩니다.
  4. Amazon Personalize는 각 결과에 대한 관련 점수와 함께 검색 결과의 개인화 순위를 반환합니다.
  5. 순위가 재조정된 히트는 플러그인에 의해 OpenSearch Service로 반환되며, OpenSearch Service 순위와 Amazon Personalize 개인화 순위 사이에 가중치가 적용됩니다. 결과 순위를 재조정할 때 OpenSearch Service와 Amazon Personalize 간의 균형을 제어하는 가중치 매개변수(0.0 – 1.0 사이)를 지정할 수 있습니다. 가중치가 높을수록 OpenSearch 서비스 순위보다 Amazon 개인화 순위의 영향력이 더 커집니다. 이를 통해 개인화된 추천이 사용자에게 반환되는 최종 검색 결과 순위에 얼마나 영향을 미치는지 사용자 지정할 수 있습니다.
  6. 사용자는 자신의 선호도와 상호 작용을 기반으로 개인화된 검색 결과를 얻게 됩니다.

사전 요구 사항

다음 사전 요구 사항이 있어야 합니다.

  • AWS Account
  • 적절한 액세스 권한이 있는 AWS Identity and Access Management(IAM) 역할이 필요합니다. 예제에서 IAM 역할 및 액세스 권한을 설정하는 데 도움이 되는 AWS CloudFormation 템플릿과 Jupyter 노트북을 제공합니다.
  • OpenSearch Service에서 개인화 검색을 사용하려면 데이터 세트 그룹, 솔루션 버전, 캠페인 등 필요한 Amazon Personalize 리소스를 설정해야 합니다. 예제에서 Amazon SageMaker의 완전 관리형 Jupyter 노트북 인스턴스 기능을 활용하여 모든 Amazon Personalize 리소스를 생성하는 Jupyter 노트북을 제공하고 있습니다.

CloudFormation 스택 배포

CloudFormation 스택은 OpenSearch Service 도메인 및 SageMaker Notebook 인스턴스의 배포를 자동화합니다. 스택을 배포하려면 다음 단계를 완료하세요.

  1. CloudFormation 스택을 배포하려는 계정의 자격 증명으로 AWS 관리 콘솔에 로그인합니다.
  2. CloudFormation 스택을 직접 시작합니다.
  3. 세부 정보 지정 페이지에서 템플릿에 필요한 매개변수(예: OpenSearch Service 및 SageMaker 인스턴스 유형)를 입력합니다.
  4. 스택 옵션 구성 페이지에서 스택 이름과 설정하려는 기타 옵션을 지정합니다.
  5. 스택 생성을 완료하고 스택 세부 정보 페이지에서 상태를 모니터링합니다.
  6. 스택이 생성된 후, 콘솔에서 SageMaker 노트북 인스턴스를 엽니다.

노트북 인스턴스에는 이미 필요한 노트북이 미리 로드되어 있을 것입니다.

Amazon Personalize 워크플로 설정 및 완료하기

1.Configure_Amazon_Personalize.ipynb 노트북을 열어 Amazon Personalize 아티팩트를 설정합니다. 이 노트북은 다음 단계를 수행합니다.

  1. 데이터 세트를 다운로드하고 데이터를 전처리하여 데이터 세트 생성에 필요한 입력 파일을 만듭니다.
  2. 데이터 집합 그룹을 만듭니다.
  3. 데이터 집합과 스키마를 만듭니다.
  4. 데이터를 준비하고 가져옵니다.
  5. 솔루션 및 솔루션 버전을 만듭니다.
  6. 솔루션 버전에 대한 캠페인을 만듭니다.

Jupyter 노트북을 사용하여 Amazon Personalize 검색 순위 플러그인을 설치합니다.

2.Configure_Amazon_OpenSearch.ipynb 노트북을 열고 지침을 따라 실행합니다. 이 노트북은 다음 단계를 수행합니다.

  1. 샘플 인덱스 데이터를 OpenSearch Service 인스턴스로 수집합니다. 셈플 데이터로 인덱스를 채우면 플러그인에 대한 철저한 테스트와 검증이 용이해집니다.
  2. OpenSearch Service 도메인에 플러그인 패키지를 설치합니다. 이렇게 하면 개인화 기능이 OpenSearch 환경에 통합됩니다.
  3. 검색 파이프라인을 설정하여 플러그인의 기능을 활성화합니다. 검색 파이프라인에는 쿼리와 결과를 변환하는 요청 전처리기응답 후처리기가 포함되어 있습니다. 파이프라인을 구성할 때 개인화된 재순위를 활성화하려면 앞서 생성한 Amazon Personalize 캠페인 ARN을 personalized_search_ranking 포스트프로세서에 지정하세요. 이렇게 하면 결과 처리 중에 적용을 위해 Amazon Personalize에서 실시간 개인화 결과를 검색하도록 플러그인을 구성합니다. 파이프라인을 정의하면 플러그인이 사용자 기본 설정에 따라 검색 관련성을 강화할 수 있습니다.

콘솔을 사용하여 Amazon Personalize 검색 순위 플러그인을 설치합니다.

콘솔에서 Amazon Personalize 검색 플러그인을 설정할 수도 있습니다. 이 작업은 이전에 Jupyter 노트북을 사용하여 플러그인을 설치하지 않은 경우에만 수행하면 됩니다.

OpenSearch Service에 Amazon Personalize 검색 순위 플러그인을 설치하려면 다음 단계를 수행하세요.

  1. OpenSearch Service 콘솔에서 도메인으로 이동합니다.
  2. Packages(패키지) 탭에서 Associate package(패키지 연결)을 선택하여 Amazon Personalize 검색 순위 플러그인을 OpenSearch Service 도메인에 연결합니다. 플러그인 버전은 OpenSearch Service 도메인 버전과 일치해야 합니다.

Amazon Personalize 검색 순위 플러그인은 OpenSearch Service 버전 2.9 이상에서 설치할 수 있습니다.

  1. 사용 가능한 플러그인 목록에서 Amazon Personalize 검색 순위 플러그인을 찾습니다.
  2. 플러그인 옆의 연동을 선택하여 설치하고 기존 OpenSearch Service 도메인과 연결합니다.

플러그인을 연결하면 패키지 목록에 플러그인 유형으로 표시됩니다. 플러그인이 설치되면 이제 설치 프로세스가 완료됩니다.

Amazon Personalize 검색 순위 플러그인 사용

Amazon Personalize 검색 순위 플러그인은 버전 2.9부터 출시된 OpenSearch Service의 검색 파이프라인 기능을 사용합니다. 이 플러그인은 검색 파이프라인 기능에 의존하여 OpenSearch Service에서 제공하는 검색 결과에 Amazon Personalize 순위를 적용하며 검색 파이프라인 응답 프로세서로도 설정해야 합니다. 이 파이프라인 정의에는 Amazon Personalize 플러그인에 대한 구성이 포함되며, 여기에는 Amazon Personalize 순위를 얻기 위해 호출하는 Amazon Personalize 캠페인, Amazon Personalize 리소스에 액세스하기 위한 IAM 역할 및 다음 표에 정의된 매개 변수가 포함됩니다.

Settings Required Default Description
campaign Yes None 결과를 개인화하는 데 사용할 Amazon Personalize 캠페인의 ARN을 지정합니다.
recipe Yes None 사용할 Amazon Personalize 레시피의 이름을 지정합니다. 이 글을 작성하는 현재로서는 aws-personalized-ranking만이 지원되는 값입니다.
item_id_field No “_id” OpenSearch에서 색인된 문서의 _id 필드가 Amazon Personalize itemId와 일치하지 않는 경우 일치하는 필드 이름을 지정합니다.
weight Yes None 응답 프로세서가 결과의 순위를 다시 지정할 때 개인화에 중점을 두는 부분을 지정합니다. 0.0-1.0 범위 내에서 값을 지정합니다. 1.0에 가까울수록 Amazon Personalize의 결과가 더 높은 순위를 차지할 가능성이 높아집니다. 0.0을 지정하면 개인화가 수행되지 않으며 OpenSearch Service의 내장된 우선 순위 알고리즘에 따릅니다.
tag No None 프로세서의 식별자를 지정합니다.
iam_role_arn Yes None Amazon Personalize 리소스에 액세스할 수 있는 IAM 역할을 지정합니다. 이는 OpenSearch Service의 경우 필수이며, 오픈 소스 OpenSearch의 경우 선택 사항입니다.
aws_region Yes None Amazon Personalize 캠페인을 생성한 AWS 지역을 지정합니다.
ignore_failure No None 플러그인이 프로세서 오류를 무시할지 여부를 지정합니다. 값은 true 또는 false 으로 지정합니다. 프로덕션 환경의 경우 쿼리 응답이 중단되지 않도록 true을 지정하는 것이 좋습니다. 테스트 환경의 경우 false를 지정하여 플러그인에서 생성되는 모든 오류를 볼 수 있습니다.
external_account_iam_role_arn No None OpenSearch Service를 사용 중이고 Amazon Personalize와 OpenSearch Service 리소스가 서로 다른 계정에 있는 경우 Amazon Personalize에 액세스할 수 있는 권한이 있는 역할의 ARN을 지정합니다.

다음 Python 코드는 OpenSearch Service 도메인에서 personalized_search_ranking response_processors를 사용하여 검색 파이프라인을 만듭니다. 이 단계는 이 게시물과 함께 제공되는 노트북의 일부로 한 번 실행합니다:

개인화된 순위를 위한 검색 파이프라인 정의하기

다음 Python 코드를 사용하여 OpenSearch Service 도메인에서 personalized_search_rankingresponse_processors가 있는 검색 파이프라인을 만들 수 있습니다. 도메인 엔드포인트를 도메인 엔드포인트 URL로 바꿉니다. 예: https://<domain name>.<AWS region>.es.amazonaws.com

import requests
from requests_auth_aws_sigv4 import AWSSigV4

domain_endpoint = 'domain endpoint'
pipeline_name = 'pipeline name'
url = f'{domain_endpoint}/_search/pipeline/{pipeline_name}'
auth = AWSSigV4('es')

headers = {'Content-Type': 'application/json'}

body = {
  "description": "A pipeline to apply custom re-ranking from Amazon Personalize",
  "response_processors": [
    {
      "personalized_search_ranking" : {
        "campaign_arn" : "<Replace with Amazon Personalize Campaign ARN>",
        "item_id_field" : "itemId",
        "recipe" : "aws-personalized-ranking",
        "weight" : "0.3",
        "tag" : "personalize-processor",
        "iam_role_arn": "<Replace with Role ARN>",
        "aws_region": "<Replace with AWS region>",
        "ignore_failure": true
    }
  ]
}
try:
    response = requests.put(url, auth=auth, json=body, headers=headers)
    print(response.text)
except Exception as e:
    print(f"Error: {e}")

개별 쿼리에 검색 파이프라인 적용하기

personalized_search_ranking 응답 프로세서를 사용하여 검색 파이프라인을 구성한 후에는 Amazon Personalize 검색 순위플러그인을 OpenSearch 쿼리에 적용하고 순위가 재조정된 결과를 볼 수 있습니다. 코드를 업데이트하여 도메인 엔드포인트, OpenSearch Service 인덱스, 파이프라인 이름(위에서 구성한 것), 쿼리(쿼리에는 “Tom Cruise”를 사용함)를 지정합니다. user_id에 검색 결과를 가져올 사용자의 ID를 지정합니다. 이 사용자는 Amazon Personalize 솔루션 버전을 만드는 데 사용한 데이터에 있어야 합니다.

import requests
from requests_auth_aws_sigv4 import AWSSigV4

domain_endpoint = 'domain endpoint'
index = 'index name'
url = f'{domain_endpoint}/{index}/_search/'

auth = AWSSigV4('es')
headers = {'Content-Type': 'application/json'}
params = {"search_pipeline": "<Replace with pipeline-name>"}
body = {
    "query": {
        "multi_match": {
            "query": "Tom Cruise",
            "fields": ["title", "plot", "genres", "directedBy", "starring"]
        }
    },
    "ext": {
        "personalize_request_parameters": {
            "user_id": "<Replace with USER ID>"
        }
    }
}
try:
    response = requests.post(url, auth=auth, params=params, json=body, headers=headers)
    print(response)
except Exception as e:
    print(f"Error: {e}")

결과 평가

3.Testing.ipynb 노트북을 열고 단계를 따라 개인화를 사용하는 쿼리와 그렇지 않은 쿼리의 결과를 테스트하고 비교합니다. Amazon Personalize 검색 순위 플러그인은 OpenSearch Service 쿼리 응답에서 검색 결과의 순위를 다시 매깁니다. 이 플러그인은 Amazon Personalize의 순위와 OpenSearch Service의 순위를 모두 고려합니다. 이 노트북은 다음 단계를 안내합니다:

  1. OpenSearch Service 도메인과의 연결을 설정하는 데 필요한 연결 매개변수를 정의합니다. 여기에는 도메인 엔드포인트, 인증 자격 증명 및 특정 OpenSearch Service 설정에 필요한 추가 구성 설정을 지정하는 것이 포함됩니다.
  2. 개인화 매개변수가 있는 쿼리와 개인화 매개변수가 없는 쿼리를 포함하여 샘플 쿼리 집합을 만듭니다. 이러한 쿼리는 개인화가 검색 결과에 미치는 영향을 평가하는 데 사용됩니다.
  3. 개인화를 사용하는 쿼리와 그렇지 않은 쿼리의 결과를 실행하고 비교합니다.

이 예에서는 ‘Tom Cruise“ ‘에 대한 쿼리를 사용하고 개인화 매개변수에는 최근 드라마 및 로맨스 영화 장르를 시청한 이력이 있는 사용자를 사용했습니다. 이후의 검색 결과는 플러그인이 사용자의 관찰된 시청 행동에 따라 추천을 맞춤화하고 우선순위를 정하는 방법을 보여줍니다. 이는 개별 사용자의 선호도와 참여 패턴을 고려하여 맞춤화된 큐레이션 경험을 제공하는 플러그인의 기능을 잘 보여줍니다. 사용자의 선호도에 대한 추론을 기반으로 검색 결과를 구체화하고 조정하는 기능을 통해 관련성과 유용성을 향상시킬 수 있습니다.

개인화된 결과와 비개인화된 결과 비교

ID가 12인 사용자에 대한 결과를 개인화해 보겠습니다. 먼저 3.Testing.ipynb 노트북에서 코드를 실행하여 이 사용자의 최근 상호 작용 기록을 검색하여 이 사용자의 최근 상호 작용을 확인합니다. 이를 통해 이 사용자가 최근에 어떤 유형의 영화를 검토했는지 확인할 수 있으며, 이를 통해 추천을 개인화하는 방법을 알 수 있습니다.

이 예에서는 사용자가 드라마, 로맨스, 스릴러 영화 장르에 관심을 보인 것을 확인할 수 있습니다. 개인화된 추천을 제공하기 위해 먼저 사용자의 장르 선호도를 활용하여 개인화 매개변수를 활성화한 상태에서 쿼리를 실행합니다. 그런 다음 개인화를 활성화하지 않은 상태에서 동일한 쿼리를 실행하여 비교합니다. 다음 결과는 개인화되지 않은 추천과 개인화된 추천 결과의 차이를 보여줍니다.

처음 두 열은 영화 색인에서 “Tom Cruise” 쿼리에 대한 기본 OpenSearch Service 결과를 표시하여 다양한 장르의 다양한 Tom Cruise 영화를 보여줍니다. 다음 두 열은 동일한 “Tom Cruise” 쿼리에 대한 개인화된 OpenSearch Service 결과를 보여주지만 드라마, 로맨스, 스릴러 장르에 관심이 있는 사용자에 맞게 맞춤화되어 있습니다. 일반 결과와 비교했을 때, 개인화된 결과는 사용자가 선호하는 드라마, 로맨스, 스릴러 장르의 톰 크루즈 영화가 눈에 띄게 표시됩니다. 이 델타는 개인화된 결과가 비개인화된 결과와 비교하여 어떻게 순위가 재조정되었는지, 사용자의 장르 선호도와 일치하는 영화의 우선순위가 어떻게 변경되었는지를 강조합니다. 이는 개인화가 어떻게 개별 사용자의 취향과 관심사에 맞게 OpenSearch Service 결과를 맞춤화할 수 있는지 보여줍니다.

이 비교는 Amazon Personalize가 어떻게 개별 사용자의 관심사에 맞게 OpenSearch Service 영화 결과를 맞춤화할 수 있는지 보여줍니다. 표준 OpenSearch Service는 “Tom Cruise”와 관련된 영화 결과를 보편적으로 제공하는 것을 목표로 하지만, Amazon Personalize는 사용자의 고유한 시청 기록과 선호도에 따라 이 사용자가 좋아할 것으로 예상되는 “Tom Cruise”영화에 초점을 맞춰 결과를 맞춤화합니다.

나란히 표시된 결과는 Amazon Personalize가 영화 결과를 개인에게 맞춤화하여 보다 타겟팅된 사용자 중심의 검색 환경을 제공하는 방법을 보여줍니다.

리소스 정리

리소스를 정리하려면 다음 단계을 수행합니다.

  1. 4.Cleanup.ipynb 노트북의 단계에 따라 노트북을 통해 생성한 리소스를 정리합니다.
  2. AWS CloudFormation 콘솔에서 생성한 스택을 삭제합니다.

결론

Amazon Personalize 검색 순위 플러그인은 OpenSearch Service와 원활하게 통합되어 개인화된 검색 환경을 구현합니다. 이 플러그인은 사용자 행동 데이터와 Amazon Personalize의 ML 기능을 사용하여 각 고유 사용자에 대한 관련성을 높이기 위해 OpenSearch Service 결과 순위를 재정렬할 수 있습니다. 이렇게 하면 가장 관련성이 높은 콘텐츠가 결과 상단에 표시되는 맞춤형 검색 환경이 만들어집니다. 이 플러그인은 다양한 사용 사례에 맞게 개인화와 OpenSearch Service 기본 점수의 균형을 맞출 수 있도록 구성할 수 있습니다. 전반적으로 Amazon Personalize 검색 순위 플러그인은 사용자의 개별적인 관심사와 선호도를 고려하여 OpenSearch Service 검색 관련성과 참여도를 향상시킬 수 있는 강력한 방법입니다. 몇 가지 구성 단계만 거치면 사용자의 공감을 불러일으키는 관련성 높은 결과를 제공할 수 있습니다.

추가 리소스

Sewoong Kim

Sewoong Kim

김세웅 Cloud Architect는 AWS Professional Services 팀의 일원으로서 컨테이너와 서버리스를 중심으로 AWS 기반 서비스를 구성하는 고객들에게 최적화된 아키텍처를 제공하고, GenAI Application Architect를 보다 고도화 하기 위한 여러 기술적인 도움을 드리고 있습니다.