“함께 구매하면 좋은 상품” 추천 모델 고도화

2025. 12. 11. 정은주

AIMachine LearningDeep Learning

배달의민족에서는 음식 배달뿐만 아니라 장보기도 당일 배송이 가능하다는 사실, 알고 계셨나요?

배민의 장보기·쇼핑 서비스는 배민B마트를 비롯해 마트, 편의점, 꽃, 전자제품 등 다양한 셀러가 입점해 있어 다양한 물건을 빠르게 받아보실 수 있는데요. 고객이 서비스에 진입한 순간부터 구매를 완료하는 여정까지 최적의 상품을 발견할 수 있도록 개인화 추천, 함께 본 상품 추천, 실시간 트렌드 랭킹, 장바구니 추천, 결제 전 추가 상품 추천 등 다양한 추천을 제공하고 있습니다.

추천

그림 1. “장보기·쇼핑” 서비스의 다양한 추천

이번 글에서는 고객이 장바구니에 담은 상품들을 기반으로 연관 상품을 추천하는 장바구니 추천 모델의 개선 과정을 공유하고자 합니다. 추천 시스템과 기본적인 머신러닝 개념에 익숙한 분들을 대상으로 시행착오와 개선 과정을 공유하며, 단순한 임베딩 유사도를 넘어 유저가 장바구니에 담은 상품들의 맥락을 이해하여 함께 구매할 만한 상품 추천의 성능을 개선한 경험을 소개합니다.

장바구니 추천

그림 2. 장바구니 추천

기존 모델 소개 및 아쉬운 점

초기 장바구니 추천 모델은 빠른 도입과 구현 편의성을 위해 주문 데이터 기반의 Item2Vec 방식을 채택했습니다. 고객의 주문 이력을 하나의 문장으로, 주문 내 상품들을 단어(Word)로 간주하여 Skip-gram 방식으로 학습했으며 현재 장바구니에 담긴 상품들과 임베딩 유사도를 기반으로 상품을 추천하는 구조였습니다.

하지만 추천 모델을 운영하면서 장바구니 추천의 목적과 상충되는 몇 가지 문제점을 발견하게 되었습니다.

대체재 편향

Item2Vec 모델은 동일한 주문 내에서 함께 등장하는 상품들을 유사한 벡터 공간에 매핑합니다. 이는 유사한 구매 패턴을 갖는 상품들이 비슷한 임베딩을 갖게 되는 결과로 이어집니다.

예를 들어, 고객이 우유를 장바구니에 담았을 때를 살펴보겠습니다.

  • 기대되는 추천: 시리얼, 등 우유와 함께 구매되는 상품
  • 실제 추천: 다른 브랜드의 우유 상품군

이는 여러 브랜드의 우유가 비슷한 주문 패턴(예: 시리얼, 빵 등과 함께 구매)을 가지기 때문에, 서로 유사한 임베딩을 갖게 되어 발생합니다. 유사한 상품군을 추천하는 것도 의미가 있을 수 있지만, 임베딩 유사도에만 의존하면 추천 결과가 동일한 카테고리 내 대체재로 편중되어 추천 다양성이 크게 떨어지는 문제가 있습니다. 장바구니 추천으로 우리가 달성하려는 핵심 목표인 크로스 셀링을 위해서는 다양한 보완 상품군을 제안할 수 있어야 합니다.

시퀀스 맥락 부재

장바구니에 상품을 담는 순서에는 고객의 구매 의도가 담겨 있습니다. 하지만 Item2Vec은 주문 내 상품의 동시 출현만을 학습하므로 이러한 순서 정보를 반영하지 못합니다.

예를 들어 다음 두 고객의 장바구니를 살펴보겠습니다.

  • 고객 1: [라면, 삼겹살, 상추]
  • 고객 2: [삼겹살, 상추, 라면]

두 고객의 장바구니에는 동일한 상품들이 담겨 있지만 순서가 다릅니다. 1번 고객은 라면을 먼저 담았고 이후 고기와 채소를 추가했으므로 고기 요리에 필요한 마늘을 추천하는 것이 적합합니다. 반면 2번 고객은 고기와 채소를 먼저 담은 후 라면을 추가했으므로 라면과 어울리는 김치를 추천하는 것이 자연스럽습니다. 하지만 Item2Vec은 순서를 고려하지 못하기 때문에 이러한 맥락 차이를 구분하지 못하는 한계가 있었습니다.

이에 담은 상품의 시퀀스를 이해하고 자연스럽게 다음 상품으로 이어질 수 있는 추천을 목표로 모델 개선을 진행했습니다.

