Когда к тебе приходит продакт-менеджер и говорит: «Мне нужны фотографии с романтическим вайбом!», ты, конечно, киваешь. Но в голове с этого момента — не просто набор условий, а попытка нащупать настроение. То, которое не описывается одним словом. Это может быть приглушённый свет в номере, может — зажжённые свечи на столе, а может — парень с девушкой, обнявшиеся на фоне заката.
Что такое «вайб»? Это скорее ощущение, чем чёткий критерий. И вот тебе нужно, чтобы модель тоже начала это «чувствовать».
На старте самое сложное — не технология разметки, а просто понять, о чём вообще идёт речь. Что именно скрывается за вайбом «уют»? Пледы? Мягкий свет? Камин? Или ощущение, как будто ты дома?
Каждый вайб мы воспринимали как многослойную капусту: пытались разложить на визуальные маркеры, настроение, контекст. Где-то угадывали интуитивно, где-то спорили, переосмысливали и возвращались назад с другими идеями.
Иногда воспринимали буквально — и получали не тот результат. Например, был вайб «добавить мистики». Ну окей, подумали мы: затаённый свет, мрак, немного таинственности… Но на выходе — масса обычных фото с просто тёмными цветами и отсутствием нужного вайба. Тогда пошли от обратного: начали искать устойчивые визуальные образы — свечи, витражи, загадочные атрибуты. Сработало. Стало чуть жутковато… но именно так, как нужно.

Проблема «пересекающихся» вайбов
На практике всё оказалось сложнее, чем в теории. Одно и то же фото может считываться по-разному в зависимости от контекста. Например, на фото — кафе, в котором однотонный интерьер, розетки, спокойный свет. Супер для работы, да?

