728x90
반응형
  • Cypher & GQL

편집자 주: 이 프레젠테이션은 Irene Iriarte-Carretero가 GraphConnect San Francisco 2016년 10월에 진행한 내용이에요.

프레젠테이션 요약

Gousto는 Neo4j를 사용하는 영국 기반의 레시피 박스 서비스인데요. 고객에게 더 개인화된 추천을 제공하기 위해 레시피 온톨로지를 매핑하고 있어요. 모든 것은 고객 데이터 여정에서 시작해서, 데이터 수집 및 분석을 통해 마케팅, 예측, 창고 유통 및 제품 할당 분야의 효율성을 높이는 데 도움을 주고 있죠.

고객 개인화는 간단한 이유 때문에 회사의 비즈니스 모델에서 정말 중요한 역할을 해요. 고객에게 관련 레시피를 제공하면 고객 만족도가 높아지고, 이는 고객이 구독 서비스를 계속 사용할 가능성이 더 높다는 것을 의미하거든요.

이렇게 효과적인 맞춤형 추천을 생성하기 위해 Gousto는 하이브리드 추천 엔진을 사용하는데요, 이는 Lyst의 Maciej Kula가 개발한 개념인 LightFM을 통해 협업 및 콘텐츠 기반 모델의 가장 좋은 특성을 결합한 것이랍니다.

Neo4j의 온톨로지를 개발함으로써 Gousto는 재료, 요리 유형, 선호도, 고객 유형 등을 기반으로 요리 간의 유사성 값을 할당하는 고기능 개인화 엔진을 개발하고 개선해서 고객을 최대한 만족시켜 계속 서비스를 이용하도록 만들고 있어요.

전체 프레젠테이션: 개인화를 위한 그래프의 온톨로지 매핑

이 블로그에서는 Neo4j Graph Database를 사용해서 고객을 위한 레시피 개인화를 개발하기 위한 온톨로지를 개발하는 방법을 살펴볼 거예요.

저는 Irene이고, Gousto의 데이터 과학자에요. Gousto는 영국에 본사를 둔 온라인 레시피 박스 서비스인데요. 미국에는 Blue Apron이나 HelloFresh와 비슷한 개념의 회사들이 많죠.

고객이 우리 웹사이트를 방문해서 주간 메뉴에서 4가지 레시피를 고르고, 요리할 인원수랑 음식 배달 날짜를 선택해요. 선택한 날짜에 맞춰, 딱 필요한 만큼의 재료와 따라하기 쉬운 레시피 카드가 담긴 상자가 문 앞으로 배송되죠. 이렇게 하면 식료품 사러 갈 필요도 없고, 식단 짜느라 머리 아플 일도 없어요.

저희 회사에서 중요하게 생각하는 건 음식물 쓰레기를 줄이는 거예요. 예전에는 당근 몇 개만 필요해도 큰 봉지를 사야 했고, 정말 조금만 필요한 재료를 비싼 병으로 사야 했잖아요.

Gousto의 핵심은 '선택'에 있어요. 매주 글루텐 프리, 유제품 프리, 채식주의 옵션을 포함해서 22가지나 되는 다양한 레시피를 제공하니까, 고객님들의 취향에 딱 맞게 메뉴를 고를 수 있죠. 게다가 일주일 내내 원하는 시간(오전, 오후, 저녁)에 맞춰 배송도 해드려요.

Gousto의 데이터 과학 팀은 비즈니스 요구사항을 지원하는 알고리즘을 만들고, 전환 유입 경로를 최적화하기 위한 분석을 실행하고, 다양한 할인에 대한 고객 반응을 확인하는 등 다양한 장기 프로젝트를 담당하고 있어요. 저희는 데이터 기반 회사가 되기 위해 노력하고 있고, 모든 직원이 중요한 회사 데이터에 쉽게 접근할 수 있도록 SQL 교육도 적극적으로 지원하고 있답니다.

Gousto 데이터 여정

