검색어 없이 사용자가 좋아할 아이템을 고른다. 수천만 후보를 후보 생성 → 랭킹 → 재정렬 퍼널로 좁히고, 피드백이 다음 학습으로 돌아온다
평점 같은 명시 피드백과 조회 · 클릭 · 찜 · 구매 같은 암묵 피드백을 모아 사용자 × 아이템 상호작용으로 만든다
analytics 이벤트 토픽에서 상품 행동(노출 · 클릭 · 장바구니 · 주문)을 받아 ClickHouse 행동 테이블에 쌓는 소비자가 있다. 운영 ClickHouse 에는 그 테이블이 아직 없어 쌓인 행동이 없다(2026-10-12 확인)
노출이 적은 아이템의 CTR 은 우연에 크게 흔들린다. 신뢰구간 하한이나 사전 분포로 당겨 적은 표본이 1위를 차지하지 않게 한다
카테고리 베스트 점수는 행동 가중합에 Wilson 하한으로 보정한 CTR 을 곱해 낸다 — 가중합 × ln(1 + Wilson CTR × 100). 최근 30일, 행동 10건 이상인 아이템만 계산한다. 계산은 내부 동기화 호출로만 돌고 운영에는 그 호출을 거는 스케줄이 없다
수천만 아이템에서 수백 개를 recall 위주로 빠르게 뽑는다. 룰 · 콘텐츠 · 협업 · 임베딩 · 위치 소스 여러 개를 합친다
후보 원천 셋 — 카테고리 베스트, 아이템 협업 필터링(PPMI), 임베딩 ANN 이 구현돼 있다. 운영에서는 셋 다 비어 있다 — Redis 에 사전 계산 목록이 없고 ANN 사이드카에 모델 파일이 없다(2026-10-12 확인)
후보 수백 개를 풍부한 특징으로 정밀하게 채점한다. 보통 클릭 · 전환 확률을 예측하는 모델이고 precision 이 목표다
ANN 후보를 ONNX 랭커(Wide & Deep · DLRM)로 다시 점수 매긴다. 사이드카에 랭커 모델이 없어 받은 순서를 그대로 돌려준다(2026-10-12 확인)
점수 순 목록을 그대로 내지 않고 다양성 · 신선도 · 이미 본 것 · 운영 규칙을 반영해 최종 Top-K 를 만든다
재정렬 단계는 없다. 폴백으로 목록을 채울 때 이미 고른 아이템을 빼는 중복 제거만 있다
기록이 없는 새 사용자 · 새 아이템 · 새 문맥에 폴백 체인과 탐색으로 첫 추천을 낸다
개인화 요청은 최근 30일 행동이 기준 미만이면 바로 카테고리 베스트로 넘긴다. 선호 도시 · 카테고리는 90일 행동에서 고르고 없으면 기본값을 쓴다. 판정과 폴백 순서는 요청마다 돌지만 폴백 목적지인 카테고리 베스트가 운영에서 비어 있다
무거운 계산은 배치로 미리 하고, 요청 경로에서는 캐시 조회 · ANN · 가벼운 채점만 한다. 퍼널 단계마다 지연 예산이 다르다
추천 API 셋(카테고리 베스트 · 비슷한 상품 · 개인화)은 engagement 파드에서, ANN 은 사이드카 파드에서 돈다. 사전 계산 목록을 갱신하는 스케줄과 재학습 잡은 배포돼 있지 않다
오프라인 지표로 후보를 거르고 온라인 실험으로 판정한다. 로그는 옛 정책이 보여 준 것만 담아 오프라인 지표가 믿기 어렵다
오프라인 평가는 학습 스크립트 안에만 있고, 온라인 실험 · 밴딧 · 노출 발행은 구현돼 있지만 꺼져 있다