А если посмотреть получше: рядом — яркие игрушки, детская зона, столики с раскрасками. Плюсик для родителей, минус для тех, кто ищет тишину.
Такие конфликты не просто часты — они повсеместны. Пришлось вводить логику исключений и уточнений, чтобы не вводить пользователей в заблуждение. Ведь если ты ожидаешь атмосферу коворкинга, а попадаешь на детский утренник — настроение будет, мягко говоря, не то.
Ориентироваться не только на фотографии
Важно не только то, что можно увидеть глазами. Например, вайб «полезная еда». Разные по калорийности боулы на фото могут выглядеть идентично. А салат с курицей внешне может не отличаться от такого же с майонезной заправкой.
Тут нам помогают отзывы. Когда люди пишут «здоровое меню», «без сахара», «натуральные продукты» — это прямой сигнал. Тогда мы подключили NLP, чтобы вытягивать значимые критерии вайбов из текста, там, где визуал бессилен.
Этот комбинированный подход расширил границы: какие-то вайбы определяет картинка (интерьер, свет, композиция), какие-то — только слова. Вместе они дают куда точнее попадание в реальные ожидания пользователя.
LLM вместо ручной разметки
Раньше мы шли по классическому маршруту: отдавали фотографии на крауд-платформу, писали инструкции, готовили описания каждого класса для разметчиков — и получали результат. И с большинством задач это работало хорошо: крауд даёт результат достаточно быстро, потому что выполняется десятками, а то и сотнями людей одновременно. Но с вайбами всё оказалось сложнее.
Учитывая, что они не поддаются чёткой формализации — тут нужно не столько фиксировать конкретный объект на фото, сколько пытаться уловить атмосферу. И вот тут начинаются проблемы: одну универсальную инструкцию для разметчиков не напишешь, критерии рождаются буквально в процессе. На одном проекте для одного вайба мы сменили промпт десятки раз — на крауде каждый такой виток означал бы, что нужно переписывать инструкции, переделывать контрольные примеры, сносить навыки каждого разметчика и запускать новую разметку. Итерации стали бы невероятно долгими.
С LLM всё прошло проще: написали промпт, прогнали на тысяче изображений, поняли, что нужно подкорректировать — внесли правки в текст и снова запустили. Быстрые циклы, минимум рутинной нагрузки и гибкость в экспериментировании — именно этого и не хватало в работе с такими размытыми категориями.
Итак, что мы сделали:
- написали промпты под каждый вайб (например: «романтическая обстановка», «уютное кафе»); 
- собрали скрипты, которые гоняли эти промпты вместе с изображениями через модели; 
- использовали сразу несколько LLM, чтобы поймать разные нюансы и перепроверять друг друга. 
Плюсы такого подхода оказались очевидны:
- первую выборку можно собрать буквально за день — можно мгновенно стартовать с экспериментами; 
- многократной разметки и досконального контроля качества не требуется: скрипты разметки справляются с этим самостоятельно; 
- можно распараллелить процесс — каждый вайб уходит своим ходом; 
- после каждого прогона можно показать результаты продакту и легко внести коррективы в критерии классов, перепрогоняя в моменте разметку без лишних затрат; 
- в нашем случае себестоимость вышла ниже крауд-разметки. 
Но, конечно, не всё так идеально. Есть и свои ограничения:
- предсказания LLM не всегда стабильные: где-то модель угадывает вайб интуитивно верно, а где-то — непредсказуемо промахивается; 
- для более сложных кейсов (например, подсчёт объектов или выявление отношений между ними) LLM пока часто уступает хорошо обученному крауду; 
- в сложных проектах или при высокой чувствительности к ошибкам LLM скорее инструмент для старта, а не финальный источник истины; 
- а ещё — в некоторых случаях инференс LLM может выйти дороже ручной разметки, особенно если объёмы большие и модели облачные. 
Технология: InternVL-3 + промптинг
В качестве основной мультимодальной модели мы выбрали InternVL-3. Почему она?
Во-первых, она умеет понимать не просто «на картинке котик», а видеть контекст. Комната тёмная или светлая, какое настроение у сцены, как расставлены акценты — всё это модель анализирует в связке с текстом.
Во-вторых, она zero-/few-shot. То есть ты можешь просто скормить ей промпт без обучения — и она уже даст осмысленный ответ. Для быстрого старта — идеальный инструмент.
И наконец, InternVL — open-source, хорошо работает локально и воспроизводима. Это значит, что мы можем хранить и гонять свои данные, не передавая их на сторону.
Для полноты картины мы сравнивали InternVL и с GPT-4V. Качество предсказаний, честно говоря, оказалось плюс-минус сопоставимым: обе модели давали адекватные результаты на старте. Но InternVL для нас оказался гораздо экономичнее: запускали на собственном железе, без затрат на облачный инференс, и спокойно обрабатывали нужные объёмы. Так что выбор оказался скорее практическим: в тех условиях InternVL был просто оптимальнее.
Как всё это работало по шагам
Вот наш пайплайн:
- Собрали большую выборку фотографий — кафе, рестораны, фастфуд и так далее. 
- Определили целевые «вайбы». Например: «романтика», «подходит для семьи с детьми», «добавить мистики», «пофоткаться». 
- На каждый придумали промпты — текстовое описание, что мы ожидаем увидеть. 
- Прогнали каждую фотку через InternVL с этими промптами. 
- Модель выдала скор — насколько это фото соответствует описанию. 
- Определили подходящий скор для каждого класса, на котором происходит адекватная фильтрация подходящих фото. 
- Фотки, где уверенность выше порога, — ушли в соответствующий класс. 
- Эти классы мы использовали для обучения моделей классификации, чтобы потом быстро прогонять большие массивы фотографий. 
Таким образом, InternVL выступал не просто как фильтр. Он был нашим «учителем», который помог собрать датасет из необработанных фото.

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

К сожалению, у InternVL-3 есть проблема — подсчёт объектов. В примере с бокалами, где важно точное количество объектов на фото, возможны ошибки, поэтому лучше стараться обходиться без численных критериев в промптах при использовании этой модели. Однако есть другие LLM-модели, которые справляются с подсчётом лучше — например, GPT. В таких чувствительных критериях при наборе данных мы использовали их для валидации.
В другом примере с вайбом «Аутентично» пришлось тоже повозиться с промптами, потому что в выборке ожидалось единое оформление в традиционном стиле разных народов мира. Однако модель поначалу реагировала на единичные объекты в оформлении, не дающие цельный аутентичный вайб.

Что делать с неоднозначными кейсами
Иногда один промпт — слишком широкий и «цепляет» ненужное. Тогда у нас два приёма.
Первый — завести дополнительную категорию. То, что на границе или слабо подходит, уходит туда. Так основной класс становится чище.
Второй — перепроверка. Подозрительные фото пускаем через суженные промпты или уточнённые проверки. Если сомнения сохраняются — человек смотрит вручную или фото уходит в «gray zone».
Комбинация этих подходов стабильно снижала шум в выборке — особенно в сложных или размытых категориях.
Где брать фото дальше?
Если после прогона тестовой выборки подходящих для датасета фотографий оказалось недостаточно, то можем прогнать дополнительные выборки фото текущим скриптом и забрать то, в чём уверены.
Не хватает экстремальных примеров или «редких случаев»? Возвращаемся к крауду, собираем пул разметки и размечаем вручную.
LLM или крауд-разметка — что выбирать?
Откровенно: LLM сильно сокращают время на старте. Особенно если категории расплывчатые, меняются каждую неделю или если разметчики психологически устают от «ощущения романтики». У нас как-то был случай, когда один из них написал нам при разметке «Позитивной атмосферы на фото»: «Я не знаю, какое фото считать более позитивным, потому что сам ничего позитивного в жизни не вижу».
Крауд — надёжен, когда нужно точное, пересматриваемое решение. Например, для наличия на фотографии объекта или визуальных особенностей.
Вывод: лучше всего работает гибрид. LLM — старт, объём, черновая база. Крауд — допил, проверка, особенные кейсы.
Что ещё было важно
Несколько наблюдений из практики:
- Формулировка промпта — суперчувствительная штука. Сменил одно слово — поменялась вся смысловая нагрузка. 
- Модель нормально реагирует на сцены, где главное — не в центре. Это бывает критично. 
- Добавление «нейтральных» фото в выборку негативов помогало обучить модель с лучшим разделением. 
- Простые категории (детские игрушки, клубника в бокале) обрабатываются почти без промахов — промпты для них мега-простые. 
- Постобработка и фильтрация всё равно нужны — полной магии не получилось. 
Финальный шаг
Когда собрали чистые датасеты по вайбам и обучили по каждому отдельную модель классификации, прогоняем все фотографии через полученные модели и определяем минимальное количество подходящих фото для подтверждения наличия нужного вайба.
То есть, если в карточке организации не просто одна, а несколько фотографий проходят заданный порог уверенности — только тогда назначаем фирме наличие нужного вайба.
Полученный профит:
- быстро оцениваем новые фото без обращения к LLM/InternVL; 
- фильтруем рестораны по запрашиваемым вайбам в интерфейсе поиска. 
Что дальше
Планируем наращивать количество категорий — например, сделать свои вайбы для отелей и баз отдыха.
Итоги
Использование мультимодальных моделей и LLM-сборки — это не просто актуально. Это реально удобно. Благодаря такому инструментарию мы:
- получили рабочие датасеты буквально за день-два; 
- ушли от тяжеловесного и дорогого крауда на этапах эксперимента; 
- научились переводить субъективные «ощущения» во вполне объективную метрику; 
- и при этом — сохранили гибкость, возможность аудита и контроль качества. 
Конечно, модель не заменит человека полностью — но в связке с настоящими UX-инсайтами, текстовыми данными и расписанными логиками она даёт то, что нужно продукту. Быстро, разумно и с ощущением волшебства.
Если захотите работать в 2ГИС, то у нас открыты вакансии Data Scientist в две команды (NLP Core и NLP Search)и могут появится ещё. Смотреть всё можно здесь.
 
          