저희 회사는 설립된 지 5년 정도 되었는데, 아주 초기부터 Google Analytics 같은 외부 데이터 소스를 활용해서 데이터 여정을 시작했어요. CEO가 보고서를 요청할 때마다 엑셀 작업이 많았지만, 고객이 우리 서비스를 어떻게 이용하는지 전체적인 여정을 파악하기는 어려웠죠.

하지만 데이터가 결국 경쟁사와 우리를 차별화해줄 거라고 믿고 데이터에 적극적으로 투자해서, 회사를 든든하게 지원해줄 데이터 생태계를 구축했어요.

현재 저희의 데이터 여정은 다음과 같아요.

저희의 주요 데이터 웨어하우스는 Amazon Redshift에요. VI 시각화 도구로는 Periscope를 사용하고 있고, 고객 행동을 파악하기 위한 통합 CRM 시스템으로는 Salesforce를 사용하고 있죠. 그리고 매일 예약 이메일을 보내는 것 같은 ETL 프로세스는 Airflow로 관리하고, 웹사이트에서 고객이 어떤 행동을 하는지에 대한 정보는 Snowplow를 통해서 수집하고 있어요. 고객이 어디를 클릭했는지, 얼마나 오래 머물렀는지 등을 추적하는 거죠.

마지막으로, 를 사용해서 다양한 레시피 간의 유사성을 계산하고 있어요. Neo4j를 선택하게 된 배경과 해결하려 했던 문제에 대해 좀 더 자세히 설명해 드릴게요.

데이터와 Gousto 고객 여정

그렇다면 데이터가 실제로 우리 제품에 어떤 영향을 미칠까요? 최종 결과는 뭘까요? 이 질문에 답하기 위해 제가 만든 간단한 고객 여정을 한번 살펴볼까요?

고객이 TV 광고를 보고 우리 웹사이트나 앱에 방문하기로 결정했다고 가정해 볼게요. 고객은 Lincolnshire에 있는 저희 주문 처리 센터에서 주문을 완료하고, 해당 상자가 준비되면 집으로 배송되는 거죠.

다음은 데이터 과학이 최종 제품에 어떤 역할을 하는지 몇 가지 핵심적인 부분이에요.

마케팅 기여

초반 예시에서 언급했듯이, TV 광고를 시작했는데 이건 고객을 웹사이트로 유도하는 역할을 하죠. 특정 제품을 사용하도록 설득하려면 고객에게 한 번 이상 접근해야 하기 때문에 Facebook이나 전단지 배포와 같은 추가 마케팅 방법이 많이 필요해요.

이런 이유로 다양한 채널의 활용과 서로 어떤 영향을 미치는지 살펴보는 마케팅 기여 모델을 구축했어요. 이건 리소스를 최대한 효과적으로 사용하기 위해 마케팅 비용을 어떻게 할당해야 하는지 알려주는 데 도움이 된답니다.

주식 조작 및 예측

웹사이트를 방문하면 사용 가능한 레시피 목록이 쭉 뜨고, 거기서 레시피를 선택하면 3일 후에 상자를 받게 돼요. 주문 후 배송까지 시간이 너무 짧기 때문에 주문 후에 구매할 수는 없어요. 대신 고객이 주문하기 전에 미리 주문을 해야 하죠.

그래서 특정 주에 대한 인수를 결정하는 데 도움이 되는 다양한 입력을 고려하는 예측 모델을 구축한 이유에요. 여기에는 날씨, 휴일, 고객 집단 분석, 확률론적 이론, 해당 주의 실시간 고객 동향과 같은 요소가 포함되고, 모두 주문에 영향을 미치죠.

이걸 통해 주문해야 하는 각 상품의 양으로 변환할 수 있는 총 상자 수를 알 수 있어요. 22가지 레시피 중 일부는 다른 것보다 인기가 더 많거든요.