구매 맥락을 고려한 추천 모델

"어떤 맥락에서 상품들이 담겼는지"를 이해하기 위해서는, 상품 간의 관계뿐만 아니라 고객이 상품을 담는 순서까지 함께 고려해야 합니다. 이를 위해 2-stage 파이프라인을 구성하여, 첫 번째 단계에서 구매 패턴 기반으로 상품 및 카테고리 임베딩을 생성하고, 이후 시퀀스 기반 추천을 통해 맥락을 학습하는 방식으로 접근했습니다.

  • Stage 1. 그래프 기반 상품 & 카테고리 임베딩: 주문 데이터를 바탕으로 함께 구매되는 패턴을 그래프로 구조화하고, Node2Vec을 통해 상품 및 카테고리의 임베딩 벡터를 생성합니다.

  • Stage 2. 맥락 기반의 다음 상품 예측: Stage 1에서 생성된 상품 및 카테고리 임베딩을 입력으로 활용하여, Transformer 모델이 장바구니에 담긴 상품들의 맥락을 파악하고 다음에 담을 상품을 예측합니다.

Stage 1. 그래프 기반 상품, 카테고리 임베딩

주문 데이터 특성상 롱테일(Long-tail) 상품의 경우 주문 빈도가 낮아 데이터 희소성 문제가 발생합니다. 이러한 환경에서도 견고한 추천 성능을 확보하기 위해 Node2Vec을 도입했습니다. Node2Vec은 실제 주문 데이터가 부족한 상황에서도 Random Walk를 통해 시퀀스를 생성할 수 있어, 상품 간의 구조적 연관성을 효과적으로 학습할 수 있습니다.

그래프 정의

그래프

그림 3. 함께 구매 데이터 기반 그래프 예시
  • Node 타입

    • 상품 노드: 주문 데이터에 등장한 개별 상품을 나타내는 노드 (예: 삼겹살, 쌈장, 청상추, 깐마늘, 된장)
    • 카테고리 노드: 상품이 속한 카테고리를 나타내는 노드 (예: 육류, 채소, 조미료)
  • Edges & Weights

    • Item-Item (ㅡ): 상품 노드들 간의 연결을 나타냅니다. 서로 강한 보완 관계를 가진 상품끼리 더 강하게 연결되도록, 상품 페어 간 주문 데이터 기반의 Association Rule을 활용하여 Edge Weight를 세팅했습니다. 단순 동시 구매 빈도가 아닌 상품 간 연관도를 기반으로 가중치를 부여하여, 인기 상품으로만 편중되는 것을 방지했습니다.
    • Item-Category (- -): 각 상품 노드와 카테고리 노드 간의 연결입니다. 상품 노드가 주문 데이터를 기반으로 생성되므로, 신규 상품이나 주문이 없는 상품은 임베딩을 생성할 수 없는 문제가 있습니다. 이를 보완하기 위해 카테고리 노드를 추가하였고, 각 상품은 소속된 카테고리에 연결됩니다. 상품 임베딩과 함께 생성된 카테고리 임베딩을 추후 Next Item Prediction 단계에서 학습 이력이 없는 상품의 초기 벡터로 활용하여 Cold Start 상품 문제를 완화했습니다.

시퀀스 생성 및 임베딩 학습

  • 구축된 그래프상에서 Weighted Random Walk를 수행하여 가상의 노드 시퀀스를 생성했습니다. Edge Weight를 고려한 Random Walk를 통해 보완 관계가 강한 상품들이 시퀀스 내에서 자주 등장하도록 하여, 상품 간의 구조적 연관성을 효과적으로 포착할 수 있습니다.

  • 그래프에는 상품 노드와 카테고리 노드가 함께 존재하며, 각 상품은 소속된 카테고리와 연결되어 있습니다. Random Walk는 상품 간 연결뿐만 아니라 상품-카테고리 간 연결도 탐색하며, 이를 통해 상품 수준과 카테고리 수준의 정보가 모두 반영된 시퀀스가 생성됩니다. 예를 들어, 다음과 같은 가상 시퀀스가 생성됩니다.

[한돈 삼겹살 500g → "육류" → 무항생제 목살 500g → 유기농 상추 → 국내산 깐마늘 → "채소" → …]

[룸모 스파게티면 → "스파게티/파스타면" → 바릴라 링귀니면 → 국내산 깐마늘 → 무띠 토마토소스 → "파스타소스" → …]

이렇게 생성된 시퀀스를 바탕으로 Node2Vec을 학습하여 각 상품과 카테고리의 임베딩 벡터를 생성했습니다.

