Введение и задача

Добрый день, уважаемые читатели Хабр.ру! Я хотел бы поделится с вами отчетом по хакатону (Practice & Scale AI: Рерайтинг текста на уровне, позволяющем проходить фильтрацию распознающих систем), в который мы очень «лихо» влетели со всей командой (Anomaly Detection) и, забегая вперед, скажу, который мы «втащили» на третье место по нашему кейсу. Жаль, правда, что призовое место было одно, но все же это был отличный опыт и по «горячим» следам все сейчас опишу и расскажу, что мы делали и как «пришли» к нашему решению.

Итак, хакатон проходил на платформе ЗаводIT и организатором являлась компания «Аналитика Инсайт». Сам хакатон ставил своей целью несколько кейсов, один из которых был, разработка решений для рерайтинга текстов и, что более важно, генерации текстов и прохождение их (текстов) систем детекции AI для сгенерированных текстов (системы проверки). То есть, по факту нам необходимо было сделать следующее:

1/ Получить исходный текст и проверить его на генерацию, при том оценив по 100 бальной шкале;

2/ Сделать рерайт текста (сгенерить) для SEO пригодным для чтения человеком;

3/ «Закамуфлировать» текст так, что бы он максимально был похож на «человеческий» и проходил системы AI, которые отлавливают сгенерированный контент.

В чем состояла бизнесовая суть задачи которую нам дали (по моему мнению): Все имеющиеся популярные сми‑платормы активно борятся с сгенерированным контентом, так как, в массе, клиентам не интересно его читать, так как он выглядит не «живым» и весьма скучным, более того, чувствуется, что он составлен по какому‑то шаблону. Отсюда получается, уход клиентов и «провал» рекламных компаний на сми‑площадка, а как следствие потеря вложенных инвестиций рекламодателей. Возможно также и другие приложения данного решения, но мне показалось данный подход наиболее ролевантным, по крайней мере, я давно его наблюдаю.

Подготовка к хаку и команда

Исходя из поставленных задач, мы активно принялись за решение, было просмотрено огромное количество материала (тексты, статьи, модели, аналитика, блоги, чаты - короче, где мы только не были ;)) ). Перебрали огромное количество моделей, что-то «взлетело из коробки», что-то проходилось тюнить и допиливать на «горячую». В самом начале, на общем созвоне, решили, что будем делать и в какую сторону «копать». Я (капитан команды) распределил роли в команде с учетом пожелания парней и их опыта (да наша команда называется «Anomaly Detection» мы постоянно участвуем в хакатонах, и этот уже не первый).

Так вот, я (Миронов Владимир — DS, Analytics), занялся, непосредственно, подбором моделей их тестированием и тюнингом, аналитикой и проработкой идей по «камуфлированию» текстов, а также общим руководством проекта со стороны бизнес‑требований и общением с заказчиком на питчингах. Жене (Евгений Гордеев — DS, Analytics) отошла роль анализа и сборки всего, что наработано по моделям, а также тюнингу моделей, запуску сервиса, его поддержке и критическому анализу поставленных задач. Организаторы, сразу обозначили, что главное, это собрать именно ядро проекта, не «заморачиваясь» на оформлении и «косметических» моментах API. Игорь Шумский (Analytics, Viusalization, Support), как начинающий, но уже принимавший участие в хакатонах специалист, мониторил весь процесс и занимался разработкой презентации с отражением ключевых аспектов нашего решения, всех его тонкостей, попутно вникая, как идет процесс, и нарабатывая опыт. Ваня (Иван Ушаков — Support), осуществлял информационную поддержку проекта и постоянно искал информацию по различным источникам, закидывая ее в общий чат. Рома (Роман Солонченко — Support, DataBase), мониторил весь процесс, а также подсказывал интересные идеи, и в случае, непредвиденной ситуации или отсутствия, кого‑то, оперативно мог влиться в разработку.

