С чем съесть макароны? Как ChatGPT помогает ритейлу давать рекомендации при покупках онлайн
Разрабатывая продукт по рекомендации товаров и системе поиска товара в каталоге, мы озадачились вопросом: как построить собственную рекомендательную систему, приносящую реальную прибыль бизнесу?
На связи Елизавета Колмакова, Data Scientist компании 1221systems. Мы сделали ленту «С этим покупают» с осмысленными рекомендациями, и я хочу рассказать, как нам в этом помог ChatGPT.
ChatGPT сейчас применяют для самых разнообразных задач: от написания мотивационных писем до создания сайтов. А что, если спросить ChatGPT, что принято есть, например, с макаронами? Проведя исследования о способностях ChatGPT выдавать осмысленные рекомендации по продуктам, которые хорошо сочетаются друг с другом, мы решили пойти дальше и проверить его на применимость для бизнеса.
Почему ChatGPT лучше моделей, построенных на данных
Абстрагируясь, такой подход решает типичные проблемы рекомендательных систем, построенных на данных о покупках пользователей:
- Холодный старт продукта. Моделям, построенным на данных, сложно давать хорошие рекомендации тем товарам, продаж которых совершено мало, которые пользуются сезонным спросом и выпущены как тест.
- Сбор данных. Для подхода генерации рекомендаций через ChatGPT не требуется собирать датасет, что экономит время.
- Препроцессинг данных. В каждом втором чеке есть общие товары («хлеб», «молоко», «масло сливочное»), наличие которых размывает истинные зависимости совместимых продуктов. Организовать фильтрацию чеков от подобных общих товаров — объемная и сложная задача.
Настройка промтов
Начав этот увлекательный путь в мир больших разговорных моделей, мы определили две задачи:
- Необходимый нейминг. Есть товары, которые достаточно сложно агрегировать под общее имя, а есть — те, которые легче: для ChatGPT нет разницы, предлагать рекомендацию к «Молоко Особая коллекция 450мл» или «Молоко Особая коллекция 950мл». Работали над неймингом наших товаров, пока не убедились, что все имена товаров отражают суть и обобщены до максимально возможного уровня.
- Входная формулировка.
ChatGPT крайне щепетильно относится к входным фразам и нуждается в прописывании каждой подробности.
Вот далеко не полный список формулировок, которые мы пробовали на примере макарон:
что купить к макаронам
- что купить с макаронами
- какие ингредиенты купить к макаронам
- какие ингредиенты купить с макаронами
- какие ингредиенты купить к макаронам, если хотим их употребить вместе
- что положить в корзину к макаронам
- что положить в корзину с макаронами
- что мне нужно доложить в корзину, если я уже взял макароны
- продукты для рецепта с макаронами
- продукты для рецепта к макаронам
и так далее.
К каждой из этих фраз мы тщательно подбирали формулировку, дополняя ее уточнениями (например, о запрете рекомендовать алкоголь и о том, что к готовой еде предпочтительнее предлагать напитки).
В итоге, фраза длиной в 74 слова была прописана и готова к прогонке по всем товарам.
Входная фраза
Подготовив входную фразу и соорудив обобщенные имена товаров, приступили к сбору ответов от ChatGPT. Взяв все имена товаров, разбили их на тройки, чтобы бережнее подойти к вопросу использования токенов (токен —атомарная единица, которой оперирует чат для генерации ответов и, образно говоря, подобен валюте, которая определяет затраты на создание ответа). В итоге этой подготовительной работы — полностью уложились в пробные токены, которые даются при регистрации на OpenAI.
Входная фраза по итогу была больше похожа на свод правил: перечислено множество уточнений и описана строгая форма ответа, чтобы удобно было дальше ее обрабатывать. Она выглядела так:
Напиши топ 10 товаров (но не перечисляя их имена марок и брендов), которые можно съесть или выпить вместе с каждым (по отдельности) из следующих продуктов из списка: 1. {ИМЯ ТОВАРА 1}; 2. {ИМЯ ТОВАРА 2}; 3. {ИМЯ ТОВАРА 3}. Строго не рекомендуй составляющие этого продукта, каждая рекомендация должна дополнять продукт, чтобы их можно было употребить вместе. Если продукт - это готовое блюдо, то отдай предпочтение рекомендации напитков к нему. Не рекомендуй алкоголь. Ответь строго в следующем формате: '1. для товара <имя товара 1>: 1) ... \n 2) ... \n 3) ... \n 4) ... \n 5) ... \n 6) ... \n 7) ... \n 8) ... \n 9) ... \n 10) ... \n', - где вместо ... вставлены топ 10 товаров
Сбор ответов: сложности и баги
Собрав и проанализировав ответы ChatGPT, выделили особенности работы с чатом для решения задачи рекомендации товаров:
1. Формулировка
Формулировка критически важна. Мы проверяли, что даже «порекомендуй, что купить с» и «порекомендуй, что купить к» имели разное качество рекомендаций:
2. Форма обратного ответа.
Если нечетко указывать форму обратного ответа, чат будет стремиться ответить по-разному, а формат критично важен для последующего выделения товаров и их поиск в каталоге. Например, при наличии рекомендации от чата «Черный кофе» нам необходимо найти категорию «Молотый кофе», что само по себе является большой задачей. Строгий вид ответа необходим для автоматизации просчета и последующего поиска в каталоге.
3. Дополнительные прогоны.
Иногда чат начинает генерировать пространные ответы (вместо «лимон» — «тонкая долька лимона без косточки»), либо же может не вернуть ответ вовсе. Нужно закладывать необходимость дополнительных прогонов изначально. Мы прописали, что если средняя длина ответа — более трех слов, то необходимо перепрогнать этот товар еще раз, поскольку у такого ответа высока вероятность получить ту самую «тонкую дольку лимона без косточки», а это крайне сложно автоматически соотнести с «лимон» из каталога.
4. Важность контекста.
Чату важен входной контекст. Для оптимизации затрат мы подавали сразу несколько товаров и порой, от такого соседства страдали рекомендации. Например, в тройке: Колбаса, Рулеты, Сало, — второй товар чат понимал как мясные рулеты, в то время как имелись в виду рулеты сладкие.
5. Специфические категории товаров.
Часто ChatGPT генерировал сомнительные рекомендации или рекомендовал несуществующие товары в категориях непродовольственных, детских товаров, а также товаров для животных. Он просто добавлял к известным товарам слова «детский» или «для кошек», например, мог посоветовать «детский крем для бритья».
6. Сложности с готовыми блюдами.
Когда мы просили дать рекомендации для салата или другого готового блюда, чат стремился разложить его на ингредиенты и предложить купить их.
7. Грамматические ошибки.
Чат способен генерировать грамматические ошибки. Это усложняет дальнейшую автоматизацию по поиску соответствия этих рекомендаций в каталоге:
От абстракции к реальности
Далее мы прописали ту часть, которая ответственна за соотнесение абстрактных рекомендаций чата с реальным товаром: например, преобразует «масло сливочное» в «масло сливочное Особая коллекция 180гр», а «торт» — в «Торт шоколадный Bocconto».
Для этого мы воспользовались трудами своих коллег из Search Service и вместо того, чтобы соотносить каждое абстрактное имя со всем каталогом, что долго по времени и вычислениям, отправляли запросы на SearchService, в котором уже реализован функционал поиска товаров по запросу с сайта myspar.ru.
Получая пул релевантных кандидатов, выбираем самый соотносящийся с абстрактным — и в итоге получаем лучшую рекомендацию из возможных в конкретном магазине.
Так с чем же все-таки съесть макароны?
И, наконец, если вы начали читать эту статью из-за интриги в названии и думаете, что бы докупить на ужин к пасте, то ChatGPT посоветовал положить в корзину следующие продукты — вот полный цикл прогона для товара:
Этап первый. Товар: МАКАРОНЫ ЦАРЬ ДУРУМ ГРЕБЕШКИ 1/450
Этап второй. Нейминг: Макароны
Этап третий. Ответ чата: Оливковое масло Пармезан Томатный соус Орегано Сливочный соус Базилик Грибы Песто Куриное филе Тунец.
Этап четвертый. Финально, список предложенных товаров из каталога:
МАСЛО ОЛИВКОВОЕ ALIANZA PURE 1л
СЫР ПАРМЕЗАН ГРАНД 45%
СОУС ТОМАТНЫЙ РАТИБОР ШАШЛЫЧНЫЙ 385г
ОРЕГАНО ИЗМЕЛЬЧЕН.KOTANYI 1/8 ПАК.
СОУС SPAR СЛИВОЧНО-ЧЕСНОЧНЫЙ 200г
БАЗИЛИК КРАСНЫЙ 25г
ГРИБЫ ЭРИНГИ 200г
СОУС ПЕСТО 250г
КУРИНОЕ ФИЛЕ В ХРУСТЯЩЕЙ ПАНИРОВКЕ
ТУНЕЦ ФИЛЕ В С/С 1/185 ФОРТУНА
Bon appetit!