핀터레스트의 Interest Platform 구축하기

Angie
7 min readOct 25, 2020

--

이번에 소개할 내용은 핀터레스트 엔지니어링 블로그에 2014년 올라온 Building the Interest Platform 입니다. 역시 꽤나 오래 전 글이지만, 2010년대 시작된 핀터레스트가 초기버전에서 어떻게 발전해 왔는지 살펴보는 데 있어서는 좋은 자료가 되어준다고 생각합니다. 게다가 고도화된 ML이 적용된 최근의 글과 비교해 쉽고 명료하게 서술되어 있기도 하구요. 그럼 오늘도 시작해 보겠습니다.

Pin + Interest

Interest — 간단하게 취향으로 대변될 수 있는 이 개념은 사실 핀터레스트 서비스를 움직이는 핵심이라고 할 수 있습니다. 핀터레스트를 구성하는 주요 개념인 핀(각각의 이미지 게시물), 보드(핀을 모으는 주제별 폴더), 피너(큐레이터-즉 유저) 들은 모두 Interest 를 중심으로 연결되어 있고, 유저들은 자신의 Interest 에 대한 시각적 발견을 위해 핀터레스트에 방문하며 연관 있는 Interest 의 게시물에 반응하고 engagement 를 일으킵니다. 따라서 Interest 를 잘 정제하여 유저들이 자신이 원하는 Interest 와 연관된 게시물을 쉽게 찾을 수 있도록 서빙하고, 새로운 Interest 로 확장할 수 있도록 하는 것은 핀터레스트의 서비스 생태계 차원에서 아주 중요한 비전이라고 말할 수 있겠습니다. 그리고 이 비전을 서포트하기 위해 만들어진 것이 바로 Interest Platform 입니다.

Interest Platform은 다음과 같은 정보를 만들어내는 것을 미션으로 합니다.

  1. Interest 자체
  2. Interest 간의 관계
  3. Interest 와 핀, 보드, 피너와의 관계

플랫폼 계층

다음은 Interest Platform의 시스템 컴포넌트입니다.

크게 4개의 레이어로 구분되어 있습니다. 각각에서 하는 역할을 조금 부연하자면 다음과 같습니다.

  1. 수집 단계 : 핀/보드/피너의 인터랙션으로 인한 기반 데이터와, 검색과 같은 직접적인 유저 인풋이 수집됩니다.
  2. Interest Dictionary : 수집된 정보는 그대로 Processing Pipeline 의 인풋으로도 사용될 수 있고, Interest Dictionary 를 통해 Interest 로 가공된 뒤 분석된 Interest 로서 Pipeline 으로 흘러가기도 합니다.
  3. Processing Pipeline : 앞 단계에서 받은 Input 으로 실제 서비스에서 사용할 정보를 만들어냅니다. Interest 의 validity, Interest 간의 관계, Interest와 핀/보드/피너와의 관계, 특정 유저의 Interest 등 만들어질 수 있는 정보의 범위는 다양합니다.
  4. Interest 서비스 : 프로세싱된 정보가 실제 서비스에 서빙됩니다. 대표적인 서비스로 명시된 것이 Interest Feed, 추천 Interest, 연관 Interest 등입니다.

단계별 구현 프로세스

위의 과정에서 각 레이어가 매끄럽게 돌아가기 위해서는, 시스템 차원에서 다음의 준비가 필요합니다.

  1. Interest Dictionary 확보하기
  2. 피너의 Interest 파악하기
  3. 연관 Interest 계산하기
  4. Interest 서비스 만들기

단계별로 구체적인 내용을 살펴보겠습니다.

Interest Dictionary 확보하기

  • 개발적 관점에서, Interest는 복수의 유저들의 관심대상이 될 수 있는 엔티티의 Text String Representation 입니다.
  • 이를 추출하기 위해, 최초의 버전에서는 핀/보드의 타이틀/디스크립션에서 자주 등장하는 단어를 n-gram 으로 추출하고 내부적인 grammar 로직을 적용했습니다.
  • 이것만으로는 퀄리티가 충분치 않았으므로, 유저들에 의해 반복적으로 검색되는 검색어와 비교하여 필터링을 거쳤습니다. (검색어가 Interest 를 포함할 수 있다고 쉽게 유추할 수 있습니다.)
  • 위키피디아 등 퍼블릭한 도메인 용어들과 비교하여 필터링했습니다. (Interest 가 대부분 subset 으로도 동작할 수 있는 단어들의 집합이었으므로 효과가 있었습니다.)
  • 마지막으로 내부적인 블랙리스트를 적용해, 적절하지 않은 대상이 Interest 로서 서비스되지 않을 수 있도록 했습니다.
  • 이 과정은 initialization을 위해 필요한 것이었고 scale 하기에는 적절치 않았으므로, implicit data (조회, 클릭…) 와 explicit data (유저에게 평가 요청…) 를 통해서도 Interest 를 추출할 수 있는 Dictionary 서비스를 만들었습니다.

