В этой статье я расскажу про свой опыт решения рабочей задачи — анализ отзывов пользователей о компании. Мы разберем возможные ошибки и посмотрим на пример кода и реальных данных. Гайд будет полезен всем, у кого нет большого опыта в анализе данных или работе с LLM через API.

  1. Постановка задачи

  2. Подготовка данных

  3. Ошибочный подход к решению

  4. Надежный подход

  5. Другие подходы

  6. Вывод

Постановка задачи

Чтобы не нарушать NDA, и компания, и все примеры в этой статье будут вымышленными. Давайте представим, что вы работаете в Яндекс.Еде — крупном сервисе-агрегаторе по доставке еды из ресторанов и продуктов из магазинов.

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

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

Чтобы было понятнее, давайте посмотрим на конкретные примеры.

Подготовка данных

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

Вот темы, о которых могли писать люди в опросе о работе Яндекс.Еды:

  • Жалоба на долгое время доставки.

  • Еда не такая вкусная, как в ресторане.

  • Благодарность за то, что все работает отлично.

  • Магазин забыл что-то положить в заказ.

И так далее, полный список тем ниже:

Список всех тем для отзывов
  1. Жалоба на долгое время доставки.

  2. Недовольство тем, что реальное время доставки не совпадает с обещанным.

  3. Жалуются, что часто привозят поврежденные продукты. Например, мороженое растаяло или ягоды помялись.

  4. Ругаются, что курьер не может найти клиента.

  5. Недовольство, что я описал курьеру подробно инструкцию, как меня найти, а он все равно звонит.

  6. Не сработал промокод.

  7. Благодарность за то, что все работает отлично и очень удобно.

  8. Жалоба на приложение - постоянно либо зависает, либо вылетает, либо телефон греется, и тд.

  9. Еда не такая вкусная, как в ресторане.

  10. Жалоба, что курьер не разговаривает на моем языке.

  11. Недовольство ценами. Например, на рынке можно овощи купить дешевле, или в магазине у дома дешевле пельмени, и тд.

  12. Долгое время приготовления заказа в ресторане. Напрмимер, не понимаю почему кофе нужно полчаса готовить.

  13. Приезжает неполный заказ - забыли положить вилку и ложку, или забыли салфетки и тд.

  14. Ругаются на то, что ресторан перепутал требования к заказу. Например, я просил безлактозное молоко, а добавили обычное. Или прожарка стейка не такая.

  15. Я долго выбирал продукты, а в итоге магазин написал, что определенный продукт закончился и не сможет привезти - надо сразу делать продукт недоступным для выбора.

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

  • "КУРЬЕР зачем ты мне звонишь, я же написал где меня найти!!"

  • "Зачем в приложении показывать продукты, которых нет в наличии? Потратил кучу времени на выбор, а потом половина списка оказалась недоступной. Пожалуйста, решите эту проблему."

  • "К бургеру даже салфетку не дали, неприятно."

  • "Цены на овощи завышены, на рынке вышло бы вдвое дешевле."

Всего получилось около 4,000 отзывов — полный список можно посмотреть по ссылке. Среди них есть как подробные, так и короткие. Иногда люди пишут грамотно, а иногда с опечатками и без знаков препинания. В общем, все как в жизни.

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

Ошибочный подход к решению

На практике я заметил, что многие переоценивают возможности ChatGPT. Так возникает желание просто отправить список со всеми отзывами в LLM и попросить сформулировать категории, на которые можно разделить ответы людей.

Формально, никакой проблемы тут нет. Согласно документации, в контекст модели влезает до 128,000 токенов:

Характеристики лучшей модели OpenAI - GPT-4o
Характеристики лучшей модели OpenAI - GPT-4o

Наш датасет размером 107,000 токенов, то есть влезает с запасом. Но попробуем попросить ChatGPT его проанализировать. Это можно сделать с помощью этого кода. Вот полученный результат:

Ответ от ChatGPT - Выделенные темы из всех отзывов

На основе предоставленных отзывов можно выделить несколько ключевых тем, связанных с услугами компании:

