TIL

👀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


  • 메시지 큐에서 들어온 데이터를 실시간으로 전처리하고, 행동의 중요도를 점수로 변환

      # 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만 쓰다가 끝난 하루.. 코딩보다 문서가 더 힘든 것 같다🥺 주말은 내내 발표자료 만들어야 하는 내 인생😱

댓글남기기