Как мы обучили LLM распознавать имена на двух языках
В 2025 году мы работали над ИИ-ботом для крупной компании в сфере образовательных технологий Казахстана Bilim Media Group. Среди других сценариев был такой: через большую языковую модель (LLM) нужно было пропустить сообщения, в которых были чувствительные данные — в частности, ФИО.
Отдавать персональные данные языковой модели — плохо. Они могут попасть в обучающие датасеты и появиться в ответах бота на вопросы пользователей. Словом, это нарушение политик обращения с персональными данными, и позволить себе такое бизнес не может. Кроме того, утечки административно и уголовно наказуемы
Выход один — прежде, чем передавать сообщения в языковую модель, чувствительные данные нужно найти и зашифровать. Чтобы распознавать в текстах тот или иной тип объектов, используют технологию распознавания именованных сущностей NER (Named Entity Recognition). Подробно о NER мы писали в нашем материале. Технология позволяет автоматически выявлять персональную информацию — а затем её можно замаскировать, чтобы не слить в языковые модели или другие системы. В нашем случае после того, как массив текстов прошёл через языковую модель, нам нужно вернуть имена на места, чтобы передать операторам поддержки.
За годы развития технологии инженеры испробовали множество подходов — системы на основе правил, алгоритмы машинного обучения CRF и SVM, модели глубокого обучения — LSTM, BERT, трансформеры.
Особенности задачи
В нашем проекте нам нужно было выделять русские и казахские имена, отчества и фамилии. Русский язык богат падежами, окончаниями, склонениями и спряжениями. Одно имя или название может иметь десятки форм. Например, имя «Иван» может встречаться как «Ивана», «Ивану», «Иваном» и так далее. Значит, идентифицировать сущность по факту простого совпадения со словарём или шаблоном не всегда возможно — и подход на основе правил нам не подходит.
Мы отмели готовое решение Natasha, которое работает только с русскими именами и только когда всё грамматически верно. При этом показатель качества достаточно низкий. В DeepPavlov много ненужных возможностей и он слишком тяжёл. Другие модели с открытым исходным кодом, которые созданы для подобных задач, также показывали низкий показатель качества.
Показатель качества — численное значение, присваиваемое языковой моделью последовательности токенов (например, слову, предложению или целому тексту), которое отражает «правдоподобие» или «предпочтительность» этой последовательности с точки зрения модели. Другими словами, это показатель качества выполняемой моделью задачи — в нашем случае это идентификация имён, отчеств и фамилий.
Мы решили обучить свою языковую модель, которая корректно работала бы с разными языками, которую можно было бы обучить распознавать другие типы сущностей.
Ход работы
За основу мы взяли модель xlm-roberta-base без «головы» — трансформер хорошо понимает и русский, и казахский, но сам по себе не умеет классифицировать сущности. Мы дообучили к нему лёгкую классификационную «голову»: теперь модель весит около 1 ГБ и запускается даже на ноутбуке.
В начале у нас была очень грязная база логов — переписок пользователей с ботом и операторами на русском и казахском. Попытки отфильтровать только пользовательские сообщения оказались безуспешными. Чтобы собрать чистые данные, пришлось внедрить предварительную обработку.
Мы выделяли в логах все строки с данными, которые считаются персональными по закону — ФИО, номера паспортов и т. д. Все персональные данные мы пронумеровали от 0 до n и напротив строки ставили метку с уникальным номером. Если в строке было несколько видов ПД, то напротив строки ставили несколько меток [0,3,..,n].
В целом можно было научить модель видеть любые ПД, но в нашем случае достаточно было находить лишь ФИО, поэтому из этого датасета мы выделили только те строки, в которых было ФИО.
Модель не пропускала некоторые сообщения с угрозами и оскорблениями (такое тоже бывает в диалогах с ботами), мы добавили обработку исключений и ловили такие эпизоды на лету.
Из финального датасета со всеми ПД мы выбрали строки с ФИО — их получилось 2 500. Мы объединили полное ФИО в один токен, не разделяя имя, фамилию и отчество. Такой трюк позволил значительно увеличить объём обучающих примеров и поднять метрику качества.
Возможности и перспективы модели
При необходимости модель можно ещё квантовать — уменьшить размер, представив веса модели в виде дискретных значений. Тогда модель будет весить около 600 Мб.
В результате наша система распознаёт ФИО на русском и казахском с высоким показателем качества: она корректно выделяет полные имена, сокращённые варианты вроде «Кузнецов Т.», а также редко встречающиеся имена, которых не было в исходных данных.
Более того, модель легко справляется с грузинскими и кыргызскими — и скорее всего, и любыми другими — именами и фамилиями. Модель обрабатывает сотни сообщений в секунду и надёжно маскирует персональные данные до того, как они попадут в языковую модель бота.
Модель масштабируема и готова к дообучению — мы можем натренировать её искать в текстах названия фруктов, номера ИНН или показания счётчиков воды.
Обсудить проект
Расскажите о задаче вашей компании.