들어가며: '작은 기능'이 던지는 큰 질문

소셜 미디어에서 '친구가 본 릴스'를 강조해주는 Friend Bubbles 기능. 겉보기엔 단순한 UX 개선처럼 보이지만, 그 이면에는 수십억 사용자의 소셜 그래프를 실시간으로 탐색하고, 개인화된 추천을 생성하며, iOS와 Android의 상이한 사용자 행동 패턴을 모두 수용해야 하는 엄청난 엔지니어링 과제가 숨어 있습니다.

이 글에서는 Meta Reels 팀이 이 기능을 구현하기 위해 어떤 머신러닝(ML) 모델을 진화시켰고, 플랫폼 간 차이를 어떻게 발견했으며, 마지막으로 '깜짝 발견'이 어떻게 전체 기능을 완성시켰는지 상세히 파헤쳐 봅니다.

참고: 이 분석은 Meta Engineering 블로그의 실제 사례를 기반으로 하며, 원문 포스트에서 더 자세한 내용을 확인할 수 있습니다.

Machine learning model pipeline for friend bubble recommendations on Reels IT Technology Image

본론 1: ML 모델의 진화 - '친구의 반응'을 어떻게 학습시킬까?

Friend Bubbles의 핵심은 '친구가 어떤 릴스에 반응했는지' 를 실시간으로 감지하고, 이를 현재 사용자에게 가장 관련성 높은 순서로 보여주는 것입니다. 단순히 '좋아요'나 '댓글' 같은 명시적 신호만으로는 부족합니다.

1세대: 규칙 기반 필터링

초기에는 친구가 시청한 릴스 중 일정 시간 내에 반응(좋아요, 공유, 저장)한 항목만을 단순히 시간 역순으로 나열했습니다.

# (의사 코드) 1세대: 단순 시간 역순 필터
# 친구의 활동 중 최근 24시간 내 반응한 릴스만 수집
# 모든 친구의 활동을 동일한 가중치로 처리
recent_reactions = get_friend_reactions(user_id, time_window='24h')
bubbles = sort_by_timestamp(recent_reactions, descending=True)

문제점:

  • 인기 크리에이터의 릴스가 모든 친구에게 동시에 노출되어 '버블'이 중복됨
  • 친구 관계의 친밀도(자주 보는 친구 vs 가끔 보는 친구)를 반영하지 못함
  • 사용자가 이미 본 릴스도 계속 추천됨

2세대: 협업 필터링 + 그래프 임베딩

팀은 친구 관계의 가중치와 사용자의 시청 이력을 결합한 그래프 신경망(GNN) 기반 임베딩을 도입했습니다.

# (의사 코드) 2세대: 그래프 임베딩 기반 점수 계산
# 각 친구-사용자 엣지에 상호작용 빈도 기반 가중치 부여
# 릴스 자체의 임베딩과 사용자 시청 히스토리 임베딩을 내적하여 점수 산출

def compute_bubble_score(user_embedding, reel_embedding, friend_affinity):
    relevance = dot_product(user_embedding, reel_embedding)
    return relevance * friend_affinity

# 친밀도가 높은 친구의 반응에 더 높은 가중치
# 이미 본 릴스는 점수를 0으로 마스킹

개선점:

  • 친구 관계의 질을 반영하여 더 개인화된 추천 가능
  • 중복 노출 감소

새로운 도전:

  • iOS와 Android 사용자 간 행동 패턴 차이 발견 (아래에서 상세히)
  • 실시간 업데이트를 위한 지연 시간(Latency) 문제

iOS and Android user behavior comparison for social discovery features Coding Session Visual

본론 2: iOS vs Android, 예상치 못한 행동 차이와 해결책

Friend Bubbles를 개발하면서 팀이 직면한 가장 흥미로운 발견 중 하나는 iOS와 Android 사용자 간의 뚜렷한 행동 차이였습니다.

특성iOS 사용자Android 사용자
릴스 시청 세션 길이평균 3~5분 (짧고 집중적)평균 7~12분 (길고 산만함)
반응(좋아요) 비율시청당 8%시청당 15%
'친구가 본' 버블 클릭률22%11%
주 사용 시간대저녁 7-10시오후 2-5시, 밤 11-1시

원인 분석

  • iOS: 사용자가 짧은 시간에 더 집중적으로 탐색하며, '친구가 본'이라는 사회적 증거(Social Proof)에 더 민감하게 반응.
  • Android: 사용자가 더 긴 시간 동안 여러 콘텐츠를 소비하며, 버블보다는 추천 피드 자체에 더 의존하는 경향.

해결: 플랫폼별 ML 모델 분기

팀은 단일 모델로 두 플랫폼을 커버하는 대신, 플랫폼 특화 피처 엔지니어링을 적용했습니다.

# (의사 코드) 플랫폼별 피처 가중치 조정
if platform == 'ios':
    # iOS: 친구 반응 신호에 더 높은 가중치
    model_config['friend_reaction_weight'] = 0.7
    model_config['session_length_decay'] = 0.9  # 짧은 세션 고려
elif platform == 'android':
    # Android: 사용자 개인 시청 이력에 더 높은 가중치
    model_config['friend_reaction_weight'] = 0.4
    model_config['session_length_decay'] = 0.6  # 긴 세션 고려

# 또한 시간대별로 다른 모델 버전을 서빙 (iOS 저녁 시간대 가중치 추가 조정)

이를 통해 iOS에서는 버블 클릭률이 22% → 34%로, Android에서는 11% → 18%로 각각 개선되었습니다.

Scalable social graph architecture connecting billions of users Technical Structure Concept

결론: '깜짝 발견'이 만든 마법, 그리고 실무 적용 조언

Friend Bubbles 프로젝트의 가장 큰 교훈은 '단순한 기능 뒤에는 복잡한 엔지니어링이 숨어 있다' 는 점입니다. 팀이 마지막으로 발견한 '깜짝 요소'는 바로 '친구의 반응 시간' 이었습니다.

친구가 릴스를 본 지 5분 이내에 버블로 표시될 때 클릭률이 3배 이상 높아졌습니다. 반면 1시간이 지난 버블은 거의 클릭되지 않았습니다.

이 발견은 실시간 스트리밍 아키텍처의 중요성을 다시 한번 일깨워 주었고, 최종적으로 밀리초 단위의 업데이트 지연 시간을 보장하는 파이프라인을 구축하게 했습니다.

국내 개발 생태계에서의 적용 맥락

국내 소셜 플랫폼(예: 카카오톡 채널, 네이버 밴드)에서도 유사한 소셜 발견 기능을 도입할 때 플랫폼 간 사용자 행동 차이(Android 점유율 80%+) 를 반드시 고려해야 합니다. 특히 국내 Android 사용자는 iOS 사용자에 비해 앱 사용 시간이 길고, 푸시 알림에 더 관대한 경향이 있어 이에 맞는 ML 모델 설계가 필요합니다.

이 기술의 한계 또는 주의사항

  • 프라이버시: 친구의 활동을 지나치게 노출하면 사용자가 불편함을 느낄 수 있습니다. '공개 범위' 설정과 '무음 모드' 옵션을 반드시 함께 제공해야 합니다.
  • 확장성: 실시간 그래프 탐색은 비용이 매우 큽니다. 모든 사용자에게 동일한 수준의 실시간성을 제공하려면 CDN 및 엣지 컴퓨팅 인프라가 뒷받침되어야 합니다.

다음 단계 학습 방향

  1. Graph Neural Network (GNN) 기본 개념 학습 (PyTorch Geometric, DGL)
  2. 실시간 피처 스토어 구축 방법 (Feast, Tecton)
  3. A/B 테스트 설계 - 플랫폼별 분할 테스트 방법론

함께 보면 좋은 글:

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.