У меня есть WhatsApp-чат с горничными. Каждый день туда летят десятки сообщений — кто заехал, что сломалось, где грязно, кто не доволен. И фотографии. Много фотографий. Фото треснувшей плитки. Скриншот переписки с гостем. Чек из магазина с покупками для виллы. Фото кондиционера, который гудит.
Проблема была простая и дурацкая: мой бот умел читать только текст. Фото он видел как "вложение" и молча игнорировал. Проходил мимо, как будто ничего не было. А горничные — особенно балийские — часто говорят картинкой. Не пишут "кондиционер не работает", а присылают видео, где он гудит. Не объясняют про гостя словами, а скидывают скриншот переписки. Без единого слова в тексте сообщения.
Весь этот контекст просто терялся. Бот делал вид, что сообщения не было.
24 марта я это починил. Теперь бот видит фотографии. Скачивает, анализирует и действует. Первое реальное срабатывание случилось через несколько минут после запуска.
Почему это важнее, чем кажется
Когда управляешь 16 виллами удалённо, информация — это всё. Каждая деталь, которую ты пропустил, потенциально превращается в плохой отзыв, конфликт с гостем или дорогой ремонт, который мог быть дешёвым, если бы поймали раньше.
Я построил систему мониторинга, которая анализирует чат горничных и создаёт алерты. Протечка → алерт в систему → задача менеджеру → решено до заезда следующего гостя. Это работает хорошо, когда информация приходит текстом. Но реальность устроена иначе.
Горничные не думают о том, в каком формате удобнее боту. Они думают: "хочу передать информацию быстро". Самый быстрый способ — сфотографировать. Отсюда результат: добросовестный работник отправил фото проблемы, а система сделала вид, что ничего не было. Проблема не попала в алерты. Никто не отреагировал. Гость приехал и написал плохой отзыв.
Слепое пятно системы — это не технический баг, это управленческий риск. Если информация поступает, но система её не видит, для всех остальных она выглядит как "информации не было".
Как работает распознавание фотографий
Технически решение состоит из двух частей: скачивание медиафайлов и их анализ.
Скачивание. WhatsApp Business API позволяет получить медиафайл по его идентификатору. Когда бот получает сообщение с фото, в объекте сообщения есть поле media_id. По нему делаешь запрос к API — получаешь URL для скачивания файла. Скачиваешь файл. Всё, у тебя есть изображение.
Анализ. Это делает GPT-4o Vision — модель, которая умеет смотреть на картинки и отвечать на вопросы о них. Я отправляю изображение и промпт примерно такого содержания: "Ты помощник по управлению виллами на Бали. Посмотри на это фото. Определи: это документ, фото помещения/проблемы с виллой, или скриншот переписки? Если это проблема с виллой — опиши что именно. Если это переписка — передай суть. Если это чек — укажи сумму и назначение."
Модель возвращает структурированный ответ. На его основе бот создаёт алерт или задачу так же, как если бы это было текстовое сообщение.
Первое реальное срабатывание
Через несколько минут после запуска в чат пришло сообщение от менеджера по бронированиям. Она прислала скриншот переписки с гостем — полностью, как картинку. Текста в сообщении ноль. Тема переписки: гость забыл вещи на вилле, просит найти и сохранить.
Раньше бот бы это пропустил. Вложение — игнор. Ничего не произошло.
Теперь бот скачал скриншот, прогнал через GPT-4o Vision, получил ответ: "Переписка с гостем. Гость забыл личные вещи на вилле №8 (из контекста переписки). Просит сохранить до следующего визита." На основе этого создал алерт с категорией "забытые вещи", прикрепил к вилле, поставил задачу горничной на этой вилле проверить и сохранить.
Весь процесс без единого текстового слова в исходном сообщении. Система увидела, поняла, отреагировала.
Что ещё стало видно: villa health report
Параллельно с распознаванием фото я сделал отчёт по "здоровью" каждой виллы. Это агрегированная сводка: сколько алертов за последний месяц, какие категории (сантехника, электрика, жалобы гостей, уборка), как быстро решались, как это соотносится с оценками гостей.
И вот тут обнаружился второй неприятный факт. Из всех исторических алертов в системе — 60% не были привязаны к конкретной вилле. Алерт есть, проблема есть, а к какому объекту это относится — неизвестно. Бесполезные данные. Ты знаешь что что-то сломалось, но не знаешь где.
Причина банальная: когда систему запускали, поле "вилла" не было обязательным. Алерты создавались как придётся. Накопилось несколько месяцев записей, которые теперь не расскажут тебе ничего конкретного.
Я починил это двумя способами. Во-первых, сделал привязку к вилле обязательной — алерт без виллы теперь не создаётся, система возвращает ошибку. Во-вторых, написал скрипт для ретроспективной разметки: берёт старые алерты без привязки, смотрит на текст и пытается определить виллу по упоминаниям, номерам комнат, именам гостей из других записей. Процентов 40 удалось размотать автоматически, остальное осталось в категории "неопределено".
Если 60% ваших данных не привязаны к объекту — это не данные, это шум. Вы знаете что что-то происходит, но не знаете где и с кем. На шуме нельзя принимать управленческие решения.
Категории проблем и как это влияет на управление
Когда villa health report заработал на чистых данных, стали видны паттерны, которых раньше не замечал.
Одна вилла стабильно лидировала по количеству алертов категории "электрика". Пять, восемь, одиннадцать обращений за квартал. Каждый раз — разная проблема, разный электрик, разный счёт. По отдельности это выглядело как "нормальные поломки". Вместе — как сигнал, что проводка устарела и нужен не точечный ремонт, а капитальный.
Другая вилла имела высокий процент жалоб на уборку при хороших оценках в целом. Оказалось — горничная хорошая, но работает в паре с другой, у которой стандарты ниже. Алерты создавала одна из них про работу другой, а общая оценка от гостей пострадала только по конкретным параметрам. Без разбивки по категориям это было не видно.
Villa health report дал не просто статистику — он дал язык для разговора с проблемами. Теперь на еженедельном совещании с менеджерами я открываю не "ощущения как дела", а конкретный отчёт: вилла, категория, тренд, корреляция с оценками.
Как выглядит промпт для распознавания
Промпт — это то, что определяет качество работы всей системы. Вот приблизительная структура того, что я отправляю вместе с изображением:
Первая часть — контекст. Я объясняю боту кто он и зачем смотрит на эту картинку. "Ты ассистент по управлению виллами на Бали. Тебе прислали фото из рабочего чата горничных и менеджеров."
Вторая часть — классификация. "Определи к какой категории относится изображение: документ/договор, проблема с объектом (поломка/уборка/техника), скриншот переписки, чек/квитанция, фото объекта для каталога, или что-то другое."
Третья часть — извлечение данных. В зависимости от категории — разные вопросы. Для проблемы с объектом: "Опиши что именно сломано или не в порядке. Если видна вилла или номер комнаты — укажи. Насколько срочно требует внимания?"
Четвёртая часть — формат ответа. Я прошу JSON — это позволяет коду легко разобрать ответ и создать нужную запись в базе данных без дополнительного парсинга.
Важный момент: если GPT-4o не уверена в чём-то — она должна сказать об этом, а не придумывать. "confidence: low" в ответе — сигнал для бота, что алерт нужно дополнительно проверить, прежде чем отправлять менеджеру.
Стоимость решения
Распознавание одного изображения через GPT-4o Vision стоит примерно $0.002-0.005 в зависимости от его размера и детальности промпта. За день в наш чат приходит в среднем 15-20 изображений. Значит расходы на распознавание — порядка $0.05-0.10 в день, или $1.5-3 в месяц.
За это я получаю: система видит 100% информации из чата вместо, условно, 60% (которые приходили текстом). Один пропущенный алерт про поломку может стоить $50-200 срочного ремонта или плохого отзыва, который обходится дороже. Экономика очевидная.
Это часть более широкого принципа: дешевле платить небольшие суммы за качественный мониторинг, чем пропускать проблемы и платить за их последствия. О том как я в целом считаю стоимость AI-инфраструктуры — в статье про аудит AI-штата.
Что изменилось в операционке
Главный эффект — психологический, а не технический. Горничные перестали думать о формате. Хочешь сообщить о проблеме — снимай как удобно. Текст, голосовое, фото, скриншот. Система это переварит.
Это важно, потому что барьер между "заметила проблему" и "сообщила о проблеме" должен быть нулевым. Каждый шаг — нужно подумать как написать, нужно найти слова, нужно объяснить — это потенциальный момент, когда человек решает "ладно, не важно, не буду сообщать". А потом приезжает гость и видит то, что давно надо было починить.
После запуска распознавания фото количество алертов выросло примерно на 30%. Не потому что стало больше проблем. А потому что система наконец увидела то, что всегда было, но раньше не замечала.
Для меня это принципиальный момент в построении AI-систем для операционки: система должна адаптироваться к тому, как говорят люди — а не люди должны учиться говорить так, как понимает система. Это звучит очевидно, но в реальности большинство автоматизаций работает наоборот. Ты внедрил бот и объясняешь сотрудникам: "нужно писать вот так, иначе бот не поймёт". Это плохая система.
Следующий шаг: голосовые сообщения
После фото встал следующий очевидный вопрос: а голосовые? Горничные любят голосовые ещё больше, чем фото. Особенно балийские — русским они почти не пишут, но голосовых накидают с охотой.
Сейчас система умеет транскрибировать голосовые через Whisper — это модель OpenAI для распознавания речи. Скачиваем аудиофайл, отправляем в Whisper, получаем текст, дальше тот же pipeline что для текстовых сообщений. Работает с русским, английским, индонезийским — что актуально для Бали, где команда смешанная.
Теперь в чате горничных нет слепых пятен. Текст, фото, голосовое — всё анализируется. Система видит всё что происходит. А значит, я тоже вижу — даже когда я в другом часовом поясе, даже когда сплю. О том как выстроена система мониторинга в целом и почему важно следить за результатами, а не только за состоянием — отдельная статья про мониторинг.
Что это меняет в управлении на расстоянии
Я управляю 16 виллами не находясь физически на каждой из них. Это возможно только если информация течёт без потерь. Каждое слепое пятно — это зона, где ты управляешь вслепую. Принимаешь решения без данных. Иногда везёт, иногда нет.
Добавление распознавания фото закрыло одно из самых больших слепых пятен. Оперативная информация с объектов теперь доходит в полном объёме. Фото сломанного замка, скриншот жалобы гостя, снимок засора в канализации — всё это теперь часть системы, а не потерянное сообщение без текста.
Параллельно villa health report дал второй уровень видимости — не оперативный, а стратегический. Теперь раз в неделю я вижу не "что происходит прямо сейчас", а "что происходит с каждым объектом в динамике". Это два разных типа управленческой информации, и хорошая система должна давать оба.
Принцип, который стоит за всем этим: автоматизация операционки начинается с полноты данных. Можно построить сколько угодно красивых дашбордов и отчётов, но если 30-40% информации теряется на входе — все аналитические надстройки будут неточными. Сначала полнота, потом аналитика.
На 16 виллах с десятками людей в команде каждый инструмент, который снижает потери информации — это прямая инвестиция в качество управления. Бот видит фотографии. Значит, я вижу фотографии. Значит, ничего не теряется. Это и есть операционная автоматизация в своём практическом применении.