Большие языковые модели, такие как GPT-3 (а также BLOOM), были определены как небольшие ученики. Это означает, что на нескольких примерах они могут выполнять самые разнообразные задачи с отличными результатами.
Модель GPT-3 Davinci на момент написания этой статьи была самой мощной моделью семейства GPT-3 и одним из самых больших LLM. Давинчи может решать логические задачи, определять причину и следствие, понимать смысл текста, создавать творческий контент, объяснять мотивы персонажей и выполнять сложные задачи обобщения.
Учитывая все это, я задался вопросом:
Может ли модель, обладающая такими возможностями, быть основным компонентом пайплайна анализа настроений на основе аспектов?
Чтобы получить ответ на такой вопрос, я попытался построить конвейер ABSA для проверки концепции (ссылка на полный код доступна в конце статьи). В этой статье я расскажу о деталях реализации.
TL;DR
Трубопровод
Мы можем смоделировать наш конвейер ABSA POC следующим образом:
Скрапинг отзывов
Первое, что нужно сделать, это получить отзывы пользователей об общем продукте или услуге. Сколько? Например, когда мне нужно что-то купить на Amazon, я обычно кратко читаю:
- Не более 25 отзывов из списка Лучшие отзывы/Все звезды (оценивается по алгоритму Amazon).
- Не более 25 отзывов из категории Последние/Все звезды.
Или, в качестве альтернативы:
- Не более 25 отзывов из списка Лучшие отзывы/Все положительные (ранжируется по алгоритму Amazon).
- Не более 25 отзывов из списка Лучшие отзывы / Все критические (ранжируется по алгоритму Amazon).
В обоих случаях нам потребуется собрать около 50 выбранных отзывов о целевом продукте.
Поскольку Amazon является довольно распространенным источником данных для отзывов пользователей, мы будем получать отзывы от него. Для этого нам нужно реализовать базовый скребок.
Я решил реализовать базовый Паук Scrapy для amazon.com
. Scrapy — это известная, простая в использовании и мощная платформа для парсинга. Этого будет более чем достаточно, чтобы получить необходимые отзывы от Amazon.
Менее чем за 50 строк кода вы можете создать (базового) паука, который:
- Соберите количество элементов, которое нам нужно (50 отзывов)
- Добавьте задержку между запросами (чтобы избежать легкой блокировки)
- Легко сканируйте страницы с отзывами
Мы можем запустить паука либо программно, либо с помощью команды CLI.
Теперь, поскольку я гитарист, давайте соберем необходимые отзывы пользователей о Boss MT-2 Metal Zone (известная педаль дисторшна для электрогитары) и сохраним результат в файле CSV:
# Top reviews / All positive $ scrapy runspider \ absa/scraping/amazon.py \ -O feedbacks.csv \ -a start_url='https://www.amazon.com/MT-2-Metal-Distortion-Guitar-Pedal/product-reviews/B0002CZVA0/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews&filterByStar=positive&pageNumber=1' # Top reviews / All critical $ scrapy runspider \ absa/scraping/amazon.py \ -o feedbacks.csv \ -a start_url='https://www.amazon.com/MT-2-Metal-Distortion-Guitar-Pedal/product-reviews/B0002CZVA0/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews&filterByStar=critical&pageNumber=1'
Потребуется несколько секунд, чтобы очистить отзывы, которые нам нужны. И этого будет достаточно для наших потребностей в скрейпинге.
Использование GPT-3 для анализа
В настоящее время полнофункциональный конвейер ABSA требует множества шагов. Назовите некоторые из них:
- EDA данных/домена
- Создание словаря аспектов (или тематическое моделирование)
- Выборка и аннотация примеров по каждому аспекту (вручную, при активном обучении или использовании правил)
- Извлечение признаков / обучение модели
- Оценка модели
- Развертывание модели
…И так далее.
Вместо этого этот подход будет амбициозно пытаться полагаться только на две вещи:
- Огромные «знания» GPT-3 (он был обучен примерно на 45 ТБ текстовых данных из нескольких источников, включая Википедию и книги)
- Впечатляющая способность к обучению [ноль|один|несколько] выстрелов
Нулевой, однократный и малозарядный подходы
Оперативная разработка – важная часть, если вы хотите получить максимальную отдачу от GPT-3.
Давайте начнем с основной задачи, связанной с ABSA. Мы попросим GPT-3 извлечь выражения аспекта, связанные сегменты и связанные настроения из предложения:
Впечатляет, но, может быть, неудовлетворительно. Это связано с тем, что мы не предоставили никаких примеров для модели, поэтому остается только догадываться, как лучше выполнить задачу и отформатировать вывод (который может отличаться, если вы попытаетесь выполнить запрос несколько раз). Мы только что попробовали нулевой подход.
Давайте сосредоточимся только на извлечении аспектов. Приведем GPT-3 на одном примере и посмотрим на результат:
Только один пример (одноразовый подход) сделал то, что мы просили. Как вы уже поняли, основная идея подсказки заключается в создании текстовой подсказки, которая помогает GPT-3 лучше понять конкретные требования задачи, а затем выполнить ее.
Давайте теперь воспользуемся более конкретным приглашением, попросив модель отформатировать вывод в JSON, чтобы было намного проще анализировать ответы модели:
Теперь вы знаете, что GPT-3 (также) поддерживает формат JSON. Однако для базового анализа ABSA извлечения только аспектов недостаточно. Также нам нужно извлечь:
- текстовые сегменты, относящиеся к извлеченным аспектам.
- Значения тональности, относящиеся к каждой паре аспект/сегмент.
Более того, мы все еще хотели бы иметь легко анализируемый вывод JSON. Итак, давайте попросим GPT-3 сделать все это (я знаю, это выглядит немного странно 😉).
В первую очередь мы передадим два общих примера результатов анализа ABSA, которые мы ожидаем в формате JSON (подход несколько снимков).
Это именно то, что нам нужно. Подводя итог, можно сказать, что, используя метод нескольких выстрелов, GPT-3 смог:
- Извлечение релевантных аспектов
- Извлечение сегментов предложений, связанных с аспектами
- Назначьте значение тональности каждой паре аспект/сегмент.
Даже если мы смотрим на один результат, я думаю, что он весьма впечатляет, особенно если учесть, как я писал выше, что обычно этот результат представляет собой комбинацию различных этапов, которые могут быть очень сложными (в зависимости от того, чего вы хотите достичь). ).
Конечно, поскольку идея состоит в создании автоматизированного конвейера, нам нужно выяснить, как программно запрашивать GPT-3.
Это легко сделать с помощью OpenAI Python Library. Чтобы запросить GPT-3 через API, сначала необходимо зарегистрироваться в OpenAI и получить ключ API. Вы получите бесплатный кредит в размере 18 долларов США (более чем достаточно, чтобы поиграть и провести этот эксперимент), а затем, в зависимости от того, являетесь ли вы частным лицом или организацией, вы будете платить по мере использования.
Давайте вызовем API OpenAI, запросив базовое Завершение:
Это напечатает что-то вроде:
I'm doing well. How are you?
Теперь мы можем обернуть вызовCompletion
в более полезный метод, который, например. позаботится о добавлении к prompt
рассмотренных выше примеров, чтобы использовать возможности GPT-3 для быстрого обучения и получить желаемый результат.
Примечание о «температуре»
На Игровой площадке GPT-3 вы, возможно, заметили, что есть некоторые параметры, которые вы можете настроить.
Здесь может быть важно значение температуры.
По сути, он контролирует случайность генерируемого текста. Если вы хотите, чтобы ваши эксперименты были воспроизводимыми, вам нужно указать значение, например 0 или 0,1. Чем больше вы увеличиваете значение, тем больше будет отличаться вывод для разных прогонов (но он всегда будет значимым). Дополнительную информацию можно найти в отличной документации.
Оценка результатов анализа
Как и было показано в начале статьи, вот еще один проанализированный отзыв для металлической зоны Boss MT-2.
Интересно видеть, что GPT-3 хорошо работает в очень специфическом контексте (эффекты электрогитары), даже если подсказка, которую мы передали при вызовах завершения, является довольно общей.
Предполагая, что качество анализа отдельных отзывов является эмпирически приемлемым, мы теперь уменьшим масштаб, пытаясь увидеть общую картину всего анализа. Для этого мы создадим простую диаграмму Aspect vs Sentiment с помощью Plotly (ссылку на полный код вы найдете в конце статьи):
Глядя на эту диаграмму, мы можем быстро увидеть, что подавляющее большинство аспектов, автоматически извлекаемых GPT-3, очень достоверны. Мы также можем видеть, что есть небольшой шум (например, «Эта педаль» не является допустимым аспектом).
Отказ от ответственности: я уже пробовал Boss MT-2 и у меня есть точное представление о том, как он работает. И, глядя на диаграмму, я бы сказал, что она вполне соответствует общему (и моему) мнению: по качеству звука люди сильно расходятся, а по характеристикам могут оценить.
—
Давайте теперь попробуем провести анализ таким же образом, но для совершенно другого продукта: пылесоса. Я выбрал случайный пылесос с Amazon, и вот некоторые примеры результатов:
Хотя он не идеален, я думаю, что он проделал очень хорошую работу. Стоит также отметить, что он хорошо работает с другими языками, кроме английского:
Диаграммы Aspect vs Sentiment в этом случае тоже выглядят неплохо. Мы можем легко увидеть, какие аспекты являются лучшими, а какие — худшими.
«Что делать, если качество анализа недостаточно хорошее?»
Если результаты неудовлетворительны, даже если вы сделали хорошую подсказку, это означает, что представленный здесь подход с несколькими выстрелами, вероятно, недостаточен для выполнения вашей конкретной задачи.
В этом случае рекомендую вам доработать GPT-3. Как указано в документах, с моделью, адаптированной к задачам, вы получите заметные преимущества:
- Более качественные результаты, чем быстрый дизайн
- Возможность тренироваться на большем количестве примеров, чем может поместиться в подсказке
- Экономия токенов за счет более коротких подсказок
- Запросы с меньшей задержкой
И последнее, но не менее важное: тонкая настройка GPT-3 с использованием API OpenAI намного проще, например. доводка ГПТ-2 с помощью трансформаторов.
«Могу ли я использовать GPT-3 для дальнейшего улучшения конвейера?»
Да! Как мы уже знаем, GPT-3 способен решать множество различных задач. Дадим несколько отправных точек.
Абстракция от слов к понятиям
Если вас не устраивает плоский список аспектов, вы можете попросить GPT-3 сгруппировать их по наиболее похожим. Вот (почти) нулевой пример с общими словами:
Пример использования может быть следующим: если вам не нравятся аспекты, генерируемые GPT-3 во время анализа, вы все равно можете использовать GPT-3 (или другие способы, если хотите) для извлечения сочетаний существительных:
Затем, когда у вас их много, используйте GPT-3, чтобы абстрагировать их в концепциях, как мы сделали выше.
Суммируйте длинные отзывы
Возможно, не стоит анализировать очень длинные отзывы напрямую. Вместо этого хорошей идеей может быть использование GPT-3 для суммирования их перед анализом:
С точки зрения стоимости будет гораздо дешевле анализировать сводные отзывы (меньше токенов для передачи), и большинство соответствующих аспектов сохраняется. Производительность GPT-3 здесь вроде бы на уровне (если не лучше) чем у BART-large.
Извлечение информации из наборов данных
Диаграммы — это в основном визуальное представление данных. Поэтому, если вы попросите GPT-3 извлечь статистику из набора данных, на основе которого вы создали диаграмму, следующим образом (пример нулевого выстрела):
Вы получите что-то вроде:
Что было бы здорово показать прямо под диаграммой.
—
Обратите внимание, что для простоты я всегда использовал метод нулевого выстрела. Это сработало, но может не справиться со всеми ситуациями, особенно когда контекст очень специфичен.
Уловки для улучшения результатов точно такие же, как описано выше: сначала попробуйте несколькопримеров. Если этого все равно недостаточно, попробуйте настроить GPT-3. Тогда результаты будут намного интереснее.
«Что, если я захочу построить на этом настоящий конвейер?»
Если вы посмотрите на код (ссылка приведена в конце статьи), вы обнаружите, что основной поток того, что мы описали в этой статье, живет в некоторых Jupyter Notebooks.
Это нормально для проверки концепции (здесь цель состоит только в том, чтобы продемонстрировать потенциал подхода), но что, если вы действительно хотите создать готовую к работе конвейер, использующий пауков Scrapy и GPT-3? Если это так, вы можете рассмотреть следующие вещи.
Масштабирование очистки
Пауки Scrapy могут масштабироваться, если вы развернете их в Zyte, их управляемом облаке. Таким образом, управление большим количеством пауков не должно быть слишком сложным.
Масштабирование анализа GPT-3
Здесь не о чем беспокоиться (кластеры для управления, графические процессоры и т. д.), вы будете полагаться только на API OpenAI. Взгляните на лимиты их использования и соответствующим образом настройте свои рабочие нагрузки.
Также стоит отметить, что цены на API OpenAI значительно снизились с 1 сентября.
Если вам не подходит GPT-3, потому что вы хотите, например. что-то более открытое, предлагаю попробовать BLOOM (используя HuggingFace API) или OPT-175B.
Создать рабочий процесс
Поскольку и парсинг, и анализ могут масштабироваться, в какой-то момент вы можете захотеть построить настоящий пайплайн.
Луиджи от Spotify — хороший вариант. Я уже писал об этом. Но вы также можете рассмотреть более новые вещи, такие как Metaflow, которые кажутся очень многообещающими.
Наконец, вы, вероятно, захотите запускать свои рабочие процессы на AWS EC2 или подобных сервисах.
Выводы
Мы только что видели, что GPT-3 может хорошо работать, когда дело доходит до решения относительно сложных задач NLP, таких как анализ настроений на основе аспектов.
Учитывая качество результатов, не потребовалось много времени, чтобы собрать кусочки воедино и увидеть некоторые релевантные результаты. И это во многом благодаря возможностям GPT-3. Конечно, вы можете получить подобное, используя несколько моделей трансформеров для конкретных задач, но для этого потребуется гораздо больше.
Мы также видели, что GPT-3 не идеален, поэтому важно помнить о возможных недостатках такого подхода.
Тем не менее, я думаю, что LLM станут новым стандартом в НЛП и будут использоваться все больше и больше в будущем для решения многих задач НЛП.
Они помогут улучшить ваши текущие проекты или, почему бы и нет, создать что-то новое.
Рекомендации
Полный код эксперимента доступен здесь.
Большое спасибо за чтение!