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

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/766758/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *