Безопасность чат-ботов Just AI
Проект по разработке инструмента для автоматического анализа текстовых сообщений и выявления потенциально нежелательного контента среди ботов компании Just AI
О заказчике
Just AI разрабатывает продукты в сфере разговорного AI, позволяя пользователям создавать собственные чат-боты и запускать их в работу в нужном канале (например, Telegram, ВКонтакте и др.).

Когда аудитория ботов растёт, растут и риски: среди тысяч сообщений могут появляться чаты с нежелательным контентом.
Отслеживание подозрительных чатов вручную, по словарю паттернов, требует значительных ресурсов. Поэтому Just AI предложил разработать совместный проект, который поможет автоматизировать обнаружение нежелательного контента, чтобы высвободить ресурсы своей команды для других задач.
Контекст проблемы
Распространение нежелательного контента через мессенджеры и социальные сети является серьёзной проблемой в интернете. Использование ботов в мессенджере упрощает процесс распространения такой информации и обеспечивает анонимность.

Для успешного обнаружения сообщений, содержащих нежелательную лексику, необходимо понимать особенности языка которым пользуются распространители такого контента. Чтобы уклониться от обнаружения, они используют разные методы:
  • Омонимы
    Слова, которые имеют два значения: бытовое и то, что указывает на нежелательный контент.
  • Сленг
    Постоянно обновляющийся сленг делает статичные списки слов со временем устаревшими.
  • Эмодзи, цифры и замены букв
    Намеренное искажение слова при добавлении эмодзи, символа, цифры или буквы из других алфавитов.
  • Одиночные буквы как запросы
    В определённом контексте сообщение с одной буквой может нести скрытый смысл, но без знания истории диалога его нельзя однозначно интерпретировать — одиночная буква встречается и в обычной переписке.

Цели проекта
  • Исследовать различные подходы к обнаружению нежелательного контента в текстовых диалогах на русском языке.
  • Разработать и сравнить прототипы моделей модерации
  • Подготовить комплексный отчет с выводами и рекомендациями для внедрения наиболее эффективного решения.
Обзор подходов
Для выбора оптимального подхода к решению задачи мы провели обзор существующих исследований в области автоматического обнаружения нежелательного контента. Ниже представлены основные методы, применявшиеся в схожих задачах, и их ключевые характеристики. Среди них базовый словарный метод, самый прогрессивный метод - LLM и несколько подходов в рамках ML.
  • Поиск по словарю + Регулярные выражения (regex)
    Поиск ключевых слов из ранее составленного словаря в сообщениях с применением регулярных выражений
  • TF-IDF + логистическая регрессия

    Метод частотного анализа текста + классификатор. Из минусов: часто не понимает семантику и контекст.
  • Word-based ML: Word2Vec, CantReader, Zhu et al
    Анализируют отдельные слова, но не понимают контекст предложения.
  • BERT, RoBERTa, ruBERT
    Трансформерные языковые модели, которые понимают контекст всего предложения, но только ruBERT обучен на русскоязычных данных. Ограничение: требуют большого объёма размеченных данных и переобучения под конкретный домен.
  • LLM prompting
    Готовая языковая модель классифицирует текст через инструкцию в промпте, без дополнительного обучения.
Изучение данных
Just AI предоставили ознакомительный сэмпл логов чат-ботов для первичного анализа и изучения данных.

Данные ознакомительного сэмпла:
  • 10 097 строк.
  • 64 колонки (примеры: 'account_id', 'project_short_name', 'channel_type', 'response_data', 'data', 'system_data', 'operator_id').
  • При проверке составных полей, содержащих информацию в формате json, обнаружили, что там дублируются уже существующие поля.
  • Использовали fasttext-langdetect для детекции языков в датасете.

После первичного анализа и описания выборки, мы запросили у Just AI основной датасет, в котором:
  1. только те записи, где в полях есть question и text_answer.
  2. в поле ChannelType только тип: chatwidget, telegram, vk. Остальные каналы (marusia, i_digital и chat2desk) используются крупными корпоративными заказчиками, и компания уверена в отсутствии нежелательных сообщений в них.
Основной датасет
- логи взаимодействий пользователей с чат-ботами. Данные собраны из настоящих диалогов, но специально скомпилированы и размечены для задач данного проекта. Данные были анонимизированы компанией Just AI перед передачей.
Каждая строка датасета соответствует одному диалоговому ходу с полями question и answer, сгруппированными по session_id. У одного аккаунта может быть много session_id, то есть структура вложенная: account_id → session_id → message.

Разметка выполнялась комбинированным образом.

Сообщения размечены на два класса: eligible и ineligible. Все eligible сообщения принадлежат аккаунтам компаний-клиентов с проверенной репутацией. Uncertain сессии принадлежат компаниям, в репутации которых нет уверенности, так как они не являются постоянными клиентами Just AI и не известны в российской бизнес-среде. Затем сообщения внутри uncertain сессий были вручную оценены с метками «eligible» или «ineligible», то есть сессия целиком не помечалась как нежелательная.


Описание основного датасета
  • Строки: 7 816 579.
  • Колонки (10): 'timestamp', 'account_id', 'project_short_name', 'channel_type', 'question', 'nlp_class', 'answer', 'session_id', 'from_ineligible_account', 'message_label'.
  • Дисбаланс классов (колонка 'message_label'): eligible 7816116 (99.99%) / ineligible 463 (0.01%).
  • Пропуски в колонках: 'nlp_class' - 99.98%, 'answer' - 41.53%, 'account_id' - 3.12%.
  • Язык: русский, английский, транслит с английского, эмодзи.

Решение проблемы с дисбалансом: для обучения и оценки моделей был создан сбалансированный поддатасет из 1392 сообщений с соотношением ineligible:eligible примерно 1:2, разделённый на train (748), val (336) и test (305).
Как мы выбирали метод
Словарный метод
Несмотря на то что словарный метод является базовым, он не требует больших ресурсов и работает быстро. Результаты метода могут быть отправной точкой для сравнения с другими подходами.
Различные ML подходы
  • Недостаток размеченных данных (463 ineligible сообщения) и ресурсов для обучения.
  • Большинство ML-моделей обучены на английском.
  • Наша задача шире стандартной классификации.
LLM prompting
  • Не требует обучения.
  • Быстрее в разработке - можно провести больше итераций по улучшению промпта.
  • Понимает контекст и текст с разными символами без дополнительной настройки.
  • Современный подход.
Составление словаря
На основании изучения подходов NLP был сделан вывод о необходимости словаря с нежелательной лексикой. Мы составили словарь, который содержит 840 слов и краткое описание значений каждого термина. В основе словаря лежит датасет Just AI и списки нежелательной лексики. Также был написан Python-скрипт, отделяющий термин от синонима по запятой и синонимичные термины от их значения по длинному тире, а также выполняющий очистку форматирования.
Метод I: Словарный подход
Это метод решения задачи бинарной классификации, также известен как правило-ориентированный. Его суть заключается во флагировании нежелательного контента, основываясь на словаре.
Мы использовали DuckDB и pymorphy3, чтобы найти ineligible сообщения.
Naive version - поиск подстроки в тексте без учёта границ слов. Smart version - поиск с границами слов через regex \b.
Naive метод
Smart метод
Причины результатов:
  • Латиница и аббревиатуры
    Словарь ищет термины на русском языке, а нежелательные термины могут быть написаны латиницей или сокращены до одной буквы. Словарь их просто не знает.
  • Команды бота, например: "/newNode_5"
    Текст начинается со служебной команды, и словарь не распознаёт термин внутри неё.
  • Ложные срабатывания
    Словарные методы ищут все слова из словаря, независимо от контекста или омонимов.
Метод II: LLM модели
Этапы работы
Разработка основного скрипта
Проработка скрипта, Error Analysis, разработка промптов.
Выбор лучшей модели
Тестирование нескольких LLM моделей (instruct и create) с асинхронной обработкой.
Получение ICL baseline
Тестирование стратегий отбора примеров для In-Context Learning на лучшей модели.
Усовершенствование ICL baseline
Пайплайн с подбором гиперпараметра количества примеров.
ICL + embedding
Добавление семантических эмбеддингов.
Разработка основного скрипта
Pipeline организован как линейная последовательность этапов:

(i) построение доменного лексикона и формирование их него словарей;
(ii) подготовка входных данных модели из raw корпуса;
(iii) сборка промпта и подача его в LLM;
(iv) получение ответа от LLM;
(v) оценка по эталонным меткам.

Все этапы используют единую детерминированную конфигурацию, что позволяет точно воспроизвести прогон и возобновить его после прерывания.

Словарь нежелательных терминов включается в промпт — модель использует его как опорный список при классификации сообщений. Все слова в словаре уже приведены к начальной форме и нижнему регистру. Результаты находятся в JSON.

Разработка промптов
Первые 3 варианта промптов были написаны с помощью нейросетей:
  1. "Минималистичный" (prompt_a): короткий промпт без словаря, только общая инструкция
  2. "Подробный" (prompt_b): с максимальным описанием деталей и полным словарем и чёткими правилами
  3. "Компромиссный" (prompt_c): балансирует между краткостью и обстоятельным описанием, включает краткий вариант словаря.
Последние 2 промпта показали macro F1-score 0.85.

В результате, мы дополнили инструкцию и получили улучшенную версию промпта - "Усиленный" (prompt_d). С ним удалось добиться показателей recall (ineligible) 0.83 и macro F1-score 0.91.
Финальный "Усиленный" (prompt_d) состоит из детальных правил, определяющих:
  • a) положительный класс через несколько явных условий (прямые упоминания, сленг и эвфемизмы, транслитерация, контекст действия и сигналы эмодзи) + триггеры положительного класса: сущности нежелательных тем, обфусцированные названия каналов и ботов, подозрительные сокращения и отдельные латинские символы, ссылки на криптовалюту и фразы с двойным смыслом,
  • b) отрицательный класс (омонимы в бытовом употреблении, ирония, нерелевантный чат),
  • c) явный приоритет решения — контекст важнее отдельных токенов.
  • d) словарь в полном размере как опорный список слов.
Тестирование скрипта на разных LLM
Одновременно с разработкой промптов, мы протестировали различные LLM на задаче бинарной классификации, используя "Подробный"(prompt_b) и "Компромиссный" (prompt_c) промпты.

Для исследования использовались модели с разными принципами работы: instruct модель (сразу даёт ответ на основе инструкции) и reasoning модель ( перед финальным ответом строит цепочку рассуждений "думает вслух", что занимает больше времени и токенов, но потенциально даёт более точный результат).

Эксперименты проводились на следующих моделях LLM:
  • Qwen3.5-9B (использованы instruct и reasoning конфигурации);
  • Gemma-4-E4B (использованы instruct и reasoning конфигурации);
  • YandexGPT-5-Lite-8B-instruct;
  • Ministral-3-8B-Instruct-2512;
  • Ministral-3-8B-Reasoning-2512.
Все модели были развёрнуты на локальном сервере с видеокартой Nvidia RTX 5090 c 32 ГБ видеопамяти.

Работа над сравнением моделей
По итогам тестирования сопоставимо высокие результаты дали 2 модели Qwen3.5-9Bи YandexGPT-5-Lite-8B-instruct. Для дальнейшей работы была выбрана модель YandexGPT-5-Lite-8B-instruct по трём причинам:
  1. Это instruct модель, соответственно не тратятся токены на "рассуждения" над ответом и сокращается время поиска решения.
  2. Она показала recall выше, чем другие модели — это критично для модерации, где важно не пропускать опасные сообщения.
  3. Qwen не смогла корректно обработать все строки датасета (проблемы с парсингом ответов), тогда как Yandex стабильно возвращала структурированный результат.
Лучшие результаты instruct и reasoning моделей, prompt_b и prompt_c
Главные выводы по тестированию разных моделей:

  • YandexGPT instruct — лучший по Recall (0.553) и Macro F1 (0.765).
  • Reasoning модели не превзошли instruct.
  • LLM метод лучше keyword baseline (0.65+).
YandexGPT-5-Lite-8B-instruct с новым prompt_d на тестовой выборке
In-Context-Learning
Модели даётся описание задачи, набор размеченных примеров и запрос. Она предсказывает ответ, опираясь на конкатенированный контекст. Поскольку ICL крайне чувствителен к выбору примеров, их подбор является ключевым: баланс между релевантностью, охватом классов и длиной промпта напрямую влияет на качество и стоимость.
Baseline ICL
Для изучения влияния выбора примеров мы начали со подачи в модель 10 примеров с двумя стратегии выборки (случайная и сбалансированная 1:1 по классам), со словарём и без него.
Параметры Baseline:
Модель: YandexGPT-5-Lite-8B-instruct
Промпт: "Усиленный" (prompt_d) в вариациях
со словарём и без
Выборка примеров: t = 10
Датасет: валидационная выборка
Стратегии отбора примеров:
  • Random — примеры отбираются случайным образом, без балансировки классов eligible и ineligible
  • Balanced — сбалансированная стратифицированная выборка соотношение классов 1:1
🏆Ключевой результат на полном словаре FULL_DICT (800 терминов) по показателю recall:
Усиленный промпт со сбалансированной стратифицированной выборкой без словаря prompt_d_balanced_few_shot_wo_dict

recall= 0.7832
f1_macro=0.6398

Так как нет значимых отличий в промптах со словарем и без,далее в экспериментах продолжили использовать словарь.
Результаты на FULL_DICT (полный словарь)
Усовершенствование ICL baseline
Добавили гиперпараметр:
  • Выборка примеров t : перебирается из массива[2, 4, 8, 16, 32])
🏆 Лучший вариант: Усиленный промпт с двумя рандомно отобранными двумя примерами prompt_d_random_with_dict_2_examples
Recall = 0.818

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

prompt_d_random_wo_dict_2_examples, prompt_d_balanced_wo_dict_2_examples, prompt_d_balanced_wo_dict_4_examples, prompt_d_random_with_dict_2_examples, prompt_d_balanced_with_dict_2_examples
Лучшие результаты ICL baseline + гиперпараметры
Худшие результаты ICL baseline + гиперпараметры
ICL + embedding
Чтобы улучшить качество классификации, мы перешли к семантическому отбору: примеры подбирались не произвольно, а на основе смысловой близости к классифицируемому сообщению.

Для реализации данного подхода использовались эмбеддинги сгенерированные с помощью модели модель Qwen3-8b. После чего из размеченного датасета отбирались примеры, наиболее близкие к нему по смыслу. Таким образом, в контекст модели передавались не случайные, а наиболее релевантные для конкретного классифицируемого случая примеры

Стратегии, подачи эмбендингов в промпт:
  • Топ-N по семантике с балансировкой по классам
Выбирает N/2 наиболее похожих legal и N/2 наиболее похожих illegal примеров из обучающей выборки на основе косинусного сходства* эмбеддингов. Гарантирует представление обоих классов в промпте, но некоторые примеры могут быть менее релевантны чем при обычном топ-N отборе.

*математическая мера похожести двух векторов, измеряет угол между ними.

  • Балансировка по классам + диверсификация
Выбирает N/2 legal и N/2 illegal примеров которые одновременно похожи на тестовое сообщение и разнообразны между собой, чтобы избежать дублирующиеся примеры. На каждом шаге выбирается пример с наилучшим балансом между похожестью на тест и непохожестью на уже выбранные примеры:
score = λ × сходство с тестом − (1−λ) × сходство с уже выбранными
Параметр λ=0.7 балансирует релевантность и разнообразие.
Лучшие результаты
Итоги
В рамках проведённого исследования эффективности малых языковых моделей (с объёмом параметров, не превышающим 9 млрд) в задаче детекции нежелательного контента было установлено, что наилучшие показатели демонстрирует модель YandexGPT‑5‑Lite‑8B‑instruct. Преимущество указанной модели обусловлено её лингвистической адаптацией: в процессе дообучения использовался корпус русскоязычных текстов, что обеспечило повышенную чувствительность и улучшило обобщающую способность модели на русскоязычных данных.

Для оптимизации работы модели применялся подход in‑context learning, реализованный посредством структурированного формирования промптов. Ключевыми компонентами методики являлись: балансировка примеров по классам с целью нивелирования дисбаланса распределения классов в обучающей выборке, а также диверсификация внутриклассовых образцов для повышения устойчивости модели к вариативности формулировок.

Реализация данной стратегии позволила достичь значения метрики Recall, равного 0,942. Данный результат свидетельствует о высокой полноте обнаружения релевантных экземпляров нежелательного контента, что является критически важным параметром для систем контент‑модерации, ориентированных на минимизацию доли ложноотрицательных срабатываний.

На основании полученных данных сформулированы следующие рекомендации для компании Just AI: целесообразно внедрять малые языковые модели, предобученные на русскоязычных корпусах? с применением in-context learning методов, в качестве базового решения для систем автоматической модерации. Такой подход характеризуется рациональным соотношением вычислительной стоимости и качества классификации, обеспечивая достаточный уровень полноты детекции при умеренных ресурсных затратах.

В перспективе, при наличии дополнительных вычислительных ресурсов или повышенных требований к точности идентификации (в том числе к балансу между полнотой и точностью), возможна экстраполяция отработанных методологических приёмов (стратегии промптинга, балансировки и диверсификации) на архитектуры больших языковых моделей —с целью дальнейшего повышения качества классификации.
Команда проекта
  • Валерия Моисеева
    Куратор проекта
  • Ильяс Асланов
    Куратор проекта
  • Екатерина Мамочкина
    Участник проекта
    Студентка программы ДПО ПАНДАН 2025-2026 года
  • Виктория Одношивкина
    Участник проекта
    Студентка программы ДПО ПАНДАН 2025-2026 года
  • Татьяна Хахалева
    Участник проекта
    Студентка программы ДПО ПАНДАН 2025-2026 года
Проект подготовлен в рамках программы ПАНДАН
Made on
Tilda