[TIL] 내일배움캠프 122일차_[ML] 암묵적 피드백을 활용한 실시간 추천 시스템 구조 설계
👀Today I Learn
목표
- 사용자가 상품을 클릭하거나 콘텐츠를 시청하면,
- 그 행동을 실시간으로 반영하여
- 사용자에게 개인화된 추천을 제공하는 시스템을 만드는 것
시스템 구성 요소
[사용자 행동]
↓
[데이터 수집 (Front / API)]
↓
[메시지 큐 (Kafka, Redis)]
↓
[스트리밍 처리 / 실시간 피드백 저장 (Spark, Flink 등)]
↓
[Online Learning 기반 추천 모델 업데이트]
↓
[추천 결과 저장 (Vector DB, Cache)]
↓
[API / UI에서 사용자에게 추천 결과 제공]
1️⃣ 사용자 행동 수집
- 사용자가 콘텐츠를 클릭하거나 조회, 구매한 행동 자체가 피드백 데이터
- 프론트엔드에서 JavaScript로 트래킹하거나, 백엔드 API를 통해 행동을 수집할 수 있음
{
"user_id": "u123",
"item_id": "item789",
"action": "click",
"timestamp": "2025-03-28T10:22:00"
}
2️⃣ 메시지 큐: Kafka or Redis Streams
- 수집한 데이터를 바로 처리하지 않고 메시지 큐에 적재하여 비동기적이고 안정적인 처리 가능
- Kafka: 대용량, 분산 처리에 적합
- Redis Streams: 실시간 반응성이 뛰어남
# Kafka 토픽 예시
kafka-topics --create --topic user-actions --bootstrap-server localhost:9092
3️⃣ 실시간 데이터 처리: Spark Streaming, Flink, Faust 등
-
메시지 큐에서 들어온 데이터를 실시간으로 전처리하고, 행동의 중요도를 점수로 변환
# PySpark Streaming 예시 def map_event(event): action_score = {"click": 1.0, "view": 0.5, "purchase": 2.0} return (event["user_id"], event["item_id"], action_score.get(event["action"], 0.1))
-
예: click은 1.0점, view는 0.5점, purchase는 2.0점 등
4️⃣ Online Learning 기반 모델 업데이트
- 전처리된 데이터를 바탕으로 추천 모델을 지속적으로 업데이트
-
가장 많이 쓰이는 방식 중 하나는 implicit 라이브러리의 ALS(Alternating Least Squares)
from implicit.als import AlternatingLeastSquares from scipy.sparse import csr_matrix model = AlternatingLeastSquares(factors=20, iterations=10) model.fit(csr_matrix(interaction_matrix)) # 점수 행렬 # 실시간으로 업데이트: 유저 벡터 갱신 model.user_factors[user_id] = updated_vector
- 최신 implicit 버전에서는 incremental update 방식도 지원됨
5️⃣ 추천 결과 저장: Vector DB / Cache
-
추천 결과는 빠르게 사용자에게 제공되어야 하므로, 캐시 또는 벡터 DB에 저장
- Redis / Memcached: 고속 캐시
- Vector DB (pgvector, Pinecone, FAISS 등): 유사도 기반 검색에 특화됨
-- 예: pgvector에 유저 임베딩 저장
INSERT INTO user_vectors (user_id, embedding)
VALUES ('u123', '[0.123, 0.532, ...]')
6️⃣ 사용자에게 추천 결과 제공 (API / UI)
- 사용자가 앱을 실행하거나 페이지를 새로고침하면, 추천 결과를 API로 받아 화면에 보여줌
# FastAPI 예시
@app.get("/recommend/{user_id}")
def recommend(user_id: str):
items = get_recommendations_from_cache(user_id)
return {"user_id": user_id, "recommended_items": items}
실시간 추천 시스템 설계 시 고려할 점
| 항목 | 고려 요소| | — | — | | ⏱ 지연 시간 | 수집 → 처리 → 추천까지 1~2초 내외 유지 | | 📈 스케일링 | Kafka + Spark 조합으로 분산 처리 가능 | | 🔄 모델 업데이트 | 실시간 또는 짧은 주기로 주기적 업데이트| | 💥 장애 복구 | 메시지 큐 재처리, 로그 백업 구조 필수| | 🧊 Cold Start | 인기 아이템 추천 or 콘텐츠 기반 추천 보완|
- 암묵적 피드백은 사용자 행동에서 선호도를 추정하는 핵심 기법이고, 이를 Online Learning 기반으로 실시간 반영하면 사용자 맞춤형 추천 시스템을 보다 유연하고 정밀하게 구축할 수 있음
- 이러한 구조를 통해 Netflix, YouTube, 쿠팡, 네이버 등 많은 서비스가 즉각적인 반응성과 개인화 추천을 실현하고 있음
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 1문제
- SQL 코드카타 1문제
- README 작성
- SA 문서 수정
- 프로세스 플로우
- 프로젝트 개요 추가
- TIL 작성
회고
오늘은 사실 README만 쓰다가 끝난 하루.. 코딩보다 문서가 더 힘든 것 같다🥺 주말은 내내 발표자료 만들어야 하는 내 인생😱
댓글남기기