MusicRecommend — рекомендации музыки по любимым трекам
Концепт · проектирование
Идея простая: даёшь системе пару десятков любимых треков — она строит по ним векторный профиль и находит похожее. Но самое сложное в ней — не там, где кажется. Поиск ближайших соседей (kNN) — как раз простая часть. Интересны три неочевидных вопроса, от которых зависит, выйдет ли что-то полезное.
Что оказалось по-настоящему сложным
- 🧠 Откуда брать эмбеддинги. В конце 2024 Spotify закрыл свои аудио-фичи и рекомендации для новых приложений — старые туториалы больше не работают. Зато для self-hosted сейчас отличная ситуация с открытыми моделями: ставка на LAION-CLAP (аудио и текст в одном пространстве — можно искать и «трек → трек», и «текстом → трек»).
- 🗂️ Где взять корпус кандидатов. Эмбеддить «всю музыку» нельзя. Решение — двухстадийный retrieval: дешёвым сигналом генерируем кандидатов, и только их скачиваем и эмбеддим. Коллаборативный сигнал, который забрал Spotify, никуда не делся — он есть в Last.fm и ListenBrainz («кто слушает X, слушает и Y»).
- 🎯 Вкус — это не один вектор. Усреднить любимое в один «вектор вкуса» — известный антипаттерн: центроид между «эмбиент вечером» и «пост-панк утром» попадает в мёртвую зону. Правильно — кластеризовать любимое и искать соседей вокруг каждого кластера.
Сильнейший гибрид для self-hoster: Last.fm/ListenBrainz даёт ось «люди как ты», CLAP — ось «звучит как»; складываем с весами и получаем и знакомое-релевантное, и неожиданно-похожее по звуку.
Как это ложится на стек
Поиск — FAISS (в памяти, миллисекунды) или Qdrant, если захочется сервис. Пайплайн
извлечения — Python-сервис со стадиями download → embed → index через очередь
(тот же паттерн, что в других моих проектах). Финальный запрос «порекомендуй
что-нибудь» можно завернуть в OpenClaw или Telegram.
Статус
Пока это архитектурный документ — продумал подход, источники эмбеддингов и корпуса, наметил MVP (любимые → CLAP с многооконным усреднением → кандидаты из Last.fm → kNN от каждого сида → топ). Код впереди; буду показывать по ходу.