최종적으로 생성된 임베딩은 구매 패턴의 연관성을 함축하고 있으며, Stage 2의 Transformer 모델의 초기 입력으로 활용됩니다.

Stage 2. Transformer 기반 시퀀스 추천

장바구니에 상품을 담는 과정을 하나의 시퀀스로 간주하고, "지금까지 담은 상품들"을 분석하여 다음에 고객이 담을 가능성이 가장 높은 상품을 예측합니다.

추천

그림 4. 모델 아키텍처

학습 데이터 구성

주문 데이터에서 장바구니에 담긴 상품의 순서를 활용하여 학습 데이터를 구성했습니다. 시퀀스 내 특정 시점 t의 상품을 예측 대상으로 설정하고, 그 이전 시점의 상품들을 입력으로 사용합니다.

\\[\\text{Input: } [i_1, i_2, \\dots, i_{t-1}] \\rightarrow \\text{Target: } i_t\\]

입력 임베딩

Transformer에 입력되는 각 상품은 Stage 1에서 학습된 상품 임베딩카테고리 임베딩을 결합한 후, 위치 임베딩을 더하여 표현됩니다.

\\[h_i = [e_{\\text{item}}(i) ; e_{\\text{category}}(i)] + e_{\\text{pos}}(i)\\]

상품 임베딩과 카테고리 임베딩을 결합하고 위치 정보를 더하여 각 상품의 특성, 카테고리, 그리고 담은 순서를 모두 반영할 수 있습니다.

특히 주문 이력이 부족한 Cold Start 상품의 경우, Node2Vec으로 상품 임베딩이 생성되기는 하지만 그래프 내 연결이 약하고 Random Walk에서 충분히 학습되지 못해 임베딩의 신뢰도가 낮을 수 있습니다. 하지만 카테고리 임베딩과 결합함으로써 이러한 약점을 보완할 수 있습니다. 예를 들어, 신규 출시된 프리미엄 한우 등심은 주문 데이터가 거의 없어 상품 임베딩만으로는 정확한 추천이 어렵지만, 육류 카테고리 임베딩을 함께 활용하여 삼겹살, 소고기 등과 유사한 구매 맥락(채소, 양념 등)을 반영한 추천이 가능합니다.

Transformer 기반 맥락 학습

상품 담기 순서에 담긴 맥락을 학습하기 위해 Transformer Encoder 구조를 채택하였으며, 다음 두 가지 핵심 구성 요소로 이루어져 있습니다.

  • Masked Self-Attention: SASRec(Self-Attentive Sequential Recommendation)을 참고하여 Causal Masking을 적용했습니다. 각 시점에서 이전 상품들만 참조하여 예측 타깃 정보가 유출되는 것을 방지합니다. Self-Attention 메커니즘을 통해 시퀀스 내 상품 간의 상호 연관성을 계산하여 동일한 상품이 마지막에 담겼더라도 이전 맥락에 따라 다른 추천 결과를 도출합니다.

  • Feed Forward Network: Self-Attention 결과를 비선형 변환하여 더 풍부한 표현을 학습합니다.

이러한 Transformer 구조를 통해 동일한 상품 조합이라도 담는 순서에 따라 서로 다른 추천이 가능합니다. [라면, 삼겹살, 상추]를 담은 고객에게는 고기 요리에 필요한 마늘을, [삼겹살, 상추, 라면]을 담은 고객에게는 라면과 어울리는 김치를 더 높은 가중치로 추천하도록 학습되어 구매 의도를 반영한 Context Vector를 생성합니다.

모델 학습 구성 및 Loss함수

  • Multi-Task Learning: Context Vector를 기반으로 다음에 올 상품과 해당 상품의 카테고리를 동시에 예측하도록 설계했습니다. 상품 수준의 구체적인 예측과 카테고리 수준의 일반적인 예측을 함께 학습함으로써, 특정 상품에 대한 과적합을 방지하고 더 일반화된 구매 패턴을 학습할 수 있습니다. 두 task의 loss는 Weighted Sum 방식으로 결합하여 최종 loss를 계산했습니다.
  • Focal Loss: 주문 데이터에서 발생하는 인기 상품과 롱테일 상품 간의 심각한 클래스 불균형(Class Imbalance) 문제를 완화하기 위해 적용했습니다. Focal Loss는 모델이 높은 확신으로 예측하는 쉬운 샘플의 손실 가중치를 감소시키고, 낮은 확신으로 예측하는 어려운 샘플에 집중하도록 설계되어 있어, 자주 등장하지 않는 롱테일 상품에 대한 학습을 강화하고 모델의 일반화 성능을 향상시킵니다.

