Как мы обучили LLM распознавать имена на двух языках

В 2025 году мы работали над ИИ-ботом для крупной Edtech-компании Казахстана Bilim Media Group. Среди других сценариев был такой: через языковую модель нужно было пропустить сообщения, в которых были чувствительные данные — в частности, ФИО.

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

Выход один — прежде, чем передавать сообщения в языковую модель, чувствительные данные нужно найти и зашифровать. Чтобы распознавать в текстах тот или иной тип объектов, используют технологию NER — Named Entity Recognition. Подробно о NER мы писали в нашем материале. Технология позволяет автоматически выявлять персональную информацию — а затем её можно замаскировать, чтобы не слить в языковые модели или другие системы. В нашем случае после того, как массив текстов прошёл через языковую модель, нам нужно вернуть имена на места, чтобы передать операторам поддержки.

За годы развития технологии инженеры испробовали множество подходов — Rule-based системы, ML-алгоритмы CRF и SVM, модели глубокого обучения — LSTM, BERT, трансформеры.

Особенности задачи

В нашем проекте нам нужно было выделять русские и казахские имена, отчества и фамилии. Русский язык богат падежами, окончаниями, склонениями и спряжениями. Одно имя или название может иметь десятки форм. Например, имя «Иван» может встречаться как «Ивана», «Ивану», «Иваном» и так далее. Значит, идентифицировать сущность по факту простого совпадения с словарём или шаблоном не всегда возможно — и подход rule-based нам не подходит.

Мы отмели готовое решение Natasha, которое работает только с русскими именами и только когда все грамматически верно. При этом score достаточно низкий. В DeepPavlov много ненужных фич и он слишком тяжёл. Другие опенсорсные модели, которые созданы для подобных задач, также показывали низкий score.

Score — численное значение, присваиваемое языковой моделью последовательности токенов (например, слову, предложению или целому тексту), которое отражает «правдоподобие» или «предпочтительность» этой последовательности с точки зрения модели. Другими словами это показатель качества выполняемой моделью задачи — в нашем случае это идентификация имён, отчеств и фамилий.

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

Ход работы

За основу мы взяли модель xlm-roberta-base без «головы» — трансформер хорошо понимает и русский, и казахский, но сам по себе не умеет классифицировать сущности. Мы дообучили к нему лёгкую классификационную «голову»: теперь модель весит около 1 ГБ и запускается даже на ноутбуке.

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

Мы выделяли в логах все строки с данными, которые считаются персональными по закону — ФИО, номера паспортов и т. д. Все персональные данные мы пронумеровали от 0 до n и напротив строки ставили метку с уникальным номером. Если в строке было несколько видов ПД, то напротив строки ставили несколько меток [0,3,..,n].

В целом можно было научить модель видеть любые ПД, но в нашем случае достаточно было находить лишь ФИО, поэтому из этого датасета мы выделили только те строки, в которых было ФИО.

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

Из финального датасета со всеми ПД мы выбрали строки с ФИО — их получилось 2 500. Мы объединили полное ФИО в один токен, не разделяя имя, фамилию и отчество. Такой трюк позволил значительно увеличить объём обучающих примеров и поднять метрику качества.

Скиллы и перспективы модели

При необходимости модель можно ещё квантовать — уменьшить размер, представив веса модели в виде дискретных значений. Тогда модель будет весить около 600 Мб.

В результате наша система распознаёт ФИО на русском и казахском с высоким скором: она корректно выделяет полные имена, сокращённые варианты вроде «Кузнецов Т.», а также редко встречающиеся имена, которых не было в исходных данных.

Более того, модель легко справляется с грузинскими и кыргызскими — и скорее всего, и любыми другими — именами и фамилиями. Модель обрабатывает сотни сообщений в секунду и надёжно маскирует персональные данные до того, как они попадут в языковую модель бота.

Модель масштабируема и готова к дообучению — мы можем натренировать её искать в текстах названия фруктов, номера ИНН или показания счётчиков воды.

Подпишитесь на наш телеграм-канал