AWS 기술 블로그
Amazon OpenSearch Service User Behavior Insights(UBI)로 사용자 행동 분석하기
대고객 서비스를 제공하는 워크로드의 경우 고객 경험을 지속적으로 향상시키기 위해서 다양한 이벤트나 프로모션을 진행합니다. 어떤 경우는 정기적으로 고객을 초청하여 인터뷰를 하며 서비스의 개선을 위한 피드백을 받기도 하고 어떤 경우는 웹 서비스상의 설문 조사를 통해 개선점을 수집하기도 합니다.
이커머스와 같은 서비스는 고객의 경험이 매출과 직결되는 대표적인 워크로드입니다. 따라서 다양한 고객의 피드백과 워크로드의 품질을 검토하기 위해서 해당 워크로드는 사용자의 행동 데이터를 수집하여 클릭률과 같은 다양한 이벤트를 분석해야 합니다. 하지만 이러한 서비스를 구성하는 것은 매우 복잡하고 대량의 이벤트를 수집하고 분석하기 위한 대규모 시스템이 필요합니다.
OpenSearch는 기계 학습과 인공지능, 검색, 옵저빌리티, 보안 분석에 특화된 커뮤니티 주도 오픈소스 검색 서비스입니다. OpenSearch 2.15 버전 이후 User Behavior Insights(UBI) 기능이 포함되었으며, 이를 활용하여 고객은 보다 쉽게 사용자의 행동 데이터를 수집하고 분석할 수 있습니다.
이번 게시글에서는 Amazon OpenSearch Service(AOS) 에서 Amazon OpenSearch Ingestion(OSI) 파이프라인을 활용하여 UBI를 구성하고 간단한 샘플 코드를 활용하여 데이터 수집과 대시보드를 통한 시각화를 해보겠습니다.
User Behavior Insights(UBI) 소개
User Behavior Insights(UBI)는 사용자의 검색 행동과 그 검색 결과, 그리고 해당 결과에서 사용자가 취한 행동을 수집하여 검색 품질 향상 및 분석과 비즈니스 인사이트를 얻기 위한 OpenSearch 플러그인입니다. UBI를 통하여 검색 서비스 운영자 또는 검색 분야 데이터 과학자는 “사용자가 우리 제품을 어떻게 활용하고 구매하는지”, “검색 후 제공된 상위 n개의 결과가 사용자에게 유용했는지”를 분석할 수 있습니다.
UBI는 사용자가 질의한 쿼리를 추적 및 기록하고, 검색 결과를 받은 후 후속 행동이나 이벤트를 모니터링 및 로깅하는 것을 목표로 합니다. 이를 위해 UBI는 아래 두 가지 인덱스를 사용하여 데이터를 수집합니다.
- 검색어와 결과를 저장하는
queries인덱스 - 사용자의 쿼리 이후 발생하는 후속 이벤트를 저장하는
events인덱스
UBI의 두 인덱스는 쿼리와 이벤트의 연결성을 유지하기 위하여 아래의 필드를 포함해야 합니다.
object_id는 사용자가 쿼리 응답으로 받는 모든 객체의 ID를 나타냅니다.query_id는 실행된 원시 쿼리에 대한 고유 ID이며,object_id는 사용자의 쿼리가 반환한 hits의 기본 식별자와 매핑됩니다.client_id는 실행한 사용자의 고유한 ID입니다. 이는 일반적으로 고유한 사용자가 사용하는 웹 브라우저입니다.object_id_field는 인덱스에서object_id를 제공하는 필드의 이름을 지정합니다.action_name은 특정 객체에 대해 수행된(또는 수행되지 않은) 사용자 동작(예: 클릭, 장바구니 담기, 관심 추가, 보기, 또는 구매 등)을 지정합니다.
query_id는 client_id를 통해 추적되는 사용자의 고유한 검색의 시작을 나타냅니다. 이 검색은 각각 고유한 object_id를 가진 다양한 객체를 반환합니다. action_name은 사용자가 수행 중인 작업을 명시하며, 각각 특정 object_id를 가진 객체들과 연결됩니다. object_id_field을 확인하여 객체 유형을 구분할 수 있습니다. UBI 인덱스 스키마에 대하여 보다 자세히 알고 싶으시다면 OpenSearch UBI 공식 문서를 참고하세요.
아래의 다이어그램은 사용자가 검색 클라이언트(검색 API) 및 UBI와 상호작용하는 과정 및 OpenSearch가 검색 클라이언트와 UBI 간의 상호작용하는 과정을 보여줍니다.
원본: https://docs.opensearch.org/latest/search-plugins/ubi/schemas/
Amazon OpenSearch Service에서는 오픈소스 OpenSearch와 달리 네이티브 UBI 플러그인을 사용할 수 없기 때문에 UBI 스타일의 사용자 행동 데이터 수집을 위하여 Amazon S3와 OpenSearch Data Prepper의 관리형 버전인 Amazon OpenSearch Ingestion을 조합할 수 있습니다.
UBI 솔루션 아키텍처
아래는 이번 게시글에서 실제로 구현하고 테스트해볼 UBI 솔루션의 아키텍처입니다.