실험 결과 및 평가

예측 결과 비교

동일한 장바구니 맥락에 대해 Item2Vec(AS-IS)과 개선 모델(TO-BE)이 어떤 추천을 제공하는지, 실제 예시를 통해 살펴보겠습니다.

추천 결과 비교

그림 5. 추천 모델 예측 결과 비교

Item2Vec은 임베딩 유사도에 기반해 비슷한 카테고리의 상품을 추천하는 경향이 있는 반면, 개선 모델은 장바구니에 담긴 상품들의 맥락을 고려하여 실제 함께 구매할 만한 보완 상품을 주로 제안합니다.

이러한 차이가 실제 지표 개선으로 이어졌는지 정량적으로 평가한 결과는 다음과 같습니다.

오프라인 평가

장바구니 추천을 제공하는 여러 셀러를 대상으로 기존 모델(Item2Vec) 대비 성능을 평가했습니다. 평가 데이터는 학습 기간 이후의 주문 내역을 사용하였으며, 장바구니에 담은 상품의 순서를 고려하여 주문 내 마지막 상품을 정답으로 설정했습니다.

  • Hit Rate@10: 모델 예측 상위 10개 상품 중 정답 상품 포함 비율
  • Category Diversity: 추천된 상위 10개 상품의 서로 다른 카테고리 개수(평균)

다음은 일부 셀러의 평가 결과입니다.

셀러 유형 셀러 Hit Rate@10 개선율 Category Diversity
슈퍼마켓 셀러 A 51% 7.04개 → 8.13개
셀러 B 71% 7.38개 → 8.35개
셀러 C 120% 8.57개 → 8.38개
편의점 셀러 D 54% 3.51개 → 4.98개
셀러 E 40% 4.80개 → 6.51개
셀러 F 87% 5.51개 → 7.11개

오프라인 평가를 통해 다음과 같은 결과를 확인했습니다.

  • 기존 Item2Vec 대비 Hit Rate@10이 40~120% 향상되었습니다. 특히 데이터가 적은 롱테일 셀러(셀러 C, F)에서 개선폭이 컸는데 이는 Transformer의 Self-Attention이 적은 데이터로도 맥락을 효과적으로 학습했음을 보여줍니다.
  • 대부분의 셀러에서 추천 상품의 다양성이 증가했습니다. 특정 카테고리의 유사 상품이 아닌, 함께 구매할 만한 다양한 상품군을 추천하는 방향으로 개선되었습니다. 다만 셀러 C에서는 다양성이 소폭 감소했는데, 이는 데이터가 적은 롱테일 셀러의 특성상 모델이 정확도 향상에 집중하면서 더 확실한 추천을 제공하는 방향으로 학습된 것으로 해석할 수 있습니다.
  • 슈퍼마켓과 편의점 모두에서 일관된 성능 향상을 보여 서로 다른 도메인에서도 모델이 안정적으로 작동함을 확인할 수 있었습니다.

온라인 A/B 테스트 결과

오프라인 평가에서 긍정적인 결과를 확인한 후, 실제 서비스 환경에서의 효과를 검증하기 위해 일부 셀러를 대상으로 2주간 A/B 테스트를 진행했습니다. 기존 Item2Vec 모델을 제공받는 Control 그룹과 개선된 Transformer 모델을 제공받는 Treatment 그룹으로 나누어, 주요 비즈니스 지표를 비교 분석했습니다.

지표 설명 개선율
전체 담기율 노출된 추천 상품을 장바구니에 담은 비율 28%
바로담기율 상세 페이지를 거치지 않고, 장바구니에 바로 담은 비율 30%
카테고리 다양성 추천된 상위 10개 상품의 카테고리 다양성 13%
주문율 추천 상품을 담은 후 구매 완료한 비율 36%

A/B 테스트 결과 다양한 지표에서 개선 효과가 있었습니다. 특히 메인 지표인 전체 담기율은 28% 크게 상승했으며, 테스트 기간 동안 안정적으로 높은 수준을 유지했습니다. 다음은 일자별 전체 담기율 추이입니다.

AB테스트

그림 6. 일자별 전체 담기율 추이

특히 바로담기율은 30% 증가했는데, 이는 고객이 상세 페이지를 확인하지 않고도 추천된 상품의 적합성을 판단할 수 있었음을 의미합니다. 카테고리 다양성 역시 13% 증가하여, Item2Vec의 대체재 편향 문제를 극복하고 다양한 보완 상품을 제안할 수 있게 되었습니다. 또한, 가드레일 지표인 주문율과 평균 주문 금액이 함께 개선되며 추천이 단순히 클릭을 유도하는 것을 넘어 실제 구매로 이어지고 있음을 확인했습니다.

한 단계 더: 모델 고도화

A/B 테스트에서 좋은 성과를 거두었지만 실제 서비스를 운영하면서 개선할 여지를 더 발견했습니다.

당시 모델은 마트와 편의점 타입의 셀러를 대상으로 서비스되고 있었는데 두 셀러 타입을 구분하지 않고 하나의 통합 추천을 제공하고 있었습니다. 하지만 셀러 타입 간 데이터 차이가 있으며 특히 함께 구매 데이터가 희소한 상품들의 경우 추천 품질이 저하되는 문제도 발견했습니다. 이러한 문제를 해결하기 위해 모델을 한 단계 더 고도화했습니다.

Stage 1. 상품, 카테고리 임베딩 개선

(1) 셀러 타입별 임베딩 학습 분리

기존 모델은 마트와 편의점 셀러를 구분하지 않고 하나의 통합된 그래프와 임베딩을 사용하고 있었습니다. 하지만 두 셀러 타입은 다음과 같이 명확한 차이를 보였습니다.

먼저 판매 상품군을 살펴보면, 마트는 신선식품 중심, 편의점은 간편식품 중심으로 주력 카테고리가 달랐습니다. 또한 마트가 약 3배 더 많은 카테고리의 상품을 판매하고 있었습니다.

셀러 타입 카테고리 수 주력 판매 상품군
마트 약 3,000개 채소/축산/과일 등의 신선식품
편의점 약 1,000개 스낵/음료 간식류, 라면/도시락 등의 간편식품

구매 유저군도 큰 차이를 보였습니다. 3개월간 구매 유저 데이터를 분석한 결과, 두 셀러 타입을 모두 이용하는 유저는 소수에 불과했습니다.

구매 패턴 비율 특징
마트만 구매 81% 전체 유저의 대다수
편의점만 구매 10% 편의점 특화 유저군
마트와 편의점 모두 구매 9% 두 셀러 교집합

특히 마트 구매자의 약 90%는 마트에서만 구매하는 반면 편의점 구매자의 절반 정도는 마트도 함께 이용하는 비대칭적 구매 패턴을 보였습니다. 이러한 데이터는 두 셀러 타입의 유저군이 명확히 구분되며 동일한 카테고리의 상품이라도 셀러 타입에 따라 구매 맥락과 패턴이 다를 수 있음을 보여줍니다.

따라서 마트와 편의점의 특성을 각각 반영하기 위해 셀러 타입별로 독립적인 그래프를 구성하고 별도의 임베딩을 학습하는 방식으로 개선했습니다.

(2) 그래프 구조 고도화: 연결 정보 강화

상품-상품 간의 함께 구매 데이터는 롱테일(Long-tail) 특성을 가지며 특히 신규 상품이나 구매 빈도가 낮은 상품 간의 연결 정보가 부족해 Edge Weight의 신뢰도가 떨어지는 문제가 있었습니다.

이러한 데이터 희소성 문제를 완화하고 그래프의 표현력을 높이기 위해 Category-Category 연결을 추가하고 Edge Weight에 Bayesian Smoothing을 적용했습니다. 카테고리 간 Edge를 추가함으로써 Random Walk 시 카테고리를 경유한 상품 탐색이 가능해져 더 다양한 시퀀스를 생성할 수 있게 되었으며 동시에 데이터 희소성도 보완할 수 있었습니다.

카테고리 간 Edge 추가

다음 그림은 기존 그래프에 Category-Category 연결을 추가하여 개선한 구조입니다.

그래프 개선

그림 7. 개선된 그래프

기존 그래프는 Item-ItemItem-Category 연결만 존재했습니다. 이 구조에서는 상품 간 직접 연결이 없으면 Random Walk로 도달하기 어렵다는 한계가 있었습니다.

Category-Category 연결을 추가하여, 상품1 → 카테고리1 → 카테고리2 → 상품2의 경로로도 탐색할 수 있게 개선했습니다. 주문 데이터를 기반으로 함께 구매된 상품들의 카테고리를 집계하여, Association Rule을 활용해 카테고리 간 연결 강도를 계산하고 그래프에 반영했습니다. 이를 통해 실제로 함께 구매할 가능성이 높은 카테고리들(예: "육류"와 "채소") 간의 연결이 강화되어, Random Walk 시 이러한 카테고리 조합이 더 자주 생성되도록 했습니다.

