Коллаборативная фильтрация на основе элементов для музыкальной рекомендательной системы
Wanyin App — это сообщество для обмена музыкой на основе ИИ, цель которого — поощрять обмен музыкой и сделать сочинение музыки проще для музыкальных энтузиастов.
Библиотека Wanyin содержит огромное количество музыки, загруженной пользователями. Основная задача — отбирать интересующую музыку на основе предыдущего поведения пользователей. Мы оценили две классические модели: коллаборативную фильтрацию на основе пользователей (User-based CF) и коллаборативную фильтрацию на основе объектов (Item-based CF) — как потенциальные модели рекомендательной системы.
- User-based CF использует статистику сходства, чтобы находить соседних пользователей с похожими предпочтениями или интересами. С помощью полученного набора ближайших соседей система может предсказать интерес целевого пользователя и сформировать рекомендации.
- Представленная Amazon, item-based CF, или item-to-item (I2I) CF, является хорошо известной моделью коллаборативной фильтрации для рекомендательных систем. Она вычисляет сходство между объектами, а не пользователями, исходя из предположения, что интересующие объекты должны быть похожи на объекты с высокими оценками.
User-based CF может приводить к чрезмерно длительному времени вычислений, когда число пользователей превышает определенный порог. Учитывая характеристики нашего продукта, мы решили выбрать I2I CF для реализации музыкальной рекомендательной системы. Поскольку у нас не так много метаданных о песнях, нам приходится работать с самими песнями, извлекая из них векторы признаков (эмбеддинги). Наш подход заключается в том, чтобы преобразовать эти песни в мел-частотный кепстр (MFC), спроектировать сверточную нейронную сеть (CNN) для извлечения эмбеддингов признаков песен, а затем давать музыкальные рекомендации с помощью поиска по сходству эмбеддингов.
🔎 Выбор поискового движка для поиска по сходству эмбеддингов
Теперь, когда у нас есть векторы признаков, остается вопрос: как извлечь из большого объема векторов те, которые похожи на целевой вектор. Когда речь зашла о поисковом движке для эмбеддингов, мы выбирали между Faiss и Milvus. Я заметил Milvus, когда просматривал трендовые репозитории GitHub в ноябре 2019 года. Я взглянул на проект, и он привлек меня своими абстрактными API. (Тогда это была версия v0.5.x, а сейчас — v0.10.2.)
Мы предпочитаем Milvus вместо Faiss. С одной стороны, мы уже использовали Faiss раньше и поэтому хотели попробовать что-то новое. С другой стороны, по сравнению с Milvus, Faiss скорее является низкоуровневой библиотекой, поэтому не слишком удобен в использовании. По мере того как мы больше узнавали о Milvus, мы в итоге решили принять Milvus благодаря двум его основным особенностям:
- Milvus очень прост в использовании. Все, что нужно сделать, — загрузить его Docker image и обновить параметры в соответствии с вашим собственным сценарием.
- Он поддерживает больше индексов и имеет подробную сопроводительную документацию.
Вкратце, Milvus очень дружелюбен к пользователям, а документация достаточно подробна. Если вы столкнетесь с какой-либо проблемой, обычно можно найти решения в документации; в противном случае вы всегда можете получить поддержку от сообщества Milvus.
Кластерный сервис Milvus ☸️ ⏩
После решения использовать Milvus в качестве поискового движка для векторов признаков мы настроили standalone node в среде разработки (DEV). Он успешно работал несколько дней, поэтому мы запланировали провести тесты в среде factory acceptance test (FAT). Если standalone node выйдет из строя в production, весь сервис станет недоступен. Таким образом, нам необходимо развернуть высокодоступный поисковый сервис.
Milvus предоставляет как Mishards, middleware для шардирования кластера, так и Milvus-Helm для конфигурации. Процесс развертывания кластерного сервиса Milvus прост. Нам нужно лишь обновить некоторые параметры и упаковать их для развертывания в Kubernetes. Диаграмма ниже из документации Milvus показывает, как работает Mishards:
Диаграмма механизма работы Mishards.
Mishards каскадно передает запрос от вышестоящего уровня вниз к своим подмодулям, разделяя вышестоящий запрос, а затем собирает и возвращает результаты подслужб на вышестоящий уровень. Общая архитектура кластерного решения на базе Mishards показана ниже:
Общая архитектура Mishards.
Официальная документация предоставляет понятное введение в Mishards. Вы можете обратиться к Mishards, если вам интересно.
В нашей музыкальной рекомендательной системе мы развернули один узел с возможностью записи, два узла только для чтения и один экземпляр промежуточного ПО Mishards в Kubernetes с использованием Milvus-Helm. После того как сервис некоторое время стабильно работал в FAT-среде, мы развернули его в production. До сих пор он работает стабильно.
🎧 I2I-рекомендации музыки 🎶
Как упоминалось выше, мы создали I2I-рекомендательную систему музыки Wanyin, используя извлеченные эмбеддинги существующих песен. Сначала мы разделили вокал и BGM (разделение дорожек) новой песни, загруженной пользователем, и извлекли эмбеддинги BGM в качестве представления признаков песни. Это также помогает выявлять кавер-версии оригинальных песен. Затем мы сохранили эти эмбеддинги в Milvus, выполнили поиск похожих песен на основе песен, которые слушал пользователь, а затем отсортировали и переставили найденные песни, чтобы сформировать музыкальные рекомендации. Процесс реализации показан ниже:
Реализация I2I-рекомендательной системы музыки Wanyin.
🚫 Фильтр дубликатов песен
Еще один сценарий, в котором мы используем Milvus, — фильтрация дубликатов песен. Некоторые пользователи загружают одну и ту же песню или клип несколько раз, и эти дубликаты песен могут появляться в их списке рекомендаций. Это означает, что формирование рекомендаций без предварительной обработки ухудшило бы пользовательский опыт. Поэтому нам нужно находить дубликаты песен и гарантировать, что они не появятся в одном и том же списке благодаря предварительной обработке.
Еще один сценарий, в котором мы используем Milvus, — фильтрация дубликатов песен. Некоторые пользователи загружают одну и ту же песню или клип несколько раз, и эти дубликаты песен могут появляться в их списке рекомендаций. Это означает, что формирование рекомендаций без предварительной обработки ухудшило бы пользовательский опыт. Поэтому нам нужно находить дубликаты песен и гарантировать, что они не появятся в одном и том же списке благодаря предварительной обработке.
Как и в предыдущем сценарии, мы реализовали фильтрацию дубликатов песен посредством поиска похожих векторов признаков. Сначала мы разделили вокал и BGM и извлекли ряд похожих песен с помощью Milvus. Чтобы точно фильтровать дубликаты песен, мы извлекли аудиоотпечатки целевой песни и похожих песен (с помощью таких технологий, как Echoprint, Chromaprint и т. д.), вычислили сходство между аудиоотпечатком целевой песни и отпечатком каждой из похожих песен. Если сходство превышает порог, мы определяем песню как дубликат целевой песни. Процесс сопоставления аудиоотпечатков делает фильтрацию дубликатов песен более точной, но он также занимает много времени. Поэтому, когда речь идет о фильтрации песен в огромной музыкальной библиотеке, мы используем Milvus для предварительной фильтрации наших кандидатов в дубликаты песен.
Использование Milvus для фильтрации дубликатов песен.
Чтобы реализовать рекомендательную систему I2I для огромной музыкальной библиотеки Wanyin, наш подход заключается в извлечении эмбеддингов песен в качестве их признаков, поиске похожих эмбеддингов по эмбеддингу целевой песни, а затем сортировке и переупорядочивании результатов для формирования списков рекомендаций для пользователя. Чтобы обеспечить рекомендации в реальном времени, мы выбираем Milvus вместо Faiss в качестве движка поиска сходства векторных признаков, поскольку Milvus оказывается более удобным для пользователей и более продвинутым. По той же причине мы также применили Milvus в нашем фильтре дубликатов песен, что улучшает пользовательский опыт и эффективность.
Вы можете скачать Wanyin App 🎶 и попробовать его. (Примечание: может быть доступно не во всех магазинах приложений.)
📝 Авторы:
Jason, инженер по алгоритмам в Stepbeats Shiyu Chen, инженер данных в Zilliz
📚 Ссылки:
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
🤗 Не стесняйтесь, подписывайтесь на нас в Twitter или присоединяйтесь к нам в Slack!👇🏻
Читать далее

Why We Built Vector Lakebase: Rethinking Unstructured Data Architecture for AI
Vector Lakebase: a unified, lake-native data foundation for AI workloads — and an answer to what happens after vector databases succeed.

Build for the Boom: Why AI Agent Startups Should Build Scalable Infrastructure Early
Explore strategies for developing AI agents that can handle rapid growth. Don't let inadequate systems undermine your success during critical breakthrough moments.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.



