Добрый день!
В этой статье я хочу поделиться своим опытом в области классификации комментариев к видео на YouTube с использованием моделей GPT-3.5 и GPT-4 от OpenAI.
Репозиторий с кодом, написанным на NodeJS и TypeScript, доступен по этой ссылке. Хотя Python является де-факто стандартом для подобных экспериментов, учитывая популярность NodeJS на бэкенде, OpenAI выпустила официальную библиотеку для работы с их API именно для этой платформы.
В качестве примера для классификации я выбрал следующее видео:
Видео, в котором тестируется пробег 6 электромобилей, логично породило холивар на тему "Электро vs ДВС" в комментариях. Вот именно этот холивар мы и будем анализировать.
1. Загрузка и подготовка комментариев
Чтобы проект функционировал корректно, необходимо в корневой директории создать файл с именем ".env", в котором будут храниться ваши ключи доступа к OpenAI и YouTube API. Инструкции по получению этих ключей легко найти в интернете.
OPENAI_API_KEY=ваш ключ тут
YOUTUBE_API_KEY =ваш ключ тут
Логика загрузки комментариев реализована в модуле Download.ts
. Детальное описание этой части опущено, поскольку оно не является центральным элементом данной статьи. Загрузка комментариев производится следующей командой:
npm run youtube-download
После выполнения этой команды в директории "data" появится файл comments.json
, содержащий все корневые комментарии (ответы в этом анализе учитываться не будут).
Модуль Convert.ts
фильтрует и оставляет только необходимые данные — ID комментария и его текст. Дополнительно удаляются комментарии слишком большой длины (более 400 символов, что составляет около 3% от общего числа), чтобы снизить стоимость анализа. Оставляются также первые 100 комментариев, которые будут использоваться как исходные данные для ручного создания тестового набора данных. Запуск происходит следующей командой:
npm run youtube-convert
В результате в директории "data" создается файл comments2.json
.
2. Ручное создание тестового набора данных
Будем тестировать классификацию на 3 категории:
0 - комментарий поддерживает электромобили;
1 - комментарий критикует электромобили или поддерживает автомобили с ДВС;
2 - другое.
Далее буду называть эти категории для краткости: "электро", "ДВС" и "другое".
Сначала необходимо отфильтровать из оставшихся 100 комментариев те, которые вы сами не можете однозначно классифицировать в одну из заданных категорий. После этого вручную установите соответствующие категории в поле "res" каждого комментария.
...
{
"id": "UgxW0nDvCXbWYHRl2iN4AaABAg",
"text": "Tesla????",
"res": 0
},
...
Далее я обрезал файл до 50 комментариев (опять же для снижения стоимости). Результат этой операции (тестовый набор данных) сохранён в файле data/comments_test.json
.
3. Классификация с использованием GPT моделей
Сначала рассмотрим одиночную обработку — то есть для каждого комментария будет отправляться индивидуальный запрос к OpenAI API.
И здесь главное это промпт (запрос к модели). Промпты бывают двух видов: системный и пользовательский. Системный промпт содержит базовые инструкции для модели. Пользовательский промпт - описание конкретной задачи.
Системный промпт:
Найди наиболее подходящую группу для комментария к YouTube видео.
Описание видео:
Пробный заезд шести электрических SUV для проверки соответствия заявленной дальности хода реальной.
Участвуют Audi Q4 e-tron Sportback, Genesis GV60, Mercedes EQA, Nissan Ariya, Tesla Model Y и Volkswagen ID Buzz.
Узнайте, кто покажет лучший результат в новом тесте с Мэтом на carwow!
Группы:
1 нравятся электромобили
2 предпочитает автомобили с ДВС или не нравятся электромобили
3 другое
Считаю важным предоставить модели контекст задачи, указав, что она классифицирует комментарии к видео на YouTube, и дать соответствующее описание.
Пользовательский промпт:
Комментарий: Мы проехали 4400км по Европе на Модель вай, заходите посмотреть! ????
Номер наиболее подходящей группы:
Завершение пользовательского промпта подобным образом позволяет относительно надежно заставить ее ответить просто номером группы.
Генерация промптов осуществляется в модуле GptLogic.ts
с помощью функции classifyCommentRu
. Эта функция в свою очередь вызывает callOpenAi
из GptUtils.ts
, которая напрямую обращается к OpenAI API.
И теперь проведём классификацию всех 50 комментариев с использованием модели gpt-3.5-turbo (стандартный ChatGPT):
npm run youtube-classify
Результаты:
error1: 7 <- ошибка тип 1 ("другое" вместо "электро" или "ДВС", или наоборот)
error2: 2 <- ошибка тип 2 ("электро" вместо "ДВС", или наоборот)
must 32% / 34% <- комментарии за "электро" / "ДВС", ручная классификация
actual 20% / 32% <- комментарии за "электро" / "ДВС", результат gpt-3.5
cost: 0.02 <- стоимость в $
Модель допустила 9 ошибок (18%) и только 2 раза перепутала "электро" с "ДВС" или наоборот. Судя по процентам основной ошибкой стало присвоение категории "другое" вместо "электро". Стоимость обработки составила всего 2 цента. И время порядка 1-2х минут (изменяется очевидно из-за загрузки OpenAI бэкенда).
Теперь запустим с моделью gpt-4:
Чтобы переключиться на другую модель, достаточно раскомментировать соответствующую строку в функции callOpenAi
из GptUtils.ts
. (Модель выбирается подобным образом так как это proof-of-concept код который я переиспользую для многих экспериментов)
Результаты:
error1: 3
error2: 3
must 32% / 34%
actual 30% / 34%
cost: 0.41
Модель допустила 6 ошибок (12%) и 3 раза перепутала "электро" с "ДВС" или наоборот. Зато результат в процентах получился очень близкий к эталонному. Но стоимость обработки составила 41 цент! Время примерно такое же как в прошлом эксперименте.
Рассмотрим все ошибки допущенные моделью:
"*censored*(не любят) электрички у нас в России...
А у меня в городе 2 лифа катаются ))
У их владельцев просто есть другой авто для дальних поездок )"
must: "электро", actual: "ДВС"
модель не поняла что критикует электромобили не автор комментария"таки неплохо, в моей голове почемуто засели цифры в 200 макс 300км ходу. но если у вас не дом и в гараже нет возможности установить зарядку то гибрид лучшее решение."
must: "ДВС", actual: "электро"
я оценил его как за "ДВС" впрочем он скорее за гибриды. а модель его отнесла к "электро""баз прикольный"
must: "электро", actual: "другое"
модель не поняла что автор имеет ввиду VW ID Buzz что простительно"Возможно уже просили - приводите пожалуйста расход с привычный стандарт kwh/100км. В текущем виде воспринимать очень тяжело."
must: "другое", actual: "электро"
наверно этот комментарий можно с натяжкой оценить как "электро""Какой бессысленный тест! Нахрен это надо? Элекромобили покупают не для того чтобы в кругосветку отправлться. Это по определению экономичная машина. Чтобы гнять по городу. Любишь ездить на природу - бери бензиновую.
Проверьте еще пикапы на расход топлива)))"
must: "электро", actual: "ДВС"
модель перепутала критику теста с критикой электромобилей, что простительно"Стекло запотело. Даже кондиционер отключили ради экономии. ????"
must: "ДВС", actual: "другое"
модель не поняла что автор намекает на нечестный тест
Все остальные классификации модель выполнила корректно. Полный список комментариев доступен тут. Считаю этот результат весьма достойным. В других экспериментах мне удавалось добиться всего одной! ошибки на 50 классификаций.
Оценим экономику применения gpt-4 для классификации подобных данных.
За час работы gpt-4 сможет классифицировать примерно 2000 комментариев. Стоимость составит примерно 16$. Предположим, человек способен классифицировать около 4 комментариев в минуту (с учетом "перекуров") что составляет примерно 250 комментариев в час. Значит модель способна заменить 8 человек с оплатой 2 доллара в час. Выглядит экономически оправданным.
3. Пакетная классификация с использованием GPT моделей
Теперь попробуем классифицировать не один, а сразу несколько комментариев, чтобы снизить стоимость и увеличить скорость обработки.
Для этого раскомментируем строку doClassifyComments()
в Classify.ts
. Функция batchClassifyComments()
разбивает все 50 комментариев на пакеты по 10 штук и направляет их в генератор промптов.
Системный промпт:
Найди наиболее подходящую группу для каждого комментария к YouTube видео.
Описание видео:
Пробный заезд шести электрических SUV для проверки соответствия заявленной дальности хода реальной.
Участвуют Audi Q4 e-tron Sportback, Genesis GV60, Mercedes EQA, Nissan Ariya, Tesla Model Y и Volkswagen ID Buzz.
Узнайте, кто покажет лучший результат в новом тесте с Мэтом на carwow!
Группы:
1 нравятся электромобили
2 предпочитает автомобили с ДВС или не нравятся электромобили
3 другое
Комментарии представлены в формате JSON массива.
Требуемый результат: JSON массив с соответствующими номерами групп.
Пользовательский промпт:
Комментарии:
[
"Мы проехали 4400км по Европе на Модель вай, заходите посмотреть! ????",
"*censored*(не любят) электрички у нас в России...\nА у меня в городе 2 лифа катаются ))\nУ их владельцев просто есть другой авто для дальних поездок )",
"Двойное удовольствие. Посмотреть и поржать над скептиками.",
"VW спереди похож на маску железного человека ????????????",
"ещё не посмотрел, но почему то уверен что Тесла",
"таки неплохо, в моей голове почемуто засели цифры в 200 макс 300км ходу. но если у вас не дом и в гараже нет возможности установить зарядку то гибрид лучшее решение.",
"Ролик тоооп",
"вот свет пропадёт и они вообще никуда не поедут, а я в свою бензина плюхну и поехал",
"Только мы в России будем на китайском говне ездить, покадругие страны идут в ногу со временем и пересаживаются на электро автомобили",
"мощность зарядки 191кВт ,но 77кВт батарею,будет заряжать более часа )) как всегда электрички то нае*во на всем )"
]
Результат:
Результаты gpt-3.5:
error1: 6
error2: 1
must 32 / 34
actual 20 / 34
cost: 0.006
Интересно, что модель совершила меньше ошибок, чем при обработке каждого комментария по отдельности, при этом стоимость уменьшилась в 4 раза.
Результаты gpt-4:
error1: 4
error2: 3
must 32 / 34
actual 36 / 30
cost: 0.12
Результаты чуть хуже, чем при одиночной обработке, при стоимости в 4 раза меньше.
Однако мои эксперименты показали, что пакетная классификация работает значительно менее стабильно, чем одиночная. Она чрезвычайно чувствительна к формулировке категорий и может давать очень неточные результаты. Я бы рекомендовал использовать её только в случаях, когда необходимо многократно классифицировать разные данные по стабильным и хорошо отлаженным категориям. Если же задача состоит в классификации по постоянно меняющимся категориям, то более надёжным вариантом будет одиночная обработка.
Надеюсь, мои эксперименты оказались для вас интересными и полезными. С удовольствием отвечу на ваши вопросы в комментариях.
Если вам нужна консультация или совет, то у меня есть наработки по применению моделей OpenAI для разных задач, не только для классификации. Пишите в комментариях или в личку, постараюсь помочь.
Комментарии (8)
den4ik_084720
13.10.2023 22:27А если сравнить с какой-нибудь моделью для NLI? Например этой
ovsale Автор
13.10.2023 22:27это специально обученная для классификации модель? ее из облака можно использовать? или только локально?
потестил немного. определенно хуже чем gpt работает
и контекст ей нельзя сообщить как я понимаю, а это важно. без описания видео многие комментарии вообще непонятны
combo_breaker
Если сделать системный промпт на английском, то стоимость будет меньше из-за особенностей токенизатора OpenAI. Интересно, какова была бы точность.
ovsale Автор
да это то с чего я начал. но точность была ниже. в другом эксперименте для gpt-3.5 было 9/7 (error1 / error2) для английского промпта и 7/5 для русского. для gpt-4 - 2/3 для английского и 1/1 для русского. получается что интеллект для одного языка выше. стоимость ниже да, но точно стоимость я не сравнивал.
combo_breaker
Спасибо!
Кстати, вы использовали обычную чат-модель gpt-3.5-turbo, тогда как есть gpt-3.5-turbo-instruct. От последней при равной цене можно ожидать лучший результат в подобной работе. Но как у нее с русским языком - я не знаю.
ovsale Автор
не пробовал но сейчас попробовал: ошибки 8/6 с gpt-3.5-turbo-instruct против 7/2 с gpt-3.5-turbo. вообще я инструкт модель не изучал потому что когда она вышла не понял в чем ее смысл.
combo_breaker
Модель instruct тренирована не на чатах, а на выполнении инструкций и прямых ответах на вопросы. Должно быть проще использовать в автоматизации, так как не должна просачиваться в ответы типичная для ChatGPT вода вроде "Sure, here is...". Видел сообщения о лучших способностях, например, может играть в шахматы https://www.reddit.com/r/GPT3/comments/16mefly/the_new_gpt_model_gpt35turboinstruct_can_play/?rdt=45819, лучше сочиняет тексты https://t.me/llm_under_hood/141, также у нее на момент выхода вроде бы не было склонности к самоцензуре, не знаю как сейчас.
ovsale Автор
у меня ничего подобного не получается. работает быстрее да, но хуже.
пакетная классификация из статьи совсем не заработала: json возвращает с синтаксическими ошибками... не помню чтобы я когда то такое вообще видел...
ну и API несколько другой и на gpt-4 одной строчкой кода не переключишь...