
Полная версия
«Слив топа Литрес»

Леха Захаров
«Слив топа Литрес»
Как «ЛитРес» решает, что показывать первым – взгляд изнутри
Представьте себе ситуацию. Вы только что закончили читать роман Пелевина «Путешествие в Элевсин», полный фирменных ироничных отсылок к буддизму, современной России и постмодернистским играм с реальностью. Вы в восторге. Закрываете книгу, открываете главную страницу «ЛитРес» и видите — в ленте рекомендаций тут же появляются «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 — это архитектор, который решает, где будут двери, окна, лестницы и как всё это будет выглядеть в итоге.
Градиентный бустинг, если совсем упрощённо, — это метод, который строит не одну сложную модель, а множество простых, «слабых» моделей (обычно это маленькие деревья решений), а затем последовательно их объединяет. Каждая следующая модель пытается исправить ошибки предыдущих. Представьте себе группу экспертов, которые по очереди высказываются о книге. Первый говорит: «У неё высокие продажи». Второй добавляет: «Но у неё низкий средний рейтинг». Третий уточняет: «Зато у автора есть премия». Четвёртый замечает: «Однако текст слишком сложный для вашего уровня чтения». В итоге, взвесив все мнения, система выносит вердикт.
CatBoost в «ЛитРес» учитывает огромное количество факторов (признаков), которые можно разделить на несколько категорий.
1. Поведенческие признаки (Behavioural Features)
Это всё, что пользователь делает на платформе — явно или неявно.
Явные действия: поставленные оценки (звёзды), написанные рецензии, добавление в избранное, покупка, скачивание.
Неявные действия (самые важные!): время, проведённое на странице книги; факт прокрутки страницы до конца; дочитывание книги до последней главы (это золотой сигнал); возвращение к книге после перерыва; клики по обложке, по кнопке «Читать», по ссылкам; частота открытия приложения. Даже то, как быстро вы пролистываете страницы, может быть сигналом — скучаете вы или вчитываетесь.
Чем больше пользователь взаимодействует с книгой — и чем глубже это взаимодействие, тем выше вес этого сигнала. Покупка, безусловно, важна. Но дочитывание до конца важнее покупки. А повторное перечитывание (когда пользователь возвращается к книге спустя месяцы) — это сигнал высшего уровня, который CatBoost учитывает с повышенным коэффициентом.
2. Семантические признаки (Semantic Features)
Это как раз то, чего не хватало ALS. CatBoost может «понимать» (в кавычках, потому что алгоритмы не понимают в человеческом смысле) содержание книги, её стиль, жанр, настроение. Для этого на «ЛитРес», согласно данным исследований, используется современная модель Sentence-BERT (SBERT). Sentence-BERT — это нейросетевая модель, которая преобразует текст (аннотацию, название, первые страницы, даже весь текст книги) в специальный вектор — так называемое семантическое представление.
Что это даёт?
Система может найти книги, которые семантически близки к тем, что вы уже читали, даже если они относятся к разным жанрам и не пересекаются по покупкам других пользователей. Например, вы читали мрачный нуарный детектив Рэймонда Чандлера. ALS может посоветовать вам других классиков нуара — Дэшила Хэмметта или Джеймса Кейна. Но Sentence-BERT может уловить более тонкую вещь: атмосферу безысходности, циничный голос рассказчика, описания ночного Лос-Анджелеса. И на основе этого предложить вам, скажем, роман «Драйв» Джеймса Саллиса — современный нуар, который жанрово может быть отнесён к «криминальной драме» или даже «триллеру», но семантически он невероятно близок к Чандлеру.
Или другой пример: вы читали «Маленькую жизнь» Ханьи Янагихары — тяжёлый, травматичный роман о дружбе и боли. Система, используя SBERT, сможет найти книги не просто «о дружбе» или «о травме», а именно с похожей эмоциональной тональностью — например, «Щегол» Донны Тартт или «Невыносимую лёгкость бытия» Милана Кундеры. Это уже не коллаборативная фильтрация, а контентная фильтрация высшего уровня.
3. Контекстные признаки (Contextual Features)
Алгоритм учитывает не только «кто вы», но и «где вы» и «когда вы».
Время суток и день недели: исследования показывают, что вечером в пятницу люди чаще выбирают лёгкое чтиво — детективы, любовные романы, юмористическую прозу. А в воскресное утро — более серьёзную литературу, нон-фикшн, психологию. CatBoost это знает и подстраивает рекомендации.
Устройство: читаете вы на телефоне в метро или на большом планшете дома в кресле? В первом случае алгоритм может предложить рассказы или короткие повести — то, что можно осилить за 15–20 минут поездки. Во втором — многотомные эпопеи.
Местоположение (с учётом всех ограничений): рекомендации могут незначительно варьироваться в зависимости от региона (например, в Санкт-Петербурге может быть чуть выше спрос на «Питерскую» прозу).
История покупок и чтения за последний час: если вы только что купили три книги по саморазвитию, CatBoost на время «забудет» о вашей любви к фэнтези и начнёт активно подсовывать вам ещё книги по продуктивности, тайм-менеджменту и личностному росту. Вы задали контекст — алгоритм его подхватил.
4. Авторские и книжные признаки (Meta-features)
Авторитет автора: книги авторов, которые уже много раз попадали в топ-списки, получали премии или просто имеют большую аудиторию, получают «фору» при ранжировании. Это не значит, что новичок не может выстрелить, но стартовые условия у него хуже.
Возраст книги (дата публикации): новинки почти всегда имеют приоритет. «ЛитРес» — коммерческий сервис, ему выгодно продавать свежий контент. Однако классика, которая стабильно продаётся годами (например, «Мастер и Маргарита»), также имеет высокий ранг.
Длина книги: слишком короткая книга (рассказ на 20 страниц) и слишком длинная (трёхтомник на 2000 страниц) могут быть наказаны в рекомендациях — первая потому, что её «слишком быстро читают» (мало времени вовлечения), вторая — потому, что её редко дочитывают до конца (высокий процент бросивших).
Язык и сложность текста: алгоритм может оценивать сложность лексики, длину предложений и сопоставлять с вашим «профилем читателя» (читаете ли вы обычно Толстого или Донцову).
Матрица факторов ранжирования: что на самом деле двигает книгу наверх
Теперь, когда мы знаем основных игроков, давайте разберёмся, как именно они взаимодействуют и какие конкретные факторы имеют наибольший вес. Представьте себе многомерную шкалу, где каждый фактор имеет свой «вес» — коэффициент важности. Точные значения этих коэффициентов — строжайшая коммерческая тайна «ЛитРес», но мы можем сделать обоснованные предположения, основанные на общих принципах работы рекомендательных систем и открытых данных.
Факторы с наибольшим весом (критические)
Дочитывание до конца (Completion Rate). Это, без преувеличения, король всех метрик. Если пользователь купил книгу, открыл её, но бросил на 10-й странице — это негативный сигнал. Если он дочитал до конца — мощнейший позитивный. А если он дочитал и тут же поставил высокую оценку — это джекпот. Алгоритм интерпретирует это так: книга настолько хороша, что пользователь не мог оторваться. Именно дочитывание — лучший предсказатель того, что и другие пользователи с похожим профилем тоже дойдут до конца. Следовательно, такие книги получают огромный буст в ранжировании.
Коллаборативная близость (Collaborative Similarity). ALS не зря работает на первом этапе. Сила «коллективного разума» огромна. Если тысяча пользователей с вашим профилем (похожие покупки, похожие оценки) купили и полюбили книгу X, а вы её ещё не читали — CatBoost с высокой вероятностью поставит её вам на первое место, даже если все остальные факторы (семантика, новизна) говорят против. Коллективный опыт перевешивает.
Поведенческая интенсивность в «песочнице» (Early Adopter Signals). Для новых книг, у которых ещё мало данных, критически важны первые дни после публикации. Если в первый же час после выхода книгу купили 100 человек, а в первый день — 500, это сигнал для системы: «Внимание, потенциальный блокбастер!» CatBoost начнёт агрессивно рекомендовать эту книгу похожим пользователям, чтобы проверить гипотезу. Если и они начнут её покупать и дочитывать — запустится эффект снежного кома. Если нет — книга быстро уйдёт в «песочницу забытых».
Факторы со средним весом (важные, но не решающие)
Семантическое сходство (Semantic Similarity по SBERT). Этот фактор особенно важен для нишевых жанров и для пользователей со сложными, нетривиальными вкусами. Для массовых жанров (любовные романы, боевики) он может уступать коллаборативной фильтрации, потому что там «все на всех похожи». Но для интеллектуальной прозы, философской фантастики или узкоспециализированного нон-фикшна семантическое сходство может выходить на первый план.
Вовлечённость (Engagement Metrics). Сюда входит множество параметров: время, проведённое на странице книги (не только чтение, но и изучение описания, отзывов), частота возвращения к книге, количество выделенных цитат (эта функция есть в приложении «ЛитРес»), факт добавления книги в закладки, факт написания рецензии (даже короткой). Всё это показывает, что книга не просто куплена, но и «пережита» пользователем.
Рекency (новизна). Свежие книги почти всегда получают небольшой, но ощутимый буст. Это нужно для того, чтобы новые авторы и новые издания не застревали навечно в глубине каталога. Однако буст этот временный — если через 2–3 недели книга не показывает органического спроса, приоритет снимается.
Факторы с наименьшим весом (но всё же влияющие)
Цена. Более дорогие книги могут быть немного наказаны в рекомендациях, потому что алгоритм предсказывает: пользователь с большей вероятностью купит дешёвую книгу или книгу по подписке. Однако если книга очень качественная и имеет высокий Completion Rate, цена перестаёт быть фактором.
Обложка и оформление. Строго говоря, алгоритмы машинного обучения не видят обложку как картинку (хотя современные сверточные нейросети могли бы это делать). Но они видят косвенные сигналы: книги с «красивыми» обложками (по субъективному мнению пользователей) чаще кликают, чаще покупают, чаще дочитывают. Таким образом, обложка влияет на поведенческие метрики, которые уже напрямую учитываются CatBoost.
Наличие аудиоверсии. Книги, которые существуют и в текстовом, и в аудиоформате, получают небольшое преимущество, так как охватывают более широкую аудиторию (любителей аудиокниг).
Скрытые триггеры, штрафы и исключения
Рекомендательная система — это не только «плюшки», но и «минушки». CatBoost не только повышает, но и понижает ранг книг за определённые «проступки».
Штраф за несоответствие ожиданиям. Если книга имеет яркую, кликбейтную обложку и громкое название, пользователь кликает на неё, покупает, а потом обнаруживает, что содержание не соответствует ожиданиям, и бросает читать на 5-й странице — система запомнит это. Книга будет помечена как «потенциальный разочарователь» (disappointer), и её ранг для похожих пользователей будет искусственно занижен.
Штраф за «странные» покупки. Если книга неожиданно для алгоритма покупается пользователями с очень разными профилями (например, и поклонниками интеллектуальной прозы, и любителями бульварных детективов), это может сбить систему с толку. В некоторых случаях это расценивается как «шум» или даже «аномалия», и ранг книги может быть временно понижен до тех пор, пока не накопится достаточно данных, чтобы понять, что происходит. (Исключение: книги-«феномены», которые действительно нравятся всем — такие как «Три товарища» Ремарка — они получают, наоборот, супер-буст.)
Штраф за «накрутку» (самое страшное). Если система заподозрит искусственное накручивание рейтингов, покупок, отзывов или скачиваний (например, резкий всплеск активности из одного IP-адреса или странный паттерн покупок), книга может быть не просто понижена в ранге, а полностью исключена из рекомендаций. Более того, аккаунт автора может быть заблокирован, а книга — снята с продажи. «ЛитРес» относится к этому очень серьёзно.
Исключение для «супер-бестселлеров». Иногда книга становится настолько популярной (всплеск из-за экранизации, победа в крупной премии, мем в социальных сетях), что правила ранжирования для неё временно отключаются. Она начинает показываться всем подряд, даже если это противоречит их профилю. Это делается для максимизации прибыли: даже если пользователь обычно не читает фэнтези, но весь мир говорит о новом романе Санджо, он, вероятно, купит и его.
Портрет «идеальной» книги с точки зрения алгоритма
Итак, подведём промежуточный итог. Какой должна быть книга, чтобы CatBoost и ALS полюбили её всем сердцем? Вот собирательный образ:
Название: интригующее, но не кликбейтное. Оно должно точно отражать содержание и соответствовать жанровым ожиданиям. Названия, которые вводят в заблуждение, приводят к высокому проценту бросивших чтение.
Жанр: чётко определённый, без «каши». Книга, которая пытается быть и детективом, и романом, и фэнтези, сбивает с толку и коллаборативную фильтрацию, и семантическую модель. Лучше выбрать один-два основных жанра и строго им следовать.
Обложка: качественная, профессиональная, релевантная жанру. Она не должна быть слишком кричащей (чтобы не создавать завышенных ожиданий), но и не слишком блёклой (чтобы привлекать клики).
Аннотация: чёткая, информативная, без спойлеров. Она должна давать пользователю точное представление о книге. Загадочные, уклончивые аннотации ведут к высокому проценту бросивших.
Объём: золотая середина — 250–400 страниц в печатном эквиваленте. Рассказы (менее 100 страниц) имеют слишком низкое время вовлечения. Тома-кирпичи (более 800 страниц) пугают пользователей высоким процентом не-дочитывания.
Первые страницы: должны «цеплять» с первой фразы. CatBoost анализирует поведение пользователя на первых страницах. Если он пролистал 10–15 страниц и закрыл книгу — это негативный сигнал. Если он после первых страниц сразу купил книгу или добавил в избранное — позитивный.
Концовка: должна быть удовлетворительной. Пользователи, разочарованные концовкой, ставят низкие оценки и не рекомендуют книгу друзьям, что снижает её коллаборативный потенциал.
Наличие аудиоверсии: обязательно. И желательно качественной, с хорошим чтецом.
Автор: если автор уже имеет успешные книги на платформе — это огромный плюс. CatBoost помнит «послужной список» автора и даёт новинкам фору. Новичкам приходится доказывать качество с нуля.
Математика успеха: как вычислительная сложность определяет судьбы
Давайте на минуту представим вычислительную мощь, которая стоит за каждым вашим кликом. Каждый раз, когда вы заходите на главную страницу «ЛитРес», система запускает следующий конвейер:
Запрос к базе данных: извлечь ваш профиль (историю покупок, оценок, чтения).
Запуск ALS: вычислить предсказанные оценки для всех 1 000 000+ книг, используя ваши 100-мерные векторы и векторы книг. (На самом деле ALS не вычисляет оценки для всех книг каждый раз — он использует индексацию и приближённые методы поиска ближайших соседей, например, ANN — Approximate Nearest Neighbors. Но суть та же.)