피너의 Interest 파악하기

  • 피너, 즉 유저가 인터랙션을 발생시킨 핀을 Interest 추출의 핵심 대상으로 사용합니다.
  • 핀은 핀터레스트 서비스 구조상 동일한 콘텐츠라도 다른 디스크립션과 함께 여러 번 다른 사람에 의해 등록될 수 있으므로, 많은 컨텍스트가 리치하게 누적됩니다.
  • 따라서 이 좋은 데이터를 잘 분석하면 되는 일견 간단해 보이는(…) 일이지만, 실제 엔지니어링적으로는 상당히 도전적인 일이라고 합니다.
  • 또한 유저들이 자신의 Interest 를 핀터레스트에 구체적으로 알려줄 수 있도록 하는 많은 장치가 계속해서 고안되어야 할 필요가 있습니다. (ex. 카테고리 이름을 유저가 커스텀할 수 있도록 하는 기능 등)

연관 Interest 계산하기

  • 연관 Interest 는 브라우징 및 디스커버리 상황의 확장가능성 차원에서 매우 중요한 개념입니다.
  • 이를 계산하기 위해선 단순한 방법을 씁니다. 바로 한 보드에 포함된 핀들이 가지는 Interest 의 co-occurence 를 계산하는 것입니다.
  • 이 방법은 알고리즘적 단순성에 비해 퀄리티가 매우 좋았습니다. 아마 이미지-텍스트를 주요 데이터 형식으로 쓰는 핀터레스트의 특성상 일반 웹페이지들보다 훨씬 정제된 정보가 들어오기 때문일 것으로 생각됩니다.
  • 이렇게 만들어진 연관 Interest 를 “연관 핀” 의 형태로 서비스에 적용했더니 유저들의 engagement 가 크게 증가했습니다.

Interest 서비스 만들기

  • 피드를 예로 들어 보면 우선 검색, 어노테이터, 혹은 다른 소스들로부터 인풋을 받습니다. 이때 매끄러운 흐름을 위해 검색, 어노테이션 등은 리얼타임으로 동작합니다.
  • 이 여러 소스의 데이터들은 합쳐져서 Interest Feed Storage 에 적재됩니다.
  • 실제 유저 사용 시나리오에서는, 유저별 Interest 메타데이터를 참조하여 유저별 Interest 에 맞춘 피드가 서빙됩니다. (이것의 발전된 형태가 이전 글에 소개된 Smart Home Feed 라고 예상해볼 수 있겠습니다.)
  • 각 소스별 퀄리티 체크를 위해, 소스별 engagemet를 측정하고 퀄리티 이슈를 파악합니다.

정리

핀터레스트가 서비스의 본질적인 부분으로 여기고 있는 Interest 는, 여러 글에서 소개되지만 지금껏 모호한 개념으로 느껴졌던 게 사실인데요. 이 개념이 실제 어떤 구체적인 형태로 만들어지고 서비스상에서 대상들과 인터랙션하는지 상세한 구조를 리뷰하면서 상세하게 파악할 수 있었습니다. 서비스를 운영하다 보면 유저들의 탐색의 대상이 되는 다양한 데이터들이 수없이 많이 생겨나게 마련인데, 개중에는 관리되지 않는 데이터가 정말 많아 브라우징과 발견에 악영향을 주는 일이 다반사입니다. 그런 점에서 정제된 핵심 데이터를 향한 집념을 가지고, 그 핵심 개념을 중심으로 주요 스테이크홀더들 간의 유의미한 인터랙션 그래프를 구축한 핀터레스트는 정말 본받고 싶은 좋은 사례라고 생각됩니다.

--

--