Как построить конвейер обезличенных синтетических данных и убедиться, что они не врут? Собрал полезную статью для руководителей разработки и QA, продакт‑менеджеров и всех, кто работает с тестовым контуром.
Я уже более 10 лет работаю с тестовыми средами, и раньше делал ошибку: выгружал из прода 200 000 строк, менял фамилии на обезличенные шаблоны, и считал, что все окей. А затем как‑то заметил, что в выгрузке остались номера договоров. Мне повезло, что именно я нашел их первым, особенно учитывая всё более суровую регуляторку. С тех пор я отношусь к тестовым данным также серьезно, как к проду.

И я такой не один. По опросу «Гарды» среди российских компаний почти половина регулярно переносит в тестовые среды копии продуктивных баз без изменений, а 18,8% держат тестовые базы в том же кластере, что и боевые. При этом с 30 мая 2025 года по 420-ФЗ утечка данных 1 000–10 000 человек стоит юрлицу от 3 до 5 млн рублей, а повторная — от 1% до 3% годовой выручки, минимум 25 млн.
Какие задачи решает создание синтетических массивов?
Прежде чем браться за тестовые данные, важно четко сформулировать, зачем вам это. Есть четыре основных задачи, которые можно решить с их помощью.
Задача |
Что критично воспроизвести |
Чем можно пожертвовать |
Типичный объём |
Основной метод |
Функциональное и регресс |
Покрытие состояний и переходов, ссылочная целостность, валидность форматов, наличие всех справочных значений |
Реальные пропорции. Хоть 50/50 — лишь бы все ветки были |
100 МБ — 20 ГБ |
Правила + подмножество прода |
Нагрузочное и производительность |
Кардинальность, скошенность, корреляции, доля NULL, длина строк, распределение по партициям, физический порядок вставки |
Осмысленность конкретных значений — планировщику всё равно, «Петров» там или «Ыфвап» |
0,5 — 50 ТБ |
Статистика + масштабирование |
Обучение и валидация моделей |
Совместное распределение, редкие классы, временна́я динамика, сезонность, дрейф |
Точное соответствие форматам систем‑источников |
1 ГБ — 5 ТБ |
Нейросетевой синтез |
Демо, обучение людей, песочницы |
Правдоподобие «на глаз», связность историй, приличные ФИО и адреса |
Статистика вообще. Никто её не проверяет |
10 МБ — 5 ГБ |
Правила + LLM |
Бывает, что команда полгода строит пайплайн на CTGAN, покупает видеокарты, а нужны были пять тысяч строк для регресса, где важно только одно — чтобы у клиента было от нуля до семи карт. Это делается за два дня на фикстурах. В общем, всегда держите в голове конкретную цель.
Уровни реалистичности синтетических тестовых данных
Синтетические данные бывают очень разными: от незаполненных болванок с правильными типами полей до почти полной копии прода.

№ |
Уровень |
Что воспроизводится? |
Для чего реально годится? |
Риск раскрытия |
1 |
Структурный |
Только схема: типы, длины, обязательность. Значения — шум |
Прогон миграций, проверка сборки, smoke |
Нулевой |
2 |
Валидный |
Плюс бизнес‑правила и ограничения: контрольные суммы, диапазоны, FK |
Функциональные тесты, интеграции, автотесты API |
Нулевой |
3 |
Одномерный |
Плюс маргинальные распределения каждого поля по отдельности |
Первые прикидки по объёму, отчёты «на глаз» |
Низкий |
4 |
Многомерный |
Плюс совместные распределения и корреляции между полями |
Нагрузочное тестирование, витрины, BI‑регресс |
Умеренный |
5 |
Дополненный правдоподобный |
Плюс тонкая структура: сезонность, редкие классы, поведенческие цепочки |
Обучение моделей, антифрод, аналитические гипотезы |
Заметный |
6 |
Реплика |
Практически замещает реальные данные в анализе |
Исследования и публикации — и только с формальными гарантиями |
Высокий |
Уровень выбирается под задачу (об этом писал выше). Для регресса хватает второго, для нагрузочного тестирования нужен четвертый, для машинного обучения — пятый. Шестой в корпоративной практике чаще всего не нужен.
Маскирование, псевдонимизация и синтез с юридической точки зрения
Этот раздел лучше проговорить с юристом и безопасником на первой же встрече. Разница между тремя подходами не техническая, а правовая, путают их очень часто. Закон не запрещает работать с тестовыми данными — он запрещает работать с ними небрежно. Граница между псевдонимизацией, обезличиванием и синтезом не техническая, а правовая, и цена ошибки здесь не часы переделки, а оборотные штрафы и репутация.
Маскирование с обратимым ключом — это псевдонимизация. Вы заменили фамилию на код, а ключ положили в хранилище. Субъекта без ключа не определить. Но ключ существует, а значит это по‑прежнему персональные данные. Тестовый контур остается ИСПДн со всеми требованиями к защите, и штрафы за утечку из него ложатся на вас.
Обезличивание регулируется жестко. С 1 сентября 2025 года действует приказ Роскомнадзора № 140 от 19.06.2025 (замена прежнего № 996 от 2013 г.). Методы в целом те же: идентификаторы, перемешивание, изменение состава и семантики, декомпозиция — плюс новый метод преобразования массива. Очень важны требования к самому процессу, и их редко кто читает.
Что требует приказ № 140 и что из этого ломает привычную практику:
Нельзя хранить обезличенные данные вместе с исходными. Никаких рядом лежащих clients и clients_masked.
Ключ соответствия хранится отдельно и третьим лицам не передается. Имейте в виду, что, к примеру, подрядчик по нагрузочному тестированию — это третье лицо.
Локальные акты о методах обезличивания и о применяемых системах не должны быть доступны третьим лицам. То есть описание вашего пайплайна маскирования — уже уязвимый документ.
Ведется учет всех действий. Каждую выгрузку нужно фиксировать в журнале.
Существует 6 основных способов получить тестовые данные. Рассмотрим их детально в таблице
Подход |
Обратимость |
Статус по 152-ФЗ |
Ссылочная целостность |
Годится для нагрузки |
Трудозатраты на старте |
Копия прода «как есть» |
– |
ПДн в полный рост |
идеальная |
да |
нулевые |
Маскирование с ключом (FPE / HMAC) |
есть |
ПДн (псевдонимизация) |
сохраняется |
да |
низкие |
Обезличивание по приказу № 140 |
частичная |
обезличенные ПДн, ст. 13.1 |
требует усилий |
частично |
средние |
Синтез без формальных гарантий |
нет |
не ПДн — если доказано |
нужно проектировать |
да |
высокие |
Синтез с дифференциальной приватностью |
нет |
не ПДн, с гарантией |
нужно проектировать |
хвосты умирают |
очень высокие |
Гибрид: правила + синтез + каталог патологий |
нет |
не ПДн — если доказано |
проектируется явно |
да, лучше всех |
средние |
Здесь как раз очень полезен синтез. Вы не переделываете записи реальных людей, а создаете новые. Нет записи, которая соответствует конкретному человеку, — нет и ПД. Но и здесь есть регуляторные требования.
Росстандарт выпустил первые нормативы — их подготовила Ассоциация больших данных. Три документа: ПНСТ 1064–2026 — основные понятия и термины, ПНСТ 1065–2026 — архитектура и методы синтеза, ПНСТ 1066–2026 — оценка качества результатов. Действуют они с 1 сентября 2026 года, то есть уже сейчас. Там наконец‑то есть то, чего не хватало: как оценить достоверность, как измерить риск восстановления исходных данных, как валидировать, как маркировать и проводить аудит.