일반적으로 샐러드가 닭고기 국수보다 인기가 덜하다는 걸 알고 있기 때문에 국수를 더 주문해야 해요. 지속 가능한 비즈니스를 구축하려고 노력하고 있기 때문에 음식물 쓰레기를 만들지 않으면서 동시에 고객에게 가능한 한 많은 다양성을 제공하고 싶어요. 이 균형에 도달하기 위해 이 모델을 계속 조정하고 개선하고 있답니다.

또한 글루텐 프리 또는 채식과 같은 다양한 구독 멤버십 유형에 대한 재고 조작 시스템도 갖추고 있어요. 주식 조작은 백그라운드에서 계속 실행되면서 이러한 제약 조건을 충족시키는 알고리즘이에요.

창고 최적화 시스템

고객이 주문하면 요청한 레시피가 창고 최적화 시스템이 있는 주문 처리 센터로 이동돼요. 여기서는 유전자 알고리즘을 사용해서 가능한 한 효율적이고 빠르게 상자를 선택할 수 있도록 하죠.

평균적으로 박스당 약 50개의 고유 SKU가 있고, 모두 특정 제약 조건이 있어요. 예를 들어 토마토를 상자 바닥에 놓고 그 위에 콩 통조림을 놓는 건 원하지 않겠죠? 토마토가 찌그러질 수 있으니까요. 창고 최적화 알고리즘은 이러한 모든 유형의 사항을 고려해서 최대한 효율적으로 품목을 선택하고 포장한답니다.

저희가 정말 집중하고 있는 건 고객 여정 루프를 종료하는 방법이에요.

고객이 집에서 뭘 먹는지, 고객이 선택한 레시피, 그리고 이러한 레시피에 부여된 평가가 실제로 우리에 대해 얻는 경험에 영향을 미치도록 하는 거죠.

이 원을 강화하고 닫으면 고객에게 최대한 개인화된 서비스를 제공하는 데 집중할 수 있어요.

개인화

고객을 위한 개인화는 이런 거예요.

상단에는 Family Friendly, Quick & Easy 같은 컬렉션이 있어요. 저희 고객은 자신에게 딱 맞는 페이지를 방문해서 뭘 좋아할지 확인하고 싶어하죠. 어떤 분들은 음식 사진을 스크롤하는 걸 좋아하지만, 모두가 그런 건 아니잖아요? 바쁜 분들도 많기 때문에, 고객이 효율적으로 의미 있는 선택을 할 수 있도록 요약된 레시피 목록을 제공하는 게 중요해요.

개인화는 웹사이트뿐만 아니라 모든 커뮤니케이션 접점에서 중요해요. CRM도 포함되는데, 이걸 활용해서 정말 유용한 레시피와 정보를 사람들에게 보낼 수 있죠.

구독은 했지만 아직 레시피를 선택하지 않은 고객도 있어요. 이런 고객에게는 자동으로 레시피가 할당되는데, 이게 모두에게 딱 맞는 건 아니거든요. 고객이 할당된 선택에 만족하면 더 나은 유지율을 보여주더라고요. 개인화된 레시피를 제공하는 게 서로에게 좋은 거죠. 고객은 시간을 절약하고 원하는 레시피를 얻고, 저희는 고객을 유지하고 비즈니스를 성장시킬 수 있으니까요.

개인화는 머천다이징과 서비스 판매 방식과도 관련이 있지만, 레시피 추천이 큰 부분을 차지하는 건 분명해요.

추천 엔진

저희는 협업 필터링과 콘텐츠 기반 필터링, 이렇게 두 가지 종류의 추천 엔진을 사용하고 있어요.

협업 필터링

먼저 부터 살펴볼까요? 이건 비슷한 사용자가 뭘 좋아하는지에 따라 제품 추천을 제공하는 방식이에요. 아래 예시를 한번 봐주세요.

