팀 내에서 범용 개인화 추천 시스템을 구축하며 온라인 A/B 테스트와 CRM 캠페인 테스트에서 비교적 좋은 성과를 확인해, 그 개선 사례와 모델링 과정을 소개하고자 합니다.
- 1. 추천을 위한 새로운 언어 체계: Content Space와 Collaborative Space
- 2. 상품을 이해하기: Semantic ID
- 3. 유저의 행동을 번역하기: Transformer 기반 Collaborative Embedding
- 4. 취향을 증류하기 (Knowledge Distillation)
- 5. 학습 데이터 엔지니어링
- 6. 실험 및 성과
- 7. 마치며
- [Reference]
안녕하세요. 컬리 데이터서비스개발팀의 Data Scientist 명우민입니다.
오늘 뭘 살지 고민하다가, 생각보다 시간이 훌쩍 지나버린 경험이 있으신가요?
최근 커머스 플랫폼에서는 방대한 상품 선택지로 인해 이와 같은 정보 과부하가 쉽게 발생합니다. 검색만으로는 탐색 비용이 높고, 인기 상품 위주의 일괄 추천은 각 사용자의 취향과 상황을 충분히 반영하지 못하죠. 결국 사용자가 원하는 상품을 제때 발견하도록 돕는 것, 즉 개인화 추천의 정밀도를 높이는 일은 서비스 경험과 매출을 좌우하는 핵심 요소입니다.
당연하게 들릴 수 있지만, 사용자가 상품을 발견하지 못하면 구매는 일어나지 않습니다. 문제는 사용자가 "오늘은 기분이 우울하니 달콤한 빵을 살거야" 같은 힌트를 친절하게 말해주지 않는다는 점입니다. 그저 조용히 상품을 탐색하고, 장바구니에 담을 뿐이죠. 이 과정에서 나타나는 '무언의 행동'은 생각보다 복잡합니다. 어떤 날은 아침에 시리얼과 우유를 담으며 계획적인 모습을 보이지만, 또 어떤 날은 전혀 관련 없는 할인 상품을 갑자기 담는 충동적 행동을 보이기도 합니다.
결국 개인화 추천 모델은 이 다양한 패턴을 얼마나 세밀하게 포착하느냐가 핵심 과제가 됩니다.
저희는 최근 이 신호들을 해석하기 위해 Collaborative Embedding 기반의 개인화 추천 시스템을 구축했습니다. 유저의 행동을 하나의 언어처럼 다루는 관점을 바탕으로 설계한 이 시스템은 Transformer의 문맥 이해와 Knowledge Distillation을 결합해 정확도와 서빙 속도 간의 트레이드오프를 크게 개선했습니다. 이번 글에서는 이 개선 사례와 모델링 과정, 그리고 실험을 통해 얻은 주요 인사이트를 차근차근 공유드리려 합니다.
“이 글은 컬리의 개인화 추천 시스템 시리즈의 1편입니다. 후속편에서는 이 모델을 지탱하는 시스템 및 서빙 아키텍처, 실시간 로그를 활용한 랭킹 시스템 구축기 등이 이어집니다.”
1. 추천을 위한 새로운 언어 체계: Content Space와 Collaborative Space
"언어"는 정보를 구조화하고 전달하기 위한 수단입니다. 한편 컬리에는 수만 가지의 상품이 존재하며, 각각의 상품들은 텍스트와 이미지라는 고유한 "상품의 언어"로 자신을 표현합니다. “유기농”, “딸기”, “저속 노화” 같은 표현은 상품의 속성을 선명하게 드러냅니다. 그리고 유저는 그 상품 언어 위에, 클릭, 장바구니와 같은 흔적을 남겨 자신의 취향을 표현합니다.
그렇다면, 상품의 속성만으로 추천 문제를 해결할 수 있을까요? 현실은 그렇지 않습니다. 유저가 실제로 어떤 상품을 선택하는지는 취향과 행동 패턴에 따라 달라지기 때문에, 단순히 속성 정보만으로는 정확한 예측이 어렵습니다.
이 문제를 해결하기 위해, 저희는 상품과 유저를 표현하기 위한 공간을 크게 두 가지로 나누어 생각했습니다.
상품과 유저를 표현하기 위한 공간
© 2025. Kurly. All right reserved.
- Content Space (상품의 언어): 상품 본연의 속성이 지배하는 공간입니다. 위의 그림에서 “시리얼”과 “우유”는 카테고리가 다르기에 이 공간에서는 멀리 떨어져 있습니다. 이 공간은 대체제 탐색 등 연관상품 추천에 활용될 수 있습니다.
- Collaborative Space (유저의 취향): 유저의 취향과 행동 패턴이 반영된 공간입니다. “시리얼”과 “우유”는 함께 구매되는 짝꿍이므로, 이 공간에서는 아주 가깝게 위치해야 합니다. 이 공간은 개인화 추천에 활용될 수 있습니다.
이렇게 나누는 이유는 간단합니다. 추천의 시나리오는 다양하고, 상품의 속성만으로는 ‘무엇인지’를 표현할 수 있지만, 실제 사용자의 선택까지 반영하려면 유저 행동이 반영된 공간이 필요하기 때문이죠. 그렇다면 각 공간은 실제로 어떻게 구축할까요?
저희는 다음과 같이 접근했습니다.
"상품의 속성(Content)으로부터 언어를 정의해 상품을 표현하고, 그 언어를 입력받아 유저의 행동 공간(Collaborative Space) 좌표로 변환해주는 번역기(Encoder)를 만들자."
여기서 핵심은 두 공간이 서로 독립적인 것이 아니라, ‘상품을 표현하는 언어’를 얼마나 잘 정의하느냐에 따라 유저 행동을 해석할 수 있는 정확도가 달라진다는 점입니다. 예시로, 기존의 상품 ID 기반 표현 방식도 일종의 상품을 표현하는 언어로 볼 수 있습니다. 숫자 하나로 모든 상품을 구분할 수 있고, 신규 상품(Cold Start)도 빠르게 표현할 수 있다는 장점이 있죠. 하지만 유저가 이 상품을 왜 선호하는지에 대한 맥락을 담아내기에는 한계가 있습니다. 따라서 저희의 핵심 목표는, 상품 속성을 언어로 정의하고, 유저가 남긴 행동의 흐름(상품 시퀀스)을 하나의 언어처럼 받아들이며, 이를 정확히 해석해 다음 추천 상품을 예측하는 모델을 구축하는 것이었습니다.
2. 상품을 이해하기: Semantic ID
위와 같은 배경 속에서, 유저의 행동을 해석하기 위해 먼저 상품의 언어를 정의하는 작업이 필요했습니다. 특히 컬리는 큐레이션 기반 플랫폼이기 때문에, 상품 상세정보가 비교적 풍부하고 잘 정리돼 있다는 특징이 있습니다. 가격·스펙 위주의 단문 정보가 아니라, 스토리·원산지·제조 방식·콘셉트 등 상품을 선호하게 만드는 맥락들이 텍스트에 충분히 녹아 있습니다. 따라서 이미 품질 좋게 작성된 상세정보를 최대한 활용하는 것이 합리적이라고 판단했고, 초기 단계에서는 텍스트 정보만으로 상품의 의미를 표현하는 방향을 선택했습니다.
다만 길고 비정형적인 텍스트를 그대로 추천 모델에 투입하는 것은 비효율적이며, 최근 연구에서도 텍스트의 의미를 압축된 임베딩 또는 코드 시퀀스 형태로 변환해 활용하는 접근[2, 3]이 효과적임이 확인되고 있습니다. 이에 저희는 이러한 선행 연구의 아이디어를 기반으로, 텍스트를 의미 손실 없이 압축하고 구조화하기 위해 RQ-VAE(Residual Vector Quantized Variational Autoencoder) [1] 를 적용했습니다. 또한, 인코더에 상품 카테고리를 예측하는 Auxiliary Head를 추가해, 컬리의 상품 분류 체계를 Regularization처럼 활용함으로써 임베딩 공간이 안정적으로 형성되도록 유도했습니다.
RQ-VAE를 통한 Semantic ID 변환
© 2025. Kurly. All right reserved.
RQ-VAE의 핵심 특징은, 복잡한 정보(초기 임베딩)를 여러 개의 코드북(Codebook)을 활용해, 모델이 상품을 구성하는 특징들을 여러 축으로 나누고, 각 축을 대표하는 코드를 부여하는 방식입니다.
이 과정을 서점에 비유하면 이해가 쉽습니다. 서점에 가서 원하는 책을 찾기 위해선 먼저 구역(문학, 과학, 역사 등)으로 나눈 뒤, 세부 분류(로맨스, SF, 고전 등)를 거쳐, 각 책의 표지와 줄거리를 확인하며 선택합니다. 마찬가지로 RQ-VAE는 상품의 정보(상품명, 카테고리, 상세설명 등)를 보고, 각 속성을 모델이 학습한 단계별 코드북으로 치환합니다.
예를 들어 컬리에서 판매 중인 [KF365] 무농약 국산콩 콩나물 300g 라는 상품은 이렇게 변환될 수 있습니다.
RQ-VAE는 상품 텍스트를 코드북이라는 분류 체계로 구조화하여, 상품 간 유사성과 특징을 직관적으로 반영합니다. 하나의 상품은 Semantic ID라는 짧은 코드 시퀀스로 변환되고, 각 코드 정보를 보존한 Content Embedding으로 압축할 수 있습니다. 이렇게 숫자 조합으로 표현된 Semantic ID는, 마치 단어가 모여 문장을 이루듯, 컬리의 복잡한 상품 체계를 하나의 언어처럼 다루게 해 줍니다. 또한, 신규 상품이 등록되더라도 텍스트 정보만 있으면 즉시 이 시스템의 언어로 변환되어 추천 후보에 포함될 수 있습니다.
3. 유저의 행동을 번역하기: Transformer 기반 Collaborative Embedding
상품의 언어(Semantic ID)가 정의되었다면, 이제는 이를 바탕으로 유저의 문장(행동 패턴)을 해석할 차례입니다.
유저의 행동 데이터는 순서와 전후 관계가 중요한 시퀀스 데이터입니다. 저희는 이를 효과적으로 모델링하기 위해 Sequential Recommendation에서 널리 쓰이는 Transformer Encoder 구조를 차용하여 유저 임베딩을 구축하고, 유저의 행동을 하나의 문장처럼 이해하도록 유도했습니다. 이 임베딩은 비슷한 취향의 유저일수록 서로 가까이, 해당 유저가 좋아할 상품일수록 그 주변에 배치되는 구조적 공간을 형성합니다. 쉽게 말해, 유저의 행동이라는 문장을 AI가 읽고, 취향이라는 의미공간(Collaborative Space)으로 바꾸는 번역 과정이라고 볼 수 있습니다.
기존 방식의 한계
Collaborative Space를 구축하기 위해,
전통적인 협업 필터링(Collaborative Filtering) 기반 방법론들은 주로 고정된 유저·상품 ID 기반으로 상호작용 데이터를 행렬이나 그래프로 모델링하고, ANN (Approximate Nearest Neighbor) 검색을 활용해 사전에 저장된 벡터를 기반으로 빠른 후보 생성을 할 수 있다는 장점이 있습니다. 하지만, 대규모 실시간 환경에서 업데이트가 어렵고, 신규 유저·상품은 추천이 불가능한 콜드 스타트(Cold Start) 문제가 있습니다.
한편, 전통적인 순차 추천 (Sequential Recommendation) 기반 방법론들은 Transformer 기반 인코더-디코더로 유저 행동 시퀀스를 맥락적으로 이해하고 다음 구매 확률이 높은 상품을 Generative 방식으로 정밀하게 예측할 수 있습니다. 하지만, 실시간 추천 시 매번 전체 Vocabulary에 대한 확률 분포 계산이 필요해 추론 비용과 latency가 큽니다.
저희는 '정확도'와 '속도' 간의 트레이드오프(Trade-off)라는 딜레마를 해결하면서, Collaborative Space의 유저 임베딩을 잘 학습하기 위해 하나의 인코더를 공유하면서 서로 다른 목적을 가진 두 개의 헤드를 동시에 학습하는 Dual-Head Architecture를 설계했습니다.
-
Generative Head: "다음에 뭘 살까?"를 직접 예측하며, 유저 취향을 세밀하게 반영합니다.
-
Retrieval Head: "주어진 상품 중 가장 살만한 것은 무엇일까?"를 빠르게 찾아내며, 벡터 유사도 기반의 고속 탐색을 수행합니다.
3.1 Generative Head
Generative Head에서는 Transformer 디코더를 통해 유저의 다음 주문에 등장할 가능성이 높은 상품의 Semantic ID를 생성하도록 학습합니다.
Generative Head
© 2025. Kurly. All right reserved.
단순한 정답 라벨링을 넘어, Semantic ID 의 코드별 확률 분포를 통해 유저의 장·단기 맥락과 미세한 취향 구조까지 깊이 있게 학습합니다. 이 헤드는 구매패턴 분석을 통한 세그먼트 마케팅, 구매주기 예측, 개인화 노출 전략 등에 활용될 수 있습니다.
3.2 Retrieval Head
Retrieval Head에서는 유저 임베딩과, 실제 해당 유저가 다음에 상호작용할 상품의 Content Space 임베딩을 동일한 Collaborative Space로 투영합니다.
Retrieval Head
© 2025. Kurly. All right reserved.
투영에는 여러 층의 MLP Layer로 구성된 Mapping Network를 사용했습니다. 이후 내적(Dot Product)으로 유저·상품 임베딩의 유사도를 측정하고, Multi-Positive InfoNCE Loss 기반 대조 학습(Contrastive Learning)을 통해 다음 주문에 실제 구매할 상품(Positive)은 가까이, 그렇지 않은 상품(Negative)은 멀리 배치되도록 학습했습니다.
\[\mathcal{L}_{\text{retrieval}} = - \frac{1}{N} \sum_{i=1}^{N} \log\left(\frac{\sum_{j \in P_i} \exp(\text{sim}(u_i, v_j) / \tau)}{\sum_{k \in B} \exp(\text{sim}(u_i, v_k) / \tau)}\right)\]
이렇게 학습된 Collaborative Space에서는 단순 벡터 유사도 계산만으로도 ANN 기반 대규모 후보군 검색이 가능하여 실시간 추천에 용이하고, 신규 상품은 Content Space 임베딩을 추출 후 Mapping Network를 거쳐 그대로 추천에 활용될 수 있어 콜드 스타트 문제에도 대응할 수 있습니다.
4. 취향을 증류하기 (Knowledge Distillation)
하지만 초기 실험 결과, Retrieval Head의 성능은 Generative Head에 비해 유의미하게 낮았습니다. 저희는 이 성능 격차의 원인을 두 헤드의 기하학적 구조 및 추론 방식의 불일치로 인해 발생한 표현력 병목(Representation Bottleneck)으로 유추했는데요.
구체적으로는, Retrieval Head는 내적을 사용하므로, 유저의 취향을 선형 초평면(Hyperplane)으로 구분($\mathbf{u}^T \mathbf{v} > \tau$)해야 합니다. 하지만 대부분 실제 유저의 취향은 복잡하게 꼬인 비선형 매니폴드(Manifold) 형태를 띱니다. 따라서 단순한 직선으로 이 복잡한 분포를 잘라내는 데는 한계가 있습니다.
예를 들어, 유저의 취향이 상황에 따라 변하는 조건부 예측 상황을 가정해 봅시다.
-
상황 A: "치킨"을 샀으면 -> "콜라"를 추천 (치킨엔 콜라)
-
상황 B: "치킨"에 “맥주”도 샀으면 -> "콜라"는 비추천 (치맥 먹을 땐 콜라 안 먹음)
이때, Retrieval Head와 같이 단순한 모델로 '치킨을 샀고 맥주도 샀으니 콜라는 싫다' 식의 복잡한 조건부 논리(XOR)를 표현하려면 차원을 기하급수적으로 확장하거나, 복잡한 결정 경계를 그리기 위해 사실상 불가능한 수준의 경우의 수를 전부 비교해야 하는 비현실적인 학습 과정을 요구하게 됩니다.
반면, Generative Head는 Auto-regressive(자기회귀) 방식을 통해 이 문제를 해결합니다. 추론 시점에서 Semantic ID를 순차적으로 예측하면서, 매 단계마다 유저의 히스토리를 다시 참고합니다.
"‘치킨’을 샀으니 "첫 번째 코드로 '음료'를 골랐는데, 다시 기록을 보니 장바구니에 이미 맥주가 있네? 그럼 다음 코드는 '콜라'가 아니라 '마른안주' 쪽으로 확률을 높여야겠다."
즉, 한 번에 결론을 내리지 않고 조건부 확률 연쇄를 통해 앞 단계 판단을 바탕으로 다음 선택을 정교하게 조정합니다. 덕분에 복잡하게 얽힌 유저의 취향과 맥락을 훨씬 유연하고 정확하게 풀어낼 수 있는 것이죠.
이러한 표현력 병목 현상을 해결하기 위해, 저희는 Retrieval의 속도에 Generative의 넓은 시야(Distribution)를 이식하는 지식 증류(Knowledge Distillation) 전략을 도입했습니다. 핵심은 학생(Retrieval)이 선생님(Generative)이 알려주는 예측 점수를 통해 보지 못한 정보의 공백을 메우는 것입니다. 하지만, Generative Head의 출력은 각 코드별 logits이기 때문에 그대로는 확률로 해석할 수 없습니다. 이때, 저희는 한 가지 트릭을 적용했는데요. 각 시점의 logits을 softmax로 변환해 코드별 Log-Likelihood를 계산하고, 이를 합해 최종 아이템 생성 확률로 표현했습니다.
\[\log P(\mathbf{v} \mid \mathbf{u}) = \sum_{t=1}^{L} \log P(c_t \mid c_{ \! < t}, \mathbf{u})\]
그리고 증류를 위한 두 가지 손실 함수를 사용하였는데, 먼저 KL Divergence를 통해 Teacher가 예측한 전역적인 확률 분포를 흉내 내고, Listwise Loss를 더해 아이템 간의 정교한 순위 정보까지 학습하도록 설계했습니다.
실제로 기존 Retrieval Head의 학습(대조 학습)은 유저가 반응하지 않은 상품을 무조건 ‘비선호(Negative)'로 간주하여, 실제로는 잠재적으로 구매하거나 혹은 관심을 가질 수 있는 상품(False Negative)까지 배제하는 문제가 있었습니다. 이때, 지식 증류를 적용하면 Generative Head가 계산한 "구매 확률 20%의 잠재적 선호 상품"과 같은 미세한(Soft) 정보가 전달됩니다. 덕분에 Retrieval Head는 단순한 정답/오답의 이분법을 넘어, 미래의 구매 가능성까지 반영된 풍부한 임베딩 공간을 학습할 수 있게 되었습니다.
5. 학습 데이터 엔지니어링
좋은 AI 모델을 만들기 위해, 좋은 아키텍처만큼이나 중요한 것은 '어떤 데이터를 어떻게 학습시키느냐' 입니다. 아무리 뛰어난 아키텍처라도 편향된 데이터를 그대로 학습하면 모델 역시 편향될 수밖에 없습니다. 저희는 비즈니스 특성을 반영한 몇 가지 엔지니어링 트릭을 통해 모델이 더 똑똑하게 학습되도록 설계했습니다.
5.1 상품의 순서(Order) 문제: Order Positional Encoding
주문 기록
© 2025. Kurly. All right reserved.
이커머스(E-Commerce) 플랫폼에서의 행동 로그는 단순한 나열(Sequence)이 아닙니다. '장바구니' 특성상 하나의 주문 건에 여러 상품이 동시에 결제되기도 하죠. 하지만 일반적인 시퀀스 모델은 이를 시간순(t=1, t=2, ...)으로만 인식하는 한계가 있습니다. 이를 해결하기 위해, 저희는 주문 단위의 위치 정보(Order Positional Encoding) 를 도입했습니다. 위치 임베딩을 통해 같은 주문서에 담긴 상품들에게는 동일한 시점 정보를 부여함으로써, 모델은 "시리얼을 산 뒤에 우유를 샀다(순차)"는 정보뿐만 아니라, "시리얼과 우유를 같이 샀다(동시)"는 맥락까지 명확하게 구분하여 학습할 수 있게 되었습니다.
5.2 인기 편향(Popularity Bias) 문제
이커머스 데이터는 소수의 인기 상품이 지배하는 전형적인 롱테일(Long-tail) 분포를 따릅니다. 이를 보정 없이 학습하면, 모델은 유저의 취향과 상관없이 누구나 많이 사는 "우유"와 "두부"만 안전하게 추천하려는 게으른(Lazy) 패턴을 보입니다. 이를 해결하기 위해, 저희는 학습 시 타겟 아이템을 샘플링할 때, 아이템 빈도수와 반비례하는 가중치[4]를 적용했습니다.
\[P(\text{sample}=i | B_{u}) = \frac{w_i}{\sum_{j \in B_{u}} w_j}, \quad \text{where} \quad w_j = \frac{1}{\sqrt{freq(j)}}\]
인기가 너무 많은 상품의 등장 확률을 적절히 눌러줌으로써, 모델이 대중적인 상품에만 기대지 않고 유저의 취향을 저격할 비인기 상품들도 골고루 학습할 수 있는 기회를 부여했습니다.
5.3 네거티브(Negative) 샘플링 문제
모델에게 "소고기"의 오답으로 뜬금없는 "샴푸"를 보여주면 너무 쉽게 맞혀버립니다. 쉬운 문제만 풀어서는 정교한 추천 실력을 키울 수 없죠. 경우의 수가 수천억에 달하는 유저·상품 페어를 전부 학습할 수 없는 현실을 고려해, 저희는 Hard Negative Mining 전략을 도입했습니다. 구체적으로는, 같은 카테고리 내의 다른 상품이나 과거에 구매했던 상품을 의도적으로 오답(Negative)으로 섞어, 모델이 단순한 카테고리 구분을 넘어 미세한 속성 차이까지 학습하도록 만들었습니다. 예를 들어 '저지방 우유'를 선호하는 유저에게 '일반 우유'를 오답으로 제시함으로써, 모델이 더 정밀한 추천 능력을 갖도록 유도했습니다.
6. 실험 및 성과
저희는 모델의 효용성을 검증하기 위해 오프라인 정량 평가(Offline Evaluation) 와 실제 유저를 대상으로 한 온라인 A/B 테스트(Online A/B Test) 및 CRM 캠페인 테스트를 순차적으로 진행했습니다.
6.1 오프라인 평가 (Offline Evaluation)
먼저 학습된 모델이 유저의 다음 구매 상품을 얼마나 정확하게 예측하는지 평가했습니다. 실제 운영 환경을 모방하여 최근 한 달간의 데이터를 사용했으며, 최종 수치는 평균값으로 산출했습니다. 구체적인 평가 지표로는 추천된 후보군(Top-10) 내에 정답 상품이 포함되었는지(적중률)를 측정하는 HR@10 (Hit Rate) 과 Recall@10, 그리고 노출 순위까지 고려하여 평가하는 NDCG@10을 사용했습니다.
또한, 저희가 도입한 각 기법의 기여도를 확인하기 위해 Retrieval Head 단독 모델을 베이스라인으로 하여 Ablation Study를 수행했습니다.
Ablation Study
© 2025. Kurly. All right reserved.
실험 결과, (C) Knowledge Distillation까지 적용했을 때 베이스라인 모델(A) 대비 성능이 비약적으로 상승(HR@10 약 66%) 하여 Teacher 모델의 약 80% 수준까지 근접했습니다. 특히 NDCG의 상승폭이 컸는데, 이는 Distillation 과정에서 Teacher가 가진 아이템 간의 미세한 서열(Ranking) 정보가 Student에게 효과적으로 이식되었음을 의미합니다. 결과적으로 저희의 Retrieval Head는 훨씬 가벼운 추론 구조임에도 Comparable한 추천 성능을 확보할 수 있었습니다.
6.2 온라인 A/B 테스트 (Online A/B Test)
오프라인 지표의 상승이 실제 비즈니스 성과로 이어지는지 확인하기 위해, 컬리 앱의 '세일(알뜰 쇼핑)' 지면 및 '놓치면 후회할 가격' 지면에서 A/B 테스트를 진행했습니다.
(좌) 세일(알뜰 쇼핑) (우) 놓치면 후회할 가격
지면 예시
© 2025. Kurly. All right reserved.
- 실험 플랫폼: GrowthBook
- 대상: 전체 유저의 트래픽을 50:50으로 분할
- 세일(알뜰 쇼핑)
- 대조군: Graph 기반 기존 운영 모델
- 실험군: Collaborative Embedding
- 놓치면 후회할 가격
- 대조군: 기존 추천 순
- 실험군: Collaborative Embedding
- 세일(알뜰 쇼핑)
- 평가 지표
- 장바구니 전환율
- 유저당 매출
두 지면 모두 가격 민감도가 높은 영역이지만, 동시에 유저가 자신의 취향에 맞는 ‘할인 상품’을 기대하는 공간이기도 합니다. 특히, 세일(알뜰 쇼핑) 지면에서 대조군으로 사용된 Graph기반 모델은 도입 당시 이미 장바구니 전환율 기준으로 기존의 단순 추천순 정렬 대비 약 30%의 개선을 만들어내며 성능이 검증된 베이스라인이었습니다.
약 1주일간의 실험 결과, 저희의 모델은 기존 모델 대비 주요 비즈니스 지표가 모두 크게 상승했습니다.
(좌) 세일(알뜰 쇼핑) (우) 놓치면 후회할 가격
온라인 A/B 테스트 결과
© 2025. Kurly. All right reserved.
- 세일(알뜰 쇼핑)
- ATC (Add-to-Cart, 장바구니 전환율): 약 +32.2% 증가
- ARPU (Average Revenue Per User, 유저당 평균 매출): 약 +44.9% 증가
- 놓치면 후회할 가격
- ATC (Add-to-Cart, 장바구니 전환율): 약 +138.7% 증가
- ARPU (Average Revenue Per User, 유저당 평균 매출): 약 +140.1% 증가
이는 단순히 장바구니 담기를 유도하는 것을 넘어, 유저가 "현재 사고 싶은 상품"을 적시에 추천했다는 것을 의미합니다. 특히 ARPU의 대폭적인 상승은 모델이 유저의 구매 맥락을 이해하고, 구매 확률이 높은 연관 상품을 효과적으로 제안함으로써 교차 판매(Cross-selling)를 유도했기 때문으로 분석됩니다. 이러한 성과를 바탕으로, 해당 모델은 현재 세일 지면뿐만 아니라 일부 다른 주요 지면에서도 A/B테스트를 통해 확장 적용되고 있으며, Collaborative Embedding이 행동 기록 기반 개인화 추천을 제공함으로써 고객의 탐색 경험을 크게 개선할 수 있음을 검증했습니다.
6.3 CRM 캠페인 테스트
저희는 세일 지면과 같은 앱 내 탐색 흐름(In-flow)뿐만 아니라, 유저의 재방문을 유도하거나(App Push) 앱 실행 즉시 구매 욕구를 자극하는(In-App Message) CRM 채널에서도 모델의 성능을 검증했습니다.
앱 푸시 (App Push)
© 2025. Kurly. All right reserved.
인앱 메세지 (In-App Message)
© 2025. Kurly. All right reserved.
- 실험 플랫폼: Braze
- 비교 대상: 기존 룰베이스(Rule-based) 개인화 로직 (예: 맞춤 할인 상품, 신상품 등)
- 평가 지표: 클릭률
CRM 마케팅은 유저의 피로도를 고려해 "추천 시점에, 가장 반응할 만한 상품"을 제안하는 것이 핵심입니다. 저희는 특정 시점에 유저별로 구매 확률이 가장 높은 상품을 Generative Head로 생성하여 개인화 메시지 및 팝업을 노출했습니다.
약 1주일간의 실험 결과,
- CTR (Click-Through Rate, 클릭률): 약 +55.6% 증가
기존 룰베이스 기반 개인화 로직 평균 대비, 새로운 개인화 추천 모델의 클릭률이 약 55% 향상되는 유의미한 성과를 보였습니다. 이는 새로 도입한 개인화 추천 모델이 단순히 유저가 좋아할 상품을 찾는 것을 넘어, "지금 당장 구매할 가능성이 높은" 잠재 수요를 효과적으로 포착했기 때문으로 분석됩니다. 이로써 해당 모델은 유저가 상품을 탐색하는 단계뿐만 아니라, 유저를 유입시키고 맞이하는 접점에서도 강력한 개인화 도구로 활용될 가능성을 증명했습니다.
7. 마치며
지금까지 상품의 언어(Content)를 정의하고 유저의 취향(Collaborative)을 해석하기 위한 모델링 여정을 소개해 드렸습니다. 이 과정을 통해 "행동을 어떻게 '언어'처럼 이해하고, 가벼운 벡터 공간 안에 담아낼 것인가?"에 대한 저희만의 해답을 찾을 수 있었습니다.
하지만 모델을 성공적으로 학습시켰다고 해서 끝이 아닙니다.
매일 수백만 명의 유저와 수만 개의 상품이 실시간으로 상호작용하는 컬리의 환경에서, 이러한 Transformer 모델 및 임베딩을 어떻게 안정적으로 서빙할 수 있을까요? 그리고 단순히 후보를 뽑는 것을 넘어, 실시간으로 쏟아지는 클릭/조회 로그를 반영해 최적의 순서로 정렬(Ranking)하려면 어떤 시스템이 필요할까요?
이어지는 [개인화 추천 시스템] 시리즈에서는 이와 관련된 내용들을 순차적으로 상세히 다룰 예정입니다.
컬리의 추천 기술이 어떻게 진화해 나가는지, 다음 편에서도 많은 관심 부탁드립니다.
감사합니다.
본 글 작성과 리뷰에 도움을 주신 데이터서비스개발팀, 그리고 실험과 운영에 협력해주신 홈전시팀·유저마케팅팀에 감사드립니다.
[Reference]
-
LEE, Doyup, et al. Autoregressive image generation using residual quantization. In: Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2022. p. 11523-11532.
-
ZHENG, Bowen, et al. Adapting large language models by integrating collaborative semantics for recommendation. In: 2024 IEEE 40th International Conference on Data Engineering (ICDE). IEEE, 2024. p. 1435-1448.
-
RAJPUT, Shashank, et al. Recommender systems with generative retrieval. Advances in Neural Information Processing Systems, 2023, 36: 10299-10315.
-
MIKOLOV, Tomas, et al. Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781, 2013.








![[한경에세이] AI 협력 앞당길 경주 APEC](https://static.hankyung.com/img/logo/logo-news-sns.png?v=20201130)
![[속보] SK텔레콤 3분기 영업익 484억원…전년 대비 90.92%↓](https://img.hankyung.com/photo/202510/AD.41815821.1.jpg)



English (US) ·