음악 추천 시스템을 위한 아이템 기반 협업 필터링
Wanyin App은 음악 공유를 장려하고 음악 애호가들이 더 쉽게 음악을 작곡할 수 있도록 하려는 의도를 가진 AI 기반 음악 공유 커뮤니티입니다.
Wanyin의 라이브러리에는 사용자들이 업로드한 방대한 양의 음악이 포함되어 있습니다. 주요 과제는 사용자들의 이전 행동을 기반으로 관심 있는 음악을 선별하는 것입니다. 우리는 잠재적인 추천 시스템 모델로 두 가지 고전적인 모델인 사용자 기반 협업 필터링(User-based CF)과 아이템 기반 협업 필터링(Item-based CF)을 평가했습니다.
- 사용자 기반 CF는 유사도 통계를 사용해 비슷한 선호도나 관심사를 가진 이웃 사용자를 얻습니다. 검색된 최근접 이웃 집합을 통해 시스템은 대상 사용자의 관심을 예측하고 추천을 생성할 수 있습니다.
- Amazon이 도입한 아이템 기반 CF, 또는 아이템-투-아이템(I2I) CF는 추천 시스템을 위한 잘 알려진 협업 필터링 모델입니다. 이는 높은 점수를 받은 아이템과 관심 아이템이 유사해야 한다는 가정에 기반하여, 사용자 대신 아이템 간의 유사도를 계산합니다.
사용자 기반 CF는 사용자 수가 특정 지점을 넘어서면 계산 시간이 지나치게 길어질 수 있습니다. 우리 제품의 특성을 고려하여, 우리는 음악 추천 시스템을 구현하기 위해 I2I CF를 사용하기로 결정했습니다. 곡에 대한 메타데이터를 많이 보유하고 있지 않기 때문에, 우리는 곡 자체를 다루며 그로부터 특징 벡터(임베딩)를 추출해야 합니다. 우리의 접근 방식은 이러한 곡들을 멜 주파수 켑스트럼(MFC)으로 변환하고, 곡의 특징 임베딩을 추출하기 위해 합성곱 신경망(CNN)을 설계한 다음, 임베딩 유사도 검색을 통해 음악 추천을 수행하는 것입니다.
🔎 임베딩 유사도 검색 엔진 선택
이제 특징 벡터가 있으므로, 남은 문제는 대량의 벡터에서 대상 벡터와 유사한 벡터를 어떻게 검색할 것인가입니다. 임베딩 검색 엔진과 관련해 우리는 Faiss와 Milvus 사이에서 검토하고 있었습니다. 저는 2019년 11월 GitHub의 인기 저장소를 살펴보던 중 Milvus를 알게 되었습니다. 프로젝트를 살펴보니 추상화된 API가 매력적으로 느껴졌습니다. (당시에는 v0.5.x였고 현재는 v0.10.2입니다.)
우리는 Faiss보다 Milvus를 선호합니다. 한편으로는 이전에 Faiss를 사용해 본 적이 있어 새로운 것을 시도해 보고 싶었습니다. 다른 한편으로는 Milvus와 비교했을 때 Faiss는 더 저수준 라이브러리에 가까워 사용하기가 그다지 편리하지 않습니다. Milvus에 대해 더 많이 알게 되면서, 우리는 결국 두 가지 주요 기능 때문에 Milvus를 채택하기로 결정했습니다.
- Milvus는 사용하기 매우 쉽습니다. Docker 이미지를 가져오고 자신의 시나리오에 따라 매개변수를 업데이트하기만 하면 됩니다.
- 더 많은 인덱스를 지원하며 상세한 지원 문서를 갖추고 있습니다.
요약하자면, Milvus는 사용자에게 매우 친화적이며 문서가 상당히 상세합니다. 문제가 발생하면 보통 문서에서 해결책을 찾을 수 있으며, 그렇지 않은 경우에도 언제든지 Milvus 커뮤니티에서 지원을 받을 수 있습니다.
Milvus 클러스터 서비스 ☸️ ⏩
Milvus를 특징 벡터 검색 엔진으로 사용하기로 결정한 후, 우리는 개발(DEV) 환경에 독립형 노드를 구성했습니다. 며칠 동안 잘 실행되었기 때문에, 우리는 공장 인수 테스트(FAT) 환경에서 테스트를 실행할 계획을 세웠습니다. 독립형 노드가 프로덕션에서 중단되면 전체 서비스가 사용할 수 없게 됩니다. 따라서 우리는 고가용성 검색 서비스를 배포해야 합니다.
Milvus는 클러스터 샤딩 미들웨어인 Mishards와 구성용 Milvus-Helm을 모두 제공합니다. Milvus 클러스터 서비스를 배포하는 과정은 간단합니다. 몇 가지 매개변수만 업데이트하고 Kubernetes에 배포할 수 있도록 패키징하면 됩니다. 아래 Milvus 문서의 다이어그램은 Mishards가 어떻게 작동하는지 보여줍니다.
Mishards의 작동 메커니즘 다이어그램.
Mishards는 업스트림 요청을 분할하여 하위 모듈로 내려보내는 방식으로 업스트림의 요청을 전달한 다음, 하위 서비스의 결과를 수집하여 업스트림으로 반환합니다. Mishards 기반 클러스터 솔루션의 전체 아키텍처는 아래와 같습니다:
Mishards의 전체 아키텍처.
공식 문서는 Mishards에 대한 명확한 소개를 제공합니다. 관심이 있다면 Mishards를 참고할 수 있습니다.
우리의 음악 추천 시스템에서는 Milvus-Helm을 사용하여 Kubernetes에 쓰기 가능한 노드 1개, 읽기 전용 노드 2개, Mishards 미들웨어 인스턴스 1개를 배포했습니다. 서비스가 FAT 환경에서 한동안 안정적으로 실행된 후, 프로덕션에 배포했습니다. 지금까지 안정적으로 운영되고 있습니다.
🎧 I2I 음악 추천 🎶
위에서 언급했듯이, 우리는 기존 곡에서 추출한 임베딩을 사용하여 Wanyin의 I2I 음악 추천 시스템을 구축했습니다. 먼저, 사용자가 업로드한 새 곡의 보컬과 BGM을 분리(트랙 분리)하고, 곡의 특징 표현으로 BGM 임베딩을 추출했습니다. 이는 원곡의 커버 버전을 분류하는 데에도 도움이 됩니다. 다음으로, 이러한 임베딩을 Milvus에 저장하고, 사용자가 들은 곡을 기반으로 유사한 곡을 검색한 다음, 검색된 곡을 정렬하고 재배열하여 음악 추천을 생성했습니다. 구현 과정은 아래와 같습니다:
Wanyin의 I2I 음악 추천 시스템 구현.
🚫 중복 곡 필터
Milvus를 사용하는 또 다른 시나리오는 중복 곡 필터링입니다. 일부 사용자는 같은 곡이나 클립을 여러 번 업로드하며, 이러한 중복 곡이 추천 목록에 나타날 수 있습니다. 이는 사전 처리 없이 추천을 생성하면 사용자 경험에 영향을 미친다는 의미입니다. 따라서 사전 처리를 통해 중복 곡을 찾아내고 같은 목록에 나타나지 않도록 해야 합니다.
Milvus를 사용하는 또 다른 시나리오는 중복 곡 필터링입니다. 일부 사용자는 같은 곡이나 클립을 여러 번 업로드하며, 이러한 중복 곡이 추천 목록에 나타날 수 있습니다. 이는 사전 처리 없이 추천을 생성하면 사용자 경험에 영향을 미친다는 의미입니다. 따라서 사전 처리를 통해 중복 곡을 찾아내고 같은 목록에 나타나지 않도록 해야 합니다.
이전 시나리오와 마찬가지로, 우리는 유사한 특징 벡터를 검색하는 방식으로 중복 곡 필터링을 구현했습니다. 먼저, 보컬과 BGM을 분리하고 Milvus를 사용하여 여러 유사한 곡을 검색했습니다. 중복 곡을 정확하게 필터링하기 위해, 대상 곡과 유사 곡들의 오디오 핑거프린트(Echoprint, Chromaprint 등의 기술 사용)를 추출하고, 대상 곡의 오디오 핑거프린트와 각 유사 곡의 핑거프린트 간 유사도를 계산했습니다. 유사도가 임계값을 넘으면, 해당 곡을 대상 곡의 중복으로 정의합니다. 오디오 핑거프린트 매칭 과정은 중복 곡 필터링을 더 정확하게 만들지만, 시간도 많이 소요됩니다. 따라서 대규모 음악 라이브러리에서 곡을 필터링할 때는 Milvus를 사용하여 후보 중복 곡을 예비 단계로 필터링합니다.
Milvus를 사용하여 중복 곡 필터링 구현.
Wanyin의 방대한 음악 라이브러리를 위한 I2I 추천 시스템을 구현하기 위해, 우리의 접근 방식은 노래의 임베딩을 특징으로 추출하고, 대상 노래의 임베딩과 유사한 임베딩을 리콜한 다음, 결과를 정렬하고 재배열하여 사용자를 위한 추천 목록을 생성하는 것입니다. 실시간 추천을 달성하기 위해, 우리는 feature vector similarity search engine으로 Faiss보다 Milvus를 선택했는데, Milvus가 더 사용자 친화적이고 정교하다는 것이 입증되었기 때문입니다. 마찬가지로, 우리는 duplicate song filter에도 Milvus를 적용했으며, 이는 사용자 경험과 효율성을 향상시킵니다.
Wanyin App 🎶을 다운로드하여 사용해 볼 수 있습니다. (참고: 모든 앱 스토어에서 이용 가능하지 않을 수 있습니다.)
📝 작성자:
Jason, Stepbeats의 Algorithm Engineer Shiyu Chen, Zilliz의 Data Engineer
📚 참고 자료:
Mishards Docs: https://milvus.io/docs/v0.10.2/mishards.md Mishards: https://github.com/milvus-io/milvus/tree/master/shards Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
계속 읽기

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.



