grep

통합임베딩으로 개인화 푸시 CTR +21.3%를 만든 과정

무신사

2026년 9월 1일

원문에서 보기 ↗

유저를 한 번 이해하고, 모든 결정이 공유하는 Layer 0

1편: MATCH란 무엇인가 2편: MATCH Console & MAI 3편: 통합임베딩으로 개인화 푸시

안녕하세요. 무신사 Core-E Personalization 팀에서 개인화 모델을 개발하고 있는 오승모, 방효석입니다. 이 시리즈에서는 MATCH를 중심으로 데이터를 더 나은 결정으로 바꾸는 방법을 이야기해 왔습니다. 운영자가 규칙을 직접 만드는 대신 모델이 유저 단위의 결정을 만들고, 여러 결정의 우선순위를 시스템이 판단하는 과정도 소개했습니다. 그런데 이 모든 이야기에는 하나의 공통된 전제가 깔려 있습니다. **"시스템이 유저를 충분히 이해하고 있다"**는 전제입니다.

어떤 유저에게 어떤 기획전을 보내야 하는지 결정하려면, 시스템 어딘가에는 그 유저의 취향과 관심사를 표현하는 공통된 표현이 존재해야 합니다. 모델마다 유저를 제각각 이해한다면, 아무리 좋은 의사결정 로직을 만들어도 결국 그 한계를 넘기 어렵습니다.

이 공통된 기반을 만드는 일은 개별 서비스의 모델을 잘 만드는 일과는 성격이 다릅니다. 새 모델의 성과는 지표로 바로 보이지만, 유저에 대한 이해를 쌓는 일은 그 자체로는 눈에 보이는 숫자를 만들지 않습니다. 대신 그 위에 올라서는 모든 결정의 품질을 좌우합니다. 이번 글은 무신사의 모든 모델과 의사결정이 공유하는 유저 표현층, Layer 0(통합임베딩)을 구축하고 이를 개인화 푸시에 처음 적용한 과정을 담았습니다.

왜 통합임베딩이 필요했는가

1편에서는 개별 최적화가 아무리 정교해져도 전체 경험에는 두 가지 갭이 남는다고 이야기했습니다. 하나는 여러 시스템이 서로 다른 결정을 내리면서 생기는 일관성의 격차, 다른 하나는 각 시스템의 학습이 저마다의 사일로(Silo)에 갇혀 서로에게 이어지지 않는 학습의 격차입니다. 통합임베딩이 겨냥한 것은 그중에서도 학습의 격차입니다.

그동안 무신사의 유저 단위 의사결정은 대부분 각자의 전용 모델로 구현되어 왔습니다. 새로운 결정이 하나 생길 때마다 그 서비스만을 위한 로그를 모으고, 피처를 설계하고, 학습 파이프라인을 만들고, 서빙과 모니터링을 붙이는 일이 반복되었습니다. 문제는 모델의 수가 아니라, 같은 유저를 여러 번 배우는 구조였습니다.

추천 모델은 상품 반응을, 푸시 모델은 클릭을, 쿠폰 모델은 구매를 학습합니다. 모두 같은 유저를 대상으로 하지만, 각 모델이 쌓은 유저 이해는 서로 공유되지 않았습니다. 그래서 새 모델을 만들 때마다 유저를 처음부터 다시 배워야 했고, 유저에 대한 이해는 모델 수만큼 조각나 있었습니다.

개인화 푸시는 이런 구조를 가장 잘 보여주는 사례였습니다. 오랫동안 DeepFM 기반 CTR 예측 모델로 운영되며 유저와 기획전 피처를 입력으로 클릭 확률을 예측했습니다. 모델 자체의 성능이 나빴던 것은 아닙니다. 문제는 시간이 지나면서 구조 자체가 유지하기 어려운 형태로 변했다는 점이었습니다.

