본문 바로가기

PRISM/기술 블로그

[기술 블로그] 개인화 추천 시스템 1편 - 유저의 행동은 “언어”일까? : Collaborative Embedding 구축기 (feat. Knowledge Distillation)

 


최근 커머스 서비스에서는 단순히 많은 상품을 보여주는 것만으로는 충분하지 않다. 이제는 사용자가 원하는 상품을 얼마나 빠르고 정확하게 찾아주느냐가 서비스 경험과 매출을 좌우하는 핵심 경쟁력이 되고 있다. 특히 상품 수가 많아질수록 사용자는 선택 피로를 느끼기 쉽다. 검색이나 인기순 정렬만으로는 각자의 취향과 상황을 충분히 반영하기 어렵기 때문이다.

결국 중요한 것은 사용자가 원하는 상품을 제때 발견하도록 돕는 일이며, 이 지점에서 개인화 추천 시스템의 역할이 커진다.

 

이번 글에서는 컬리 기술블로그의 「개인화 추천 시스템 1편 - 유저의 행동은 ‘언어’일까? : Collaborative Embedding 구축기 (feat. Knowledge Distillation)」를 바탕으로, 유저의 행동을 하나의 언어처럼 해석하는 추천 시스템이 어떤 구조로 설계되는지   정리해보았다.

 

이 글은 단순히 추천 모델을 소개하는 데서 끝나지 않고, 상품 표현 방식, 유저 행동 해석 방식, 정확도와 속도 사이의 트레이드오프를 어떻게 해결했는지까지 함께 보여준다는 점에서 인상 깊었다.

 

※ 본 글은 컬리 기술블로그의 「개인화 추천 시스템 1편 - 유저의 행동은 “언어”일까? : Collaborative Embedding 구축기 (feat. Knowledge Distillation)」 글을 참고하여 작성하였습니다. 

https://helloworld.kurly.com/blog/personalized-recommendation-v1

 