Проблемы с доставкой и курьерами:

  1. Длительное время доставки: многие клиенты указывают, что доставка длится гораздо дольше, чем было обещано, часто превышая 1-2 часа.

  2. Проблемы с навигацией курьеров: курьеры часто теряются, не могут найти адрес или подъезд. Часто звонят клиентам для уточнения.

  3. Холодная еда: из-за долгой доставки еда часто приезжает холодной.

  4. Систематическое опоздание: клиенты жалуются на постоянные опоздания доставки.

Качество и точность заказа:

  1. Ошибки в заказе:

    • Привозят не тот заказ.

    • Не учитывают аллергии и предпочтения (ложат нелюбимые ингредиенты или аллергенные продукты).

  2. Неполные заказы: забывают приборы, салфетки, ложки и вилки.

  3. Некачественная упаковка: продукты часто повреждены, разбиты или разломаны.

  4. Проблемы с точностью заказа: не выполняются специальные пожелания клиентов по безглютеновым продуктам, исключению ингредиентов и т.д.

Приложение и проблемы с товарами:

  1. Неправильное отображение наличия товаров: в приложении показываются товары, которых нет в наличии.

  2. Высокие цены: многие клиенты жалуются на завышенные цены на продукцию по сравнению с магазинами.

  3. Технические проблемы: приложение часто зависает, не работает корректно или тормозит.

Клиентский сервис:

  1. Отсутствие извинений и компенсаций: в случае проблем с доставкой и заказом клиенты не получают извинений или рекомендаций по компенсации.

  2. Неудовлетворенная поддержка: проблемы не всегда решаются, многие клиенты жалуются на неэффективную работу службы поддержки.

Качество продуктов:

  1. Поврежденные и непрезентабельные продукты: помятые, поврежденные, протекшие продукты, что вызывает разочарование у клиентов.

  2. Несоответствие заявленному: качество еды и продуктов не соответствует ожиданиям.

Проблемы с инструкциями для курьера:

  1. Игнорирование инструкций: Курьеры не следуют подробным инструкциям, указанным в заказе.

  2. Постоянные звонки: несмотря на написанные инструкции, курьеры продолжают звонить клиентам и спрашивать дорогу.

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

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

  • Проблемы с промокодами.

  • Жалобы на вкус еды.

  • Положительные отзывы.

    • Обратите внимание, что в промпте я специально попросил выделять и позитив, так как для бизнеса важно понимать, что нравится клиентам. Но ChatGPT указал только на жалобы.

  • Языковой барьер с курьерами.

    • В датасете больше 100 отзывов, где клиенты жалуются на курьеров, которые не говорят на их языке. ChatGPT эту тему не заметил.

  • Долгое время приготовления блюд.

    • ChatGPT выделил проблему долгой доставки, но в клиенты часто отделяют время приготовления заказа от самой доставки, и жалуются именно на первое.

В итоге видим, что результат далек от идеального. Кратко посмотрим на причины этого:

Причины невнимательности ChatGPT

Еще год назад ученые из Стэнфорда выпустили статью, где рассказали, что LLM хуже запоминают контекст, который стоит в середине промпта. Наш датасет составлен как раз таким образом, что некоторые темы встречаются только в середине списка, и не встречаются ни в первых 1,000 строчках, ни в последних.

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

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

Надежный подход к решению

Чтобы решить проблему невнимательности, я предлагаю такой подход:

  1. Получение эмбеддингов. Переведем все отзывы в вектора - эмбеддинги.

  2. Кластеризация эмбеддингов. Разобьем наши отзывы на смысловые кластеры.

  3. Выделение темы из кластеров. С помощью ChatGPT опишем каждый кластер.

  4. Объединение тем. Получим финальный список тем по всем кластерам без повторов.

  5. Подсчет статистики. Определим количество отзывов для каждой категории.

Получение эмбеддингов

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

Мы должны для каждого из наших 4,000 отзывов получить свой эмбеддинг. Для этого я буду использовать API OpenAI и их модель text-embedding-3-large. Вы можете выбрать любую другую модель, в том числе и open source, но обработка всех отзывов самой мощной доступной в API моделью стоила всего 1,3 рубля.

Визуализация эмбеддингов

Когда у нас есть эмбеддинги для каждого из отзывов, мы сначала понизим их размерность, чтобы посмотреть на них в 2D. Для этого используем алгоритм t-SNE. В результате получится такая картинка:

Визуализация всех наших отзывов в 2D с помощью эмбеддингов
Визуализация всех наших отзывов в 2D с помощью эмбеддингов

Тут каждая точка — это один отзыв. Видно, что все они разбиваются на несколько кластеров — категорий. Причем некоторые кластеры очень маленькие (самый верхний, по центру). Вероятно, в прошлом подходе ChatGPT как раз не заметил такие маленькие категории.

Кластеризация эмбеддингов

Здесь самое сложное — выбрать количество кластеров, на которое будем разбивать отзывы. Глядя на картинку, можно увидеть около 15 выделяющихся кластеров, но для надежности давайте возьмем побольше. Например, выделим 25 кластеров. В итоге мы все равно сможем склеить повторяющиеся в один. Для кластеризация воспользуемся классическим алгоритмом K-means:

Все наши отзывы кластеризованы с помощью K-means
Все наши отзывы кластеризованы с помощью K-means

Теперь каждый отзыв принадлежит к одному кластеру. Мы пока не знаем, чем объединены все отзывы внутри кластера, но т.к. используются текстовые эмбеддинги, мы можем предполагать, что все отзывы в кластере будут иметь какую-то общую тему.

Выделение темы из кластеров

Для каждого кластера мы возьмем список отзывов, которые к нему принадлежат, и попросим ChatGPT выделить 1 тему, которой объединены все отзывы данного сегмента:

Ответ от ChatGPT

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

Проблемы, которые упоминают клиенты:

  1. Курьеры не следуют инструкциям - клиенты пишут подробные комментарии с указаниями, но курьеры их игнорируют или не читают.

  2. Курьеры теряются - даже с точными координатами и инструкциями курьеры не могут найти нужное место.

  3. Множество звонков - курьеры звонят несколько раз, чтобы уточнить путь, что вызывает неудобства для клиентов.

  4. Задержки в доставке - из-за потерь времени на поиски заказа, доставка часто задерживается.

  5. Приложение/навигация - кажется, что навигация в приложении или использование GPS курьерами неэффективно.

  6. Обучение курьеров - клиенты выражают недовольство уровнем профессионализма курьеров и недостаточностью их навыков по ориентации на местности.

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

Cluster 1:
Тема, про которую писали пользователи, очевидна: долгое время приготовления и доставки заказов. Клиенты массово жалуются на то, что приготовление еды в ресторанах и кафе занимает слишком много времени, и это касается как простых, так и более сложных блюд. Также упоминались задержки в доставке, из-за чего еда приходит холодной или растаявшей. Пользователи выражают недовольство тем, что приходится ждать от 40 минут до двух часов и более, что значительно превышает обещанное время доставки, указанное в приложении.

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

Клиенты испытывают недовольство из-за следующих моментов:

  • Частые случаи растаявшего мороженого и других замороженных продуктов.

  • Продукты приходят помятыми или в неудовлетворительном состоянии.

  • Долгое время доставки, что приводит к порче продуктов.

  • Низкое качество упаковки и транспортировки, что не обеспечивает нужные условия хранения продуктов.

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

Cluster 3:
Тема, объединяющая все ответы в форме опроса, заключается в недоступности товаров, которые показываются как доступные в приложении. Клиенты выражают недовольство тем, что они могут выбрать и оплатить продукты или блюда, которые затем оказываются недоступными. Основные жалобы сосредоточены на необходимости указывать отсутствие товара заранее и обеспечивать обновление наличия товаров в реальном времени, чтобы избежать разочарования и потери времени.

Cluster 4:
Из предоставленных ответов опроса клиентов компании по доставке еды и продуктов можно выделить две основные темы:

  1. Недоступность товаров после оформления заказа:

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

  2. Проблемы с промокодами:

    • Несколько клиентов упомянули, что промокоды не срабатывали, что также вызывало разочарование, так как они не получали обещанные скидки.

Тем не менее, основная и самая часто упоминаемая тема – это "Недоступность товаров после оформления заказа". Большинство комментариев клиентов сфокусированы именно на этом, указывая на значительное неудобство и разочарование из-за отсутствия товаров, которые были добавлены в корзину и оплачены.

