В мире высоких технологий все больше и больше компаний внедряют голосовых и чат‑ассистентов в различные сегменты рабочих процессов. Они помогают обрабатывать рутинные задачи, ускоряют взаимодействие с пользователями и снижают нагрузку на сотрудников. Компания «Эвотор» находится в числе тех, кто активно занимается разработкой ассистента поддержки на базе llm — Евы, которая уже помогает тысячам пользователей ежедневно.

Но в каждом клиентском сервисе рано или поздно встает вопрос — а что делать с «неудобными» запросами? Кто‑то спрашивает про политику, кто‑то пишет откровенно неприемлемые вещи или пытается узнать рецепт наркотиков. Ответить на такое — значит рисковать имиджем компании. Игнорировать — тоже плохой вариант. А перевод на оператора может быть бесполезным, если он не готов к обсуждению подобных тем.

Меня зовут Калинина Наталия, ml‑engineer в компании Эвотор, и в статье приоткрою дверцу внутренней кухни нашей поддержки. У нас ежедневно обрабатываются тысячи пользовательских запросов и операторам отследить сообщения с высоким риском достаточно сложно. При таких объемах критически важна автоматизированная обработка чувствительных запросов и, что немаловажно, ответов самого ассистента.

image.png
Статистика обращений по дням

В связи с этим решила помочь коллегам в разработке safety layer и встроить детектор чувствительных тематик прямо в чат-бота, чтобы он сам мог отлавливать потенциально опасные или нежелательные сообщения до того, как будет сгенерирован ответ или запросы попадут к оператору.

В этой статье расскажу:

  • какие темы считаются чувствительными и почему;

  • как подбирала подход — от регулярных выражений до LLM;

  • как устроена архитектура решения;

  • на какие "грабли наступала" на этапе тестирования;

  • и как сейчас реагирует бот, когда получает что-то вроде «Как заниматься онлайн сексом безопасно по SSL/TLS?»

Спойлер: бот не краснеет, а работает.

Что такое «чувствительные темы» и почему их важно вовремя замечать

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

Так зачем все это нужно? Прежде всего стоит подумать о репутации компании и этике, ведь ассистент может выдать не совсем релевантную и нейтральную генерацию на сложную тему или, что еще хуже, предоставить ответ с опасной информацией, например, как сделать бомбу без смс и регистрации. Также сюда попадают и юридические риски. Нарушение норм и законов — особенно при упоминании чувствительных тем — может повлечь жалобы или даже поездки в Магадан. Еще одним немаловажным фактором является защита команды. Саппорту не всегда просто читать такие сообщения, поэтому детекция снижает эмоциональное давление и уменьшает выгорание сотрудников. И конечно же — качество сервиса. Если бот чётко понимает, где надо молчать, где — перенаправить, а где — дать мягкий отказ, это вызывает доверие.

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

Эксперименты с оптимальным подходом

Все начинается с базы — поресерчить текущие решения на рынке и попробовать прикрутить что-то готовое. Существует множество тулзов для обеспечения безопасности генерации асисстентов, основанных на llm-моделях. Например, LLM Guard, Vigil, Lakera Guard и другие.

Они умеют детектировать токсичность и prompt injection, утечки PI (персональных данных), опасные тематики, а так же инструкции по взлому или вредоносные действия. Их легко встроить в пайплайн приложения и в отдельных случаях настроить панель мониторинга.

На первый взгляд — мечта. Но когда начала копаться глубже, выяснилось, что почти все эти инструменты:

  • ориентированы на английский язык (в лучшем случае — с частичной поддержкой других языков);

  • плохо справляются с русским матом, сленгом, сарказмом и культурными особенностями (у нас же "бомба" — это и про взрывы, и про шашлык);

  • и, конечно, не локальны — почти все работают через облачные API, что не подходит для закрытых контуров или офлайн-интеграций.

Плюс ко всему, готовые решения — это ещё и черные ящики. Понять, почему система что-то отфильтровала или нет, — достаточно сложно. А в данном случае важно мягко и корректно сгенерировать ответ, зная, почему система посчитала тему чувствительной.

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

Тогда было решено попробовать словарный подход — заранее составила списки слов и фраз по каждой теме, включая сленг, эвфемизмы и даже опечатки. Это дало чуть больше гибкости, но вскоре всё начало напоминать бесконечную игру в догонялки: пользователи находят новый способ обойти фильтр — добавляем новую строку в словарь. Такой подход крайне плохо масштабируется+поддержка занимает много времени и сил.

Следующий шаг — включить нейросети. Началось все с GPT — отправляла запросы по API с определенным промптом на детекцию чувствительных тематик. GPT справлялся довольно неплохо, но: (1) дорого, (2) долго, (3) нестабильно (4) внешний сервис — одна и та же фраза могла то пройти, то нет. Плюс ко всему, модель переодически галлюцинировала, что порождало новые проблемы с обработкой такой выдачи. Да, она умеет «думать», но как сделать, чтобы это было быстро, качественно и дёшево 24/7 — отдельная статья. Не стоит забывать в данном случае об интеграции зарубежных сервисов, что являлось одним из red flags при разработке собственного решения.

