오늘 공부한 내용은 추천을 위한 시스템 디자인!
추천 결과를
일정 주기
(하루에 한번, 한 시간에 한번 등)에 따라 업데이트 하는 것
key-value로 된 추천 결과가 이미 저장되어 있기 때문에 serving 단계에선 단순히 look up만 하면 된다.
연산 과정에 문제가 생겨 결과가 오지 않아도 이전에 캐싱된 결과물을 serving에 쓰면 돼서 안정적이다.
연산 비용이 적고 효율적이다. 하지만 모든 유저에 대한 추천을 만들어야하는 단점이 있다.
추천 결과가 자주 변하지 않는 식료품, 직업 추천 같은게 적합하다.
stream 형태로 들어오는 데이터를 실시간으로 분석해서 추천 결과를 제시하는 것
유저의 요청이 올 때 마다 추천을 한다.
실시간 추천이기 때문에 latency가 낮아야하고 대규모 트래픽을 감당할 수 있어야 한다.
시간에 민감한 context(날씨, 시간)
을 사용할 수 있다.
모든 유저가 아니라 방문하는 유저만 추천 결과를 만들면 된다.
쇼핑, 음악, 영상 등 빠르게 변하는 환경에서 사용한다.
매번 수백만개의 아이템을 정렬하는 것은 비효율적이다. 그래서 후보군을 추리는 단계와 ranking을 진행하는 2 stage로 나눈다.
수백만개의 아이템을 수백개로 줄이는 과정
정확도보다 속도를 우선해서 빠르게 후보군을 추려낸다.
대표적으로 ANN 방법을 사용한다.
4stage로 본다면 Candidate Generation는 Retrieval과 Filtering, Ranking은 Scoring과 Ordering으로 나눌 수 있다.
이미지 출처 : Eugene Yan
오프라인 환경의 특징
모델 학습, 표현 학습, 랭킹 등의 배치 프로세스 수행
카탈로그 아이템에 대한 임베딩 생성
ANN(Approximate Nearest Neighbors) 인덱스나 지식 그래프 구축
피처 스토어에 아이템과 사용자 데이터 로드
온라인 환경의 특징
오프라인에서 생성된 모델, 인덱스, 그래프 등을 활용
입력 아이템이나 검색 쿼리를 임베딩으로 변환
후보 검색과 랭킹을 순차적으로 수행
쿼리 표준화, 토큰화, 맞춤법 검사 등의 전처리 수행
Candidate Retrieval
수백만 개의 아이템을 수백 개로 빠르게 축소하는 과정
정확도보다 효율성 중시
주로 임베딩과 ANN을 활용하며, 그래프나 의사결정 트리도 사용
Ranking
후보군에 대해 정밀한 점수 계산과 순위 결정
아이템, 사용자 데이터, 문맥 정보 등 다양한 특성 활용
학습-순위화(learning-to-rank) 또는 분류 작업으로 모델링