← ПроектыОбложка проекта «MusicRecommend — рекомендации музыки по любимым трекам»

MusicRecommend — рекомендации музыки по любимым трекам

Концепт · проектирование

AI / эмбеддингиМузыкаSelf-hostedКонцепт

Идея простая: даёшь системе пару десятков любимых треков — она строит по ним векторный профиль и находит похожее. Но самое сложное в ней — не там, где кажется. Поиск ближайших соседей (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 от каждого сида → топ). Код впереди; буду показывать по ходу.