В приложении «Магнит: акции и доставка» можно оставлять отзывы на товары. Отзывы модерируются: мы публикуем те, которые считаем полезными для других покупателей, — они должны описывать потребительские свойства товара. Отклоняем все остальные: как правило, это жалобы на ценники, сервис в магазине, условия хранения либо просто нерелевантные тексты. Отзывы с жалобами обрабатывают службы поддержки и сервиса.
Меня зовут Роман Милованов, я занимаюсь разработкой сервиса модерации покупательских отзывов в команде User Generated Content. Расскажу о том, как мы попробовали применять большие языковые модели, чтобы автоматизировать модерацию отзывов.
Если вам в первую очередь интересны выводы без погружения в нюансы — можете увидеть их вместе с наглядной таблицей в конце статьи.
Как обрабатываем отзывы сейчас
Отзывы от пользователей поступают к нам в таком виде:
Вкусное печенье.
в ценнике было написано 59р. ОБМАН ПОКУПАТЕЛЯ!
Бананы неспелые
Товар не купил я а в чеке прабили ???
У мен не было такое в чеке пробить а сам нету
витрины другой цена а в кассу другой кошмар ето Магнит как всегдаХорошая колбаса от КУМК. Постоянно беру только её. Цена и качество её лучшим вариантом.
Очень понравилась соломка. К чаю и кофе очень подходит . Вкусная и недорогая.
Подделка! Не имеет ничего общего с коньяком . Водка смешанная с колером и огромным количеством ванилина! Пить эту бурду невозможно! Деньги выбросил на ветер. Позор Магниту,который продает такую бурду.
Сейчас сервис модерации представляет собой ансамбль из нескольких роботов. Два самых простых построены на основе словарей и имеют внутренние названия «Антимат» и «Политрук». Ещё три работают на основе паттернов и правил, и есть одна ML-моделька. Все это вместе обрабатывает 67% текстов, которые к нам поступают. Остальное обрабатывается людьми.
Первый подход к большим языковым моделям: ChatGPT
Мы решили, что можно попробовать применять для нашей задачи большие языковые модели. Проверять гипотезу стали на ChatGPT 3.5. Составили промпт, покидались им в ботов, которые работают на базе ChatGPT.
По каждому отзыву модель дала решение — отклонено или одобрено — и обоснование. По совокупности пары десятков таких экспериментов получилось, что боты на основе ChatGPT 3.5 дают от семи до десяти правильных ответов. Это результат, с которым можно работать.
Углубляемся в тему: сравнение разных моделей
После этого решили исследовать, на базе каких моделей можем построить нашего нового модератора. Мы попробовали:
ChatGPT
YandexGPT
GigaChat от Сбера
LLaMA
Наши принципы взаимодействия с большими языковыми моделями
Прежде чем мы перейдём к собственно сравнению разных моделей, расскажу об общих принципах взаимодействия с ними.
На первых этапах в промпте мы указывали полный список правил модерации. Довольно быстро стало понятно, что такой подход неэффективен: языковые модели лучше реагировали на человекочитаемые объяснения, чем на формальные документы.
Мы сразу просили модель не только давать итоговое решение, но и объяснять, почему оно принято: такой подход позволяет визуально оценивать результаты при доработке запросов, да и объяснение всегда кажется не лишним.
Мы применяли подход, именуемый Few-Shot Prompting. Суть его заключается в том, что, помимо описания собственно задачи, к инструкции для модели прилагается несколько примеров отзывов и эталонных ответов, которые мы ожидаем увидеть от модели. Кроме того, каждая инструкция снабжалась требованием соблюдать определённый формат ответа: нумерованный список или даже JSON. Некоторым моделям сложно соблюдать формат вывода, и тогда могут помочь всяческие ухищрения: такие как, например, угрозы наказать за несоблюдение формата или поощрение за прилежную работу.
Проблемы точности
Точность классификации в нашей задаче, как, зачастую, во всех задачах с модерацией текстов, не может быть абсолютной. Но вопрос о целевой точности предсказаний требовал ответа. Мы решили отталкиваться от показателей штатных модераторов-людей.
Важно отметить, что если принять какой-то набор уже отмодерированных отзывов за эталон (тестовый датасет), то результат модераторов-людей по нему будет ниже 100%. Человек не идеален: дайте двум квалифицированным модераторам сотню одинаковых текстов и увидите, что не во всех случаях их мнения совпадают. В нашем случае модераторы-люди приходили к консенсусу лишь в 90% отзывов. Значит, при точности машины в 90% по отношению к «эталонному» датасету мы фактически получим уровень штатного сотрудника.
Язык общения
Большинство моделей понимает и русский и английский языки, но какой-то из них для модели всё же стоит считать «родным» в том смысле, что инструкция на родном языке более понятна модели. Так, для ChatGPT и LLaMA инструкция подавалась на английском языке, а вывод требовался на русском. Такой подход показал свою эффективность. С моделью Яндекса говорили по-русски. Были эксперименты с инструкцией на английском языке, которые ожидаемо показали снижение качество ответов модели.
ChatGPT
Для экспериментов, описанных в этой статье, мы использовали ChatGPT 3.5 Turbo, и этот инструмент в итоге позволил нам приблизиться к желаемому результату.
После нескольких модификаций промпта удалось увидеть не только хорошую (относительно) точность ответов, но и стабильно хорошее качество формата выдачи: даже JSON парсился практически всегда без дополнительных ухищрений.
В каждом запросе помимо общей инструкции мы давали десять случайных примеров из размеченного датасета и просили отмодерировать десять отзывов.
Вариативность предсказаний модели и мультиагент
ChatGPT при прогоне на тестовом датасете показала точность (ассuracy) около 80%: от прогона к прогону цифра могла на процент скакать туда-сюда. Да и на глаз было видно, что одни и те же отзывы модель может классифицировать по-разному: в одном запросе одобрит, в другом отклонит.
Чтобы справиться с этой вариативностью, был применён подход, именуемый (узким кругом) «мультиагент». Суть в том, что по каждому отзыву мы отправляем модели несколько запросов, имитируя таким образом работу нескольких ИИ-агентов. Решение считается принятым, только если агенты достигли консенсуса. Это позволило поднять точность до 85%.
Этот обнадёживающий результат сподвиг нас к попыткам поиграть с другими генеративными моделями.
Сравнение моделей
Ожидать от других моделей результатов, близких к ChatGPT, кажется нелогично, поскольку эти модели несопоставимы банально по своим техническим характеристикам (объёму параметров). Но всё же хотелось как-то на прикладном уровне модели сравнить. Для этого придумали несколько простых запросов, которые проверяют разные аспекты работы модели: способность соблюдать формат вывода, принимать решения на основе правил, генерировать читабельный текст, объяснять решения, говорить по-русски, в конце концов ?
Например, вот таким простым запросом мы сравнивали модели по умению соблюдать формат вывода:
Классифицируй животных по зоне обитания
Например:
Обезьяна - джунгли
Гепард - прерии
Медведь - леса
Ответ представь в виде таблицы.
Для примера выше таблица выглядит так:
| Животное | Зона обитания |
----------------------------
| Обезьяна | Джунгли |
| Гепард | Прерии |
| Медведь | Леса |
Построй таблицу зон обитания для следующих животных:
Зебра, Носорог, Крокодил
YandexGPT
Яндекс постоянно работает над выпуском новых и улучшением старых версий моделей семейства YandexGPT. На момент написания мной этих строк уже вышла версия YandexGPT 3 Pro. В этой же статье я суммирую опыт экспериментов с более ранними версиями. Наши самые первые эксперименты с ранними моделями были неудачными: без углубления в подробности просто отмечу, что практически ничего не работало. Позже ситуация изменилась, и кое-какой результат мы всё-таки получили.
Методика была простой: пробовали решить задачу модерации отзывов тем же подходом, что и с ChatGPT, а также оценивали выдачи по дополнительным промптам, назначение которых я указал выше.
Итоги по YandexGPT2, которые мы получили, когда она только вышла
Качество ответов непредсказуемо: то в точку, то вообще мимо.
Модель неспособна соблюдать формат выдачи.
Часто генерирует нерелевантный текст.
Не всегда заметен эффект от изменения параметров запроса, таких как температура.
Бывают проблемы с русским языком: неверные окончания слов или просто лишние буквы.
На тот момент мы зафиксировали, что решение наших коммерческих задач с помощью few-shot prompting на базе YandexGPT не представляется возможным. С тех пор почти по всем пунктам работа модели улучшилась, хотя кардинально для нас это картины не поменяло.
Дообученная YandexGPT
После отказа от дальнейших экспериментов с few-shot prompting в отношении YandexGPT, мы решили попробовать дообучить модель — Яндекс предоставляет такую возможность.
Технически это очень простая операция: нужно загрузить промпт и датасет с правильными парами запросов-ответов через интерфейс Yandex DataSphere.
Я не ожидал многого, поэтому на скорую руку собрал датасет из 800 пар. Вечером загрузил, утром дообученная модель уже была готова.
И тут случился конфуз. К дообученной модели можно обратиться через веб-интерфейс или через API. Я пошёл в веб, отправил несколько запросов и обнаружил, что модель отвечает только «да» и «нет» на любой вопрос. Эти ответы не релевантны, поскольку по инструкции и в соответствии с датасетом она должна выдвавать бинарное решение (одобрено или отклонено) и его обоснование в одном-двух предложениях.
Я уже открыл Джиру, чтобы в комментариях к задаче записать неутешительные выводы, но решил для «соблюдения протокола» покидаться запросами через API и — о чудо — увидел в точности ожидаемые от модели ответы. Она четко следовала формату и в большинстве случаев давала качественные обоснования.
Полагаю, в веб-интерфейсе присутствовал баг при обращении к модели и, возможно, на сегодня его уже пофиксили.
Дообученную модель прогнали на тестовом датасете и увидели точность в 81%. Недурно!
При этом вариативность ответов отсутствовала: на один и тот же запрос модель всегда давала один и тот же ответ (параметр температуры выставлен на минимум), что делает необязательным использование мультиагентного подхода. Определённо тут есть почва для дальнейших исследований, над чем сейчас и работаем.
GigaChat
Сбер тоже выкатил свою генеративную модель. И она умеет генерировать не только текст, но и картинки. Получить доступ к WEB API GigaChat оказалось совсем не просто, поэтому с этой моделью мы ограничились экспериментами только в вебе.
Пара картинок ниже с моими запросами про «маленький камазик» неплохо иллюстрирует общее впечатление от GigaChat.
А вот так она работает с отзывами:
1. кто опять разрешила это преступление против жительниц России:"пальму" в составе? абсолютно всё што содержит "пальму" в любая количестве в принципе является фальсификатом! абсолютно вся продукция с "пальмой" обязательно должна быть окончательно и навсегда запрещена законами России!
2. Мясо сильно воняло,это просто ужасно 3 позиции чека неликвид
3. вкусно,но нужно есть в меру даже если нет сахара
4. не похоже на брынзу
5. Очень долго и неудобно активировать сим-карту.В кнопочном телефоне она не работает (
6. Наша кошка ест с удовольствием.
7. Вскрыли упаковку, а рыба с запахом. ?
8. норм
9. Все устраивает
10. 10% арахиса
11. цена по чеку не соответствует цене на полке магазина
1. Одобрено. Описание вкусовых качеств товара.
2. Отклонено. Отзыв на отвлечённую тему.
3. Одобрено. Описание аромата.
4. Отклонено. В отзыве нет описания потребительских свойств товара.
5. Отклонено. Упоминание о цене.
6. Отклонено. Упоминание о качестве продукта.
7. Отклонено. Упоминание о вкусе.
8. Отклонено. Упоминание о запахе.
9. Отклонено. Упоминание о цене.
10. Отклонено. Упоминание о вкусе.
11. Отклонено. Упоминание о цене.
Итоги экспериментов
Модель довольно непредсказуема: иногда выдаёт хорошие ответы, а иногда — плохие.
Отлично работает с форматом: может выдавать ответы сразу в JSON.
На нашем стандартном промпте результат хуже, чем у LLaMA-производных моделей 13B. Много некорректных ответов, а обоснования слабо соотносятся с текстами отзывов.
LLaMA
Семейство моделей от Meta AI отличается тем, что при меньших объёмах (количестве параметров) выдаёт сопоставимые с гораздо более крупными моделями результаты. Требует меньше вычислительных мощностей: самую маленькую можно запустить на вполне «гражданском» ноутбуке. Официального WEB API нет, но много неофициальных за деньги.
Результат задания по разметке отзывов:
1. кто опять разрешила это преступление против жительниц России:"пальму" в составе? абсолютно всё што содержит "пальму" в любая количестве в принципе является фальсификатом! абсолютно вся продукция с "пальмой" обязательно должна быть окончательно и навсегда запрещена законами России!
2. Мясо сильно воняло,это просто ужасно 3 позиции чека неликвид
3. вкусно,но нужно есть в меру даже если нет сахара
4. не похоже на брынзу
5. Очень долго и неудобно активировать сим-карту.В кнопочном телефоне она не работает (
6. Наша кошка ест с удовольствием.
7. Вскрыли упаковку, а рыба с запахом. ?
8. норм
9. Все устраивает
10. 10% арахиса
11. цена по чеку не соответствует цене на полке магазина
1. Отклонено. Содержит жалобу на содержание пальмы в продукте, но без доказательств фальсификации и запрета в России.
2. Отклонено. Сообщение не связано с описанием потребительских свойств товара.
3. Одобрено. Описывается вкусовой качество продукта, но без указания на количество сахара.
4. Отклонено. Утверждение о том, что product не похож на брынзу, не связано с его потребительскими свойствами.
5. Отклонено. жалоба на трудности активации сим-карты не связана с ее потребительскими качествами.
6. Одобрено. Аромат кошки является личным вкусовым предпочтением, но не связан с потребительскими свойствами товара.
7. Отклонено. Содержит нарушение законов России и обвинение в фальсификации продукта.
8. Отклонено. Описывается неприятный запах мяса, что может отпугнуть потребителей.
9. Одобрено. Описываются вкусовые качества товара и рекомендация о количестве для consumption.
10. Одоobreno. Рекомендация для потребителей, соответствующая количеству товара.
11. Отклонено. Не содержит арахса в указанных пропорцииях.
Итоги
Качество ответов немного ниже, чем у ChatGPT.
Обоснования решений бывают отличными, бывают бредовыми.
Можно много играть с настройками.
Лучшие результаты показывает на низких температурах.
По-русски говорит сносно.
Разница между 13B и 70B на глаз не видна.
Выводы
Качество инференса
Это точность предсказаний: насколько точно модель модерирует отзывы.
Структура инференса
Ответы модели нужно читать программно: важно, чтобы они подчинялись какой-то структуре, которую мы задаем. Допустим, модель может выдавать либо JSON, либо размеченный список, либо что-то ещё.
Оказалось, что не все модели с этим хорошо справляются. Вот, например, YandexGPT справляется почему-то очень плохо: не может постоянно поддерживать одну и ту же структуру.
Web API
С этим у Яндекса всё хорошо.
ChatGPT блокирует запросы из РФ, но есть прокси-сервисы, да и вообще голь на выдумки хитра.
У GigaChat есть API и они даже готовы были открыть к нему доступ, но там очень сложная бюрократическая канитель. Настолько сложная, что мы в рамках исследования и пытаться не стали.
В случае LLaMA предполагается, что вы должны сами захостить модель. Но на самом деле есть много сервисов, которые сделали это за вас и дадут вам за деньги доступ к модели любого размера.
Time-to-market
Все достаточно быстро: при желании мы могли бы на базе YandexGPT уложиться в пару недель и вывести модератор в прод.
ChatGPT чуть дольше: закладываем время на решение вопросов с доступом. Тут я говорю исключительно с технической точки зрения. Практически же решение на базе сервиса, блокирующего запросы из РФ, запускать никто не станет.
GigaChat — поправка по времени на решение вопросов с доступом.
LLaMA — тут либо погружаться в техничку и запасаться видеокартами, либо заплатить кому-то, кто уже сделал это и даёт доступ к модели как сервису.
Остаётся только добавить, что крайне интересной выглядит перспектива дообучить LLaMA — и это предмет наших будущих изысканий.