Внутреннее исследование (research tool) · 02 апреля 2026 г.

Анонимизация медицинских кейсов

час → 5 минут

Модель передает историю в детерминированный код, сохраняя контроль и повторяемость.

TL; DR

  • Internal research tool: безопасная подача медицинских кейсов в LLM-помощника, нужно убрать ПД и идентификаторы.
  • Стартовали с «LLM сама обезличивает» — получили дрейф ответов, утечки имени, неработоспособные плейсхолдеры.
  • Переключились на детерминированный пайплайн распознавания + правила; LLM осталась только там, где она правда нужна. Результат — стабильно, проверяемо: вместо часа ручной работы — около 5 минут.

Контекст

Это внутренний инструмент, а не клиентский кейс. Делал, чтобы безопасно отдавать медицинские истории врачу-консультанту через LLM-ассистента: нужно убрать ФИО, даты рождения, адреса, номера документов, не теряя клинического смысла. На вход — свободный текст истории болезни, на выход — обезличенный текст и таблица замен.

Проблема

Первый прототип «LLM анонимизирует целиком в одном вызове» выглядел красиво, но:

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

Для медицинского контекста это — стоп-фактор.

Подход

Поворот: модель там, где она нужна, код — там, где можно без неё.

  1. Распознавание сущностей детерминированно. NER-модель (spaCy + русский медицинский словарь) находит имена, даты, диагнозы, номера. Это воспроизводимый шаг.
  2. Правила и таблица замен в коде. Каждой сущности — стабильный плейсхолдер (ИМЯ_1, ДАТА_2), таблица замен сохраняется отдельно, можно откатить.
  3. LLM — только на «сложные» куски. Когда нужно перефразировать редкие диагнозы или мед-аббревиатуры. Узкий промпт, проверка на длину/совпадение терминов.
  4. Валидатор. Финальный проход: ищет в обезличенном тексте остатки ФИО/дат/номеров по словарям и регулярным выражениям. Если что-то нашлось — текст не уходит.

Результат

  • Ручная обезличивка одной истории занимала около часа. Пайплайн — около 5 минут, включая ручную проверку валидатора.
  • Стабильность 1:1 на повторном прогоне: тот же текст даёт тот же результат.

Что бы сделал иначе

Сразу бы построил валидатор первым, а не последним. Когда был только «LLM делает всё», именно отсутствие проверки на выходе и маскировало ошибки. Валидатор-сначала вынудил бы быстрее уйти в детерминированный путь.

← ко всем кейсам

Написать в Telegram Telegram