개인화 추천 시스템 1편 - 유저의 행동은 “언어”일까? : Collaborative Embedding 구축기 (feat. Knowledge D

팀 내에서 범용 개인화 추천 시스템을 구축하며 온라인 A/B 테스트와 CRM 캠페인 테스트에서 비교적 좋은 성과를 확인해, 그 개선 사례와 모델링 과정을 소개하고자 합니다.

helloworld.kurly.com


 

1. 이 글을 선정한 이유

이 글을 선정한 이유는 단순히 추천 모델 하나를 설명하는 글이 아니라, 유저 행동을 어떻게 이해할 것인가라는 더 본질적인 문제를 다루고 있기 때문이다.

 

보통 추천 시스템을 떠올리면 협업 필터링, 콘텐츠 기반 추천, 순차 추천처럼 알고리즘 이름부터 생각하게 된다. 물론 이런 기법들도 중요하다. 하지만 실제 서비스 환경에서는 그보다 더 중요한 질문이 있다.

  • 사용자는 무엇을 원하는가?
  • 그리고 그 의도를 우리는 어떤 데이터로 읽어낼 수 있는가?

커머스에서 사용자는 “오늘은 이런 상품이 사고 싶다”라고 직접 말하지 않는다. 대신 클릭하고, 장바구니에 담고, 구매를 하거나 이탈하는 식으로 행동만 남긴다. 문제는 그 행동이 항상 일관적이지 않다는 점이다.

 

어떤 날은 계획적으로 장을 보고, 어떤 날은 할인 상품에 반응해 충동적으로 구매하기도 한다. 즉, 유저의 취향은 고정된 값이라기보다 상황과 맥락에 따라 달라지는 흐름에 가깝다.

 

이 글은 바로 그 복잡한 행동 흐름을 단순한 로그가 아니라, 하나의 문장처럼, 하나의 언어처럼 해석할 수 있지 않을까라는 관점에서 접근한다. 개인적으로는 이 지점이 가장 흥미로웠다. 추천 시스템을 단순히 “비슷한 상품 찾기” 수준으로 보는 것이 아니라, 유저의 행동을 읽고 번역하는 문제로 본다는 점에서 훨씬 설계적인 시야를 제공한다고 느꼈다.

 

또한 이 글은 개념 설명에만 머물지 않고, 실제 모델 구조, 데이터 엔지니어링, 오프라인 평가, 온라인 A/B 테스트, CRM 캠페인 성과까지 함께 제시하고 있어 실무적인 이해에도 도움이 되는 글이라고 느꼈다.

 

2. 개인화 추천의 핵심 문제: 사용자는 말하지 않고 행동한다

커머스 플랫폼에는 수많은 상품이 존재한다. 검색만으로는 탐색 비용이 높고, 인기 상품 위주의 추천은 각 사용자의 취향을 세밀하게 반영하지 못한다. 결국 사용자가 원하는 상품을 적시에 발견하도록 돕는 것이 중요해진다.

 

그런데 여기서 어려움이 생긴다. 사용자는 자신의 취향을 명확한 문장으로 설명해 주지 않는다. “오늘은 기분이 우울해서 달콤한 빵이 먹고 싶다” 같은 힌트를 서비스에 직접 입력하지도 않는다. 대신 조용히 상품을 둘러보고, 클릭하고, 장바구니에 담고, 구매할 뿐이다.

즉, 유저는 자신의 취향을 말이 아니라 행동으로 표현한다.

 

하지만 이 행동은 생각보다 복잡하다. 어떤 날은 시리얼과 우유처럼 연관성이 높은 상품을 함께 담기도 하고, 어떤 날은 전혀 예상하지 못한 할인 상품에 반응할 수도 있다. 따라서 개인화 추천의 핵심은 단순히 “이 사람이 뭘 샀는가”를 보는 것이 아니라,

그 행동 패턴을 얼마나 세밀하게 해석할 수 있는가에 달려 있다고 볼 수 있다.

 

3. 추천을 위한 새로운 관점: Content Space와 Collaborative Space

이 글에서는 추천 문제를 이해하기 위해 상품과 유저를 표현하는 공간을 두 가지로 나눈다.

 

구분               Content Space                                                          Collaborative Space

기준 상품의 속성 유저의 행동과 취향
중심 정보 상품명, 카테고리, 설명, 이미지 클릭, 장바구니, 구매 패턴
의미 상품이 무엇인지 설명 유저가 실제로 어떻게 선택했는지 반영
예시 시리얼과 우유는 카테고리가 달라 멀 수 있음 시리얼과 우유는 함께 구매되므로 가까울 수 있음
활용 연관 상품, 대체제 추천 개인화 추천

 

첫 번째는 Content Space이다. 이 공간은 상품 본연의 속성이 중심이 되는 공간이다.

상품명, 카테고리, 설명, 이미지처럼 상품 자체가 지닌 정보가 이 공간을 구성한다.

예를 들어 “시리얼”과 “우유”는 카테고리가 다르기 때문에, Content Space에서는 서로 멀리 떨어질 수 있다.

 

두 번째는 Collaborative Space이다. 이 공간은 유저의 행동과 취향이 반영된 공간이다.

현실에서는 시리얼과 우유가 자주 함께 구매되기 때문에, Collaborative Space에서는 두 상품이 가깝게 놓여야 한다.

즉 이 공간은 “상품이 무엇인가”보다 “유저가 실제로 어떻게 선택했는가”를 더 잘 반영한다.

 

이렇게 두 공간을 나누는 이유는 분명하다. 상품 속성만으로는 상품의 정체성은 설명할 수 있어도, 사용자가 실제로 왜 그것을 선택했는지까지는 충분히 설명하기 어렵기 때문이다. 결국 더 정교한 개인화 추천을 위해서는 상품의 언어와 유저의 행동 언어를 함께 다뤄야 한다.

 

4. 상품을 “의미 있는 언어”로 표현하기: Semantic ID

유저 행동을 잘 이해하려면 먼저 상품을 잘 표현해야 한다.

기존의 단순한 상품 ID는 상품을 구분하는 데는 유용하지만, 그 상품이 어떤 맥락과 속성을 가지는지는 담아내지 못한다.

숫자 하나만으로는 왜 어떤 유저가 그 상품을 좋아하는지 설명하기 어렵기 때문이다.

 

이 문제를 해결하기 위해 글에서는 Semantic ID라는 개념을 사용한다.

  • Semantic ID는 상품을 단순한 번호로 다루는 것이 아니라, 상품의 의미를 구성하는 여러 속성으로 나누어 코드 시퀀스로 표현하는 방식이다.

원문에서는 컬리가 큐레이션 기반 플랫폼이기 때문에 상품 상세정보가 풍부하고 잘 정리되어 있다는 점에 주목한다.

가격·스펙 중심의 짧은 정보만 있는 것이 아니라, 스토리·원산지·제조 방식·콘셉트처럼 상품을 선호하게 만드는 맥락이 텍스트에 충분히 담겨 있다고 본 것이다. 그래서 초기 단계에서는 텍스트 정보를 최대한 활용해 상품 의미를 표현하는 방향을 선택했다.

 

이 과정에서 사용된 핵심 기술은 **RQ-VAE(Residual Vector Quantized Variational Autoencoder)**이다.

  • 이 모델은 길고 비정형적인 텍스트를 여러 코드북으로 압축·구조화하여, 상품 정보를 짧은 코드 시퀀스로 바꿔 준다.

또한 글에서는 인코더에 상품 카테고리 예측용 Auxiliary Head를 추가해, 컬리의 상품 분류 체계를 일종의 정규화 장치처럼 활용함으로써 임베딩 공간이 더 안정적으로 형성되도록 했다고 설명한다.

 

예시는 아래처럼 이해할 수 있다.

[상품 유형: 콩나물(채소류)] → Codebook A, index 27
[원산지: 국내산] → Codebook B, index 12
[생산 방식: 유기농] → Codebook C, index 3
[용량/규격: 300g] → Codebook D, index 8

Result: Semantic ID = [27, 12, 3, 8]

 

이 방식의 장점은 분명하다.
첫째, 상품 간 유사성과 차이를 더 잘 반영할 수 있다.
둘째, 신규 상품이 들어와도 텍스트 정보만 있으면 빠르게 이 체계 안에 편입시킬 수 있어 콜드 스타트 문제에도 유리하다.
즉, Semantic ID는 상품을 하나의 “언어”처럼 다루게 해 주는 기반이라고 볼 수 있다.

 

5. 유저 행동을 번역하기: Transformer 기반 Collaborative Embedding

상품의 언어가 정의되었다면, 이제는 유저의 행동을 해석해야 한다.

글에서는 유저의 행동 데이터를 하나의 문장처럼 읽어야 하는 시퀀스 데이터로 본다.

예를 들어 어떤 사용자가 특정 상품을 클릭하고, 다른 상품을 장바구니에 담고, 다음 주문에서 관련 상품을 구매했다면, 이 흐름은 단순한 이벤트들의 나열이 아니라 앞뒤 맥락이 중요한 행동 문장으로 볼 수 있다.

 

따라서 이 문맥을 이해하려면 시퀀스를 다루는 모델이 필요하다. 여기서 사용된 것이 Transformer Encoder 기반 구조이다.

  • Transformer는 순서와 맥락을 고려해 입력 시퀀스를 해석하는 데 강점을 가지므로, 유저의 행동 흐름을 읽고 이를 하나의 취향 표현으로 바꾸는 데 적합하다.

이 글의 표현을 빌리면, 상품이 단어라면 유저의 행동은 문장이고, 추천은 다음 단어를 예측하는 작업에 가깝다.

즉 추천 시스템을 자연어 처리 문제처럼 재해석한 것이다. 이 관점이 흥미로웠던 이유는 추천을 단순한 유사도 계산이 아니라,

맥락을 이해하는 문제로 끌어올렸기 때문이다.

 

6. 기존 방식의 한계와 정확도-속도 트레이드오프

추천 시스템에서는 흔히 정확도와 속도 사이의 딜레마가 생긴다.

원문에서는 전통적인 협업 필터링 계열과 순차 추천 계열의 장단점을 다음처럼 설명한다.

 

방식                               장점                                                              한계

협업 필터링 기반 방법 빠른 후보 생성, ANN 검색 활용 가능 콜드 스타트 문제, 대규모 실시간 업데이트 어려움
순차 추천 기반 방법 행동 맥락 이해, 다음 구매 예측 정확도 높음 전체 vocabulary 확률 계산 필요, 추론 비용과 latency 큼

 

전통적인 협업 필터링 기반 방식은 비교적 빠르게 후보 상품을 생성할 수 있다는 장점이 있다. 하지만 고정된 유저·상품 ID 중심으로 동작하기 때문에 신규 유저나 신규 상품이 등장했을 때 대응이 어렵고, 실시간 환경에서 업데이트에도 한계가 있다.

 

반면 Transformer 기반의 순차 추천 방식은 유저 행동의 문맥을 더 정교하게 이해할 수 있다.

하지만 추천 시점마다 전체 후보군에 대한 확률 분포를 계산해야 하므로 계산 비용과 지연 시간이 커진다. 정확도는 높지만 서비스 환경에서 빠르게 서빙하기 어렵다는 문제가 생긴다.

 

즉, 빠른 추천은 상대적으로 단순하고, 정교한 추천은 상대적으로 무겁다.

이 글에서는 바로 이 트레이드오프를 해결하기 위해 Dual-Head Architecture를 제안한다.

 

7. 해결 전략: Dual-Head Architecture

이 구조의 핵심은 하나의 인코더를 공유하면서, 목적이 다른 두 개의 Head를 동시에 학습시키는 것이다.

 

구분        Generative                                                                                      HeadRetrieval Head

역할 다음 상품을 직접 생성 빠르게 후보 상품 검색
장점 장·단기 맥락과 미세한 취향 구조 반영 실시간 추천에 유리, ANN 검색 가능
한계 계산 비용 큼 표현력이 상대적으로 단순
활용 세그먼트 마케팅, 구매주기 예측, 개인화 노출 전략 대규모 후보군 검색, 실시간 추천

 

Generative Head는 “다음에 어떤 상품을 살까?”를 직접 예측한다.

Semantic ID를 순차적으로 생성하면서 유저의 장기·단기 맥락과 세밀한 취향 구조까지 반영할 수 있다. 정확도 측면에서는 강력하지만, 실시간 서비스에서 그대로 사용하기에는 계산 비용이 크다.

 

Retrieval Head는 유저 임베딩과 상품 임베딩을 같은 공간에 투영한 뒤, 유사도 계산을 통해 빠르게 후보를 찾는다.

여기에는 여러 층의 MLP로 이루어진 Mapping Network가 사용되며, 학습에는 Multi-Positive InfoNCE Loss 기반 대조 학습이 적용된다. 다음 주문에 실제로 상호작용할 상품은 가깝게, 그렇지 않은 상품은 멀어지도록 학습하는 구조다.

 

정리하면, Generative Head는 정교하지만 무겁고, Retrieval Head는 빠르지만 단순하다.

컬리는 이 두 구조를 경쟁시키는 대신 함께 학습시켜, 속도와 정확도를 모두 확보하려고 했다. 이 부분이 단순히 더 좋은 모델 하나를 찾는 접근이 아니라, 서비스 환경에 맞는 구조를 설계하는 방식이라는 점에서 인상적이었다.

 

8. 핵심 개선 포인트: Knowledge Distillation

초기 실험에서는 Retrieval Head의 성능이 Generative Head보다 유의미하게 낮게 나타났다고 한다.

글에서는 그 이유를 Retrieval Head의 표현력 한계에서 찾는다. Retrieval Head는 기본적으로 내적 기반 유사도를 사용하기 때문에, 유저 취향을 비교적 단순한 선형 구조로 구분해야 한다. 하지만 실제 취향은 그렇게 단순하지 않다.

 

예를 들어 “치킨을 샀으면 콜라를 추천”할 수는 있지만, “치킨과 맥주를 이미 샀다면 콜라는 오히려 덜 적절”할 수도 있다.

이런 조건부 맥락은 단순 유사도 기반 구조만으로는 표현하기 어렵다.

 

반면 Generative Head는 자기회귀 방식으로 단계별 예측을 수행하면서, 이전 선택과 유저 히스토리를 계속 참고할 수 있다.

그래서 더 복잡한 맥락과 조건부 취향을 유연하게 반영할 수 있다.

 

이 문제를 해결하기 위해 도입된 것이 Knowledge Distillation이다.

  • 쉽게 말하면, 정확하지만 무거운 Generative Head를 Teacher로 두고, 빠르지만 단순한 Retrieval Head가 그 지식을 배우도록 만든 것이다.

원문에서는 Teacher의 출력을 그대로 쓰는 대신, 각 시점의 logits를 softmax로 바꾸어 코드별 log-likelihood를 계산하고, 이를 합해 최종 아이템 생성 확률로 표현했다고 설명한다. 이를 간단히 쓰면 아래와 같다.

log P(v|u) = Σ log P(c_t | c_<t, u)

 

즉, Generative Head는 상품을 한 번에 맞히는 것이 아니라, 코드 시퀀스를 순차적으로 예측하면서 매 단계마다 유저 히스토리를 반영한다는 뜻이다.

 

또한 증류 과정에서는 KL Divergence로 Teacher의 전역적인 확률 분포를 모방하고, Listwise Loss를 더해 아이템 간의 정교한  순위 정보까지 학습하도록 설계했다고 한다. 이 과정은 기존 Retrieval 학습에서 생길 수 있는 False Negative 문제도 완화해 준다.

 

예전에는 유저가 반응하지 않은 상품을 모두 비선호로 처리했다면, Distillation 이후에는 “잠재적으로 관심을 가질 수 있는 상품”에 대한 부드러운 정보까지 전달받을 수 있게 되는 것이다.

 

결국 이 구조는 빠른 모델이 정확한 모델의 시야를 배우는 방식이라고 정리할 수 있다. 그리고 이것이 이 글의 핵심 기술적 포인트 중 하나였다.

 

9. 모델만큼 중요한 것: 데이터 엔지니어링

이 글이 좋았던 또 하나의 이유는, 추천 성능이 단순히 모델 구조만으로 결정되지 않는다는 점을 잘 보여줬다는 것이다. 실제로는  어떤 데이터를 어떻게 학습시키느냐도 매우 중요하다.

 

데이터 엔지니어링 요소              의미                                                                         기대 효과

Order Positional Encoding 같은 주문에 속한 상품을 같은 시점 정보로 처리 순차 관계와 동시 구매 관계를 함께 학습
Popularity Bias 완화 인기 상품 쏠림을 줄이는 샘플링 가중치 적용 롱테일 상품도 충분히 학습
Hard Negative Sampling 비슷한 상품이나 과거 구매 상품을 오답으로 섞음 더 미세한 차이까지 구분 가능

 

첫째, Order Positional Encoding을 도입했다.

  • 이커머스에서는 하나의 주문에 여러 상품이 함께 결제되기도 한다. 일반적인 시퀀스 모델은 이를 단순히 시간순으로만 해석할 수 있지만, 실제로는 “같이 구매한 상품”이라는 정보도 중요하다.
  • 이를 반영하기 위해 같은 주문에 속한 상품들은 동일한 시점 정보로 처리해, 순차 관계와 동시 관계를 구분하도록 설계했다.

 

둘째, Popularity Bias를 완화했다.

  • 이커머스 데이터는 소수의 인기 상품에 편중되기 쉽다. 이 편향을 그대로 학습하면 모델은 누구에게나 안전하게 인기 상품만 추천하려는 경향을 보일 수 있다.
  • 이를 막기 위해 학습 시 빈도수가 높은 상품의 영향력을 조절해, 롱테일 상품도 충분히 학습될 수 있도록 했다.

 

셋째, Hard Negative Sampling을 적용했다.

  • 너무 쉬운 오답만 넣으면 모델은 정교한 구분 능력을 키우기 어렵다. 그래서 같은 카테고리 안의 비슷한 상품이나 과거에 구매했던 상품을 의도적으로 오답으로 섞어, 미세한 차이까지 구분할 수 있도록 만들었다.
  • 이 부분을 보면서, 좋은 추천 시스템은 결국 좋은 모델 + 좋은 데이터 설계가 함께 가야 한다는 점을 다시 느꼈다.

10. 실험 및 성과

이 글은 모델 설명에서 끝나지 않고 실제 성과까지 제시한다는 점에서 더 설득력이 있었다.

오프라인 평가에서는 Retrieval Head 단독 모델을 기준으로 여러 기법의 효과를 비교했는데,

Knowledge Distillation까지 적용했을 때 성능이 크게 향상되었다고 한다.

 

특히 HR@10 기준으로 약 66% 수준의 상승이 있었고, Teacher 모델의 약 80% 수준까지 근접한 성능을 확보했다.

이는 상대적으로 가벼운 구조임에도 충분히 경쟁력 있는 추천 품질을 달성했음을 보여준다.

 

  • 온라인 A/B 테스트 결과도 인상적이다. 원문에 따르면 실험은 컬리 앱의 ‘세일(알뜰 쇼핑)’ 지면과 ‘놓치면 후회할 가격’ 지면에서 진행되었고, 비교군은 각각 기존 Graph 기반 운영 모델과 기존 추천 순 정렬이었다.
  • 실험군은 Collaborative Embedding 기반 추천 모델이었다.

 

성과는 다음처럼 정리할 수 있다.

 

평가                                                                   영역결과

오프라인 평가 HR@10 약 66% 상승, Teacher의 약 80% 수준 도달
세일(알뜰 쇼핑) A/B 테스트 장바구니 전환율 +32.2%, ARPU +44.9%
놓치면 후회할 가격 A/B 테스트 장바구니 전환율 +138.7%, ARPU +140.1%
CRM 캠페인 CTR +55.6%

 

세일 지면에서는 장바구니 전환율이 약 32.2%, 유저당 평균 매출이 약 44.9% 증가했고, 다른 지면에서는 이 수치가 더 크게 나타났다고 한다. 이는 단순히 상품을 많이 노출한 것이 아니라, 유저가 “지금 사고 싶어 하는 상품”을 더 잘 맞췄다는 뜻으로 볼 수 있다.

 

  • 또한 CRM 캠페인에서도 개인화 추천 모델이 활용되었다.
  • 원문에서는 App Push와 In-App Message 실험에서 기존 룰베이스 개인화 로직 대비 클릭률이 약 55.6% 증가했다고 설명한다.
  • 이때 특정 시점에 유저별로 구매 확률이 가장 높은 상품을 Generative Head로 생성해 개인화 메시지와 팝업에 반영했다고 한다. 이는 개인화 추천이 앱 내 탐색 경험뿐 아니라, 유저를 다시 불러오는 접점에서도 효과적으로 작동할 수 있음을 보여준다.

11. 느낀 점

이 글에서 가장 인상 깊었던 점은 추천 시스템을 단순히 “비슷한 상품 찾기” 기술로 보지 않고,

유저 행동을 해석하는 문제로 바라봤다는 점이다.

 

  • 특히 상품을 Semantic ID라는 언어로 정의하고, 유저의 행동 시퀀스를 Transformer로 해석해,
  • 그 결과를 다시 Collaborative Space에 배치하는 흐름이 매우 설계적으로 느껴졌다.
  • 그리고 정확도와 속도라는 실무적인 문제를 Dual-Head Architecture와 Knowledge Distillation으로 풀어낸 방식도 인상적이었다.

 

개인적으로는 이 글이 추천 시스템을 더 넓은 관점에서 보게 해 주었다. 추천은 단순히 “무엇을 보여줄까”의 문제가 아니라,

결국 유저의 행동을 얼마나 잘 읽고, 그 맥락을 얼마나 잘 번역하느냐의 문제라는 생각이 들었다.

 

12. 마무리

이 글의 핵심은 한 문장으로 정리할 수 있다. 추천 시스템은 결국, 유저 행동을 얼마나 잘 이해하느냐의 문제다.

 

앞으로 추천 시스템은 단순히 비슷한 상품을 연결하는 수준을 넘어서, 유저의 맥락과 상황까지 해석하는 방향으로 더 발전할 가능성이 크다. 그리고 그 중심에는 항상 “유저의 행동을 어떻게 해석할 것인가”라는 질문이 남아 있을 것이다.

 

컬리의 이번 사례는 그 질문에 대해 하나의 흥미로운 답을 제시한다. 상품을 언어처럼 표현하고, 유저 행동을 문장처럼 읽고, 정확한 모델의 시야를 빠른 모델에 증류하는 방식은 추천 시스템이 앞으로 어떤 방향으로 진화할 수 있는지를 잘 보여준다.