TL;DR
Модель для удаления персональных данных из текста ведёт себя как турист с разговорником: она знает стандартные фразы (имена, даты, адреса), но не понимает местный сленг. Исследователи показали — если явно перечислить в промпте локальные обозначения (сокращения организации, названия зданий, внутренние коды) и дать примеры того, что не нужно трогать, модель за один проход находит почти всё то, что раньше пропускала.
Главная боль: LLM хорошо чистит текст от «классических» личных данных, но пропускает то, что не входит в стандартный список — сокращение больницы «TCH», название корпуса «Mark Wallace Tower», внутренние номера пейджеров. Это не ограничение модели — она просто никогда не была об этом попрошена. Когда промпт просил её убирать только «18 категорий по HIPAA», она честно убирала только 18 категорий.
Решение — не сложная архитектура, а уточнение задачи в два слоя: сначала назвать модели, какие ещё локальные термины считать идентифицирующими, потом дать пары «Неправильно → Правильно», чтобы она не начала удалять всё подряд из паранойи. Оба слоя добавляются в один и тот же промпт, без дополнительных проходов.
Схема метода
ШАГ 1: Обычный прогон — попросить убрать стандартные категории персональных данных → первый вариант очищенного текста
ШАГ 2: Посмотреть, что осталось узнаваемым (сокращения, коды, названия своей организации) → список "слепых зон"
ШАГ 3: Один финальный промпт: стандартные категории + явный список локальных категорий + примеры "не удалять это" → готовый результат за один запрос
Все три шага можно сделать в одном чате: прогнал, посмотрел, дописал промпт, прогнал ещё раз с уточнениями.
Пример применения
Задача: Стартап готовит внутреннюю переписку и отчёт о происшествии для передачи внешнему юристу перед сделкой (due diligence). Нужно убрать имена, даты — но также внутренний сленг: название переговорки «Зал Кэррибиан», сокращение отдела «ОП» (отдел продаж), клички проектов типа «Проект Мангуст», номера внутренних тикетов Jira.
Промпт:
Ты — эксперт по анонимизации документов перед передачей третьей стороне.
Замени в тексте ниже все идентифицирующие данные на плейсхолдеры вида [ТИП]:
Стандартные категории: имена людей, даты, телефоны, email, адреса, номера договоров.
Также замени специфичные для нашей компании обозначения:
- Названия внутренних помещений и переговорных комнат (например, "Зал Кэррибиан")
- Сокращения названий отделов ("ОП", "ДМ", "Тех")
- Кодовые названия проектов ("Проект Мангуст")
- Номера внутренних тикетов и задач (форматы вида PROJ-1234)
НЕ удаляй следующее — это не идентифицирует компанию или людей:
- НЕВЕРНО: "встреча в 14:00" → ВЕРНО: оставить, это не идентификатор
- НЕВЕРНО: "обсудили KPI отдела" → ВЕРНО: оставить, общий термин, не привязан к конкретному человеку
Если сомневаешься — лучше удали, чем оставь потенциально узнаваемое.
Текст:
{вставить документ}
Результат: Модель вернёт текст с плейсхолдерами вместо имён, дат и локальных обозначений. Общие бизнес-термины (KPI, отчётность, время встречи) останутся нетронутыми. При первом прогоне без списка локальных категорий часть внутреннего сленга («Зал Кэррибиан», «Проект Мангуст») скорее всего проскочит — именно ради этого нужен второй шаг с явным списком.
Почему это работает
Модель не умеет угадывать, что у тебя в компании «ОП» значит «отдел продаж» — она не видела твой внутренний словарь. Без явного указания она честно следует общим правилам и упускает контекстные детали, потому что для неё это просто обычные слова, а не идентификаторы.
Зато модель отлично выполняет то, что ей явно сказали делать. Если один раз назвать категорию — «сокращения отделов» — модель применит это правило последовательно по всему тексту, даже если сокращение встречается 20 раз в разных формах.
Метод использует эту силу напрямую: вместо надежды, что модель «сама поймёт контекст», ты подсказываешь конкретные категории плюс примеры того, что не нужно трогать. Один запрос закрывает обе проблемы — и пропуски, и лишнее удаление.
Рычаги управления: - Список локальных категорий — расширяй или сужай под свой документ (юридический, HR, финансовый) - Пары «Неверно → Верно» — добавляй свои конкретные случаи излишнего удаления - Порог сомнения («если не уверен — удаляй») — можно поменять на противоположный, если важнее сохранить читаемость текста, а не максимальная анонимность
Шаблон промпта
Ты — эксперт по анонимизации документов.
Замени все персональные и идентифицирующие данные в тексте ниже на плейсхолдеры вида [ТИП_ДАННЫХ].
Стандартные категории: имена людей, даты, адреса, телефоны, email, номера документов.
Также замени специфичные для {контекст: моя компания/организация/сфера} идентификаторы:
- {категория 1: например, сокращения названия компании и подразделений}
- {категория 2: например, названия помещений, зданий, офисов}
- {категория 3: например, внутренние коды проектов, номера кабинетов, служебные обозначения}
НЕ удаляй следующее — это не идентифицирующая информация:
- {пример 1: НЕВЕРНО — ..., ВЕРНО — оставить}
- {пример 2: НЕВЕРНО — ..., ВЕРНО — оставить}
Если сомневаешься — удаляй лучше избыточно, чем оставляй потенциально идентифицирующее.
Текст:
{документ}
Подставь в {контекст} тип организации или документа, в {категория} — свои локальные обозначения (найдёшь их, прогнав документ первый раз и посмотрев, что осталось узнаваемым), в примеры «Неверно/Верно» — реальные случаи, где модель могла бы удалить лишнее.
🚀 Быстрый старт — вставь в чат:
Вот шаблон для анонимизации документов. Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какие у тебя есть локальные сокращения, названия и коды — потому что без этого списка она не узнает, что именно в твоём документе является «местным» идентификатором.
Ограничения
⚠️ Нужен предварительный шаг: метод не работает с первого промпта «из коробки» — сначала нужно прогнать документ и вручную найти, что осталось узнаваемым, только потом писать финальный промпт со списком.
⚠️ Список категорий не переносится автоматически: локальные обозначения одной компании (или больницы) не подходят для другой. Каждый раз нужно составлять список заново под конкретный документ.
⚠️ Метод восстанавливает большинство, не всё: даже с уточнённым промптом часть пропусков остаётся — модель ловит примерно 4 из 5 случаев, не все.
⚠️ Разные модели реагируют по-разному: добавление уточняющих категорий у одних моделей повышает точность находок, у других — портит баланс (начинает пропускать больше). Нужно проверять на своей модели.
Как исследовали
Исследователи взяли 100 клинических записей пациентов детской онкологии из техасской больницы (5322 размеченных фрагмента персональных данных) и прогнали через 8 разных LLM (Claude, GPT-oss, GLM, DeepSeek и другие), а также через два специализированных инструмента для удаления персональных данных из медицинских текстов. Сравнивали три варианта промпта: базовый (по стандарту HIPAA), с добавленными локальными категориями и с добавленными примерами «что не трогать».
LLM обошли специализированные системы, причём разница была особенно заметна там, где нужен контекст, а не шаблонное распознавание. Простое добавление списка локальных терминов вернуло почти 80% пропущенных идентификаторов.
Отдельно проверили 14 вариантов многоагентных схем — когда несколько LLM работают по цепочке, проверяя друг друга (одна «чистит», другая «проверяет»). Ни одна сложная схема не побила простой промпт с хорошими инструкциями. Это ключевой вывод: проблема была не в архитектуре, а в формулировке задачи.
Самое неожиданное: когда исследователи проверили, что именно LLM находили «сверх нормы» (то, что разметчики-люди не отметили), эксперты подтвердили — это тоже настоящие персональные данные, просто люди их пропустили при разметке. Получилось, что модель с хорошим промптом нашла ошибки в эталонной разметке, сделанной людьми.
Ресурсы
Palacios D., Neeley M.B., et al. Institution-Specific LLM Prompting Recovers PHI That De-identification Systems and Their Gold Standards Both Miss. Baylor College of Medicine, Texas Children's Hospital.