Cluster 5:
Исходя из всех предоставленных отзывов, наиболее часто упоминаемой темой является проблема с неправильной степенью прожарки мяса (в том числе стейков и бургеров) в доставленных заказах. Клиенты жалуются на то, что получают мясо с неправильно указанной прожаркой, что существенно влияет на их опыт и удовлетворённость услугой.

Cluster 6:
Исходя из предоставленных комментариев, можно сделать вывод, что основная тема, про которую писали пользователи, связана с несоответствием заказов их пожеланиям и инструкциям. Вот основные аспекты:

  1. Несоблюдение просьб о исключении или добавлении ингредиентов.

  2. Плохое качество доставки: товары приходят в непрезентабельном виде (например, томаты как пюре, излишне перчёное или солёное блюдо, слипшаяся курага).

  3. Отсутствие необходимых аксессуаров для потребления (например, палочек к суши, трубочек к смузи, салфеток).

Проблема сводится к систематическому игнорированию или неисправлению индивидуальных пожеланий клиентов.

Cluster 7:
На основе предоставленных отзывов клиентов, можно выделить главную тему: курьеры регулярно игнорируют инструкции, оставленные пользователями в приложении, и предпочитают звонить клиентам, создавая неудобства и дополнительные хлопоты. Клиенты явно недовольны, что несмотря на предоставленные ими подробные инструкции для доставки, курьеры либо не читают их вообще, либо не следуют им должным образом.

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

Cluster 9:
Тема, о которой писали пользователи в комментариях, связана с задержкой и неточностью времени доставки. Клиенты массово жалуются на то, что фактическое время доставки значительно превышает обещанное, что вызывает неудобства и негативные эмоции.

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

Cluster 11:
По предоставленным комментариям можно выделить две основные темы, которые волнуют пользователей:

  1. Проблемы с производительностью и стабильностью мобильного приложения:

    • Приложение часто вылетает и зависает.

    • Телефоны пользователей перегреваются при использовании приложения.

    • Приложение работает медленно, грузится долго.

    • Промокоды часто не работают.

  2. Несоответствие ассортимента и доступности товаров:

    • Товары, находящиеся в корзине, исчезают, или интернет-магазин сообщает, что их нет в наличии.

    • Неактуальная информация о доступности товаров в приложении.

    • Заказанные продукты или блюда часто недоступны, несмотря на их отображение в приложении.

На основе анализа комментариев можно сделать вывод, что пользователи жалуются на две основные проблемы: низкую производительность и частые сбои приложения, а также проблемы с актуальностью ассортимента товаров.

Cluster 12:
На основании данных комментариев можно очевидно выделить одну главную тему жалоб клиентов. Пользователи неоднократно упоминают о проблемах с курьерами, которые не говорят на русском языке. Это вызывает значительные трудности в коммуникации, затрудняет объяснение деталей заказа и местоположения доставки, что приводит к общей неудовлетворённости сервисом.

Основная тема:

Языковой барьер между клиентами и курьерами.

Ключевые моменты:

  1. Курьеры не говорят по-русски: Основной источник дискомфорта заключается в том, что курьеры не владеют русским языком, что затрудняет процесс коммуникации.

  2. Трудности в объяснении адреса и деталей заказа: Из-за языкового барьера клиенты испытывают сложности в том, чтобы объяснить курьерам, куда доставить заказ или как найти адрес.

  3. Неудобства и стресс: Клиенты тратят дополнительное время и нервы на то, чтобы разобраться с курьерами, что негативно сказывается на общем впечатлении от сервиса.

  4. Призыв к обучению курьеров: Многие пользователи рекомендуют компании обучить курьеров базовому русскому языку для улучшения качества обслуживания.

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

Cluster 13:
Тема, о которой писали пользователи в своих отзывах, — "некорректное отображение наличия продуктов в мобильном приложении компании". Пользователи выражали недовольство тем, что многие из заказанных через приложение товаров оказываются отсутствующими только после оформления и оплаты заказа. Это вызывает разочарование и неудобство, так как они тратят много времени на выбор продуктов, а потом вынуждены вносить изменения в свои планы.

