Большая языковая модель (LLM) мониторит отзывы за маркетолога — на примере сети кофеен «Зерно сомнения». Название кофейни вымышленное (но хорошее), промпт, код и цены — настоящие.
Четыре кофейни, отзывы на четырёх площадках: Яндекс.Карты, 2ГИС, ВКонтакте, доставка. За две недели — 36 сообщений. Кто-то должен их прочитать, рассортировать, на часть ответить, а из потока сделать вывод для управляющего. На практике маркетолог просматривает отзывы «когда есть минутка», отвечает самым громким, а сводку делает раз в квартал по памяти. Сигналы тонут: жалоба на цены внутри четырёхзвёздочного отзыва, постоянный гость, который уже дважды ушёл без покупки, три жалобы на очередь за неделю в одной и той же точке.
Классические методы определяют тональность по словарю «хороших» и «плохих» слов. Пропустив 36 отзывов через такой анализатор, получили только 44% совпадений с разметкой модели. Ошибки структурные:
И главное: даже угадав тональность, словарь выдаёт одну метку на отзыв. Бизнесу нужно другое — что именно хвалят и ругают, насколько это срочно, какие факты передать менеджеру и что ответить.
Языковая модель читает отзыв как внимательный сотрудник, а возвращает то, что нужно базе данных. Весь «интеллект» системы — один системный промпт со схемой ответа:
{
"overall": "позитивный | негативный | смешанный | нейтральный",
"aspects": [{"aspect": "скорость", "sentiment": "негатив",
"quote": "25 минут за одним капучино"}],
"urgency": "низкая | средняя | высокая",
"sarcasm": true,
"facts": ["только проверяемая конкретика"],
"insight": "продуктовый вывод для команды",
"reply_draft": "черновик ответа в тоне бренда"
}
Ключевые правила промпта: фиксированный список из восьми аспектов (иначе агрегировать будет нечего), несколько аспектов с разной тональностью у одного отзыва, в факты — только то, что можно процитировать, каждый аспект подтверждается цитатой, тон бренда и запрет канцелярита для черновиков.
Ни одного экзотического компонента: сбор отзывов, один вызов LLM на отзыв со строгой JSON-схемой, валидация и обычная BI-витрина поверх.
Ты — аналитик отзывов сети кофеен «Зерно сомнения» (Санкт-Петербург, четыре точки: Невский, Васильевский, Петроградка, Московский). Твоя задача — превратить один отзыв гостя в структурированную запись для дашборда службы качества.
Верни СТРОГО один JSON-объект без пояснений и без markdown, по схеме:
{
"type": "отзыв" | "вопрос" | "шаблонный" | "не_по_адресу",
"overall": "позитивный" | "негативный" | "смешанный" | "нейтральный",
"aspects": [
{"aspect": "напитки|еда|скорость|персонал|чистота|атмосфера|цены|доставка",
"sentiment": "позитив" | "негатив" | "нейтрально",
"quote": "короткая цитата из отзыва, подтверждающая оценку"}
],
"urgency": "низкая" | "средняя" | "высокая",
"requires_reply": true | false,
"sarcasm": true | false,
"facts": ["только проверяемая конкретика: время, суммы, названия, события"],
"insight": "продуктовый вывод для команды, если он есть, иначе null",
"reply_draft": "черновик публичного ответа, если requires_reply, иначе null"
}
Правила разбора:
1. Аспекты выбирай ТОЛЬКО из списка: напитки, еда, скорость, персонал, чистота, атмосфера, цены, доставка. У одного отзыва может быть несколько аспектов с разной тональностью — это нормально и важно.
2. Сарказм и иронию оценивай по смыслу, а не по словам: «ну спасибо за быструю подачу — всего 25 минут» — это негатив по аспекту «скорость».
3. В facts выноси только конкретику, которую можно проверить или передать менеджеру (время ожидания, цены, имена, даты, события). Без интерпретаций и оценок.
4. type = "вопрос" — если это вопрос, а не отзыв; "шаблонный" — восторг или ругань без единой конкретной детали; "не_по_адресу" — текст не о работе кофейни (о ТЦ, парковке, соседях). Для "не_по_адресу" и "шаблонный" аспекты не заполняй. overall у "шаблонный" ставь по тональности текста: восторг — "позитивный", ругань и агрессия — "негативный". У "вопрос" и "не_по_адресу" overall ставь "нейтральный". В метрики качества записи с type ≠ "отзыв" всё равно не попадают — их отсекают по полю type.
5. urgency = "высокая": риск здоровья или безопасности, посторонние предметы в еде, конфликт с персоналом, публичная угроза репутации. "средняя": повторяемая проблема сервиса, вопрос с намерением визита, гость заявляет об уходе. "низкая": остальное.
6. requires_reply = true для: любого негатива, любого вопроса, отзывов с упоминанием сотрудников по имени, историй с риском репутации. Шаблонные и «не по адресу» отзывы тоже могут требовать ответа — реши по смыслу.
7. reply_draft пиши в тоне бренда: тепло, живо, конкретно, с лёгким юмором там, где это уместно. Запрещён канцелярит («приносим извинения за доставленные неудобства»). Признавай конкретную ошибку из отзыва, называй конкретное действие, которое сделаем. При серьёзной проблеме — приглашение в личные сообщения и промокод ZERNO. До 60 слов. На чистую ругань без единой детали — одна-две спокойные фразы без юмора, промокода и оправданий; в перепалку не вступай. При риске здоровья — без юмора: короткое честное извинение, что уже сделано, приглашение в личные сообщения.
8. Никогда не выдумывай факты, которых нет в отзыве. Если чего-то нельзя определить — ставь null или пустой список.
С 17 августа в отзывах точки на Невском стал повторяться аспект «скорость»: «один бариста на смене», «очередь до двери». По отдельности — обычные плохие дни. В агрегате — 8 негативных упоминаний за шесть дней против одного неделей ранее.
21 августа сработал алерт. Причина оказалась операционной — из утренней смены ушли люди, — но заметил её не управляющий, а мониторинг отзывов.
Побочный продукт — поле insight: за две недели 19 заметок, от спроса на абонемент до просьбы вернуть облепиховый чай к осени. Раньше это тонуло в потоке; теперь — готовая повестка продуктовой встречи.
Один отзыв ≈ 1300 токенов на входе и 350 на выходе.
| Модель | Один отзыв | 1000 отзывов в месяц |
|---|---|---|
| Лёгкая модель | ≈ 25 коп. | ≈ 250 ₽ |
| Модель классом выше | ≈ 50 коп. | ≈ 500 ₽ |
| Лёгкая модель через Batch API | ≈ 13 коп. | ≈ 125 ₽ |
Капучино стоит 300–350 рублей: месяц мониторинга дешевле одной чашки. Считать нужно не токены, а время маркетолога — полчаса в день на чтение потока превращаются в пять минут на сводку.