예를 들어, 신규 출시된 프리미엄 한우 등심처럼 구매 이력이 부족한 상품의 경우, 다른 상품들과의 직접적인 함께 구매 데이터가 거의 없어 연결이 제한적입니다. 이런 상황에서 카테고리 간 연결은 다음과 같은 차이를 만듭니다.

[기존] 상품 간 직접 연결이 부족하여 탐색 제한
프리미엄 한우 등심 200g → "육류" → 호주산 소고기 안심 → …
프리미엄 한우 등심 200g → "육류" → 소고기 채끝 → …

[개선] 카테고리 간 연결로 다양한 보완 상품 발견
프리미엄 한우 등심 → "육류" → "채소" → 유기농 상추 → …
프리미엄 한우 등심 → "육류" → "조미료" → 쌈장 300g → …

다만 그래프가 풍부해지면 Random Walk가 과도하게 자유로워질 수 있어 실제 구매 패턴에서 벗어난 비현실적인 시퀀스가 생성될 우려가 있었습니다. 예를 들어 카테고리만 계속 이동하거나("육류" → "채소" → "조미료" → "음료" → ...) 동일 카테고리만 반복되는 시퀀스(삼겹살 → 목살 → "육류" → 소고기 → ...)는 임베딩 학습에 노이즈가 될 수 있습니다.

이를 방지하기 위해 이종 그래프에서의 Metapath 방식을 참고하여 노드 타입 간 제약 조건을 추가했습니다. 이를 통해 실제 구매 패턴에 가까운 의미 있는 시퀀스를 생성하도록 했습니다.

  • 동일 타입 노드 반복 제한: 상품 또는 카테고리 노드가 연속으로 등장하는 횟수를 제한하여 자연스러운 상품-카테고리 교차 패턴을 유지
  • 카테고리 다양성 보장: 동일 카테고리의 상품만 반복적으로 등장하는 것을 방지하여 다양한 상품군을 포함한 시퀀스 생성

Bayesian Smoothing 적용

카테고리 간 연결을 추가하여 그래프를 풍부하게 만들었지만 여전히 상품-상품 간 직접 연결의 신뢰도 문제가 남아있었습니다. 특히 구매 횟수가 적은 상품 쌍의 경우 Edge Weight의 신뢰도가 낮아 노이즈가 될 수 있습니다.

이를 해결하기 위해 상위 개념인 카테고리-카테고리 간 Edge Weight를 활용하는 Bayesian Smoothing을 도입했습니다. 예를 들어, 프리미엄 한우 등심유기농 상추 간의 직접 구매 데이터가 부족하더라도, 두 상품이 속한 "육류""채소" 카테고리 간의 연관성(상위 개념)을 활용하여 Edge Weight를 보정하는 방식입니다.

\\[w_{ij}^{\\text{smoothed}} = \\lambda \\times w_{ij} + (1 – \\lambda) \\times w_{ij}^{\\text{category}}\\]

여기서 λ는 관측 데이터(상품 간 함께 구매 횟수)의 신뢰도를 나타내는 계수로 데이터가 많을수록 1에 수렴합니다. 상품 간 함께 구매 횟수가 적을수록 카테고리 수준의 Prior(wijcategory)에 더 많이 의존하고 구매 횟수가 많아질수록 상품 수준의 Likelihood(wij)를 더 신뢰하는 구조입니다. 이를 통해 함께 구매 데이터가 희소한 상황에서도 상위 개념의 통계적 정보를 활용하여 안정적인 Edge Weight를 유지할 수 있습니다.

구매 횟수가 적어 우연히 높은 Edge Weight를 가진 노이즈성 상품 쌍들의 가중치가 하락하여 그래프의 신뢰도가 향상됩니다. 이는 Random Walk 시 품질이 낮은 연결을 따라가는 것을 방지하여 더 의미 있는 노드 시퀀스를 생성할 수 있도록 합니다. 다음은 실제 상품 쌍(name_1, name_2)의 Edge Weight이 어떻게 조정되었는지 보여주는 예시입니다. Bayesian Smoothing 적용 후, 신뢰도가 낮은 상품 쌍의 가중치는 하락하여 노이즈성 edge가 개선됨을 확인할 수 있습니다.

Bayesian Smoothing 결과

베이지안 예시1

베이지안 예시2

그림 8. Bayesian Smoothing을 통한 노이즈성 edge 개선

Stage 2. Transformer 기반 시퀀스 추천 개선