Cluster 14:
На основании предоставленных отзывов можно сделать вывод, что основной темой комментариев клиентов является длительное ожидание доставки по сравнению с обещанным временем. Большинство клиентов выражают недовольство тем, что заказы привозятся значительно позже, чем указано в приложении или на сайте. Эта постоянная задержка доставок вызывает сильное разочарование и недовольство среди пользователей сервиса.

Cluster 15:
Из анализа предоставленных комментариев можно выделить основную тему, которую обсуждали пользователи: удобство использования приложения и качество доставки. В большинстве отзывов упоминается удобство приложения, быстрая и своевременная доставка, свежесть продуктов и вежливость курьеров. Некоторые пользователи также подчеркивают, что приложение помогает экономить время и силы, особенно для семей с детьми. Несколько отзывов упоминают проблемы с курьерами, которые не всегда могут найти адрес или звонят пользователям, несмотря на предоставленные инструкции.

Основную тему можно сформулировать следующим образом:
"Пользователи положительно оценивают удобство и эффективность использования приложения для доставки еды и продуктов, отмечая высокое качество сервиса, но также иногда высказывают замечания по поводу работы курьеров."

Cluster 16:
Тема большинства отзывов клиентов касается ошибок при сборке заказов, связанных с пищевыми ограничениями и предпочтениями. Пользователи неоднократно упоминают, что получили продукты или блюда, которые не соответствовали их заказам, несмотря на указания об отсутствии определенных ингредиентов (например, глютен, лактоза, орехи, сахар и т.д.). Эти ошибки могут не только разочаровывать клиентов, но и представлять серьезную угрозу для здоровья, особенно при наличии аллергий и непереносимостей.

Cluster 17:
Тема, которая явно прослеживается в отзывах клиентов, заключается в неудовлетворительном качестве доставки продуктов. Пользователи часто жалуются на повреждение товаров во время доставки – размятые и испорченные фрукты, ягоды, овощи, молочные продукты и выпечку. Нарекания касаются также неправильного хранения и транспортировки, небрежного обращения курьеров и задержек в доставке. Эти проблемы приводят к тому, что продукты приходят в непригодном или неудовлетворительном состоянии, что вызывает сильное недовольство и разочарование клиентов.

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

Cluster 19:
Тема, которой посвящены все комментарии, заключается в следующем:

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

Пользователи системы доставки еды и продуктов часто выражают недовольство тем, что их подробные комментарии, включающие точные указания, коды домофона и другие ориентиры, игнорируются курьерами. Курьеры не используют предоставленные данные, что приводит к множественным звонкам и необходимости дополнительного объяснения со стороны клиента. Это создаёт ощущение, что инструкции не читаются или не учитываются, делая процесс доставки менее удобным и вызывая разочарование.

Cluster 20:
Тема, о которой писали пользователи, заключается в завышенных ценах на продукты питания и товары в приложении компании по доставке еды и продуктов. Клиенты недовольны тем, что стоимость товаров через приложение значительно выше, чем в обычных магазинах, супермаркетах и на рынках. Множество отзывов подчеркивает, что за такие цены проще и выгоднее сходить в магазин самостоятельно.

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

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

Ключевые моменты:

  1. Постоянные и значительные задержки в доставке.

  2. Несовпадение заявленного времени доставки с реальным.

  3. Недовольство тем, что курьеры не могут найти адрес.

  4. Частые опоздания, вызывающие неудобство и разочарование клиентов.

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

Cluster 23:

Основная тема отзывов: Долгое время ожидания доставки. Многие клиенты компании по доставке еды и продуктов выражают недовольство длительным временем ожидания заказов. Вот ключевые моменты, повторяющиеся в отзывах:

  1. Время доставки превышает ожидания:

    • Заказы, которые должны были прибыть в течение 20-30 минут, доставлялись через час и более.

    • Некоторые пользователи ожидали более двух часов.

  2. Качество еды ухудшалось из-за долгой доставки:

    • Жаловались на холодную или остывшую еду.

    • Еда теряла вкус и аппетитный вид из-за длительного времени в пути.

  3. Проблемы с приготовлением заказов в ресторанах:

    • Многие клиенты отметили, что рестораны готовят заказы дольше обещанного времени.

    • Даже простые блюда, такие как салаты, бургеры или омлеты, готовились час и более.

  4. Негативное влияние на общее впечатление:

    • Клиенты разочарованы сервисом и многие выражают намерение не пользоваться услугами компании в будущем.

    • Длительное ожидание портит настроение и вызывает неудобства, особенно когда еда нужна к определенному времени, например, к ужину или обеду.

  5. Низкий уровень обслуживания:

    • Некоторых клиентов не уведомляли о задержках.

    • Проблемы с курьерами и навигацией, приводящие к дополнительным задержкам.

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

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

В итоге мы получили краткое описание каждого из 25 кластеров. Осталось только удалить повторы.

Объединение тем

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

Итоговый список категорий отзывов
  1. Курьеры не могут найти адрес.

  2. Курьеры звонят по телефону.

  3. Долгое приготовление еды.

  4. Долгая доставка.

  5. Замороженные продукты приезжаю растаявшими.

  6. Недоступны товары, которые отображаются доступными в приложении.

  7. Промокоды не срабатывали.

  8. Неправильная прожарка мяса.

  9. Несоблюдение просьб о исключении или добавлении ингредиентов.

  10. Отсутствие необходимых столовых приборов.

  11. Курьеры игнорируют описанные инструкции.

  12. Фактическое время доставки значительно превышает обещанное.

  13. Проблемы с производительностью и стабильностью мобильного приложения.

  14. Курьеры не говорят на русском языке.

  15. Положительные отзывы о приложении и качестве доставки.

  16. Завышенные цены в сравнении с покупками напрямую.

  17. Качество еды ухудшалось из-за долгой доставки - еда потеряла вкус или остыла.

  18. Продукты приходят помятыми или в неудовлетворительном состоянии.

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

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

Подсчет статистики

Благодаря наличию кластеров, мы уже можем довольно точно понять, сколько именно отзывов принадлежит к каждой категории. Достаточно просто сложить размеры всех кластеров, которые отвечают за данный сегмент.

Но можно пойти дальше, и попросить ChatGPT определить для каждого из отзывов одну из 18 категорий, к которой он относится. Это позволит получить максимально точную статистику.

Для экономии времени и денег, мы можем подавать в один запрос в API сразу по 50 отзывов, и просить классифицировать каждый. Также мы попросим отвечать в формате JSON, чтобы было удобно обрабатывать ответ.

Здесь можно увидеть результат классификации от ChatGPT — для каждого отзыва определена его категория. А тут весь код для этого подхода — от генерации эмбеддингов до классификации каждого отзыва.

Итог

В качестве результата, мы можем показать руководству компании такую таблицу:

Тема отзыва

Количество отзывов

Фактическое время доставки значительно превышает обещанное.

534

Недоступны товары, которые отображаются доступными в приложении.

403

...

...

Положительные отзывы о приложении и качестве доставки.

92

Замороженные продукты приезжают растаявшими.

84

...

...

Неправильная прожарка мяса

34

Промокоды не срабатывали.

23

Здесь сразу видно, какие проблемы являются приоритетными, а какие встречаются нечасто. Но мы честно смогли отобразить даже самые редкие отзывы, например, промокоды не сработали только у 23/4,000 респондентов. Однако это не значит, что мы можем просто выкинуть эту категорию, как это было в первом подходе к решению. Даже редкая проблема может быть критичной, и менеджер сам примет решение, нужно ли обращать на нее внимание.

Другие подходы к решению

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

  1. Случайно перемешать датасет несколько раз. Так мы можем попытаться побороть проблему "середины контекста". После каждой случайной перестановки отзывов мы будем просить у ChatGPT список тем, на которые бьются ответы, а затем попробуем объединить все списки. Это может сработать, но нам придется отправлять в API весь датасет несколько раз, что увеличит стоимость анализа. Также сложно заранее понять, сколько именно раз нужно повторить эту процедуру. В итоге, надежность не гарантирована, мы все еще можем упустить редкие категории.

  2. Разбить датасет случайно на 25 одинаковых кусочков, и попросить темы для каждого из них у ChatGPT. Тут мы вместо умных кластеров подаем просто случайные куски датасета. Это может сработать, и это даже не потребует лишних затрат денег на вызовы API, но мы все еще рискуем потерять какие-то редкие категории. А в случае с кластерами поверх эмбеддингов, мы скорее всего увидим отдельный кластер даже для маленьких сегментов и не упустим их.