Поэтому после череды экспериментов стало понятно: если мы хотим нормально работать с русским языком, контролировать поведение ассистента, его внутренности и быть уверенными в результате, надо собирать самостоятельно.

Архитектура

Приоритетными параметрами при реализации своего подхода являлись:

  • относительная легковесность решения (ориентир на небольшую модель для запуска на самым малых мощностях);

  • «русскоязычность» модели (как упоминалось выше, есть множество решений для английского языка, но для русского сегмента круг сильно сужается из‑за его специфики).

image.png
Архитектура решения

Сам пайплайн достаточно простой, но стоит чуть подробнее поговорить о данных. Их подготовка занимает большую часть времени, которого, как известно, у бизнеса не так много. Использовать человеческие ресурсы на весь процесс в данном случае выходило слишком затратно, а yandex.toloka показала неудовлетворительные результаты. Поэтому выбор пал на сет подходов для разметки текстовых данных.

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

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

Учитывая то, что у нас была обучена внутренняя модель сентимента, выбор пал именно на нее, так как негатив из разных областей она уже видела.

А что с датасетом? В данном случае получился достаточно интересный микс данных:

  • внутренние диалоги ассистента поддержки с клиентами;

  • часть датасета коллег из Сколтеха, состоящий из 2ch.hk (платформа для общения на русском языке, похожая на Reddit. Другими словами, настоящая кладезь текстовых данных с различными тональностями и темами для обсуждений) и Otvet.Mail.ru (платформа для ответов на вопросы);

Так как детекция «опасных» тематик является достаточно важным слоем безопасности, процесс подготовки и разметки проходил в несколько этапов:

  1. удаление дублей, замена url, маскирование имен клиентов и их личных данных;

  2. аннотирование внутренней сентимент‑моделью с метками «позитив/негатив/нейтраль»;

  3. оценка соотношения классов (в данном случае получилось ~60% негатива и около 40% позитива и нейтрали соответственно);

  4. GPT‑разметка негативной части по тематикам (напомню: политика, религия, наркотики, порнография и расизм+нейтраль в качестве альтернативы)+проверка итоговых лейблов;

  5. ручная проверка оставшейся части с более приятным контекстом и ее доп.разметка по тематикам.

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

В подобных условиях возникло желание обратиться к нейросетям и остановилась на BERT‑семействе. Важно было соблюсти баланс скорости и качества, поэтому, пройдясь по бенчмаркам и проведя ресерч, взяла ai‑forever/ruBert‑base. Это русскоязычная моделька от команды SberDevices на 178M параметров (более подробно здесь). Плюс она хорошо справляется с семантикой слов и уделяет большее внимание к смыслу текста в целом, что очень важно при работе с чувствительными тематиками. И конечно же, скорость — модель достаточно быстро работает из‑за расширения словаря, а главное — предоставляет качественные эмбеддинги.

С моделью определились, но осталась проблема дисбаланса классов. Здесь было важно повысить робастность модели в данных условиях. Для этого использовала Mixup — технику аугментации данных, при которой создаются новые обучающие примеры путём линейной комбинации пар входных данных и их меток.

Mixup работает следующим образом: допустим, есть два примера:

  • «Как оплатить через СБП?» $(x1)$ → класс «Оплата» $(y1)$

  • «Как сменить номер телефона?» $(x2)$ → класс «Настройки» $(y2)$

Метод создаёт:

  • Новый вход: $x=λx1​+(1−λ)x2​$

  • Новую метку: $y=λy1+(1−λ)y2$

Где $λ∈[0,1]$ — случайное число.

То есть на выходе получается новый тренировочный пример, который частично похож и на запрос про оплату, и на запрос про номер телефона. Его метка — не «жёсткий» класс, а сглаженный вектор, указывающий, что 70% вероятности — «оплата», 30% — «настройки».

При выборе основной метрики был сделан упор на «состояние» данных, так как из‑за отсутствия в них баланса, точность может быть обманчиво высокой. Поэтому в качестве базы выбрала F1-macro (даёт более честную картину и производит усреднение по классам — важен каждый класс одинаково, независимо от частоты). По итогам обучения модели получилась красивая матрица ошибок и F1 со значением ~96%.

image.png
Матрица ошибок на тесте

Этап тестирования

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

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

image.png
image.png
image.png

А что же дальше?

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

Тут уже продолжится сбор данных по тем классам, которые оказались особенно уязвимыми во время тестирования. Например, запросы о порнографии и наркотиках часто приводили к ложным срабатываниям или недостаточной точности.

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

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

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