추천시스템을 바꾼다는 것: 구조적 선택이 유저 행동을 어떻게 바꾸는가

ML Engineer, 장성원 님
Jan 06, 2026
추천시스템을 바꾼다는 것: 구조적 선택이 유저 행동을 어떻게 바꾸는가

추천시스템은 단순히 “좋아할 만한 상품을 맞히는 시스템”이 아닙니다. 유저가 어디서 탐색을 시작하고, 어디에서 선택을 고민하며, 어디서 결정을 내리는지를 잇는 흐름의 문제에 가깝습니다. 그래서 추천시스템을 개선할 때, 모델 하나의 성능보다 먼저 다음의 질문을 던집니다.

이 구조는 유저의 행동을 어떻게 바꾸고,
그 변화가 어떤 지표로 이어지는가?

이 글은 저희가 추천시스템을 단계적으로 재설계해오면서

  • 어떤 문제가 먼저 보였고

  • 그 문제를 어떤 구조적 선택으로 풀었으며

  • 그 선택이 실제 비즈니스 지표와 경험에 어떻게 연결됐는지를 정리한 기록입니다.

개선은 다음과 같은 단계로 진행되었습니다.

(1) 후보 풀 자체를 건강하게 만들고 (Retrieval)
(2) 그 후보를 유저의 현재 맥락에 맞게 정렬하고 (Reranking)
(3) 반복 노출에 대한 피드백을 추천에 반영하고 (Negative Feedback)
(4) 행동 이전의 의미 정보를 추천의 출발점으로 사용했습니다. (Semantic Embedding Initialization)

각 단계는 “이 구조가 유저의 행동을 어떻게 바꾸는가”, 그리고 “그 변화가 실제 지표에 어떻게 연결되는가”를 기준으로 설계되었습니다. 아래에서는 각 단계가 어떤 문제를 풀기 위해 도입되었고, 그 선택이 탐색·전환·다양성 등 비즈니스지표에 어떤 변화를 만들었는지를 순서대로 정리합니다.


0. 출발점: Item-based Collaborative Filtering

추천이 “틀리진 않는데, 점점 뻔해질 때”

초기 추천 시스템은 item-based collaborative filtering(CF)이었습니다. 공동 클릭(co-click) 기반 유사도로 “이 상품을 본 유저들이 함께 본 상품”을 추천하는 방식입니다. 구현은 단순했지만, 시간이 지날수록 추천 분포의 구조적 문제와 운영 비용 측면의 제약이 함께 드러났습니다.

관측된 현상

  • 추천이 특정 인기 상품군으로 빠르게 수렴

  • 추천되는 SKU 수 감소(catalog coverage 하락)

  • item별 co-click 유사도를 상시 참조해야 하는 구조로 인해, 상품 수 증가에 따라 메모리 사용량과 배포·스케일링 비용이 함께 증가

추천이 사용자의 취향과 완전히 벗어난 것은 아니었지만, 탐색을 돕는다기보다 이미 많이 본 상품을 반복 노출하는 방향으로 작동하고 있었습니다. 이 경험은 하나의 결론으로 이어졌습니다.

후보 생성 단계에서 분포가 무너지면, 이후 어떤 모델을 얹어도 회복하기 어렵다. 게다가 그 후보 생성이 규모에 따라 비용이 계속 커지는 방식이라면, 개선의 여지도 점점 줄어든다.

그래서 저희는 랭킹을 고치기 전에 후보 생성 자체를 바꾸기로 했습니다.


1. Graph 기반 Multi-Behavior Retrieval 도입

후보를 ‘유사도’가 아니라 ‘관계와 의미’로 만든다

이 문제를 해결하기 위해 저희는 추천의 첫 단계를 다시 정의했습니다. 문제는 “정확한 1등을 고르는 능력”이 아니라, 그 1등을 고를 수 있는 후보 풀이 충분히 넓지 않다는 점이었습니다. 그래서 후보 생성 방식을 co-click에서 embedding 기반 retrieval로 전환함으로써 “확장 가능한 검색 문제”로 재정의했습니다.