Вывод

Мы увидели, что у ChatGPT есть свои ограничения, например, проблема "середины контекста". Узнали, как обойти ее, используя эмбеддинги и кластеризацию. Посмотрели на пример решения задачи анализа отзывов на "реальных" данных.

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


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

Комментарии (8)


  1. Pol1mus
    12.06.2024 12:48

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


    1. nikitayusupov Автор
      12.06.2024 12:48
      +2

      Верно, по сути это мы в итоге и делаем.

      Но сначала нам нужно сформировать эту таблицу для классификации, то есть понять, какие вообще бывают классы отзывов.

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


  1. nikolay_karelin
    12.06.2024 12:48
    +2

    Хорошая статья, спасибо!

    Хотел добавить, что бОльшая часть этого функционала есть в пакете BERTopic

    Кстати, а вы не обрабатывали ситуацию, когда в одном отзыве описано несколько проблем?


    1. nikitayusupov Автор
      12.06.2024 12:48

      Спасибо! Посмотрел BERTopic, выглядит действительно удобно!

      На самом деле, в жизни у меня были отзывы, в которых как раз почти всегда сразу несколько тем описано в одном отзыве. В целом, подход был почти такой же, только я просил в конце для каждого отзыва выделить не одну тему, а сразу список тем. ChatGPT с этим отлично справлялся, субъективно кажется, что он всегда определяет правильный набор тем для 1 конкретного отзыва.

      Хотя в таком случае усложняется пост-анализ, когда интересно посмотреть не только на то, сколько раз была упомянута каждая тема, но еще и как часто встречаются разные пересечения тем в одном отзыве.


  1. serhit
    12.06.2024 12:48
    +2

    Отличная статья, спасибо! Использовал подобный подход для анализа выявления общих проблем по инцидентам (сервис).

    Подход, когда сначала делается кластеризация, а потом LLM используется для описания кластера действительно имеет массу преимуществ:

    • Позволяет использовать разные подходы для эмбеддингов - можно начинать даже с tf-idf с опциональным понижением размерности и заканчивать LLM.

    • Позволяет использовать разные алгоритмы кластеризации. В нашем случае лучше работал DBSCAN поскольку кластера строились поверх текста и дополнительных векторизированных атрибутов, приводило к несферическим формациям.

    • Классические методы кластеризации позволяют применять известные методы для поиска оптимального количества кластеров (по "силуэту" например).

    • Можно работать с большими по объему обращениями (один кейс - это переписка), и большими корпусами обращений без опасения перелететь через размер контекста

    • Для описания кластера можно выбирать подмножество кейсов сэмплированием (если кластера и тексты большие). Кстати для k-means можно ограничиваться окрестностью центра кластера, а в методах когда эмбединг допускает обратное преобразование - вообще смотрнть на центр кластера и получать описание в некотором виде (не так здорово, конечно, как вышло бы у LLM)

    • И самое главное, на этапе начальных экспериментов использование LLM можно вообще пропустить, оставив его "на сладкое". Это может быть важно если бюджет эксперимента ограничен.


    1. nikitayusupov Автор
      12.06.2024 12:48

      Спасибо за полезные дополнения!

      • Интересно про количество кластеров. Кажется, не очень хорошо, что я просто на глаз их определяю, поэтому мне понравилось про метод "по силуэту", я про него раньше не знал.

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


  1. Advisory
    12.06.2024 12:48

    т.к. используются текстовые эмбеддинги, мы можем предполагать, что все отзывы в кластере будут иметь какую-то общую тему

    Когда один отзыв может одновременно соответствовать нескольким темам решили не разбирать?


    1. nikitayusupov Автор
      12.06.2024 12:48
      +1

      Да, верно, чтобы не усложнять статью эту тему опустил.

      Но общий подход все равно такой же должен сработать:

      • Во-первых, в жизни все равно будут какие-то отзывы, которые содержат ровно одну тему. Они выделятся в отдельные кластеры и там мы эту тему поймаем.

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

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