먼저 운영 지식이 점차 사라졌습니다. 모델의 운영 주체가 여러 차례 바뀌면서 어떤 피처를 왜 넣었는지, 장애가 발생했을 때 무엇을 점검해야 하는지 같은 맥락이 함께 사라졌습니다. 파이프라인은 매일 정상적으로 동작했지만 예측 품질의 변동을 설명할 수 있는 사람은 없었습니다. 시리즈 1편에서 이야기했던 *"담당자가 바뀌면 마케팅 자산이 리셋된다"*는 현상이 모델 레이어에서도 똑같이 일어나고 있었던 것입니다.

전용 학습 파이프라인을 유지하는 비용도 적지 않았습니다. 개인화 푸시만을 위한 데이터 생성, 피처 가공, 모델 학습 파이프라인을 매일 돌려야 했고, 사이클이 멈추면 그날의 발송 품질도 함께 흔들렸습니다. 세일즈 푸시와 라이브 푸시처럼 같은 앱푸시 채널 안에서도 서로 다른 모델과 파이프라인이 각각 운영되고 있었습니다.

이런 문제들은 모두 같은 원인에서 비롯되었습니다. 유저를 이해하는 책임을 각 모델이 따로 가지고 있었기 때문입니다. 모델이 하나 늘어날 때마다 유저를 이해하기 위한 학습과 운영도 함께 늘어났고, 그 비용 역시 계속 쌓였습니다. 그래서 방향을 바꿨습니다. 결정마다 새로운 모델을 만드는 대신, 모든 결정이 공유하는 하나의 유저 표현을 먼저 만들기로 했습니다.

통합임베딩 설계

그렇게 만들기로 한 것이 바로 유저 표현(User Representation), Layer 0입니다. 각 모델이 유저를 다각도로 재해석하던 구조에서 벗어나, 이 층 하나가 유저 이해를 전담하도록 역할을 재설계했습니다. 어떤 유저가 무엇을 좋아하는지 한 번만 계산해 두고, 푸시, 쿠폰, 지면 추천 등의 서비스가 그 결과를 공유하는 것입니다.

통합임베딩은 바로 이러한 공통 기반을 의미합니다. 상품 조회, 좋아요, 구매, 브랜드 탐색처럼 무신사 서비스 곳곳에 흩어져 있던 유저 행동을 하나의 공통 공간에서 통합 학습합니다. 이제 유저, 상품, 브랜드, 카테고리는 모두 동일한 공간 안의 엔티티(Entity)가 되고, 조회, 좋아요, 구매 같은 행동은 엔티티 사이를 잇는 릴레이션(Relation)이 됩니다.

방식을 정하면서 무신사 데이터가 지닌 본래 구조를 먼저 살폈습니다. 상품은 특정 브랜드에 속하고, 브랜드와 카테고리는 서로 얽혀 있습니다. 유저는 그 사이를 넘나들며 클릭하고, 좋아요를 누르고, 장바구니에 담으며, 구매합니다. 기획전 역시 이러한 브랜드와 카테고리를 묶어 만든 모음집입니다. 즉, 무신사의 데이터는 처음부터 '연결' 형태의 구조를 띠고 있었습니다.

기존 모델들은 이 연결 구조를 평평한 피처 벡터에 억지로 눌러 담아 학습했습니다. 그 과정에서 "이 유저가 이 브랜드에 반응했다"는 사실과 "이 상품이 그 브랜드에 속한다"는 관계가 서로 다른 피처로 나뉘어 학습되었습니다. 이 연결성을 원래 구조대로 학습할 수 있다면, 유저의 반응을 단순 상품 단위를 넘어 브랜드나 카테고리 단위로 자연스럽게 일반화할 수 있습니다. 그래프 구조를 채택한 이유가 바로 여기에 있습니다.