정확한 1등을 고르는 것보다, 유저가 관심을 확장해갈 수 있는 영역을 먼저 확보하자.

즉, 추천의 시작은 “무엇을 위에 올릴까”보다 “어디까지를 후보로 볼까”에 가깝다고 판단했습니다. 그래서 item-based CF를 제거하고, graph 기반 Retrieval(=Candidate Generation) 구조를 도입했습니다.


왜 Graph Retrieval인가 (CF에서 Graph로)

저희가 풀고 싶었던 문제는 “더 잘 맞히기”라기보다,

  • 인기상품군으로 수렴하는 후보 분포를 완화하고

  • high-order connectivity를 이용해 long-tail까지 후보를 확장하며

  • 이후 ranking이 쓸 수 있는 “쓸모 있는 후보 풀”을 만드는 것이었습니다.

그래프 기반 retrieval은 이 목적에 잘 맞습니다. user–item bipartite graph에서 message passing을 통해 1-hop 상호작용을 넘어선 고차(user–item) 연결 정보를 임베딩 공간에 주입할 수 있기 때문입니다.


Multi-Behavior를 선택한 이유: 행동을 늘리는 것이 아니라, 선호를 분해하기 위해

클릭, 찜, 장바구니, 구매는 모두 positive처럼 보이지만 각각이 드러내는 선호의 성질은 다릅니다. 이 차이를 무시하고 행동을 단순히 합치면,

  • 빈도가 높은 행동(주로 클릭)에 끌려가고

  • 후보 단계부터 선호가 흐려지며

  • 다시 인기 상품 중심으로 수렴하게 됩니다.

이 지점에서 참고한 접근이 Behavior-Contextualized Item Preference Modeling 입니다.

이 논문은 다음을 분명히 합니다.

  • auxiliary behavior는 유용하지만

  • 이를 target behavior로 그대로 옮기면 노이즈가 된다

  • 핵심은 행동을 분리해 target에 정렬된 preference만 사용하는 것

우리는 이 관점을 Retrieval 단계에 적용했습니다.


어떤 그래프를 만들었는가

구조의 핵심은 복잡함이 아니라 역할 분리였습니다.

  1. Multi-behavior interaction graph

    • user–item 간 클릭/찜/장바구니/구매 관계를 모두 포함

    • 목적: high-order connectivity를 통해 협업 신호의 뼈대를 만들기

  2. Target-aligned preference 강화

    • 행동별로 분리된 선호 표현 중, 구매(target) 부분만을 Retrieval scoring에 반영

    • 보조 행동은 표현을 풍부하게 만드는 역할로 제한

이 과정에서 UltraGCN 구조를 사용해,

  • 그래프 구조 정보는 유지하면서

  • 모델의 학습 비용을 현실적으로 관리할 수 있었습니다.


Retrieval 단계에 실시간 탐색 흐름 반영

Retrieval을 단순한 “장기 취향 검색”으로만 두지 않았습니다. 과거 상호작용으로 형성된 그래프 기반 표현은 유저의 전반적인 취향을 안정적으로 담아내지만, 최근 탐색 흐름까지는 충분히 반영하지 못합니다. 그래서 장기 선호를 기준점으로 유지하되, 최근 클릭한 상품들의 embedding을 집계해 유저 표현을 실시간으로 이동시키는 방식으로, 현재 탐색 맥락에 따라 후보 분포가 달라지도록 설계했습니다.

  • 최근 클릭한 상품들의 embedding을 집계해

  • 유저 표현을 즉시 이동시키고

  • 현재 탐색 흐름에 따라 후보 분포가 달라지도록 설계했습니다.

이로써 Retrieval은 정적인 취향 검색이 아니라 세션 맥락에 반응하는 후보 생성 단계가 되었습니다.


관측된 변화

  • Aggregate diversity(catalog coverage/shannon entropy) 향상

  • 유저가 더 많은 상품을 탐색하고, 실제 클릭도 늘어남

다만, 문제가 남아있었습니다.

분포와 탐색은 개선되었지만, 구매 지표가 즉시 따라오지는 않았다.


2. Reranking 도입: “볼 만한 후보”를 “사고 싶은 선택”으로 만들기

