목차14개 항목
출처와 참고
카카오의 「루빅스(RUBICS) – kakao의 실시간 추천 시스템」(2016.04), 「카카오 뉴스 추천 AI 알고리듬 '루빅스'의 비밀」(2017), 「카카오I 추천 엔진의 진화」(2017), 「내 손안의 AI 비서, 추천 알고리듬」(2017), 「브런치 추천의 힘에 대한 6가지 기술(記述)」(2019)을 바탕으로 재구성한 노트다. 최근성·다양성·반복 노출 실험은 Hulu의 「Hulu’s Recommendation System」(2011)로 보강했다. 밴딧 알고리즘 비교와 「군집 → 타기팅 → 밴딧」 구조는 최규민의 「추천시스템 이제는 돈이 되어야 한다」(PyCon Korea 2019)로 보강했다.
왜 실시간인가
뉴스는 영화·음악·책과 달리 생명주기가 아주 짧다. 사용자 반응을 반영하는 데 오래 걸리면, 반영할 때쯤엔 그 기사가 더 이상 뉴스가 아니다. 글 플랫폼도 비슷해서 소비의 상당 부분이 발행 당일과 첫 주에 몰린다.
뉴스는 협업 필터링·콘텐츠 기반 필터링만으로 부족하다. 기사마다 소비 데이터가 쌓이기 전에 수명이 끝나기 때문이다. 그래서 지금 들어오는 반응으로 바로 순위를 고치는 방법이 필요하다.
멀티암드 밴딧
멀티암드 밴딧(Multi-Armed Bandit, MAB)은 승률을 모르는 슬롯머신 여러 대 중 어디에 동전을 넣을지 정하는 문제다. 승률이 높은 기계를 찾으려면 탐색(exploration)이 필요하고, 찾은 뒤에는 그 기계에 거는 활용(exploitation)이 이득이다. 둘의 균형이 핵심이다.
| 슬롯머신 | 추천 |
|---|---|
| 기계 | 콘텐츠 |
| 레버 당기기 | 콘텐츠 노출 |
| 당첨 | 클릭 |
| 승률 | 클릭률(CTR) |
| 알고리즘 | 탐색하는 방식 |
|---|---|
| ε-greedy | 트래픽의 1−ε(예: 90%)는 지금까지 CTR이 가장 높은 콘텐츠에, ε(10%)는 무작위 콘텐츠에 보낸다. 단순하지만 이미 나쁜 것으로 판명된 콘텐츠에도 계속 노출을 쓴다 |
| 톰슨 샘플링(Thompson Sampling) | 콘텐츠마다 CTR을 베타 분포 Beta(클릭 수 + 1, 비클릭 수 + 1)로 두고, 매번 분포에서 표본을 뽑아 가장 높은 것을 보여 준다. 노출이 적어 불확실한 콘텐츠는 분포가 넓어 가끔 뽑히고(탐색), 노출이 쌓이면 분포가 좁아져 좋은 콘텐츠로 수렴한다(활용) |
| UCB | 추정 CTR에 「불확실성 보너스」(노출이 적을수록 큼)를 더한 상한으로 고른다 |
| LinUCB 등 맥락 밴딧 | 사용자·콘텐츠 특징으로 CTR을 선형(또는 신경망) 모델로 예측하고 그 불확실성으로 탐색한다. 개인화가 된다 |
탐색에는 비용이 있다. 최적 콘텐츠만 보여 줬을 때와의 클릭 차이를 후회(regret) 라 하고, 밴딧 알고리즘은 이 후회를 줄이는 방향으로 탐색과 활용을 조절한다.
돈이 되는 추천: 군집 → 타기팅 → 밴딧
추천의 성과는 클릭 자체가 아니라 CTR과 그로 인한 매출로 잰다. 이를 위해 세 요소를 묶는다.
| 단계 | 하는 일 |
|---|---|
| 사용자 군집 | 반응 패턴으로 사용자를 묶는다. 같은 콘텐츠도 군집마다 CTR이 25%, 7.1%, 2.1%처럼 크게 다르다 |
| 아이템 특징 | 클릭이 적은 신규 아이템도 다룰 수 있게 이미지 특징(사전 학습 CNN, 스타일), 텍스트 특징(키워드, word2vec), 행렬 분해(ALS) 잠재 벡터를 붙인다 |
| 타기팅 + 밴딧 랭킹 | 군집별 후보를 좁힌 뒤 군집마다 밴딧으로 탐색·활용해 최종 순위를 정한다 |
교과서 밴딧과 실제의 차이
| 현실 문제 | 대응 |
|---|---|
| 한 번에 여러 개를 보여 준다 | 슬롯 여러 개를 동시에 고르는 변형 |
| 반응률이 시간에 따라 변한다(비정상성) | 시간 감쇠: 오래된 반응과 오래된 기사의 가중치를 낮춘다 |
| 화면 위치가 클릭을 좌우한다 | 위치 편향 보정: 가능한 모든 위치에서의 선택 확률을 평균한다 |
| 이미 본 기사가 또 나온다 | 중복 회피: 사용자가 이미 고른 기사는 가중치를 낮춘다 |
| 새 콘텐츠의 초깃값 | 콘텐츠 특성이나 카테고리 평균으로 시작한다 |
| 피드백이 늦게 온다 | 수집 지연을 줄이는 파이프라인 (아래) |
실서비스는 이 보정을 넣은 개인화 MAB를 중심으로 사용자 그룹 맞춤 추천과 개인화 추천을 앙상블한다.
클릭률을 넘어: 열독률
CTR은 제목에 대한 반응일 뿐 본문을 실제로 읽었는지는 알려 주지 않는다. CTR만 최적화하면 낚시성 제목이 이긴다.
열독률 지수(DRI, Deep Reading Index) 는 기사의 정보량(본문 길이, 이미지 수)으로 기대되는 체류 시간에 비해 실제로 얼마나 머물렀는지를 잰다. 짧은 기사와 긴 기사의 평균 체류 시간이 같다면 짧은 기사를 더 열심히 읽은 것이다. 열독률이 크게 낮은 기사는 제목과 본문이 어긋난 경우가 많다.
CTR과 열독률을 섞어 랭킹하면 1인당 페이지뷰는 조금 줄고 체류 시간은 는다. 끌리는 제목의 기사가 덜 추천된 대가다. 무엇을 최적화하느냐가 서비스의 성격을 바꾼다. 이 흐름이 업계 전반의 「클릭 대신 장기 가치」 목표로 이어졌다.
피드백 지연이 성능을 바꾼다
피드백 수집 주기를 짧게 할수록(예: 120초 → 10초) CTR이 뚜렷하게 오르지만 시스템 부하와 비용도 함께 오른다. 모델만큼 데이터 최신성이 중요하다. 빠르게 할수록 비싸므로 성능과 효율 사이에서 지점을 정한다.
실시간 추천 시스템 구조
flowchart TB ev["사용자 노출·클릭 이벤트"] --> mq["메시지 큐<br/>(Kafka: 대량 메시지를 복제해 안전하게 저장)"] mq --> stream["스트림 처리<br/>(Flink, Kafka Streams, Spark Streaming: 결과를 학습에 반영)"] mq --> batch["배치 처리<br/>(실시간일 필요 없는 집계)"] stream --> rank["결합해 랭킹"] batch --> rank rank --> srv["무상태 추천 서버<br/>(비동기 병렬 처리)"] srv --> db["분산 NoSQL 저장소<br/>(노드 추가·복제가 쉬운 것)"]
| 목표 | 설계 |
|---|---|
| 반영 속도 | 사용자 피드백이 수 초 안에 다음 추천에 반영된다 |
| 응답 속도 | 디스크·네트워크 IO 최소화, 불변 데이터로 락 없이 병렬 처리. 꼬리 지연(p99.9 이상)까지 관리한다 |
| 확장성 | 인스턴스를 무상태로 만들어 수평 확장한다 |
| 장애 격리 | 오케스트레이터(Kubernetes 등)로 죽은 프로세스 자동 재시작, 의존 구성 요소 장애 시 준비된 폴백 값으로 응답, 상시 통합 테스트와 즉시 알림 |
언어·프레임워크는 기술적 우위보다 팀이 이미 익숙한 것을 고르면 학습 부담이 준다.
실험이 본체다
다른 서비스에서 성공한 모델이 그대로 통한다는 보장은 없다. 그래서 매일 여러 실험 버킷을 만들고 지우며 모델을 다듬는 실험 문화가 추천 개발의 본체다. 측정해야 고칠 수 있다.
A/B 테스트 설계
통제 실험의 일반 원칙(유의성 기준, 검정 선택, 신기 효과, 결과의 유효 기간)은 프로덕트 데이터 분석에 있다. 추천에서는 다음을 더 챙긴다.
- 같은 시간에 사용자를 나눠 다른 로직을 보여 준다. 오프라인 로그는 사용자가 실제로 본 것에 대한 반응만 있고, 전후 비교에는 트렌드·새 콘텐츠·시간대 효과가 섞인다.
- 새 로직에는 트래픽의 5~10%를 준다. 이기면 그것이 새 기준이 되고 다음 실험을 시작한다.
- 실험 플랫폼은 버킷 규칙을 언제든 추가·삭제·변경하고, 노출 비율을 0~100% 사이로 조절하며, 사용자 기준 또는 트래픽 기준으로 버킷을 배정하고, 지표를 실시간으로 보여 준다.
노출 편향을 걷어 낸 인기 콘텐츠
신규 사용자·신규 콘텐츠의 콜드 스타트에는 인기 콘텐츠가 대안이다. 그런데 「많이 본 글」은 메인 화면에 노출된 글일 가능성이 크다. 인기가 품질이 아니라 노출 위치의 결과인 것이다. 노출 기회를 최대한 공평하게 맞춘 뒤 반응을 비교해 인기 콘텐츠를 고르면, 추천에 썼을 때 성과가 크게 오른다.
작은 규칙의 A/B 효과
Hulu의 실험은 모델을 바꾸지 않고 후보를 어떻게 고르고 줄 세우나만으로도 큰 차이가 난다는 것을 보여 준다.
| 실험 | 결과 |
|---|---|
| 최근 행동 가중 | 최근에 본 쇼에서 나온 추천의 CTR이 오래전 시청 기반 추천의 1.8배 |
| 새로움 | 이미 많이 본 인기 쇼의 가중치를 낮추고 비슷하지만 덜 알려진 쇼를 올린다 |
| 다양성 | 추천마다 근거가 되는 쇼가 서로 다르게 고른다. 10개 넘게 본 활성 사용자에서 CTR이 유의하게 올랐다 |
| 반복 노출 하향 | 여러 번 보여 줬는데 누르지 않은 추천은 순위를 내린다(노출 무반응을 부정 피드백으로). CTR 약 10% 상승 |
| 명시적 피드백 | 별 4~5개를 준 쇼에서 나온 추천의 CTR이 시청·검색 기반보다 높다. 양은 적어도 신호가 강하다 |
온라인 처리 순서는 사용자 프로필 생성(행동 + 오프라인 토픽 모델) → 후보 생성(관련 쇼 표) → 필터링(이미 본 쇼 제거) → 랭킹(다양성·새로움) → 설명 생성이고, 오프라인 피드백 분석기가 「추천했는데 클릭이 적은」 쌍의 순위를 내린다.
추천 자리마다 2단계
| 자리 | 1단계 | 2단계 |
|---|---|---|
| 유사글 | 글 특징 추출: CBF(주제는 맞지만 읽음 수 0인 글도 섞임) + CF(인기 있으면서 비슷한 글) | MAB로 탐색·활용하며 CTR 높은 글 선택 |
| 첫 화면 맞춤 추천 | 타기팅: 회귀 모델(XGBoost 등)로 예측 CTR 상위 K개 + 편향 없는 인기 글 + 통계적으로 추천 가치가 있는 글 | 랭킹: ALS·word2vec 같은 CF. 분산·증분 학습으로 피드백을 수 분 안에 반영한다 |
신규 글은 발행 직후 CBF 특징부터 뽑고, 반응이 쌓이면 CF 특징을 더한다.
알고리즘과 공정성
뉴스·검색어 추천은 여론에 영향을 주므로 기술만의 문제가 아니다.
- 투명성: 외부 전문가 자문, 알고리즘 공개로 추천 원리를 설명한다.
- 다양성: 모두에게 같은 첫 화면을 보여 주던 편집이 관심사별 추천으로 바뀌면 노출되는 기사의 종류가 크게 늘어난다.
- 사용자 조절권: 개인이 고른 주제와의 연관성으로 노출 여부를 정하고, 상업성 키워드 같은 범주의 노출 정도를 사용자가 직접 조절하게 한다.
정리
- 수명이 짧은 콘텐츠는 밴딧으로 탐색과 활용을 오가며 실시간으로 순위를 고친다.
- 실제 밴딧에는 시간 감쇠, 위치 편향, 중복 회피, 초깃값, 피드백 지연 보정이 필요하다.
- CTR만 최적화하면 낚시 제목이 이긴다. 체류·열독 같은 깊이 지표를 함께 본다.
- 피드백 수집은 빠를수록 좋지만 비용과 맞바꾼다.
- 추천 개발의 본체는 버킷 A/B 테스트를 매일 돌리는 실험 문화다. 여론에 닿는 추천에는 투명성과 사용자 조절권을 함께 둔다.
관련 노트: 추천 시스템, 추천 시스템 기초, 딥러닝 추천 시스템, 강화 학습
원본 기록8
- 원문 (새 창) tech.kakao.com/2016/04/27/rubics/
- 원문 (새 창) brunch.co.kr/@kakao-it/57
- 원문 (새 창) brunch.co.kr/@kakao-it/136
- 원문 (새 창) brunch.co.kr/@kakao-it/72
- 원문 (새 창) brunch.co.kr/@kakao-it/333
- 원문 (새 창) navercorp.com/media/pressReleasesDetail?seq=29727
- 원문 (새 창) www.slideshare.net/ssuser2fe594/ss-164511610
- 원문 (새 창) tech.hulu.com/blog/2011/09/19/recommendation-system.html