그래프 슈퍼 히어로 마크는 농어, 이탈리안 치킨, 새우 링귀니를 주문했어요. Emil이라는 친구도 있는데, 지금까지 링귀니와 농어, 이렇게 두 가지 요리만 주문했네요. 이 고객들은 요리 취향이 꽤 비슷하죠? 그래서 Mark가 주문했던 세 번째 요리, 이탈리안 치킨을 Emil에게 추천하는 거예요.

협업 필터링에는 몇 가지 장점이 있어요. 각 추천에는 여러 데이터 포인트가 있다는 거죠. 위 예시는 두 사용자 간의 유사성을 기반으로 했지만, 일반적으로 추천을 제공하는 데 도움이 되는 데이터 포인트를 제공하는 사용자 클러스터가 있답니다.

하지만 단점도 있어요. 첫 번째는 "콜드 스타트(Cold Start)"라는 개념인데, 추천 엔진이 새로운 사용자를 상대할 때, 사용자에 대한 정보가 없기 때문에 어려움을 겪는다는 의미예요. 희소성도 또 다른 문제죠. 엄청나게 많은 레시피 컬렉션이 있지만, 사용자가 모든 레시피를 선택할 수는 없으니까요. 그래서 각 사용자는 해당 레시피 중 일부하고만 상호 작용하게 되는 거죠.

콘텐츠 기반 필터링

다음은 콘텐츠 기반 필터링 예시인데, 이건 항목 간의 유사성을 기반으로 해요. 이 경우에는 레시피 간의 유사성을 비교하는 거죠.

여기 예전에 새우 링귀니를 주문했던 Emil이 있어요. 이번 주 메뉴에 파스타를 기반으로 한 또 다른 레시피가 있는데, 두 레시피가 꽤 비슷하니까 Emil에게 새로운 파스타 요리를 추천해 볼 수 있겠죠?

이런 유형의 필터링의 가장 큰 장점은 "콜드 스타트" 문제를 피할 수 있다는 점이에요. 추천을 할 때 레시피 속성에 의존하기 때문에 사용자에 대한 정보가 없어도 괜찮거든요. 반면에 협업 필터링에서는 해당 레시피를 주문한 적이 없다면 추천할 정보가 아직 부족하죠.

단점은 사용자 간에 많은 정보를 공유하지 않는다는 거예요. 즉, 우리가 놓치고 있는 더 미묘한 사용자 행동이 있을 수 있다는 뜻이기도 하고요.

우리는 또 우연한 기회도 놓치고 있어요. 예를 들어, 파스타를 주문하는 고객이 거의 항상 카레도 주문한다면, 비슷한 사용자에게 두 가지 요리를 모두 추천해야 한다는 걸 알 수 있는 정보가 부족한 거죠.

LightFM

협업 필터링과 콘텐츠 기반 필터링의 장단점을 모두 활용하는 완벽한 솔루션은 하이브리드 추천 시스템을 사용하는 거예요. LightFM에 의해 개발되었고, Maciej Kula가 Lyst에서 만들었죠. 저는 여러분 모두 그의 논문을 읽어보시길 추천드려요. 사용자 및 항목 콜드 스타트를 위한 메타데이터 임베딩 권장 사항에는 이 추천 시스템이 어떻게 작동하는지 설명되어 있답니다.

콜드 스타트 문제를 해결하기 위해 신규 사용자가 처음 가입할 때 선택할 수 있는 레시피 5~10개를 제공해요. 이렇게 하면 협업 필터링을 통해 다른 유사한 사용자와 비교할 수 있는 선호도에 대한 정보를 얻을 수 있죠. 또한 콘텐츠 기반 필터링을 통해 고객이 가입 과정에서 선택한 것과 비슷한 레시피를 추천해 드릴 수도 있고요. 하지만 비슷한 레시피에 대해 콘텐츠 기반 필터링을 제대로 활용하려면 유사성 점수를 할당해야 해요.

음식은 매우 주관적이고 강한 감정을 불러일으키기 때문에 이런 유형의 정보를 포착하기가 정말 어려워요. 다음 예를 한번 살펴볼까요?

