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

Комментарии (8)


  1. combo_breaker
    13.10.2023 22:27

    Если сделать системный промпт на английском, то стоимость будет меньше из-за особенностей токенизатора OpenAI. Интересно, какова была бы точность.


    1. ovsale Автор
      13.10.2023 22:27
      +1

      да это то с чего я начал. но точность была ниже. в другом эксперименте для gpt-3.5 было 9/7 (error1 / error2) для английского промпта и 7/5 для русского. для gpt-4 - 2/3 для английского и 1/1 для русского. получается что интеллект для одного языка выше. стоимость ниже да, но точно стоимость я не сравнивал.


      1. combo_breaker
        13.10.2023 22:27

        Спасибо!

        Кстати, вы использовали обычную чат-модель gpt-3.5-turbo, тогда как есть gpt-3.5-turbo-instruct. От последней при равной цене можно ожидать лучший результат в подобной работе. Но как у нее с русским языком - я не знаю.


        1. ovsale Автор
          13.10.2023 22:27
          +1

          не пробовал но сейчас попробовал: ошибки 8/6 с gpt-3.5-turbo-instruct против 7/2 с gpt-3.5-turbo. вообще я инструкт модель не изучал потому что когда она вышла не понял в чем ее смысл.


          1. combo_breaker
            13.10.2023 22:27

            Модель 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, также у нее на момент выхода вроде бы не было склонности к самоцензуре, не знаю как сейчас.


            1. ovsale Автор
              13.10.2023 22:27

              у меня ничего подобного не получается. работает быстрее да, но хуже.
              пакетная классификация из статьи совсем не заработала: json возвращает с синтаксическими ошибками... не помню чтобы я когда то такое вообще видел...
              ну и API несколько другой и на gpt-4 одной строчкой кода не переключишь...


  1. den4ik_084720
    13.10.2023 22:27

    А если сравнить с какой-нибудь моделью для NLI? Например этой


    1. ovsale Автор
      13.10.2023 22:27

      это специально обученная для классификации модель? ее из облака можно использовать? или только локально?

      потестил немного. определенно хуже чем gpt работает

      и контекст ей нельзя сообщить как я понимаю, а это важно. без описания видео многие комментарии вообще непонятны