Graph 기반 Retrieval은 추천의 분포를 건강하게 만들었지만, 구매 전환까지 책임지기에는 한계가 있었습니다. 후보는 넓어졌지만, 그 안에서 유저의 현재 상태(Context)를 세밀하게 읽어내지 못했기 때문입니다. 탐색 초반, 비교 단계, 구매 직전은 유저가 중요하게 보는 조건이 완전히 다릅니다. 우리는 후보를 잘 만드는 것과, 후보를 지금의 맥락에 맞게 정렬하는 것은 다른 문제라고 정의하고, 전환 관점의 미묘한 차이를 구분하기 위한 Reranking 단계를 도입했습니다.

문제는 이 순서가 단순한 “인기/유사도”만으로 결정되기 어렵다는 점입니다. 구매 전환은 가격, 브랜드, 카테고리, 스타일처럼 여러 속성이 유저의 취향과 동시에 맞물리는 조합에서 발생하는 경우가 많고, 같은 상품이라도 유저가 지금 어떤 맥락에서 탐색 중인지에 따라 중요해지는 조합이 달라집니다.

그래서 저희는 Reranking을

(1) 후보상품–유저–컨텍스트 feature 간 교호작용을 학습해 ‘전환 관점의 미묘한 차이’를 구분하는 모델과,

(2) 세션 내 행동의 흐름을 반영해 ‘지금의 의도’를 읽어내는 sequential 모델로 구성했습니다.

전자는 feature interaction을 안정적으로 학습하는 구조를, 후자는 실시간 행동 시퀀스를 후보와 함께 결합해 해석하도록 설계했습니다.


Deep & Cross Network(DCN) 기반 Reranking

기본 랭킹 모델로 Deep & Cross Network(DCN)를 사용했습니다.

DCN은

  • cross network로 low-order interaction을 안정적으로 만들고

  • deep network로 higher-order를 보강하는 구조라

  • 유저/상품 embedding

  • 상품의 가격, 브랜드, 이미지, 텍스트 feature, 검색어 등

    간의 교호작용(feature interaction)을 안정적으로 학습해,

후보 간의 미묘한 차이를 전환 관점에서 더 잘 구분해주었습니다.


TransAct 기반 Sequential Modeling: 행동의 ‘흐름’을 의도로 해석하기

Reranking에서 가장 중요한 추가 요소는 Sequential Modeling이었습니다.

참고한 논문은 TransAct 입니다.

TransAct의 핵심은 단순히 “유저 행동 시퀀스를 추천에 반영한다”가 아니라,

  • Realtime 행동 시퀀스에 나타나는 단기 취향

  • Batch로 학습된 장기 취향

이 두 가지를 함께 결합해 랭킹한다는 점입니다.

특히 중요한 구조는 다음과 같습니다.

  1. Realtime Action Encoder

    • 최근 행동 시퀀스(item, behavior type)를 transformer로 인코딩

    • “지금 유저가 어떤 흐름에 있는지”를 표현

  2. Candidate × Sequence Early Fusion

    • 시퀀스를 “요약 벡터 하나”로 만들어 붙이는 late fusion보다,

    • 후보 아이템과 시퀀스 표현을 일찍 결합해, “이 후보가 이 시퀀스 맥락에서 얼마나 맞는가”를 직접 학습

  3. Recent-action Bias 완화

    • 학습 시 random time window mask를 적용해 행동 시퀀스의 구간을 랜덤하게 제거

    • 모델이 가장 최근 행동 몇 개에 과도하게 의존하는 현상(recency bias) 을 완화하고 short-term intent를 보다 안정적으로 일반화하여 학습하도록 유도

  4. Short / Long term Preference 균형

    • Long-term preference: batch 학습된 user embedding으로 표현해 유저의 전반적 취향을 안정적으로 유지

    • Short-term intent: realtime 행동 시퀀스로부터 동적으로 추출

    • 두 표현을 후보 아이템과 함께 결합해 랭킹함으로써 단기 탐색 흐름에만 끌리지 않으면서도 현재 맥락에 반응하는 순위를 구성


관측된 변화

가장 뚜렷한 변화는 상품 상세 페이지(PDP)의 ‘연관 상품 추천’ 지면에서 관측되었습니다. 이 지면은 유저의 관심이 이미 특정 상품에 수렴한 상태에서 이루어지는 고의도(high-intent) 탐색 구간으로, 동일한 후보 집합이라도 지금 이 유저에게 더 구매 가능성이 높은 선택이 상위에 노출되는지가 지표에 직접적으로 반영됩니다.

Reranking 도입 이후, 해당 연관 상품 영역에서는

  • 세션 맥락에 더 잘 정렬된 상품이 상위에 유지되며

  • 추천 클릭 이후의 행동 흐름이 보다 일관되게 구매로 이어졌고

그 결과 유저당 거래액(GMV)이 +3.86%, 주문 횟수가 +4.41% 증가하는 개선이 확인되었습니다.

이러한 설계가 가능했던 배경에는, 유저의 최근 행동 시퀀스를 실시간으로 활용할 수 있는 Feature Store 인프라가 있었습니다. 다만 Feature Store 자체에 대한 상세한 내용은 이 글의 범위를 벗어나, 이후 별도로 다룰 예정입니다.

Retrieval이 “보게 만드는 후보 풀”을 확장했다면, Reranking은 그 풀 안에서 결정 직전의 맥락에 맞는 선택을 앞쪽으로 당겨, 탐색을 실질적인 구매 성과로 연결하는 단계로 기능했습니다.


3. Negative Feedback을 반영한 추천 업데이트

‘보지 않기로 한 것’을 추천이 기억하게 만들기

Retrieval과 Reranking을 도입한 이후에도, 추천 결과를 운영에서 지켜보면 한 가지 패턴이 반복적으로 나타났습니다. 이미 여러 번 노출되었지만 반응하지 않았던 상품, 그리고 그와 유사한 상품들이 시간이 지나면 다시 추천 상단에 노출되는 현상이었습니다.

이는 추천 시스템이 “선호된 아이템”은 빠르게 학습하는 반면, 노출 이후 반응이 없었던 아이템에 대한 부정적 신호를 명시적으로 학습하지 못하고 있었기 때문이었습니다.

이를 해결하기 위해 Carousel Personalization with Contextual Bandits 관점을 참고했습니다.

이 논문은 추천을 단발성 예측이 아니라,

  • 노출 → 반응 → 업데이트 → 다음 노출로 이어지는

  • 연속적인 상호작용 과정으로 다룹니다.

저희의 접근은 논문의 policy update 아이디어를 embedding space에서의 미세 이동으로 구현했습니다.

bandit 관점에서 아래와 같이 정의했고,

  • 유저 embedding = 현재 policy의 상태

  • 아이템 embedding = action 방향

  • 클릭 / 무반응 = reward signal

결과적으로 유저 embedding(policy)의 업데이트는 아래와 같이 이루어집니다.

  • 클릭된 상품에 대해서는

    • 해당 아이템이 나타내는 방향으로 유저 embedding을 가깝게 이동시켜 현재 맥락에서의 선호를 강화하고

  • 노출 이후에도 반응이 없었던 상품에 대해서는

    • 그 아이템이 나타내는 방향에서 유저 embedding을 멀어지게 이동시켜 동일하거나 유사한 아이템이 반복적으로 상위에 노출되는 것을 완화했습니다.

이 업데이트는 Retrieval과 Reranking 모두에 공유되며, 추천을 “한 번의 결과”가 아니라

연속적인 상호작용 속에서 점진적으로 조정되는 과정으로 만들었습니다.


관측된 변화

  • 반복 노출 감소를 통해 상품 다양성 지표, 브랜드 다양성 지표가 각각 +2.63%, +4.16% 상승했습니다

  • 이를 통해, 유저당 거래액(GMV)이 +2.55% 상승했습니다


4. 추천이 유저의 행동이 아니라, 의미에서 시작되도록

지금까지 저희는 유저 행동 신호를 중심으로 Retrieval과 Reranking을 설계해 왔습니다.

이 접근은 분포와 맥락 정렬 측면에서 분명한 개선을 가져왔지만, 추천의 출발점 자체는 여전히 “행동이 관측된 이후” 에 머물러 있었습니다. 하지만 추천의 정확성을 한 단계 더 끌어올리기 위해서는, 행동 이전에 존재하는 정보인 상품 자체가 갖는 의미와 성질이 모델의 초기 표현 공간에 강하게 반영될 필요가 있다고 판단했습니다.

여기서 핵심 질문은 다음과 같습니다.

행동(클릭·구매)은 유저의 선택의 결과지만, 텍스트(상품 설명·타이틀)는 상품이 무엇인지를 설명합니다.

그렇다면 이 의미는, 추천시스템에서 유저 선호의 출발점이 될 수 있을까요?

이 물음은 Language Representations Can be What Recommenders Need 논문에서 명확하게 설명됩니다.


어떤 발견인가?

이 논문은 사전학습된 언어 모델(LLM)이 생성하는 임베딩 공간이, 단순한 의미 표현을 넘어 사용자 선호(협업필터링 신호)까지 일부 내포할 수 있음을 보였습니다.

  1. 언어 임베딩 → 추천 임베딩의 준동형사상 (Homomorphism)

    • 상품의 텍스트를 LLM으로 임베딩하고, 이를 선형 변환(linear transformation)하면

    • 그 결과 벡터 공간이 전통적인 CF 임베딩과 구조적으로 유사한 행동 표현 공간으로 작동했습니다.

    • 즉, 언어 공간 그 자체가 협업 신호를 내포할 수 있다는 가능성을 실험적으로 확인했습니다.

  2. 초기화 및 일반화의 강점

    • 기존 ID 기반 임베딩처럼 무작위 초기화하는 대신, 의미 표현을 좋은 출발점(initialization)으로 사용하면, 아래의 이점이 관측되었습니다.

      • 빠른 수렴

      • 새로운 도메인/콜드스타트 상황에서도 일반화 성능 개선


의미 공간을 추천의 출발점으로 삼다

논문의 관점을 바탕으로, 저희는 추천 표현의 출발점을 행동이 아닌 의미로 이동시켰습니다.

1) 상품 텍스트 → 초기 item embedding

상품 상세페이지의 설명과 타이틀을 Qwen3로 임베딩해, 이를 item의 초기 representation으로 사용했습니다. 이 임베딩은 상품의

  • 스타일·소재·핏에 대한 뉘앙스

  • 가격대가 암시하는 포지션

  • 브랜드가 전달하는 이미지

등을 함께 담고 있어, 순수 ID 기반 또는 행동 기반 embedding보다 상품의 본질적인 특성을 더 풍부하게 표현할 수 있었습니다.

2) 유저 초기 embedding의 구성

유저의 초기 embedding은 다음과 같이 정의했습니다.

유저 초기 표현 = interaction history에 포함된 item embedding의 평균

즉, 유저가 상호작용한 상품들의 의미 기반 표현을 집계해 유저의 취향을 초기화했습니다. 이는 논문에서 제시된 “언어 표현 공간이 추천 공간과 대응될 수 있다”는 발견을 실제 시스템 설계로 옮긴 결과입니다


왜 이것이 중요한가?

기존 추천 시스템은 주로 행동(클릭/구매) 기반 데이터를 통해 embedding을 훈련하거나 초기화를 무작위로 하여, “텍스트가 가진 본질적인 의미”를 추가 feature로만 사용해 왔습니다.

하지만 의미 공간을 출발점 자체로 삼아 embedding을 구성하면:

  • 행동과 의미가 함께 반영된 표현 공간을 만들 수 있고

  • 아이템의 본질적인 특성(상품이 겨냥하는 스타일·용도)과 사용자 취향을 더 잘 맞출 수 있으며

  • cold-start & long-tail 문제도 완화

되는 효과를 기대할 수 있습니다.


관측된 변화

  • 전체 유저의 유저당 거래액(GMV)이 +2.3% 상승했습니다

  • 미구매 유저의 유저당 거래액(GMV)이 +7.9% 상승했습니다

  • 브랜드 다양성 지표가 +1.3% 상승했습니다


5. 정리하며

저희는 추천 시스템을 이렇게 바라보고 있습니다.

추천은 한 번의 예측이 아니라, 유저와 시스템이 주고받는 선택의 누적이다.

그래서 추천시스템을 개선할 때마다 모델 하나를 더 잘 만드는 것보다,

  • 추천되는 상품의 분포가 한쪽으로 쏠리지는 않는지,

  • 같은 상품이 어떤맥락에서 반복 노출되며 사용자 경험을 훼손하는지,

  • 추천으로 만들어진 노출이 다음 추천에 어떤 피드백 루프로 반영되는지

를 중점적으로 살펴봤습니다.

그 결과, 같은 상품이 반복 노출되는 실패를 줄이고, 유저가 탐색을 이어갈 수 있는 구조를 만드는 선택을 해왔으며, 이는 비즈니스 지표 향상으로 이어졌습니다

그리고 이 여정은 아직 끝나지 않았습니다. 다음 단계에서는 “유저가 더 오래·더 깊게 탐색하도록 만드는 신호와 목표”를 시스템 레벨에서 다시 정의하려고 합니다. 즉, 단기 반응(클릭/전환)을 잘 맞히는 추천이 아니라, 유저의 장기 만족과 재방문으로 연결되는 추천을 만들기 위해 입력 신호와 학습 목표를 함께 손보는 작업입니다.

아래는 그 연장선에서 현재 준비 중인 두 가지 변화입니다.


1) 상품 상세 페이지(PDP) dwell time으로 ‘클릭’을 선호 단위로 쪼개기

지금까지의 시스템은 클릭·찜·장바구니·구매처럼 행동의 종류(action type)를 분해해 선호를 정렬해 왔습니다. 하지만 같은 클릭이라도 의미는 같지 않습니다.

  • 스쳐 지나간 클릭

  • 비교를 위한 클릭

  • 구매 직전의 집중 탐색

이 차이는 종종 “무엇을 클릭했는가”보다 “얼마나 머물렀는가”에서 더 뚜렷하게 드러납니다.

그래서 저희는 PDP에서의 dwell time을 활용해 클릭 신호를 더 세분화하고, 이를 추천 업데이트와 랭킹에 반영하려고 합니다. 즉, 클릭을 하나의 positive로 취급하는 대신,

  • 신뢰할 만한 관심(의미 있는 탐색)

  • 약한 관심(가벼운 훑어보기)

을 구분해서 후보 생성/리랭킹/업데이트의 입력 신호 자체를 더 정교하게 만들 계획입니다. 모델이 “많이 눌린 것”이 아니라 “깊게 본 것”을 더 잘 기억하게 만드는 방향입니다.


2) LTV·Retention 같은 장기 지표를 직접 최적화하도록 목표를 재정의하기

또 하나의 다음 질문은 아래와 같습니다.

지금 우리가 줄이는 loss는, 정말 우리가 올리고 싶은 비즈니스 지표와 같은 방향인가?

추천 시스템은 실험에서 CTR이나 CVR이 오르더라도, 그 상승이 항상 Life-Time Value(LTV)나 retention 으로 이어지지는 않습니다. 단기 반응을 잘 맞히는 것과, 유저의 장기적인 만족과 관계를 키우는 것은 다른 문제이기 때문입니다. 그래서 저희는 목표를 더 명확히 “장기 지표”로 옮기고, 모델이 그 목표를 향해 학습하도록 설계를 바꾸려 합니다. 궁극적으로는 loss가 줄어드는 것이 곧 LTV/retention 상승으로 이어지도록, 학습 목표와 비즈니스 목표를 정렬(alignment)하는 것이 목표입니다.


함께 이 흐름을 설계할 분을 찾고 있습니다

저희는 추천을 하나의 모델이 아니라, 유저의 탐색과 선택이 이어지는 구조로 설계하고 있습니다.

이 구조를 더 단단하게 만들고 싶은 분이라면, 아래 채용 공고를 확인해 주세요.

🧠 ML Engineer 채용공고 보기

🌱 ML Engineer (신입) 채용공고 보기

Share article

라포랩스