惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Heimdal Security Blog
A
Arctic Wolf
K
Kaspersky official blog
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
L
LINUX DO - 热门话题
MongoDB | Blog
MongoDB | Blog
T
Threat Research - Cisco Blogs
D
Docker
爱范儿
爱范儿
T
Tenable Blog
C
Check Point Blog
B
Blog
C
Cisco Blogs
Vercel News
Vercel News
The Cloudflare Blog
T
Threatpost
NISL@THU
NISL@THU
T
Tor Project blog
V2EX - 技术
V2EX - 技术
P
Palo Alto Networks Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tailwind CSS Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
SecWiki News
SecWiki News
博客园 - 司徒正美
S
Security @ Cisco Blogs
GbyAI
GbyAI
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Cloudbric
Cloudbric
Webroot Blog
Webroot Blog
N
News and Events Feed by Topic
Y
Y Combinator Blog
博客园_首页
T
Troy Hunt's Blog
The Hacker News
The Hacker News
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
U
Unit 42
AWS News Blog
AWS News Blog
PCI Perspectives
PCI Perspectives
V
Visual Studio Blog
博客园 - 聂微东
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как я строю рекомендательную модель фильмов: cold start, вектор вкуса и GPT
Pegiy · 2026-04-29 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение6 мин

Охват и читатели288

Кейс

Выбрать фильм на вечер сложно даже для одного человека.
А если фильм нужно выбрать для пары, где вкусы просто разные, задача становится ещё менее предсказуемой.

Обычные подборки, жанровые фильтры и списки “что посмотреть вечером” помогают только до определённого момента.
Они работают как витрина, но плохо работают как персональная рекомендация, потому что почти не учитывают зрительский опыт, индивидуальные предпочтения и то, какие фильмы человек вообще уже видел.

Именно с этой задачи я и подошёл к своему проекту NextFilm: не как к каталогу фильмов, а как к рекомендательной системе.
Основной вопрос звучал так: как выдать полезную рекомендацию новому пользователю, если на старте о нём почти ничего не известно.

По сути, в моём контексте это и есть cold start.
Не абстрактная проблема “мало данных”, а вполне прикладная ситуация: пользователь уже хочет получить рекомендацию, а система пока не знает, что он смотрел, насколько у него большая зрительская база и какие паттерны вкуса у него вообще есть.

Почему жанров недостаточно

Наивный способ рекомендовать фильмы — опираться на жанры, популярность и общие рейтинги.
Но жанр — слишком грубый признак.

Два пользователя могут одинаково любить фантастику, но один предпочитает медленные, атмосферные и философские фильмы, а другой — динамичные, зрелищные и сюжетно плотные.
Формально жанр один и тот же, но реальные ожидания от фильма — совершенно разные.

То же самое происходит с универсальными подборками.
Они могут давать неплохой средний результат, но почти не решают задачу персонализации, особенно если пользователь уже много смотрел и плохо реагирует на слишком очевидные рекомендации.

Из этого для меня следовал простой вывод:
если рекомендательная система хочет быть полезной, она должна сначала понять не только “что нравится”, но и какой у пользователя зрительский опыт.

Этап 1. Сбор стартовых сигналов

Первый этап в моём пайплайне — не выдача рекомендаций, а сбор стартового профиля.
На этом шаге для меня важнее всего понять, какие фильмы пользователь уже видел и как он к ним относится.

Это критично по двум причинам.

Во-первых, нужно отделить “фильм не нравится” от “пользователь его просто не смотрел”.
Если этого не сделать, модель начинает делать ложные выводы на пустом месте.

Во-вторых, у пользователей очень разная база просмотра.
Один человек знает в основном самые популярные фильмы последних лет, другой — классику и авторское кино, третий вообще редкий зритель и узнаёт только самые громкие названия.

Если все эти сценарии одинаково обработать на старте, модель быстро начинает шуметь.
Поэтому первый полезный шаг — собрать набор уже просмотренных фильмов и получить по ним первичные оценки.

С технической точки зрения именно эти оценки становятся первым надёжным сигналом для модели.
Они ещё не дают полноценный профиль, но уже позволяют понять, где у пользователя сильные предпочтения, а где пока слишком мало информации.

Этап 2. Построение вектора вкуса

Когда стартовых оценок становится достаточно, можно переходить от “карты просмотренного” к более содержательной модели предпочтений.

В моём случае вкус — это не просто список любимых жанров.
Я стараюсь разложить его на несколько более тонких параметров: темп, эмоциональный тон, глубина, зрелищность, привычность формы, сюжетная плотность и другие подобные признаки.

Именно здесь оценки начинают превращаться во внутренний вектор предпочтений.
Идея не в том, чтобы сказать “пользователь любит драму”, а в том, чтобы описать, какой тип фильма для него обычно оказывается релевантным.

Такой подход лучше работает на практике, чем грубая жанровая сегментация.
Он позволяет объяснить, почему два фильма из одного жанра могут оказаться очень далеко друг от друга с точки зрения конкретного зрителя.

На этом этапе рекомендательная модель уже может делать первые осмысленные выводы.
Но опираться только на локальные оценки одного пользователя всё ещё рискованно: данных мало, а случайные совпадения могут слишком сильно влиять на выдачу.

Этап 3. Коллективный сигнал