위 솔루션은 제공되는 AWS CDK 코드를 통해 프론트엔드와 백엔드를 배포하고 Amazon OpenSearch Service와 UBI 구성을 위한 인프라를 배포합니다.
솔루션 배포를 위한 사전 조건
사전 조건이 완료 되었다면 배포를 수행합니다.
Step 1 : CDK 코드 Clone
먼저 aws-samples GitHub 레포지토리에서 opensearch_ubi를 clone 합니다. 여기서는 필요한 디렉토리/파일만 체크아웃하도록 depth 와 sparse-checkout 를 사용합니다.
코드 다운로드가 완료되면 deploy.sh를 통해 인프라 환경을 배포합니다. 배포에는 OpenSearch Cluster 배포를 포함하여 약 20분 가량 소요됩니다.
배포가 완료되면 터미널에 출력되는 엔드포인트를 통해 테스트용 웹 사이트를 접근할 수 있습니다. OpenSearch Dashboard 접근을 위한 ID 와 패스워드는 AWS Secrets Manager에 저장되며 출력 결과에 있는 AWS Command Line Interface(CLI)를 통해서 확인 가능합니다.
Step 2 : Index 정보 확인
생성된 OpenSearch의 Dashboard에 접근합니다. AWS Secrets Manager의 ID와 패스워드 정보를 확인해 로그인한 후 Dev Tools로 이동합니다. OpenSearch Dashboard의 Dev Tools에서는 간단한 쿼리를 통해 클러스터의 세팅 정보와 인덱스 정보, 그리고 검색이나 데이터 색인 작업을 할 수 있습니다. 아래는 OpenSearch Dashboard의 Dev Tools 화면입니다. 
쿼리를 통해 생성된 인덱스의 정보를 확인할 수 있습니다. 이번 데모에서 활용할 가상 데이터는 products 인덱스에 있습니다. 총 56개의 상품 데이터가 생성되어 있습니다. Index 정보를 확인했으니 실제 테스트용 웹 서비스에 접근하여 검색과 클릭 이벤트를 발생시켜 보겠습니다.
Step 3 : 이벤트 발행
deploy.sh 실행 결과에 출력된 웹사이트 링크로 들어가면 다음과 같은 화면을 볼 수 있습니다. 전자제품 데이터가 색인되어 있으며 products 인덱스 내에서 데이터를 검색할 수 있습니다. 상품을 클릭하고 장바구니 담기(Add to Cart) 버튼을 클릭합니다.

우측 하단에는 OpenSearch Ingestion 파이프라인으로 이벤트와 쿼리 결과가 색인되는 상태를 확인하는 박스가 나타납니다. UBI와 Query 값이 실시간으로 변경되는 것으로 정상적으로 데이터가 전달되고 있음을 알 수 있습니다. 또한 AWS Management Console 의 Amazon OpenSearch Service 콘솔에서 Ingestion > Pipelines > dev-ubi-pipeline의 Sink 지표를 통해 데이터가 OSI를 활용해 잘 색인되고 있는지 확인할 수 있습니다.

Step 4 : Dashboard 생성 및 모니터링
OpenSearch의 UBI를 통해 들어오는 이벤트 데이터를 Dev Tools로 확인하는것은 운영상 효율적이지 않습니다. OpenSearch에서는 UBI를 위한 Dashboard를 제공하고 있습니다. 공식 튜토리얼 문서 에서 sample UBI Dashboard를 클릭해 다운받으세요. 그리고 아래의 단계를 수행합니다.
- 좌측 메뉴에서 Management > Dashboard Management 로 이동합니다.
- Dashboard 패널에서 Saved Objects를 선택합니다.
- 오른쪽 상단에서 Import를 선택합니다.
- 파일 선택 패널에서 Import를 선택합니다.
- 다운로드한 UBI 대시보드 파일을 선택하고 Import 버튼을 선택합니다.
대시보드 등록이 완료되면 좌측 메뉴에서 Dashboards > User Behavior Insights 를 클릭하세요. 대시보드가 성공적으로 Import 되었다면 아래와 같은 화면이 보입니다.

대시보드 상단의 달력모양 아이콘의 Quick select를 클릭후 Refresh every를 5초로 설정하여 실제 검색과 클릭시 지표가 어떻게 보이는지 확인해 보겠습니다.
검색과 클릭을 지속적으로 수행하면 좌측 대시보드의 지표가 실시간으로 변하는 것을 확인할 수 있습니다.

이러한 실제 고객의 행동 데이터(검색, 도큐먼트 클릭 등)는 이후 고객 검색의 정확도 개선과 클릭률 개선을 위한 비즈니스 지표로 이용 될 수 있고 나아가 초 개인화 추천을 위한 LTR(Learning to Rank) 학습 또는 별도 Re-Ranker 모델 학습에도 사용될 수 있습니다. OpenSearch의 LTR 플러그인 관련하여 더 자세히 알고 싶으시다면 “Amazon OpenSearch Service의 LTR 플러그인을 활용한 검색 품질 개선” 블로그를 참고 하세요.
실습 리소스 정리
이번 UBI 데모를 통해 구현해본 사용자 이벤트 수집 솔루션은 고객의 Web 어플리케이션에 UBI 수집을 위한 JavaScript 코드의 일부 수정으로 다양한 프로덕션 워크로드에서 활용할 수 있습니다. 실습 후, 사용하지 않는 경우 비용이 발생할 수 있으며 아래의 쉘 스크립트를 통해 생성한 리소스를 제거하세요.
마무리
이번 글에서 소개한 UBI는 검색 서비스가 핵심 비즈니스 도메인으로 자리 잡고 있는 이커머스와 같은 산업에서 필수에 가까운 솔루션입니다. 사용자 이벤트를 수집하는 솔루션은 구현 난이도가 상당히 높으며 많은 리소스를 요구합니다. Amazon OpenSearch Service의 UBI 기능은 Data Prepper를 기반으로 만들어진 OpenSearch Ingestion 파이프라인을 사용하여 관리형 큐로서 활용이 가능하며 서버리스 제품으로 보다 효율적인 운영 환경을 제공합니다.
이 글을 통해 보다 쉽게 사용자 이벤트를 수집하고 높은 성능과 정확도의 검색 서비스를 운영하는 데 도움이 되길 바랍니다.