Stage 1에서 임베딩을 개선한 후, Stage 2에서는 Transformer 모델의 학습 방식을 개선했습니다. 기존 모델을 분석하던 중 Next Item Prediction 시 고정된 타깃을 사용하고 있다는 점을 발견했습니다. 즉, 최초에 랜덤하게 추출한 타깃을 학습 시 모든 Epoch에서 동일하게 사용하고 있었으며 이로 인해 모델이 동일한 시퀀스에서 다양한 상황을 학습하지 못하는 한계가 있었습니다.

모델의 일반화 성능을 향상시키기 위해 Epoch별로 타깃을 새롭게 샘플링하는 방식으로 변경했습니다. 이를 통해 동일한 주문 샘플에서도 매 Epoch마다 다른 타깃을 학습하게 되어 다양한 길이와 맥락을 활용할 수 있도록 했습니다. 또한 샘플링 시 랜덤 시드에 Epoch 번호를 포함시켜 실험 재현성을 보장할 수 있도록 설계했습니다.

예를 들어, [삼겹살, 상추, 마늘, 쌈장] 시퀀스가 있을 때

[기존] 최초 선택된 고정 타깃 사용
────────────────
Epoch 1: [삼겹살, 상추, 마늘] → 쌈장
Epoch 2: [삼겹살, 상추, 마늘] → 쌈장
Epoch 3: [삼겹살, 상추, 마늘] → 쌈장

[개선] 매 Epoch마다 타깃 샘플링
────────────────
Epoch 1: [삼겹살, 상추] → 마늘
Epoch 2: [삼겹살, 상추, 마늘] → 쌈장
Epoch 3: [삼겹살] → 상추

또한 기존 모델은 타깃 기준으로 이전에 담긴 모든 시퀀스를 입력으로 사용했으나 다양한 시퀀스 길이에 대한 실험을 통해 최근 5개 상품만으로도 유사한 성능을 낼 수 있음을 확인했습니다. 성능과 계산 효율성을 고려한 실험 결과를 바탕으로 최적의 시퀀스 길이를 설정하여 모델의 계산량을 줄이면서도 성능을 유지할 수 있도록 개선했습니다.

V2 모델 검증

온라인 A/B 테스트 결과

오프라인 평가에서 긍정적인 결과를 확인한 V2 모델을 실제 서비스 환경에 적용하여 효과를 검증했습니다. V2 모델은 Stage 1의 셀러 타입별 임베딩 분리, 그래프 구조 개선과 Stage 2의 Epoch-wise Target Sampling이 모두 반영되어 있습니다. V1 모델을 제공받는 Control 그룹과 V2 모델을 제공받는 Treatment 그룹으로 나누어, 일정 기간 동안 주요 비즈니스 지표를 비교 분석했습니다.

지표 설명 개선율
전체 담기율 노출된 추천 상품을 장바구니에 담은 비율 4%
바로담기율 상세 페이지를 거치지 않고 바로 장바구니에 담은 비율 5%
주문율 추천 상품을 담은 후 구매 완료한 비율 4%

V1 모델에서 이미 큰 폭의 성과를 거둔 상황에서 V2 모델은 추가로 전체 담기율 4%, 바로담기율 5%, 주문율 4%의 추가 개선을 달성했습니다. 이는 Stage 1의 셀러 타입별 임베딩 분리와 그래프 구조 개선, Stage 2의 Epoch-wise Target Sampling이 실질적인 추가 효과를 만들어냈음을 의미합니다.

또한 가드레일 지표인 평균 주문 금액 역시 안정적으로 유지되어 비즈니스 건전성을 확보하면서도 핵심 지표 개선을 달성할 수 있었습니다.

셀러 타입별 성과

셀러 타입별로 분리하여 학습한 임베딩의 효과를 더 자세히 살펴보기 위해 마트와 편의점을 나누어 결과를 분석했습니다.

셀러 타입 전체 담기율 바로담기율 주문율
마트 6% 7% 4%
편의점 2% 3% 5%

마트와 편의점 타입의 셀러 모두 긍정적인 성과를 보였습니다. 마트 타입의 셀러에서 지표 개선폭이 더 컸는데 다양한 상품 구성과 복잡한 구매 패턴의 특성이 분리 학습된 임베딩에 효과적으로 반영된 것으로 보입니다. 편의점은 스낵류와 간편식품 중심의 특성이 명확해 상대적으로 개선폭은 작지만 전체 담기율부터 주문율까지 모든 지표에서 꾸준한 개선을 보였습니다.

결론 및 향후 계획

