Добрый день!
В этой статье я хочу поделиться своим опытом в области классификации комментариев к видео на 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 для разных задач, не только для классификации. Пишите в комментариях или в личку, постараюсь помочь.