요리는 브라질 검은콩 요리와 캄보디아 치킨 요리, 이렇게 두 가지가 있어요. 둘 다 쌀을 베이스로 한다는 점 외에는 공통점이 별로 없죠. 그렇다면 우리는 어떤 요리를 추천해야 할까요?

모험심이 강하고 새로운 요리를 맛보고 싶어 우리 서비스를 이용하는 사람의 관점에서 생각해보면, 두 항목을 모두 목록에 넣을 수도 있을 거예요. 왜냐하면 각각 다른 지역에서 왔고, 맛도 매우 다르니까요. 하지만 누군가가 가족이 다양하고 건강한 식단을 섭취하고 있는지 확인하기 위해 우리 서비스를 사용하는 경우라면, 자녀에게 닭고기와 쌀을 기본으로 한 요리를 또 주고 싶어 하지는 않을 수도 있겠죠.

다시 말하지만, 누군가가 우리 서비스를 사용하는 이유에 따라 달라지는 거예요.

이제 두 가지 레시피를 자세히 살펴볼게요.

두 요리 모두 푸짐한 타코라서 꽤 비슷하죠. 하지만 아이들이 있는 가족에게 먹이려고 한다면 옥수수와 고구마튀김이 맛과 재미 면에서 더 좋을 수 있어요. 적양파 절임은 호불호가 갈릴 수도 있겠지만요. 편의성을 중요하게 생각하는 고객과 협업하는 경우, 주방에서 더 많은 시간을 보내야 하니까 고구마 요리법을 선호하지 않을 수도 있겠네요.

이 예시를 보면 음식 선택에는 정말 많은 요소들이 관련되어 있다는 걸 알 수 있어요. 그래서 요리 간 유사성 점수를 매길 때 다양한 요소를 고려해야 하죠. 단순히 재료만으로는 부족할 수 있어요. 요리 종류, 웹사이트에 레시피가 표시되는 방식, 고객이 서비스를 이용하는 이유 등 레시피의 미묘하고 주관적인 측면까지 파악하고 싶거든요.

솔루션: Neo4j 그래프 온톨로지

이제 문제점을 알아봤으니, Neo4j가 필요한 이유를 한번 살펴볼까요?

저희는 특정 도메인에 존재하는 엔터티의 유형, 속성, 그리고 관계에 대한 공식적인 명칭과 정의인 온톨로지를 도입하기로 결정했어요.

이게 저희에게 어떤 의미냐면, 모든 레시피와 재료를 Neo4j에 넣고, 유형, 레시피, 재료, 그리고 이들을 연결하는 관계로 전체를 설명하는 거예요. 단순한 분류 그 이상을 원했기 때문에(닭가슴살이 닭의 일부라는 것 이상), 훨씬 더 흥미로운 관계를 만들 수 있었죠.

왜 Neo4j를 선택했을까요?

레시피는 보통 요리 유형을 정의하는 재료로 구성되고, 요리 유형도 재료를 정의하기 때문에 레시피와 재료 속성은 서로 밀접하게 연결되어 있어요. 마치 실제 생활처럼 모든 것이 연결되어 있고 복잡하죠.

이러한 다양한 관점을 포착하려면 Neo4j가 제공하는 다양한 각도에서 모든 관계에 접근할 수 있는 게 중요했어요.

Neo4j를 선택하게 된 몇 가지 실용적인 이유도 있었어요.

우선, 레시피와 재료에 대한 유연한 구조를 정의할 수 있었어요. 시스템에 이미 해당 속성이 있는 다른 재료에 대해 걱정할 필요 없이 "고추"에 "매운맛" 속성을 쉽게 부여할 수 있었죠. 또한 일본식과 미국식 요리인 치킨 카츠 버거처럼 다양한 퓨전 요리도 있잖아요? 각 요리에 식품 원산지를 백분율까지 지정할 수도 있어요. 덕분에 더 똑똑한 유사성 점수를 만들고 데이터로부터 추론을 생성할 수 있게 되었죠. 예를 들어, 이제 칠리처럼 매운 재료가 포함된 레시피에 어린이에게 적합하지 않다는 라벨을 붙일 수 있어요.

그럼 이 온톨로지와 구조를 가지고 어떻게 유사성을 계산할까요? 고민 끝에 지도 학습 방식과 비지도 학습 방식, 이렇게 두 가지 방법을 생각해 냈어요.

지도 학습 방식은 태그가 지정된 데이터와 속성을 사용해서 요리 유형 및 공유 재료와 같은 다양한 요소에 의해 두 레시피가 어떻게 연결되는지 결정하는 거예요. 태그가 지정된 데이터는 시스템에서 점수와 연결된 다양한 속성의 가중치를 계산해서 훈련 데이터에 맞추는 데 사용될 수 있죠. 비지도 학습 방식에서는 태그가 지정된 데이터에 대한 클러스터링을 사용해서 모델을 검증해요.

저희 목표는 고객이 주문하는 것, 주문하지 않는 것, 레시피를 평가하는 방법에 대한 데이터베이스를 사용해서 모델을 훈련시켜 더 많은 것을 학습할 수 있도록 하는 거예요. 하지만 아직 그 단계까지는 가지 못했어요.

유사성 점수를 벤치마킹하기 위해 Gousto 직원들에게 특정 레시피의 유사성을 평가하도록 요청하는 RecipeBot을 Slack에 설정했어요. 수천 개의 답변을 수집했고, 이제 이걸 활용하기 시작했죠.

이게 현재 저희 회사의 상황이고, 모든 작업이 진행 중이에요. 앞으로는 더 구체적인 결과를 공유할 수 있기를 기대하고 있어요.

결론

사실 이건 Gousto와 Neo4j의 협력의 시작일 뿐이에요.

저희는 수많은 아이디어와 질문을 가지고 GraphConnect London을 떠났어요. Snowplow 데이터로 개인화를 한 단계 더 발전시킬 수 있을까요? 앞서 언급했듯이 Snowplow를 사용하면 웹사이트에서 세부적인 사용자 활동을 수집할 수 있잖아요. 개인화를 위해 이 데이터를 어떻게 사용할 수 있을까요? 고객이 주문하기 전에도 이 정보를 사용해서 레시피를 추천할 수 있을까요? 또한 글루텐과 같은 식이 요구 사항에 문제가 있는 성분을 대체할 때 온톨로지가 도움이 될 수 있다고 생각해요.

저희가 고정관념에서 벗어나 생각하고 있는 몇 가지 추가적인 영역이 있어요. 예를 들어 AI 기반 레시피 개발을 어떻게 활용할 수 있을까요? 레시피 개발자에게 아이디어를 제안하기 위해 온톨로지를 사용할 수 있을까요? 예를 들어, 스칸디나비아에서 영감을 받은 레시피가 두 개뿐인데 그 레시피가 매우 인기가 있다면, 그런 유형의 요리를 더 많이 만들고 싶을 수도 있잖아요. 아니면 특정 두 가지 재료를 함께 사용하면 항상 높은 평가를 받는 것 같다는 걸 알게 될 수도 있겠죠. 이걸 어떻게 활용할 수 있을까요?

Gousto의 모든 사람들은 모든 가능성에 들떠 있고, 이건 정말 여정의 시작일 뿐이에요. 앞으로도 더 흥미로운 내용을 공유할 수 있기를 바라요!

추천 엔진, 더 강력하게 만들고 싶으신가요?
그래프 기술 기반 추천 시스템이 왜 더 강력하고 효율적인지 이 백서에서 확인해보세요. Graph Database로 추천 강화하기 – 지금 바로 다운로드 받으세요!
  • Collaborative Filtering
  • Content-based Filtering
  • Customer Journey
  • Gousto
  • Graph Ontology
  • GraphConnect
  • Hybrid Recommender System
  • LightFM
  • Personalization

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts