Введение: персонализация как роскошь, доступная не всем
Когда мы слышим слово «персонализация», в голове сразу всплывают образы гигантов вроде Netflix, Spotify или YouTube. Эти платформы тратят миллионы долларов на сбор и анализ огромных массивов данных, используя сложные распределённые системы и целые армии инженеров. Кажется, что создать умную ленту новостей, которая понимает вкусы пользователя, без Big Data и мощной инфраструктуры просто невозможно. Но команда разработчиков, опубликовавшая свой опыт на Habr, доказывает обратное: персонализация возможна даже в условиях ограниченных ресурсов. Они взяли Telegram-бота, добавили PostgreSQL с расширением pgvector и всего пять сигналов — и получили ранжирование новостей, которое удивило даже авторов. Источник
В июле 2026 года, когда тренды ИИ и анализа данных становятся всё более доступными, этот кейс выглядит особенно вдохновляющим. Он показывает, что для умной персонализации не обязательно иметь кластер из сотен серверов и петабайты логов. Достаточно грамотно подойти к выбору инструментов и сигналов, которые действительно отражают интересы пользователя. В этой статье мы разберём, как именно авторам удалось решить задачу, какие пять сигналов они использовали и почему pgvector стал ключевым элементом пазла.
Проблема: новости — это мусор, если их не фильтровать
Telegram-боты для доставки новостей — привычный инструмент для тысяч пользователей. Но у них есть общая боль: поток информации превращается в белый шум. Без персонализации каждый подписчик получает одну и ту же ленту, где перемешаны важные для него темы и совершенно неинтересный контент. Результат — падение вовлечённости, отписки и общее разочарование.
Авторы статьи столкнулись с классической дилеммой: как дать каждому пользователю уникальную ленту, не имея возможности хранить и обрабатывать терабайты данных? Традиционные подходы — коллаборативная фильтрация, построение матриц пользовательских предпочтений, сложные модели машинного обучения — требуют больших вычислительных мощностей и объёмов данных. Для небольшого проекта это непозволительная роскошь.
Решение пришло неожиданное: использовать встроенные возможности PostgreSQL и всего несколько простых, но эффективных сигналов. Вместо того чтобы копить данные годами, авторы решили собирать минимум информации, но максимизировать её полезность.
Решение: pgvector и пять сигналов
В основе системы ранжирования лежит расширение pgvector для PostgreSQL. Этот инструмент позволяет хранить и искать векторные представления (embeddings) прямо в базе данных. Векторизация новостей и интересов пользователей даёт возможность сравнивать их семантическую близость — то есть понимать, насколько тема одной статьи похожа на предпочтения конкретного человека.
Но векторы — это только половина дела. Вторая половина — это пять сигналов, на основе которых строится итоговый рейтинг каждой новости для каждого пользователя. Авторы выделили следующие:
- Семантическое сходство — насколько вектор новости близок к вектору интересов пользователя. Этот сигнал самый важный, он задаёт базу.
- Темпоральный вес — свежие новости получают больший приоритет. Учтён эффект «затухания» со временем.
- Популярность — количество кликов или взаимодействий с новостью среди других пользователей. Если статья интересна многим, вероятно, она будет интересна и вам.
- История взаимодействия — какие новости пользователь уже читал, лайкал или пропускал. Это позволяет избегать повторов и усиливать сигнал понравившихся тем.
- Категориальный вес — предпочтения пользователя по тематикам (технологии, спорт, политика, наука и т.д.).
| Сигнал | Описание | Вес в ранжировании |
|---|---|---|
| Семантическое сходство | Косинусное расстояние между эмбеддингами | 0.4 |
| Темпоральный вес | Линейное убывание за 24 часа | 0.2 |
| Популярность | Количество кликов за последний час | 0.15 |
| История взаимодействия | Булевы флаги: читал/не читал | 0.15 |
| Категориальный вес | Вес на основе частоты тем | 0.1 |
Каждый сигнал получает числовое значение, а затем они суммируются с разными весами. Итоговый рейтинг — это взвешенная сумма, которая и определяет порядок новостей в ленте конкретного пользователя. Простота этого подхода позволяет обновлять ленту в реальном времени без сложных вычислений.
Техническая реализация: почему pgvector, а не отдельная векторная база
Выбор pgvector — не случайность. Во-первых, команда уже использовала PostgreSQL для хранения пользователей и новостей. Подключить расширение — дело нескольких минут. Во-вторых, это избавляет от необходимости разворачивать и поддерживать отдельную систему вроде Milvus, Qdrant или Weaviate. Для небольшого проекта это существенная экономия ресурсов.
pgvector поддерживает несколько типов индексов для быстрого поиска ближайших соседей, включая IVFFlat и HNSW. Авторы выбрали HNSW (Hierarchical Navigable Small World) — он даёт высокую точность при приемлемой скорости на объёмах до нескольких миллионов векторов. В их случае, когда количество новостей измеряется тысячами, а пользователей — десятками тысяч, производительность оказалась более чем достаточной.
Интересная деталь: векторизация новостей выполняется один раз при добавлении статьи в базу. Для этого используется предобученная модель Sentence-BERT, которая превращает заголовок и краткое описание новости в числовой вектор длиной 768 элементов. Пользовательские профили также хранятся в виде векторов, которые обновляются асинхронно каждые несколько часов на основе истории взаимодействий.
Как это работает на практике: пример из реальной жизни
Представьте пользователя Ивана. Он подписан на новости по технологиям и науке, но не любит политику и спорт. Система хранит его профиль как вектор, усреднённый по всем новостям, которые он читал и лайкал. Когда приходит новая статья о квантовых вычислениях, её вектор сравнивается с профилем Ивана — сходство высокое. Статья получает бонус по сигналу семантического сходства.
Но если та же статья уже была показана Ивану вчера, но он её не открыл, срабатывает сигнал истории взаимодействия — новость понижается в рейтинге. Если же статью активно читают другие пользователи (сигнал популярности), она может подняться выше, даже если семантическое сходство не максимальное.
В итоге Иван видит в начале ленты самые релевантные и свежие новости, которые с высокой вероятностью его заинтересуют. А новости про футбол или политику уходят в конец списка или вообще не показываются.
Результаты и выводы: персонализация без Big Data — это реально
Авторы статьи делятся впечатляющими результатами. После внедрения системы ранжирования на основе pgvector и пяти сигналов, вовлечённость пользователей (количество кликов на новости) выросла на 40% по сравнению с простой хронологической лентой. Количество отписок снизилось, а время, проведённое в боте, увеличилось.
Главный вывод, который можно сделать из этого кейса: персонализация не обязательно требует огромных инвестиций в инфраструктуру. Ключ к успеху — правильно выбранные сигналы и инструменты, которые работают в условиях ограниченных ресурсов. pgvector позволяет добавить семантический поиск в любую базу данных на PostgreSQL без сложной архитектуры. А пять простых сигналов — семантическое сходство, свежесть, популярность, история и категории — дают достаточно контекста для качественного ранжирования.
Этот подход может быть полезен не только для новостных ботов, но и для любых приложений, где нужно персонализировать контент: рекомендации статей, подборка товаров, лента социальной сети и даже образовательные платформы. Например, ASI Biont поддерживает подключение к Telegram через API — подробнее на asibiont.com/courses. Используя подобную методологию, можно создавать умные ленты обучения, которые адаптируются под прогресс и интересы каждого студента.
Заключение: минимум данных — максимум смысла
Персонализация без Big Data — не миф, а рабочая стратегия, которую может повторить любой разработчик. Кейс, описанный на Habr, показывает, что для хорошего результата не нужно собирать всё подряд. Достаточно пяти продуманных сигналов и одного мощного, но простого в использовании инструмента — pgvector.
В мире, где данные становятся новой нефтью, умение извлекать ценность из малого объёма информации — это искусство. И авторы этой статьи доказали, что овладеть им может каждый.
Если вы хотите углубиться в тему, обязательно прочитайте оригинальную публикацию на Habr — там есть все технические детали, код и дополнительные нюансы реализации. Источник
Комментарии