Как стать автором
Обновить

Классификация комментариев к Youtube видео с помощью GPT моделей. Точность и ее цена

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров2.6K

Добрый день!
В этой статье я хочу поделиться своим опытом в области классификации комментариев к видео на YouTube с использованием моделей GPT-3.5 и GPT-4 от OpenAI.

DALL·E-3: A computer screen displaying a colorful comment section with tags classifying content
DALL·E-3: A computer screen displaying a colorful comment section with tags classifying content

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

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии8

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн