Annoy 소개 — Spotify 의 근사 최근접 이웃 라이브러리

Annoy 소개 — Spotify 의 근사 최근접 이웃 라이브러리

Annoy 는 Spotify 의 음악 추천을 위해 만들어진 근사 최근접 이웃(ANN) 검색 라이브러리예요. C++ 로 구현되고 파이썬 바인딩을 제공하며, 고차원 벡터 공간에서 쿼리와 가장 가까운 점을 빠르게 찾아요.

핵심 아이디어

  • 영역 트리·랜덤 프로젝션: 각 노드에서 랜덤 초평면으로 공간을 둘로 나눠 트리를 만들고, 여러 트리를 포레스트로 쌓아요.
  • 근사 검색: 정확한 브루트포스 대신 트리 탐색으로 속도를 얻고 정확도를 근사해요.
  • 파일 기반 인덱스: 인덱스를 파일로 저장하고 메모리 매핑(mmap) 해서 여러 프로세스가 공유할 수 있어요.

왜 유용할까

  • 인덱스 분리와 로딩 분리: 한 번만 인덱스를 만들어 파일로 배포하고, 각 프로세스는 빠르게 mmap 으로 로드해요.
  • 작은 메모리: 인덱스가 작아 메모리 부담이 적어요.
  • 여러 거리: 유클리드, 코사인, 맨해튼, 해밍, 내적(dot) 거리를 지원해요.

Spotify 사용 사례

행렬 분해로 만든 사용자/아이템 벡터에서 유사 사용자·아이템을 찾는 데 사용돼요. 수백만 트랙을 고차원 공간에서 다루어야 해서 메모리가 핵심 고려사항이었어요.

더 알아보기 (Learn more)

출처: Annoy GitHub