이처럼 엔티티와 릴레이션으로 데이터를 표현하는 방식을 지식 그래프(Knowledge Graph)라고 부릅니다. 엔티티는 그래프의 노드, 릴레이션은 노드와 노드를 잇는 선에 해당합니다. 엔티티 간의 연결은 (head, relation, tail) 형태의 Triplet으로 표현합니다. 예를 들어 유저가 상품을 클릭했다면 (유저, 클릭, 상품), 그 상품이 특정 브랜드에 속한다면 (상품, 브랜드소속, 브랜드)가 되는 방식입니다. 지식그래프 임베딩(Knowledge Graph Embedding; KGE)은 이렇게 구축된 엔티티와 릴레이션 관계를 바탕으로 각 구성 요소를 벡터로 표현하는 방법론입니다. 이 방식을 채택한 이유는 두 가지입니다.

  1. 학습의 통합: 클릭, 좋아요, 구매처럼 성격이 다른 행동을 따로 학습할 필요가 없습니다. 릴레이션 종류만 다른 triplet일 뿐이라 한 공간에서 동시에 학습할 수 있습니다.
  2. 상위 개념의 공유: 유저와 상품뿐 아니라 브랜드, 카테고리 같은 상위 엔티티도 동일한 공간에 놓입니다. 뒤에서 다룰 기획전 표현이 가능해진 것도 바로 이 특징 덕분입니다.

모델 학습과 유효성 검증

여러 KGE 모델 중 무신사는 TransE를 선택했습니다. 구조가 가벼워 억 단위의 triplet 데이터를 저비용으로 학습할 수 있고, 엔티티 사이의 릴레이션을 벡터의 이동(Translation)으로 정의하여 연산에 활용하기 매우 편리하기 때문입니다. 학습은 실제로 존재하는 triplet의 점수는 올리고, 무작위로 생성한 가짜 triplet의 점수는 낮추는 방식으로 진행됩니다.

이렇게 구축된 공간에서는 유저 벡터에 "클릭" 릴레이션 벡터를 더하면 유저가 클릭할 법한 상품 근처로 이동하고, "구매" 벡터를 더하면 구매할 법한 상품 근처에 도달합니다. 유저에 대한 이해가 이미 이 공간 좌표 안에 녹아 있으므로, 그 위의 상위 태스크는 별도의 복잡한 유저 표현 학습 없이도 벡터 연산으로 구현할 수 있습니다. 학습된 임베딩 공간은 128차원으로 구성되어 있습니다. 12종의 엔티티와 23종의 릴레이션으로 이루어져 있으며, 학습에 투입되는 엣지(Edge)는 약 1억 5천만 건에 달합니다.

완성된 모델은 특정 서비스만을 위한 전용 모델이 아닙니다. 유저를 이해하는 공통 자산으로 존재하며, 개인화 푸시를 비롯한 다양한 태스크가 동일한 공간을 공유합니다. 그 효과는 개인화 푸시에 적용하기 전부터 이미 드러났습니다. 카테고리 선호도 모델의 기존 PinSage 임베딩을 통합임베딩으로 교체하기만 했는데도, 고관여 집단과 저관여 집단의 CTR 격차가 48%에서 50%로 벌어졌고 CVR은 최대 7.8% 개선되었습니다. 모델 구조는 그대로 둔 채 유저를 표현하는 방식만 바꾼 결과였습니다.

하지만 이 구조를 수억 건의 실제 데이터 위에서 서비스로 구현하는 과정은 생각보다 간단하지 않았습니다. 노이즈를 걷어내는 데이터 클렌징부터, 시간 경과에 따른 임베딩의 성능 감쇠(Temporal Decay) 현상, 그리고 행동 로그가 전혀 없는 Cold 엔티티를 다루는 문제까지, 실제 모델을 구축하며 마주한 현실적인 문제들과 이를 하나씩 해결해 나간 과정을 소개합니다.

학습 대상 선정

가장 먼저 결정해야 했던 과제는 '누구를 학습시킬 것인가'였습니다. 4주 치 로그에는 약 490만 명의 유저가 등장하지만, 상당수는 상품 몇 개만 훑어보고 떠난 유저였습니다. 좋아요, 장바구니, 구매 이력이 전혀 없고 클릭도 10회 이하인 유저를 학습에서 제외해 보았습니다. 그 결과 유저 수는 12% 줄어든 반면, 엣지는 단 1%만 감소했습니다. 전체 그래프의 정보량은 거의 유지하면서, 취향을 추론하기 어려운 노드만 걸러낼 수 있었습니다. 상품에도 동일한 기준을 적용해 단순 클릭만 있고 유의미한 반응이 없었던 상품을 제외하자, 상품 수 역시 9% 줄어들며 그래프가 한층 촘촘해졌습니다.

임베딩 공간의 형성과 변화

학습을 마친 뒤 가장 먼저 확인한 것은 단순 지표가 아닌 '공간이 형성된 모양'이었습니다. TransE가 관계를 제대로 학습했다면, 유저와 상품 사이의 거리는 행동의 강도를 반영해야 합니다. 실제 측정한 유저-상품 유사도는 구매(0.219) > 좋아요(0.211) > 클릭(0.199) > 검색(0.150) 순으로 나왔습니다. 어떤 행동이 더 강한 신호인지 모델에 직접 가르쳐주지 않았음에도, 확정적이고 의도가 명확한 행동일수록 유저와 상품이 공간상에서 가깝게 배치되었습니다. 공간이 의도한 방향으로 형성되고 있다는 것을 확인할 수 있었습니다.

하지만 동시에 시간이 지나면서 학습된 임베딩이현재 시점 유저의 상태나 취향을 제대로 반영하지 못하는 현상이 나타났습니다. 학습 직후 0.199였던 클릭 유사도는 1주일 뒤 0.174, 3주일 뒤 0.157까지 하락했습니다. 신규 유입된 유저와 상품이 공간 내에 자리를 잡지 못하고, 기존 유저의 취향 역시 그사이 변화하기 때문입니다. 매주 공간을 전체 재학습(Full Retraining)하는 주기는 이 감쇠 곡선을 관찰하여 결정했습니다.

Cold-start 문제와 대응

다음으로 부딪힌 문제는 커버리지였습니다. 학습에서 제외된 유저나 어제 새로 가입한 유저는 그래프상에 좌표가 존재하지 않습니다. 이들에게 좌표를 부여하지 못하면 모델은 일부 활동성 유저만을 위한 반쪽짜리 자산에 머물게 됩니다.

처음에는 성별이나 연령대 같은 속성을 엔티티로 추가해 그래프 내부에서 문제를 해결하려 했으나, 속성 엣지 수가 행동 엣지 수보다 2배 이상 많아지면서 그래프가 유저와 유저 속성 간의 관계에 과도하게 의존해 학습되는 문제가 발생했습니다. 유저와 유저 속성 간의 관계는 행동 관계와 달리 정적인 관계여서, 학습 데이터가 많아져도 그래프의 다이나믹스를 충분히 반영하지 못하고 오히려 학습 성능을 떨어뜨렸습니다. 결국 속성 정보는 그래프 외부에서 다루기로 방향을 전환했고, 통합임베딩은 두 개의 모델로 나누어 운영하게 되었습니다.

두 모델은 같은 공간의 좌표를 만들지만, 그 좌표를 얻는 방식은 다릅니다. Cold 모델의 학습 재료는 Warm 공간 자체에서 추출합니다. 예를 들어 '성별=남성'이라는 속성의 좌표는 남성인 모든 Warm 유저 임베딩의 평균으로 정의하고, '브랜드=나이키'의 좌표는 해당 브랜드 상품들의 임베딩 평균으로 산출합니다. 이렇게 생성한 속성 좌표들을 조합하면, 행동 이력이 없는 Cold 유저라도 속성이 가리키는 적절한 공간 위치에 배치할 수 있습니다.

Cold 모델의 구조 개선

초기 Cold 모델은 속성 정보와 요약된 행동 데이터를 입력받아 Warm 임베딩을 예측하는 MLP 구조였습니다. 그러나 행동 로그가 전혀 없는 유저는 입력값의 행동 데이터가 모두 0으로 채워지면서, 출력되는 임베딩이 사실상 한 점으로 뭉치는 현상이 나타났습니다. 개인화를 위해 유저마다 다른 좌표가 나와야 함에도 이를 수행하지 못한 것입니다. 또한 엔티티 유형별로 모델을 개별 운용하다 보니 콘텐츠나 배너처럼 모수가 적은 유형은 학습 데이터 자체가 부족했습니다.

이를 해결하기 위해 구조를 전면 재설계했습니다. 정해진 피처 칸을 채우는 방식 대신, 엔티티가 보유한 속성 집합을 집계하여 표현을 만드는 구조로 전환했습니다. 속성의 개수나 순서에 영향을 받지 않는 구조 덕분에 유저, 상품, 스냅, 콘텐츠, 배너를 하나의 공통 Cold 모델로 통합 처리할 수 있게 되었습니다. 여기에 특정 범용 속성이 표현을 과도하게 지배하는 현상을 막는 마스킹과, 엔티티 유형에 따라 중요한 속성에 가중치를 부여하는 게이팅 메커니즘을 적용하여 변별력을 높였습니다.

운영 주기와 파이프라인 동기화

운영 주기 역시 유연하게 분리했습니다. Warm 모델은 주 1회 전체 재학습을 진행하고, Cold 모델은 매일 새로 유입되는 엔티티를 추론합니다. 주기가 상이하여 두 모델의 산출물 시점이 어긋나는 문제를 방지하기 위해, [Warm 모델 + Warm 임베딩 + Cold 모델]을 하나의 단일 버전 패키지로 묶어 관리합니다. 이 패키지의 검증이 끝났을 때만 최종 서빙 테이블을 교체하며, 어느 한 단계라도 실패할 경우 포인터를 이동하지 않고 이전 일자의 안정적인 데이터를 계속 바라보도록 원자성을 보장했습니다.

통합임베딩의 첫 적용: 개인화 푸시

통합임베딩이 실제 서비스에서 작동하는지 검증할 첫 번째 무대는 개인화 푸시였습니다. 새 파이프라인에는 CTR 예측 모델이 없습니다. 스코어링이 공간 위에서의 벡터 연산으로 대체되기 때문입니다. 여기서 가장 중요한 기술적 문제는 기획전이었습니다.

기획전은 매일 생기고 사라집니다. 노출 기간도 짧고, 충분한 반응 데이터를 모으기 전에 종료되는 경우가 대부분입니다. 기획전을 학습 대상으로 볼 것인지, 아니면 이미 알고 있는 엔티티를 조합한 결과로 볼 것인지에 따라 시스템의 구조가 달라집니다.

저희는 문제를 다르게 정의했습니다. 기획전은 새로운 엔티티가 아니라, 이미 학습된 브랜드와 카테고리의 조합이라고 봤습니다. 그러면 새 기획전을 위한 학습 과정 자체가 사라집니다. 공간 안에 이미 존재하는 브랜드와 카테고리를 조합해 기획전을 표현하기만 하면 되기 때문입니다.

새 기획전이 생겨도 어떤 브랜드와 카테고리로 구성됐는지만 알면, 별도의 CTR 학습이나 클릭 로그가 쌓이기를 기다릴 필요 없이 첫날부터 좌표를 계산할 수 있습니다. 이렇게 모델을 새로 학습하지 않고, 임베딩 공간 위의 연산만으로 개인화 추천을 구현했습니다.

실험과 운영 전환

새로운 스코어링 방식은 오프라인 테스트에서는 가능성을 보여줬고, 온라인 테스트에서는 실제 효과를 증명했습니다. 전환은 오프라인 검증, 온라인 A/B 테스트, 기존 파이프라인 fade-out, 메인 전환의 네 단계를 거쳐 진행했습니다. 오프라인 테스트에서 새 선호도 점수는 랜덤 대비 약 31% 높은 정확도로 클릭 유저를 식별했습니다. 하지만 새로운 스코어링 방식이 추천한 기획전과 기존 DeepFM 추천의 겹침 비율은 5.4%에 불과했습니다.

추천 결과가 이렇게 다르면 과거 발송 로그를 이용한 데이터 재현 평가 자체가 성립하지 않습니다. 과거 로그에는 새로운 백본 구조가 선택했을 기획전의 반응 결과가 존재하지 않기 때문입니다. 오프라인 테스트에서 충분히 좋아 보이는 구조도 운영에서는 실패할 수 있고, 반대로 오프라인 테스트만으로는 평가할 수 없는 모델도 존재합니다. 이번 사례는 후자에 가까웠습니다. 따라서 오프라인 테스트 지표는 성과 증명이 아닌 온라인 실험 진입을 위한 통행증으로만 다루었습니다.

온라인 A/B 테스트는 유저를 과거 클릭률 기준 5개 그룹으로 층화한 뒤 진행했습니다. 결과는 대조군(DeepFM) 대비 **CTR +21.3% 상승(p<0.001)**이었고, A/B 그룹에 동일 기획전이 노출된 12건 중 9건에서 새 파이프라인이 우세했습니다. 새로운 스코어링 방식이 단순히 다른 기획전을 선택한 것이 아니라, 기존 CTR 모델보다 더 적합한 타겟을 선택할 수 있음을 입증한 결과였습니다.

개선의 원천은 모델 구조가 더 정교해서가 아니라, 유저를 바라보는 창이 넓어진 데 있습니다. 기존 모델은 개인화 푸시의 클릭 로그라는 좁은 창으로만 유저를 배웠지만, 통합임베딩은 상품 조회와 좋아요, 구매, 브랜드 탐색까지 서비스 전반의 행동으로 유저를 배웁니다. 푸시를 클릭한 적 없는 유저라도 다른 지면에 남긴 행동이 있으면 취향을 읽을 수 있습니다. 동일한 기획전을 두고도 새 파이프라인이 우세했던 것은 소재가 아니라 유저에 대한 이해가 달랐기 때문입니다. 앞서 이야기한 "같은 유저를 여러 번 배우는 구조"를 벗어난 것이, 그대로 성능으로 돌아온 셈입니다.

전환 과정에서는 기존 DeepFM 출력 테이블에 감겨 있던 소재 선정 의존성을 하나씩 걷어내고 독립 로직으로 세웠습니다. 동시에 이 표현층이 산출한 선호도 점수가 일정 기준에 못 미치는 유저에게는 푸시를 발송하지 않는 발송 컷오프 정책을 적용했습니다. 그 결과 일 발송량이 26% 감소했음에도 발송당 거래액은 57% 증가했고, 채널 전체의 일평균 거래액도 15% 이상 상승했습니다. 모델이 정교한 점수를 만들어주고, 운영 정책이 그 점수를 바탕으로 "보내지 않을 결정"을 내려 만든 시너지였습니다.

통합임베딩이 가져온 변화

개인화 푸시를 개선한 것보다 더 큰 변화는 개선이 전파되는 단위가 개별모델에서 Layer 0로 바뀌었다는 것입니다. 먼저 전용 학습 파이프라인이 사라졌습니다. 개인화 푸시를 위해 매일 별도로 돌던 학습 파이프라인은 더 이상 필요하지 않게 되었습니다. 소비층만 남으면서 운영이 단순해졌고, 인수인계해야 할 파이프라인 블랙박스도 줄었습니다.