Как построить конвейер синтетических данных?
Теперь переходим к практике: от минимизации хаоса в тестовых данных до автоматизации за 7 шагов. Порядок действий здесь важен, не советую перескакивать этапы.
Шаг 1. Инвентаризация и профилирование
Классифицировать поля нужно по содержимому, а не по именам. В колонке field_17 в старой таблице вполне могут лежать паспортные данные, а колонка passport — красивая, но пустая с 2019 года. Классификатор, который смотрит только на заголовки, найдет passport и пропустит field_17. А отвечать за утечку придется именно за field_17.
Для каждого поля нужно выяснить тип данных и посчитать пустые значения — отдельно пустые строки, это не одно и то же. Дальше считаем количество уникальных значений и собираем топ-20 из них: смотрим, какую долю они занимают суммарно, — так сразу видны перекосы в распределении. И вместо средней длины строки полезнее построить гистограмму распределения длин — по ней картина заметно нагляднее.
Где скрываются проблемы?
Поля‑помойки, где лежит и телефон, и адрес, и переписка с юристом. Справочники, которые внезапно оказываются ПД: к примеру, контрагенты, где половина записей — ИП, а ИП это физлицо с ФИО в названии. И косвенные идентификаторы: номер офиса, дата открытия счета и сумма первого взноса (в небольшом городе этого достаточно, чтобы найти конкретного человека).
Какие инструменты использовать?
Для быстрого старта подойдет ydata‑profiling, для повторяемых проверок — Great Expectations или Soda, а для больших таблиц — обычный SQL на ClickHouse: он быстрее любой библиотеки. Персональные данные хорошо находит из коробки «Гарда Data Masking» с машинным обучением — на старых схемах с полями f_01…f_88 она экономит недели работы.
Метрика готовности к следующему этапу — доля полей с подтвержденной классификацией. Если она ниже 95%, идти дальше бессмысленно: неизвестность просто переедет на следующий этап и найдется в проде. Да, это скучно. Да, займет две‑три недели. И обойти это не получится — я пробовал трижды.
Шаг 2. Что такое контракт на данные и зачем его создавать?
Контракт на данные — это короткий документ о том, какой датасет считается правильным. Он защитит всех от бесконечных переписок. Пишет его потребитель, а не генератор, иначе получится описание того, что удобно отдавать, а не того, что нужно. Хранить — в YAML рядом с кодом, чтобы контракт жил в версиях и проходил ревью.
# contracts/acquiring_load.yaml dataset: acquiring_load_4tb purpose: performance # одна из четырёх задач, не «универсальный» owner: perf-team source_profile: profiles/acquiring@2026-07-14.json volume: rows: 1_300_000_000 size_tb: 4.1 tolerance: 0.03 must_preserve: cardinality: merchant_id: { value: 41_000, tol: 0.05 } card_token: { value: 78_000_000, tol: 0.05 } skew: merchant_id: { gini: 0.81, tol: 0.03 } partitions: last_90d_share: { value: 0.70, tol: 0.02 } nulls: mcc: { value: 0.031, tol: 0.005 } string_length: merchant_name: { mean: 34.2, p95: 61, tol: 0.10 } must_not_contain: [ real_pan, real_msisdn, real_fio, real_contract_no, real_inn ] edge_cases: # ссылки на каталог патологий, см. шаг 6 include: [ EC-014, EC-021, EC-088, EC-102, EC-137 ] min_occurrences: 200 privacy_gates: exact_row_match: 0 dcr_p5: ">= holdout" mia_auc: "<= 0.55" reproducibility: seed: 20260901 generator_version: "2.3.1" lifecycle: ttl_days: 14 storage_class: restricted-test
Выглядит как бюрократия, а работает как страховка: через полгода на вопрос, почему у вас 41 000 мерчантов вместо двенадцати, ответит конкретный файл, а не уволившийся коллега голосовухой. Есть три поля, которые все норовят выкинуть, а потом жалеют: seed, ttl_days и min_occurrences.
Шаг 3. Подбираем генератор для каждого типа данных
Главное не то, какой генератор выбрать, а какой генератор подходит каждой группе полей. В типичной корпоративной базе около 80% данных спокойно генерируются правилами, еще 15% требуют статистики, и лишь оставшиеся 5% — ради них и нужна нейросеть.
Разбивка по группам полей
Что генерируем? |
Чем? |
Почему именно так? |
Инструменты |
Первичные и внешние ключи, токены |
Детерминированные функции: HMAC‑SHA256, формат‑сохраняющее шифрование FF1 |
Нужна воспроизводимость и согласованность между системами. Нейросеть здесь не нужна и опасна: она может «запомнить» реальный идентификатор |
|
Форматные атрибуты РФ: ИНН, СНИЛС, БИК, номер карты |
Правила с корректными контрольными разрядами |
Валидаторы на входе отбракуют всё остальное, и вы будете тестировать не систему, а свой генератор |
Собственные функции, |
Числовые и категориальные поля с зависимостями |
Гауссовы копулы, CTGAN, TVAE |
Ловят совместное распределение и корреляции. Копула часто не хуже GAN и в десятки раз быстрее — начинайте с неё |
SDV ( |
Цепочки событий: транзакции, сессии, статусы заявок |
PAR из SDV, DoppelGANger, либо марковская цепь + распределение интервалов |
Порядок и интервалы важнее значений. В восьми случаях из десяти марковской модели достаточно, а стоит она в пятьдесят раз дешевле |
SDV |
Свободный текст: обращения, комментарии, протоколы |
Локальная LLM с жёсткими ограничителями и пост‑фильтрами |
Единственное место, где без нейросети правда никак. И единственное, где реален риск дословного запоминания |
Self‑hosted модели с русским языком; для деидентификации — NER: Natasha, DeepPavlov, Presidio |
Ссылочная структура между таблицами |
Обход графа FK сверху вниз, генерация родителей раньше детей |
Многотабличные синтезаторы формально не гарантируют целостность — это известная проблема, проверяйте руками |
SDV |
Справочники: ОКВЭД, регионы, валюты, МСС |
Копируем как есть |
Это не персональные данные. Синтезировать их — вредительство: сломаете join и потратите неделю на отладку |
– |
Шаг 4. Чем кормить генератор, чтобы синтетические данные получились реалистичными?
Главное правило: модель учится там же, где живут данные — тот же контур, те же защиты и журналы доступа. Наружу выходит только готовая модель и только после проверки на утечку.
Теперь четыре важных вещи, о которых редко пишут
Размер выборки. Табличной модели хватает 1–5 млн строк. Больше — не лучше: модель дольше учится и сильнее запоминает конкретные записи.
Дедупликация. Дубликаты — главная причина запоминания вместо обобщения. Чистим через MinHash или SimHash с порогом схожести 0,8. На одном проекте только это уменьшило утечки в десять раз.
Канарейки. Перед обучением подмешиваем 300–1000 выдуманных записей с редкими сочетаниями — редкая фамилия, необычный диагноз, точная дата. После генерации ищем их в результате. Нашли — модель течет. Не нашли — гарантий нет, но есть дешевый ежедневный сигнал для CI.
Дифференциальная приватность. Для внутреннего контура обычно лишняя: при ε ≤ 1 вымываются хвосты распределения, ради которых все и затевалось. Вдобавок шум дает ложные срабатывания статистических тестов — аналитик путает его с реальным эффектом. Данные уходят за периметр — нужна. Остаются внутри — без нее почти наверняка обойдетесь.
Шаг 5. Двухконтурная схема, без которой терабайты синтетики не получить
Суть в том, что нейросеть дает структуру, а не объем. Гнать миллиард строк через CTGAN — как возить щебень на велосипеде: можно, но бессмысленно.
Цифры простые: глубокая табличная модель на видеокарте делает десятки тысяч строк в секунду, то есть миллиард — это дни непрерывной работы. А копула или сэмплер на Spark и ClickHouse выдают миллионы строк в секунду с одной машины и растут линейно. Разница — в тысячи раз. Поэтому нужны два контура: медленный учит модель, быстрый размножает результат по требованию.

Главное в размножителе — предсказуемость. Заданы три параметра: слепок модели, seed и диапазон номеров строк — и результат всегда один и тот же. Поэтому каждый воркер генерирует свой кусок сам, без общего состояния и координации, и итог сходится побайтово.
-- ClickHouse: скелет размножителя. Zipf по мерчантам через словарь весов, -- детерминированный PRNG от (seed, номер строки) INSERT INTO tx_synth SELECT cityHash64(:seed, n) AS rid, dictGet('merchant_zipf', 'merchant_id', toUInt64(zipf_bucket(rid))) AS merchant_id, dictGet('card_pool', 'token', toUInt64(rid % 78000000)) AS card_token, -- 70% объёма — в последние 90 дней, как в проде now() - toIntervalSecond( if(rid % 100 < 70, rid % 7776000, 7776000 + rid % 86400000)) AS ts, -- логнормаль по суммам + магнит на круглые значения round_magnet(exp(4.1 + 0.92 * randNormal(rid))) AS amount, if(rid % 1000 < 31, NULL, dictGet('mcc', 'code', rid % 400)) AS mcc FROM numbers_mt(:row_from, :row_count)
И три тонкости, которые я узнал благодаря проблемам с нагрузочным тестом.
Первая — порядок вставки. Если генерировать данные по возрастанию ключа, соседние строки станут похожими, сжатие улучшится, а 4 терабайта прода на стенде ужмутся в 1,5 — тест покажет отличные, но фальшивые цифры. В проде данные приходят вперемешку, поэтому перемешивайте их перед загрузкой, хотя бы блоками по несколько миллионов строк. Одна строчка кода — и на диске вдвое больше места.
Вторая — длина строк и доля пустых значений. Скучные метрики, но обе работают. В проде merchant_name в среднем 34 символа, а генератор выдает 12 — таблица выходит в два с половиной раза меньше. В MCC в проде 3,1% пустых значений, у вас ноль — вы не словите ни одного падения на пустом поле и получите другой размер строки в колоночном хранилище.
Третья — сколько терабайт нужно. Большинству команд — ноль. Терабайты нужны нагрузочникам и тем, кто отлаживает запросы на больших таблицах. Остальным хватает среза: 2–3% от прода со связностью покрывают около 95% сценариев, генерируются за минуты и влезают на ноутбук. Просьбы полной копии — это не потребность в данных, а недоверие к срезу, и лечится оно контрактом из шага 2, а не терабайтами.
Шаг 6. Заводим каталог патологий

Генеративная модель по своей природе сглаживает редкие случаи. Это не баг, а ее работа: она держится плотности распределения, а редкие события низкой плотности и бывают по определению. GAN к тому же схлопывает моды, VAE — размывает. Аналитику это не мешает: ему нужны среднее и корреляции. А для тестировщика это беда, потому что баги прячутся именно в хвостах.
Ни один существующий генератор сам не воспроизведет клиента с 412 картами, платеж на копейку, фамилию в 78 символов или транзакцию, пришедшуюся ровно на перевод часов. А в проде все это встречается — и на каждом таком случае однажды кто‑то падал. Отсюда и решение: гибрид, где основную массу данных рисует нейросеть, а редкие крайние случаи приносит готовый каталог исключений.
Каталог патологий — это структурированный список редких случаев: идентификатор, описание, ссылка на инцидент и целевая доля в датасете. Наполняется из четырех источников.
Багтрекер за два‑три года: выгружайте дефекты, где упоминаются данные, форматы, пустые значения и кодировки, — это золотая жила.
Постмортемы прода: каждый инцидент, вызванный данными, становится записью каталога — это дисциплина, а не техника.
Ограничения схемы: для каждого CHECK, NOT NULL и лимита длины нужны значения на границе и за ней.
И наконец, просто подумайте, как вы ломали бы свою систему, если бы за это платили.
ID |
Класс |
Патология |
Что ловит? |
EC-014 |
ФИО |
Фамилия из одной буквы; фамилия 78 символов; двойная через дефис; отчество «оглы»/«кызы»; «ё» и «е» в одной записи; висячий пробел в конце |
Обрезка полей, сортировки, поиск, ширина в отчётах и печатных формах |
EC-021 |
Даты и время |
29 февраля; 31-е в 30-дневном месяце; дата рождения 1900 и завтрашняя; переход на летнее время в исторических данных до 2014; Камчатка (+12) и Калининград (+2) в одной таблице |
Расчёт возраста, дедлайнов, SLA, ночные джобы, оконные функции |
EC-034 |
Суммы |
0,01; максимально допустимая; отрицательная; четыре знака после запятой; ровно на пороге лимита; банковское округление половин |
Переполнения, округления, лимиты, сверки на копейку |
Шаг 7. Как не дать синтетике сломать прод с помощью независимых проверок?
Невалидный датасет не публикуется. Точка. Ворота стоят в CI, у каждого — жесткий порог из контракта.
Лучший тест пригодности данных — не статистика, а планы запросов. Берете топ-50 запросов из pg_stat_statements, прогоняете EXPLAIN (ANALYZE, BUFFERS) на проде и на синтетике и сравниваете типы узлов и оценки кардинальности. Совпало — данные годные. Не совпало — сломано ровно одно распределение, и сразу видно какое. Так я за час нахожу то, что метриками искал бы неделю.
Ловушка DCR. Расстояние до ближайшей реальной записи часто выдают за доказательство приватности — это ничего не значит. Честная проверка такая: отложите часть реальных данных, которых модель не видела, и сравните DCR для этого холдаута и для синтетики. Если синтетика ближе к обучающей выборке, модель просто запоминает. За эту ошибку критикуют половину работ по синтетическим данным.
Тонкости работы с синтетическими данными в России
Тут шаблоны не работают. Зарубежные инструменты в наших реалиях выдают номер соцстрахования вместо СНИЛС и адрес в духе «улица, город, штат». Даже локаль ru_RU в популярных библиотеках дает правдоподобные строки, которые не проходят валидацию.
Следствие простое и обидное: сгенерируете ИНН двенадцатью случайными цифрами — валидатор отсеет около 90% записей. Вы будете тестировать не систему, а свой генератор, и узнаете об этом дня через три.
Атрибут |
Как ломается по умолчанию? |
Как делать? |
Источник справочника |
ИНН |
Случайные цифры не проходят проверку контрольного разряда |
Генерировать первые 9 (или 10) цифр, считать контрольные по весовым коэффициентам. Для юрлица — следить, чтобы первые две цифры соответствовали региону из адреса |
Алгоритм ФНС, коды регионов |
СНИЛС |
То же самое плюс забывают про правило «остаток 100 или 101 даёт 00» |
Веса 9…1 по девяти цифрам, остаток от деления на 101, особый случай для 100 и 101 |
Алгоритм СФР |
КПП, ОГРН, БИК |
Генерируются независимо от ИНН — и получается юрлицо из Владивостока с московским КПП |
Генерировать связкой: регион — ИНН — КПП — БИК обслуживающего банка. Связность важнее правдоподобия отдельных полей |
Справочник БИК, коды регионов |
Номер карты |
Алгоритм Луна соблюли, а БИН взяли реальный действующий — и получили номер, который может существовать |
Луна плюс БИН из тестовых диапазонов платёжных систем. Никогда не используйте боевые БИН своего банка |
Тестовые диапазоны платёжных систем |
Номер телефона |
Все записи вида +7 999 000–00-00, либо реальные существующие номера — и рассылка из тестового контура уходит живым людям |
В России нет зарезервированного диапазона по аналогии с американскими 555. Берите неназначенные диапазоны из реестра нумерации и держите отдельный чёрный список |
Реестр российской системы и плана нумерации (открытые данные Минцифры), выгрузки ЦНИИС |
Адрес |
Готовые локали склеивают случайный город со случайной улицей и случайным индексом. Валидатор адреса такое отбрасывает |
Идти сверху вниз по иерархии ФИАС/ГАР: регион — город — улица — существующий дом — индекс этого дома |
ФИАС / ГАР |
Паспорт |
Серия не соответствует региону выдачи, дата выдачи раньше даты рождения, возраст не бьётся с обязательной заменой в 20 и 45 лет |
Серия = код региона + год выпуска бланка; проверять правило замены документа по возрасту |
Коды регионов |
ФИО |
Транслит или короткие латинские строки. Ломается сортировка, ширина колонок, поиск |
Кириллица, обязательно «ё», двойные фамилии, отчества на ‑оглы и ‑кызы, склонения в тех местах, где система их показывает |
Частотные словари имён |
Правила, которые придётся написать самим. Хорошая новость: это пишется один раз и переиспользуется на всех проектах. У меня эта библиотека живёт уже пятый год и обросла тестами толще, чем сам генератор. Хорошо ещё дописать «Даты и время», «Календарь нагрузки», «Суммы и НДС».
Отдельно про кириллицу: в разных колляциях буква ё встает то после е, то в конце алфавита, и результат сортировки по полю ФИО на синтетике отличается от прода. Если автотесты сравнивают выдачу списка построчно, вы получите красные тесты на ровном месте и потратите день на выяснение, почему база сортирует не так, как ожидал разработчик. Проверяйте колляции до, а не после.
Какие инструменты выбрать в российских реалиях?
Ландшафт собран по слоям, а не по вендорам: вендоры меняются, слои — нет. Часть зарубежных платформ недоступна, а часть неприменима, потому что это SaaS: данные для обучения за периметр не выпускаешь. Открытые библиотеки ставятся локально и работают у всех одинаково.
Слой |
Международная практика |
Что применимо в РФ |
Комментарий |
Поиск чувствительных данных и профилирование |
Microsoft Presidio, ydata‑profiling, Great Expectations, Soda |
Всё перечисленное ставится локально; из коммерческих — «Гарда Data Masking» с ML‑поиском ПДн, решения InfoWatch |
Начните с открытых, коробочное берите, когда схема больше пары тысяч таблиц |
Табличный синтез |
SDV (GaussianCopula, CTGAN, TVAE, CopulaGAN), synthpop, Gretel, MOSTLY AI, Tonic, Syntho, Hazy, K2view |
SDV и synthpop — локально, без ограничений. Из отечественного развивается сервис SyntData у Сбера |
SaaS‑платформы отпадают сами: данные для обучения наружу не выпустишь |
Последовательности и временные ряды |
PAR из SDV, TimeGAN, DoppelGANger |
То же самое, всё открытое |
Марковская цепь плюс распределение интервалов часто не хуже и в разы дешевле |
Текст |
Крупные LLM через API + Presidio для деидентификации |
Только self‑hosted модели с хорошим русским. Для NER — Natasha, Slovnet, DeepPavlov |
Отправлять реальные ПДн во внешний API нельзя. Обучать на них — только локально |
Правила и фикстуры |
Faker, Mockaroo, Datafaker, dsdgen из TPC‑DS |
Faker с локалью |
Это тот слой, который вы всё равно допишете сами. Заложите на него две‑три недели |
Маскирование и подмена |
Delphix, Informatica TDM, IBM Optim |
«Гарда Data Masking», решения на |
Помните: обратимое маскирование не выводит данные из‑под 152-ФЗ |
Масштабирование до терабайт |
Spark, Trino, dbt |
Spark, ClickHouse ( |
ClickHouse на генерации плоских таблиц вне конкуренции по скорости |
Оценка качества и приватности |
SDMetrics, Anonymeter, TAPAS |
Всё открытое, работает. Как рамка для отчётности — ПНСТ 1066–2026 |
Отчёт по ПНСТ — то, что теперь спрашивают на комитете вместо рассуждений |
Никакой инструмент не закрывает всю цепочку. Реалистичный стек — это пять‑шесть открытых библиотек, одна коммерческая система маскирования и примерно три тысячи строк своего кода под российскую специфику и каталог патологий.
План создания конвейера синтетических данных на 90 дней с раскладкой по неделям
Этот алгоритм действий поможет получить первый работающий домен и научиться на нем: второй домен потом делается за две недели, третий — за одну.
Недели |
Что делаем? |
Что должно быть на выходе — иначе дальше не идём |
1–2 |
Профилирование источников, классификация полей по содержимому, поиск косвенных идентификаторов |
Профиль в формате JSON, зафиксированный по дате. Классификация ≥ 95% полей. Список «полей‑помоек», требующих NER |
3–4 |
Контракты на данные с потребителями. Выбор одного пилотного домена — самого болезненного, а не самого простого |
YAML‑контракт в репозитории, прошедший ревью потребителя. Согласованный с ИБ и юристами способ обработки: маскирование, синтез или гибрид |
4–6 |
Сборка каталога патологий: выгрузка дефектов за 2–3 года, разбор постмортемов, границы схемы |
Не менее 60 записей с ID, описанием, ссылкой на инцидент и целевой долей. Меньше 60 — вы плохо копали |
6–8 |
Пилотная генерация: слепок, размножитель, правила под российские форматы, справочники as is |
Датасет 1–10 ГБ, проходящий первые ворота. Воспроизводимый по seed побайтово |
8–10 |
Валидация: все три группы метрик, калибровка порогов, сравнение планов запросов |
Отчёт по качеству, пороги записаны в контракт, ворота стоят в CI и умеют ронять сборку |
10–11 |
Доставка: сервис выдачи окружений, версионирование слепков, TTL, журналирование |
Команда получает датасет по кнопке за минуты, без заявки в ИБ. Это главный видимый результат для бизнеса |
11–12 |
Масштабирование до целевого объёма, нагрузочная сверка с продом |
Совпадение планов на топ-50 запросов ≥ 90%. Размер таблиц на диске в пределах 5% от прода |
Подводим итоги
Синтетические данные — не панацея. Модель сглаживает хвосты, генератор путает СНИЛС с зарубежной страховкой, а терабайты прода на стенде лгут, если данные вышли слишком прилизанными. Работает только связка: инвентаризация по содержимому полей, контракт с порогами в CI, каталог патологий из реальных инцидентов, проверка приватности через холдаут и планы запросов как главный тест.
Юридические требования зафиксируйте до первой выгрузки — ошибки, связанные с приказом № 140 и штрафы по 420-ФЗ стоят слишком дорого, будьте аккуратны. Начните с одного домена и среза на 2–3% прода: этого хватит почти всем, а второй домен затем делается за две недели. Соберете конвейер целиком — тесты на синтетике будут предсказывать прод. Соберете не все — будете третий день искать баг, который сидит в вашем генераторе.
Если тема построения синтетического конвейера, да и вообще совершенствования тестового контура вам близка, — заходите в телеграм‑канал о тестировании. Там вы найдете больше информации на эту тему.