기존 Item2Vec 방식은 대체재 편향과 시퀀스 맥락 부재라는 한계가 있었습니다. 이를 해결하기 위해 2-stage 파이프라인 기반의 Transformer 모델을 도입했고, 단계적 개선을 통해 장바구니 추천 성능을 크게 향상시켰습니다.

단계 주요 개선 효과
V1 모델 Graph Embedding + Transformer 도입 담기율 28%, 주문율 36% 개선
V2 모델 임베딩 분리 및 그래프 개선, 모델 Generalization 능력 향상 담기율 4% 추가 개선

Item2Vec에서 시작하여 단계적 개선을 거친 결과 담기율, 평균 주문금액, 추천 다양성 등의 주요 비즈니스 지표에서 의미 있는 성과를 거두었습니다.

장바구니 추천 모델 개선의 핵심은 단순히 지표를 향상시키는 것을 넘어 유저가 장바구니에 담은 구매 맥락을 이해하고 그에 맞는 보완 상품을 제안하여 실질적인 쇼핑 경험 개선을 이뤄냈다는 점입니다. 특히 셀러 타입별로 임베딩을 분리 학습함으로써 마트와 편의점이라는 서로 다른 도메인 특성을 반영하면서도 일관된 성능 향상을 달성할 수 있었습니다.

향후 계획

개인화 도입

현재 모델은 장바구니 맥락을 기반으로 일반화된 추천을 제공하지만, 유저 개개인의 선호도는 반영하지 못하고 있습니다. 예를 들어, 특정 브랜드를 선호하는 유저에게는 해당 브랜드의 상품을, 유기농 상품을 선호하는 유저에게는 유기농/친환경 상품군을 추천하는 것이 더 적합할 수 있습니다.

유저의 구매 이력과 선호도를 반영하면 동일한 맥락에서도 유저별로 최적화된 추천이 가능할 것입니다. 이를 위해 후처리 단계에서의 개인화 필터링이나 유저 임베딩 기반 리랭킹 모델 등을 검토하고 있습니다. 나아가 유저의 단기/장기 선호도를 모두 고려하여 단기/장기 취향을 균형있게 반영하는 방향도 고려해 볼 수 있습니다.

Cold Start 문제 개선

현재는 신규 상품이나 구매 이력이 부족한 상품에 대해 소속 카테고리의 임베딩을 활용하고 있으나 이는 같은 카테고리 내 상품들을 동일하게 표현하는 한계가 있습니다. 상품명, 브랜드, 상세 설명 등의 메타데이터를 활용한 Content-based 임베딩을 협업 필터링 기반 임베딩과 결합하는 Hybrid 접근법을 도입하면 신규 상품에 대해서도 개별 특성을 반영한 추천이 가능할 것입니다.

더 넓은 맥락 이해

현재는 장바구니 내 상품 시퀀스만을 고려하지만 실제 구매 의도는 더 복잡한 요인들의 영향을 받습니다. 시간대, 요일, 날씨, 계절, 최신 트렌드 등의 컨텍스트 정보를 모델에 반영하면 다양한 상황에 더 정교하게 대응할 수 있습니다. 이러한 컨텍스트 정보를 추가로 반영하여 시공간적 맥락을 고려한 더욱 정교한 추천이 가능할 것으로 기대됩니다.

마무리

이번 글에서는 고객의 구매 맥락을 이해하기 위해 그래프 기반 임베딩과 Transformer를 활용한 장바구니 추천 모델 개선 사례를 소개했습니다.

추천프로덕트팀은 이처럼 고객에게 최상의 경험을 제공하기 위해 끊임없이 추천 시스템을 발전시켜 나가고 있습니다. 앞으로도 데이터 속에서 고객의 니즈를 발견하고 이를 실제 서비스로 연결하며, 그 과정에서 얻은 인사이트를 함께 공유하겠습니다.

다음 글에서는 배민의 음식 배달 추천에 대해 소개드리려고 합니다. 고객이 앱을 열어 음식을 주문하기까지 어떤 추천들이 함께하고 있는지 궁금하시다면 앞으로도 많은 관심 부탁드립니다!

  • 우아한형제들 Data Scientist / 배달의민족 서비스의 다양한 추천 모델을 개발하고 있습니다. 데이터 속에서 고객의 니즈를 발견하고, 이를 실제 서비스로 연결하는 과정에서 큰 보람을 느낍니다.

  • 정은주

    우아한형제들 Data Scientist / 배달의민족 서비스의 다양한 추천 모델을 개발하고 있습니다. 데이터 속에서 고객의 니즈를 발견하고, 이를 실제 서비스로 연결하는 과정에서 큰 보람을 느낍니다.