개선이 전파되는 방향도 바뀌었습니다. 개인화 푸시는 이제 세일즈 푸시, 라이브 푸시와 공통 모듈 위에서 돕니다. 그리고 같은 유저 표현을 쿠폰 타겟팅, 오프라인 방문 예측, 지면 개인화, Inbox Optimizer까지 함께 소비합니다. 예전에는 모델 하나를 고도화하면 채널 하나가 좋아졌지만, 지금은 백본 하나를 고도화하면 그 위의 결정들이 함께 좋아지는 구조가 되었습니다.

품질 관리도 한 곳에 모였습니다. 여러 태스크에 흩어져 있던 데이터 가공과 학습 파이프라인 대신 백본 모델 하나에 품질 검증과 모니터링이 집중되고, 유저 이해의 히스토리도 한 곳에 쌓입니다. 물론 이 구조의 회귀는 상위 모든 서비스의 회귀로 이어질 수 있으므로, 백본 업데이트 시 위층 태스크별 영향을 확인하는 단계적 평가 체계 구축이 안정적 운영의 필수 전제 조건입니다.

남은 과제

현재는 행동 이력이 없는 유저와 엔티티도 속성 정보를 활용해 통합임베딩 공간에 배치할 수 있습니다. 다음 과제는 이 Cold 표현의 품질을 Warm 수준으로 끌어올리고, 새로운 행동이 발생했을 때 변화하는 유저의 상태를 공간에 얼마나 빠르게 반영할 것인가입니다. 또한 Warm과 Cold 유저군 사이의 성능 차이를 지속적으로 측정하고, 이를 기준으로 임베딩 품질을 평가하는 체계도 고도화할 필요가 있습니다.

나아가 현재의 통합임베딩이 주로 행동과 속성 정보를 기반으로 유저를 표현한다면, 검색 키워드처럼 기존 행동 그래프에 직접 포함되지 않았던 텍스트 신호까지 어떻게 공간 안으로 가져올 것인가도 중요한 과제입니다. 현재 여러 방법론을 검증 중이며, 이를 통해 유저와 엔티티에 대한 표현을 더욱 풍부하게 확장하고, 장기적으로는 언어적 의미까지 함께 이해하는 통합 표현으로 발전시키고자 합니다.

마치며

추천, 푸시, 쿠폰, 콘텐츠 노출은 서로 다른 문제처럼 보이지만, 결국 모두 "유저를 이해한 뒤 결정을 내린다"는 같은 구조를 갖습니다. Layer 0는 이 공통 구조를 한 번만 구현하기 위한 시도였습니다.

이 시리즈에서는 데이터를 더 나은 결정으로 바꾸는 여러 방법을 소개했습니다. Layer 0는 그 결정들이 같은 유저 이해를 공유하도록 만든 기반입니다. 새로운 개인화 문제를 만날 때마다 모델을 하나씩 만드는 대신, 같은 유저 이해 위에 새로운 결정을 쌓는 것. CTR +21.3%는 그 위에서 나온 첫 번째 결과일 뿐, 저희가 만들고 싶었던 것은 앞으로 어떤 개인화 문제를 만나도 같은 기반 위에서 답을 찾아갈 수 있는 구조였습니다.

하지만 유저를 하나의 언어로 이해하는 것만으로 개인화 의사결정이 완성되지는 않습니다. 유저에게 전달할 라이브, 기획전, 매거진과 같은 서로 다른 콘텐츠 역시 시스템이 같은 기준으로 이해하고 비교할 수 있어야 합니다. Layer 0가 "이 유저는 무엇을 좋아하는가" 에 답하기 위한 공통 표현층이라면, **"무엇을 누구에게, 언제, 어디서, 어떻게 전달할 것인가"**를 하나의 캠페인 구조로 연결하는 기반이 필요합니다. 다음 글에서는 무진장 많은 콘텐츠를 공통된 언어로 통합하고, 이를 타겟팅과 발송, 성과 측정까지 연결한 Campaign Meta Engine의 구축 과정을 소개합니다.