Чтобы не замыкаться только на локальном профиле, я добавляю внешний слой коллективных оценок.
Для этого я использую MovieLens 25M от GroupLens — открытый датасет, в котором собрано 25 млн оценок по более чем 62 тысячам фильмов.

Здесь для меня важна не абстрактная “математика поверх математики”, а вполне прикладная логика.
Если пользователю понравился определённый набор фильмов, можно посмотреть, какие ещё фильмы систематически нравятся людям с похожими паттернами.

То есть внешний датасет используется не вместо пользовательского профиля, а как дополнительный слой сигнала.
С одной стороны, у меня есть локальные предпочтения конкретного человека; с другой — коллективные зависимости между фильмами, подтверждённые большим числом реальных оценок.

На практике это уже похоже на гибридную схему:
часть сигнала идёт от внутреннего профиля пользователя, часть — от collaborative filtering по похожим оценочным паттернам.

Этап 4. Дообучение на новых сигналах

Важный момент: такая модель не должна оставаться статичной.
Если после первого онбординга зафиксировать профиль навсегда, качество рекомендаций быстро упрётся в потолок.

Поэтому по мере накопления новых оценок модель должна пересматривать значимость признаков, обновлять веса и уточнять, какие факторы действительно сильнее всего влияют на релевантность для конкретного пользователя.
Такой подход обычно описывают как online updates или дообучение на новых пользовательских сигналах.

Это особенно важно в кино.
Вкусы не только различаются между людьми, но и меняются со временем: пользователь может уставать от одних типов фильмов и начинать лучше реагировать на другие.

Поэтому для меня рекомендательная система — это не “один раз посчитанная формула”, а постоянно уточняемая модель.
Каждая новая оценка должна не просто сохраняться, а менять дальнейшую траекторию выдачи.

Этап 5. Зачем здесь GPT

Даже если предыдущие этапы уже дают неплохой пул кандидатов, остаётся ещё одна проблема: как превратить технически релевантную выдачу в результат, который человеку удобно воспринимать.

Базовая модель может подобрать формально хорошие варианты, но список всё равно может выглядеть странно.
Например, быть плохо упорядоченным, недостаточно объяснимым или слишком “машинным” по подаче.

Поэтому GPT в моём пайплайне не заменяет рекомендательную модель.
Он стоит поверх неё как финальный слой интерпретации и re-ranking.

Сначала система собирает кандидатов на основе пользовательских оценок, вектора вкуса и коллективных сигналов.
Затем LLM помогает более осмысленно отсортировать кандидатов, сгруппировать выдачу и сделать результат понятнее для пользователя.

Для меня здесь принципиально важно не подменять модель LLM-магией.
GPT хорош в интерпретации, объяснении и финальной подаче, но базовая релевантность всё равно должна рождаться раньше — на уровне данных, сигналов и ранжирования.

Что получается в итоге

Если упростить пайплайн, он выглядит так:

  1. Собрать стартовые оценки и понять, что пользователь уже видел.

  2. Построить начальный профиль предпочтений.

  3. Превратить набор оценок в более устойчивый вектор вкуса.

  4. Сопоставить сильные сигналы с коллективными паттернами из MovieLens 25M.

  5. Отранжировать кандидатов.

  6. Поверх этого применить GPT как слой интерпретации и финальной сборки выдачи.

С инженерной точки зрения для меня это попытка уменьшить долю случайных рекомендаций.
Не советовать “что-то популярное”, а пройти от слабых сигналов к более устойчивой модели пользователя.

Где у подхода ограничения

Понятно, что такая схема не решает всё автоматически.

Во‑первых, cold start остаётся самым чувствительным этапом: чтобы получить приличное качество рекомендаций, системе приходится просить пользователя сделать достаточно заметный первый шаг — поставить оценки ряду фильмов. И если пользователь не готов тратить на это время, система получает слишком мало сигнала и начинает работать хуже.

Во-вторых, в рекомендательных системах всегда есть риск переобучиться на популярных фильмах.
Чем сильнее в данных выражены массовые паттерны, тем выше шанс, что модель будет чаще возвращаться к очевидным вариантам.

В-третьих, LLM-слой тоже нельзя переоценивать.
Он помогает сделать выдачу понятнее, но не исправляет фундаментальные ошибки, если базовый ранжирующий слой собран слабо.

То есть главный интерес для меня сейчас не в “идеальной модели”, а в качестве пайплайна целиком: какие сигналы собирать на старте, как уменьшать шум, как дообучать систему и где правильно ставить границу между классическим рекомендателем и LLM.

Почему мне это интересно

На поверхности задача выбора фильма выглядит простой.
Но если пытаться реально решать её для одного человека или для пары с разными вкусами, очень быстро становится понятно, что жанров, популярных списков и красивой витрины недостаточно.

Поэтому мне и интересно строить систему именно как рекомендательный пайплайн:
с cold start, пользовательским профилем, коллективным сигналом, дообучением и финальным слоем интерпретации.

Для меня это и есть самая интересная часть проекта: не просто подобрать фильм, а понять, как сделать рекомендацию релевантной при недостатке данных на старте, а затем постепенно повышать её качество по мере накопления реальных пользовательских сигналов.

Если у вас есть опыт построения рекомендательных систем — особенно в части cold start, гибридных моделей или интеграции LLM в пайплайн, — буду рад любым замечаниям и альтернативным подходам в комментариях.

Сервис, о котором шла речь в статье: https://nextfilm.pro