Хакатон длился три дня в онлайне. Работа шла весело и задорно, команда работала слажено и спокойно, все возникающие вопросы решались в рабочем порядке очень оперативно. Трудились плотно, но без истерик и фанатизма, если парням необходимо было отлучится по своим вопросам, проблем это не вызывало, для всей остальной команды, все были на связи, никто никого не дергал не донимал, отлично, что получилось построить спокойный flow‑режим. «Краптели» с утра до позднего вечера, но ночью спали и все отдыхали, так как команде нужен отдых и аккумулирование ресурсов, для генерации идей.    

Перед каждым чек‑поинтом и питчингом, мы устраивали короткие созвоны, с целью обсудить то, что будем говорить, как лучше подать все и на каком этапе сейчас все реализовано. На финальный питчинг приготовили большую презентацию и записали, как реально работает приложение.

Проект и сервис

При технической реализации проекта (в столь короткий срок), как я уже говорил, мы перебрали кучу моделей, искали везде, на githab»e, huggin face и просто бегали по сети. При этом в качестве модели, которая будет проводить анализ того, что текст сгенерирован мы взяли Juner/AI‑generated‑text‑detection на сегодняшний день, это одна и топовых моделей по решению данного класса задач, ее тюнили и настраивали. Здесь сразу скажу, что мы реализовали проект который работает внутри периметра компании, он не выносит данные во вне, и не требует подключения во внешнюю сеть, что является несомненным плюсом при реализации поставленной задачи.   

Перефразирование текста проводилось при помощи следующего класса моделей: T5, Bart, T5+Parrot, Opus, Pegasus, Pegasus + PAWS + T5. При разработке использовали стандартный пак библиотек, тут обошлось без изыcков: pathlib, re, argparse, logging, itertools, concurrent, tqdm, torch, transformers, sentencepiece, nltk, Streamlit. Оценка модели происходила по метрике BLEU. Кроме, того мы учли вариант представления решения (рерайтинга) не только на английском языке, но и на русском и представления не одного варианта рерайтинга, а нескольких, что бы пользователь мог, самостоятельно, выбирать понравившийся ему вариант.

В ходе работы над таском, мы «прогнали» большое количество тестов, какие‑то были удачными, какие‑то откровенно «провальными», но мы выяснили основные тонкие моменты рерайтинга, применительно к задачи «камуфлирования» текста. Мы использовали, как чистые модели, так и миксованные. На следующих рисунках я представил варианты тестов.

Рис. 1. Рерайтинг полученный посредством T5 (Здесь особого качества мы не получили, метрика BLEU была на уровне 0,06, что весьма низко, и как видно качество рерайта страдает из-за потери большого количества информации)
Рис. 1. Рерайтинг полученный посредством T5 (Здесь особого качества мы не получили, метрика BLEU была на уровне 0,06, что весьма низко, и как видно качество рерайта страдает из-за потери большого количества информации)
Рис. 2. Рерайтинг полученный посредством BART (Здесь мы получили откровенный прорыв на уровне 0,67, что оказалось очень приятным и дало пищу для дальнейших разработок, да и объем текста и общий смысл не очень пострадал);
Рис. 2. Рерайтинг полученный посредством BART (Здесь мы получили откровенный прорыв на уровне 0,67, что оказалось очень приятным и дало пищу для дальнейших разработок, да и объем текста и общий смысл не очень пострадал);
Рис. 3. Рерайтинг полученный посредством T5+Parrot (Здесь все ушло «ниже плинтуса» по метрикам, поэтому от такой архитектуры заведо отказались, примерно такую же ситуацию нам обрисовала связка Pegasus + Paws + T5, но мы оставили ее для некоторых «специфических» текстов);
Рис. 3. Рерайтинг полученный посредством T5+Parrot (Здесь все ушло «ниже плинтуса» по метрикам, поэтому от такой архитектуры заведо отказались, примерно такую же ситуацию нам обрисовала связка Pegasus + Paws + T5, но мы оставили ее для некоторых «специфических» текстов);

Наиболее прорывным решением, оказалась, очень неприметная сеть (организаторы на питчинге, как мне показалось, даже на пару секунд потеряли дар речи, и сказали, что решение, крайне необычное, но весьма рабочее) Helsinki‑NLP/opus‑mt‑en‑ru. То есть мы использовали модель двойного перевода, что особенно хорошо, сеть не нуждается в значительных ресурсах, а качество рерайтинга, очень высокое (Рис. 4.).

Рис. 4. Рерайтинг полученный при помощи Helsinki-NLP/opus-mt-en-ru
Рис. 4. Рерайтинг полученный при помощи Helsinki-NLP/opus-mt-en-ru

Если на данном этапе мы получили неплохое решение, следующим важным моментом было «камуфлирование» текста, этакий постпроцессинг текста. Очень интересная задача, на мой взгляд и не самая тривиальная. Здесь на помощь пришел всесторонний анализ человеческих ошибок и особенностей письма при написании текста, таких как:

  • ошибки в пунктуации и двойные пробелы (Рис. 5);

  • пропуски букв и некорректная стилистическое построение предложения;

  • лишние знаки препинания и изменение длины предложений (Рис. 6);

  • перестановка слов в предложении и замена пассивных конструкций на активные (Рис. 7);

  • добавление эмоциональных элементов и замена слов на разговорные аналоги;

  • различная стилистика письма (академическая, профессиональное, техническое);

  • замена слов синонимами (Рис. 8) и многое другое.

Конечно, данных подходов достаточно много, и грамотно оформленный SEO текст правит многие из них, но все может быть, и не всегда все видит алгоритм правки, но на то и был «расчет», что модель еще больше будет считать, что текст написан, именно, человеком.

Рис.5. Внедрение двойных поробелов и лишних знаков препинания
Рис.5. Внедрение двойных поробелов и лишних знаков препинания
Рис.6. Перестановка слов в предложении и изменение длины предложений
Рис.6. Перестановка слов в предложении и изменение длины предложений
Рис.7. Замена слов на разговорные аналоги.
Рис.7. Замена слов на разговорные аналоги.

По итогу нам удалось реализовать очень простую, быструю и эффективную заготовку‑алгоритм по рерайтингу текстов в самом широком ключе, то есть мы старались не привязываться к конкретной отрасли. При этом, до начала соревнования, мы «прошерстили сайт» компании заказчика и поняли, что клиенты у нашего заказчика, самые разнородные и учесть все специфики деятельности весьма сложно. Поэтому мы решили написать, более или менее унифицированный алгоритм и подход по решению данной задачи.

Все полученные наработки видны на рис. 8. Здесь показана работа алгоритма, который выясняет, был ли исходный текст сгенерирован и дает оценку, степени генерации. При этом мы, наряду с топовыми решениями, все равно добавили не самые ролевантные модели, так как в зависимости от стилистики текста и его структуры, они могут дать также неплохой результат, но их диапазон не очень широкий.

Рис. 8. Перефразирование текста
Рис. 8. Перефразирование текста

Таким образом, мы заняли 3 место с не самым плохим баллом, всего до финала дошло порядка 11 комманд. На общем питчинге, были представлены также весьма интересные подходы и идеи от других разработчиков и были показаны их решения. На этом хак закончился и спустя 4 часа, после проверки всех решений был оглашен рейтинг и результат с «выкаткой» лидерборда (Рис. 10). Отдельная благодарность организаторам, за качественную подготовку и проведения хакатона.

Рис. 9. Сертификат (такой сертификат получили все участники команды со своим именем)
Рис. 9. Сертификат (такой сертификат получили все участники команды со своим именем)
Рис.10. Финальный лидерборд
Рис.10. Финальный лидерборд

Так весело и незатейливо мы втащили данный хак, кстати, меня есть блог, где я публикую последние новости разработки по ML & DL и анализу данных, а также небольшую аналитику. Там есть краткие выдержки из статей и заметки из блогов других разработчиков. Так же есть чат, где вы можете спросить любой вопрос, и я с удовольствием отвечу на него, есть также группа в ВК и небольшой канал на YouTube. Скоро появится каналы на других площадках. Подписывайтесь, задавайте вопросы буду рад всех видеть.

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