Леха Захаров – «Слив топа Литрес» (страница 1)
Леха Захаров
«Слив топа Литрес»
Как «ЛитРес» решает, что показывать первым – взгляд изнутри
Представьте себе ситуацию. Вы только что закончили читать роман Пелевина «Путешествие в Элевсин», полный фирменных ироничных отсылок к буддизму, современной России и постмодернистским играм с реальностью. Вы в восторге. Закрываете книгу, открываете главную страницу «ЛитРес» и видите — в ленте рекомендаций тут же появляются «Generation «П» , «Чапаев и Пустота» и ещё пара авторов, которых вы никогда не читали, но которые, как тонко намекает алгоритм, пишут в похожей манере. А может быть, наоборот: вы запоем проглотили детектив Александры Марининой, и вам вдруг предлагают Татьяну Устинову или Дарью Донцову. Удивительное совпадение? Магия больших данных? Или тщательно спланированная операция по манипуляции вашим читательским вкусом?
На самом деле — и то, и другое, и третье одновременно.
За этой пугающей и одновременно восхитительной точностью стоит не один гениальный программист в тёмной комнате, а целая экосистема алгоритмов, десятки тысяч строк кода, сотни тысяч гигабайт обработанных пользовательских данных и, конечно, огромные вычислительные мощности, которые работают на то, чтобы в нужный момент предложить вам именно ту книгу, от которой вы не сможете отказаться. В этой главе мы разберём эту систему до винтика. Мы заглянем под капот «ЛитРес», разберём его рекомендательный движок на составные части, поймём логику каждого этапа и узнаем, как именно из многомиллионного каталога платформа выбирает те несколько книг, которые увидят именно вы.
В конце концов, знание — сила. Если вы автор, понимание этих алгоритмов даст вам ключ к тому, чтобы ваша книга оказалась перед глазами нужного читателя. Если вы читатель — вы начнёте видеть невидимые нити, которые связывают вас с книжными полками.
Двухэтапная архитектура: искусство умного отсева
Чтобы понять, как работает любая современная рекомендательная система — будь то «ЛитРес», онлайн-кинотеатр, музыкальный стриминг или маркетплейс — нужно усвоить один фундаментальный принцип: никто не сравнивает каждый товар с каждым пользователем в реальном времени. Почему? Потому что это вычислительно самоубийственно. Представьте себе: каталог «ЛитРес» насчитывает, по разным оценкам, от нескольких сотен тысяч до более миллиона книг. Сравнить миллион книг с одним пользователем — это миллион операций. А если пользователей миллион? Вы получаете триллион операций в секунду. Ни один дата-центр в мире не справится с такой нагрузкой в реальном времени.
Поэтому все умные системы работают в два этапа.
Первый этап: быстрый отбор кандидатов (этап «грубой силы»). На этом этапе алгоритм должен максимально быстро, буквально за доли секунды, отсеять 99,9% каталога и оставить несколько сотен кандидатов — книг, которые потенциально могут быть интересны пользователю. Это черновая работа, здесь не нужно идеальное попадание, нужно — быстрое и дешёвое. Представьте себе охотника, который сначала стреляет дробью в гущу летящих уток, надеясь задеть хоть несколько, и только потом прицельно бьёт по подранкам.
Второй этап: точное ранжирование (этап «ювелирной работы»). Теперь, когда у нас есть небольшой пул кандидатов (например, 300–500 книг), мы можем позволить себе роскошь — применить к ним сложные, ресурсоёмкие модели машинного обучения, чтобы отсортировать их в идеальном порядке: от самой релевантной до самой, ну, не очень. Именно на этом этапе решается, что окажется на первом месте в вашей ленте, а что на десятом.
Именно такая двухуровневая архитектура, как показывают исследования и открытые данные о платформе, лежит в основе современной рекомендательной системы «ЛитРес». В частности, в выпускной квалификационной работе студента НИУ ВШЭ 2025 года, посвящённой улучшению качества рекомендаций на платформе, прямо описывается двухэтапная система: первый этап использует алгоритм ALS для формирования предварительного списка рекомендаций на основе пользовательских взаимодействий, а второй этап — ранжирование кандидатов с помощью алгоритма градиентного бустинга CatBoost, который учитывает поведенческие и семантические признаки.
Давайте разберём каждый этап детально, потому что именно в этой связке кроется главный секрет успеха.
Этап 1. ALS — Матричное разложение и тайная жизнь ваших оценок
Аббревиатура ALS расшифровывается как Alternating Least Squares — «чередующиеся наименьшие квадраты». Звучит жутковато для гуманитария, но на деле идея, стоящая за этим алгоритмом, изящна и даже поэтична.
ALS относится к семейству методов коллаборативной фильтрации (collaborative filtering). Коллаборативная фильтрация — это, если говорить простым языком, принцип «тем, кому понравилось это, понравилось и вот это». Вы когда-нибудь замечали, как на книжных сайтах появляется блок «Читатели, купившие эту книгу, также купили...»? Это и есть классическая коллаборативная фильтрация в действии.
Но ALS — это не просто «друзья купили». Это математически строгий, элегантный способ предсказать ваши вкусы на основе вкусов всех остальных пользователей.
Как это работает?
Представьте себе огромную таблицу — матрицу. По вертикали в ней перечислены все пользователи «ЛитРес» (миллионы строк), по горизонтали — все книги в каталоге (сотни тысяч столбцов). В ячейках этой таблицы стоят оценки — 1, 2, 3, 4, 5 звёзд, а может быть, 0 (не читал) или прочерк (нет данных). Проблема в том, что эта матрица на 99,999% состоит из прочерков — вы ведь прочитали лишь ничтожную долю всех существующих книг. ALS пытается предсказать эти прочерки. Какие книги вы бы оценили высоко, если бы прочитали? Какие — низко?
ALS решает эту задачу хитрым способом: он представляет каждого пользователя и каждую книгу как вектор в некоем гипотетическом многомерном пространстве «вкусов». У этого пространства может быть, скажем, 100 измерений. Первое измерение — «любовь к детективам», второе — «интерес к научной фантастике», третье — «склонность к психологической прозе», четвёртое — «чувствительность к стилю», пятое —... и так далее. Разумеется, в реальности эти измерения не имеют имён — они извлекаются алгоритмом автоматически из данных, но суть от этого не меняется.
Каждый пользователь получает свой вектор (набор из 100 чисел), который описывает его уникальный читательский профиль. Каждая книга получает свой вектор (тоже из 100 чисел), который описывает её «вкусовую геометрию» — какие типы пользователей она привлекает.
Идеальный сценарий: если вы умножите вектор пользователя на вектор книги (это называется скалярное произведение), то получите предсказанную оценку. Если книга вам идеально подходит, произведение будет большим (скажем, соответствует 5 звёздам). Если не подходит — маленьким (1 звезда). Задача ALS — подобрать такие векторы для всех пользователей и всех книг, чтобы предсказанные оценки максимально совпадали с реальными, которые вы поставили. Алгоритм делает это итеративно, отсюда и слово «Alternating» (чередующийся): он попеременно фиксирует векторы пользователей и улучшает векторы книг, затем наоборот, и так много раз, пока не сойдётся к оптимальному решению.
ALS обожают в индустрии за его скорость и масштабируемость. Он прекрасно работает на разреженных данных (когда у вас очень мало оценок на пользователя) и может обрабатывать миллионы пользователей и товаров. Именно ALS в «ЛитРес» отвечает за первичный отсев. Он пробегает по всей библиотеке, вычисляет для вас предсказанные оценки для нескольких сотен тысяч книг (в уме, на самом деле — на сервере) и выбирает те 300–500, у которых предсказание выше всего.
Но здесь есть один нюанс. ALS — это чистая математика. Он видит только цифры. Он не знает, что такое «сюжет», «атмосфера», «стиль автора», «философская глубина». Для него «Война и мир» и «Гарри Поттер» — просто два вектора в 100-мерном пространстве. Он не отличит хороший текст от плохого. Он не знает, что такое «кликбейтное название» или «удачная обложка». Он просто считает корреляции: «Пользователи, похожие на вас, часто читали вот эту книгу — значит, и вам она, вероятно, понравится». И этого для первого этапа более чем достаточно.
Этап 2. CatBoost — Генерал, который принимает окончательное решение
И вот ALS сделал свою чёрную работу: из миллиона книг он отобрал 500 кандидатов, которые, по его скромному мнению, могут вас заинтересовать. Теперь на сцену выходит тяжёлая артиллерия — CatBoost.
CatBoost (сокращение от Categorical Boosting) — это мощнейший алгоритм машинного обучения, основанный на градиентном бустинге (Gradient Boosting). Если ALS — это чертёжник, который набросал контуры здания, то CatBoost — это архитектор, который решает, где будут двери, окна, лестницы и как всё это будет выглядеть в итоге.
Градиентный бустинг, если совсем упрощённо, — это метод, который строит не одну сложную модель, а множество простых, «слабых» моделей (обычно это маленькие деревья решений), а затем последовательно их объединяет. Каждая следующая модель пытается исправить ошибки предыдущих. Представьте себе группу экспертов, которые по очереди высказываются о книге. Первый говорит: «У неё высокие продажи». Второй добавляет: «Но у неё низкий средний рейтинг». Третий уточняет: «Зато у автора есть премия». Четвёртый замечает: «Однако текст слишком сложный для вашего уровня чтения». В итоге, взвесив все мнения, система выносит вердикт.