— Нам нужны люди.
— Какие?
— Которых не существует. Но которые живут.
— ?!
Статья Елизаветы Курочкиной, старшего специалиста по Data Science, компании Neoflex, посвящена рассказу о том, как простая задача генерации синтетических данных для банка переросла в создание фреймворка симуляции цифровой цивилизации под названием HumanDynamics.
Зачем вообще понадобилось что-то симулировать?
Одна из ключевых проблем, с которой сталкивается банковская сфера, — данные. Они необходимы повсюду: тестирования продуктов, настройки систем, мониторинга клиентской активности. Но работать с настоящими пользовательскими данными нельзя из-за требований к безопасности и конфиденциальности. Кроме того, не все сценарии можно встретить в живой выборке, особенно редкие или потенциально опасные.
Однажды сотрудники Neoflex обратились к штатному R&D-специалисту по Data Science с запросом: «Сгенерируй пользовательские данные для банка».
На уровне идеи задача была довольно понятна — нужна синтетика. На практике всё оказалось немного сложнее.
Исходная постановка задачи или о специфике работы на R&D-проектах
Формально задача звучала как «создать синтетических клиентов банку». Но R&D редко работает с формальными задачами. Как правило, это область без чётких требований, с размытыми границами и высокой степенью неопределённости. Никакого готового решения, никакого roadmap’а. Только конечная точка того, как что-то должно выглядеть. В ходе брейнштормов с коллегами прозвучали следующие мысли. Цитата из обсуждений:
Для теста банковской среды нам нужны люди, которых не существует. Мы не можем использовать реальные данные – нужны неживые персонажи. Но при этом — они должны жить. Каждый из них должен быть уникален: кому-то 8 лет, кому-то 33, 45, 60. Кто-то пусть будет женат, кто-то – только поступает в университет. У каждого должна быть индивидуальная история: разводы, смена работы, путешествия, болезни, миграции, участие в преступлениях, победы и неудачи, банкротства. Все как у людей. И при этом — они должны жить в своем мире.
Мир тоже должен развиваться, в нем должны происходить внешние события: экономические кризисы, рост рынка, катастрофы, политические изменения, социальные потрясения. Люди должны это как-то учитывать. И, как реальные клиенты, идти в банк и пытаться, например, взять кредит, открыть счёт или запросить страховой продукт. И они должны жить в системе и регулярно обновляться, проживая каждый свою историю. И пусть эта система выявит нам все недостатки механизмов внутри инфраструктуры банка, которые существуют…
Звучит здорово, правда?
В этом смысле проект HumanDynamics оказался типичным Research & Development-проектом. Никаких готовых инструментов под такую задачу не существовало. Стандартные генераторы данных не подходили — слишком примитивны. Симуляторы поведения оказывались негибкими и неглубокими. Модели случайных процессов не давали нужной детализации, контекста и вариативности.
Поэтому мы решили строить собственную систему. По сути — инструмент для построения динамической среды, где возможны уникальные сценарии, а персонажи ведут себя максимально приближенно к настоящим клиентам банка. Фреймворк – своего рода, «контролируемая среда бесконтрольного поведения».
Итак, для чего?
Тестировать скоринговые и андеррайтинговые системы. Банку нужна такая система для тестирования инфраструктуры без привлечения настоящих клиентов.
Оценивать устойчивость процессов в условиях кризисов, массового оттока, паники.
Имитировать мошенничество и другие риски, чтобы проверять корректность работы систем защиты.
Анализировать поведение клиентов в ответ на внешние события.
Из чего?
Компоненты системы, из которых сложился фреймворк:
Агенты
Это синтетические персонажи, сгенерированные с уникальными характеристиками: ФИО, дата рождения, пол, гражданство, данные паспорта и ИНН, контактные данные. У каждого будет индивидуальный жизненный путь, на который влияют как внутренняя логика системы, так и случайные события.
Среда жизни
Здесь происходят события, влияющие на агентов: поступление в университет, увольнение, свадьба, развод, рождение детей, болезнь, переезд, пенсия. Каждый агент проходит свой уникальный набор таких событий — как в реальной жизни.
Банковская среда
Это часть среды, где агент может начать взаимодействие с банком: подать заявку на кредит, открыть счёт, запросить или отказаться от продукта и т.д. Всё с корректным API-взаимодействием, полями, статусами заявок и правилами обработки.
Правовая среда
Часть среды, куда агент попадает, если нарушает закон — кража, участие в нелегальных схемах, уклонение от налогов, вступление в террористические организации. Тут агент может попасть в стоп-листы по разным категориям и получить отказ при следующем обращении в банк.
Синтетический мир
Объединяющая среда, насыщенная внешними событиями: кризисами, изменениями политической ситуации, колебаниями курса валют, эпидемиями. Эти события формируют внешний контекст, на который агенты должны реагировать — и иногда делать неожиданные выборы.

Как система функционирует
Система работает как цикл (запускаемый синтетическим миром) с влож��нным циклом внутри (цикл банковской среды), который активируется ежедневно по расписанию и состоит из шагов:
Шаг 1. Создание профилей
Генерируются данные для n-заданного количества будущих агентов в случайной точке их жизненного пути. Профили создаются с индивидуальными характеристиками на основе заданных базовых параметров: ФИО, дата рождения, пол, гражданство, паспортные данные, ИНН, контактная информация. Все данные сохраняются в виде строк и столбцов сводной таблицы. Данные генерируются на основе библиотеки Faker, доработанной под нужный формат и тип данных.

Шаг 2. Генерация жизни
Сырые табличные данные преобразуются в объекты специального класса “Agent” и «оживают» — передаются под управление LLM, которая создает для каждого из них по одному индивидуальному жизненному событию.

_life_event_prompt = """
Ты — генератор синтетических жизненных сценариев для виртуальных пользователей банка.
На основе входных данных ты должен сгенерировать реалистичный новый следующий этап в жизни пользователя, а также, при необходимости, обновить его статус в стоп-листах.
**Входные данные о пользователе(agent_data):**
{agent_data}
**Возможные сферы жизни (life_spheres):**
{life_spheres}
**Категории стоп-листов(stop_lists):**
{stop_lists}
**Твоя задача:**
1. Придумай следующий реалистичный жизненный этап/событие, относящееся к одной из сфер из `life_spheres`. Событие должно соответствовать логичному развитию события, исходя из информации в `agent_data`. События должны быть из разных`life_spheres` и быть разнообразными.
2. !Опционально! Добавь или удали пользователя из одного или нескольких стоп-листов, если это логично. Листы носят негативный характер и должны включать нежелательных пользователей в связи с их неплатежеспособностью, испорченной кредитной историей, нарушениями законодательства и прочими негативными аспектами. Включение или исключение должно основываться на реальных фактах, исходя из информации в `agent_data`.
…
Примеры генераций:
Якубову Ивану исполнилось 7 лет, и он пошёл в школу
Дряглов Степан получил повышение и стал ведущим менеджером по продажам в компании
Шаг 3. Синхронизация с хранилищем
Агенты с новыми событиями объединяются с уже существующими в реляционной базе данных. Все данные хранятся в виде таблиц. Этот шаг необходим для поддержания количества и разнообразия популяции.

Шаг 4. Выборочная активация и повторная генерация жизненного события
Из БД случайным образом извлекается n-число агентов, которые становятся активными — для каждого из них генерируется ещё одно индивидуальное жизненное событие.
Если агент совершил противозаконное действие, он попадает в стоп-лист — отдельную таблицу в БД, содержащую типы и описания правонарушений, даты включения и исключения.

Шаг 5. Регистрация в банке
Агенты, если еще до этого не являлись клиентами банка, подают заявки на API создания учетной записи в системе.
Отклонённые — возвращаются в БД и исключаются из цикла активации.
Одобренные — становятся клиентами и переходят на следующий уровень взаимодействия с банком.
На этом этапе проверяется работа скоринговых систем на предмет выявления нежелательных и потенциально неплатежеспособных клиентов.

С момента одобрения у агента начинается активная «жизнь» внутри банковской среды.
Шаг 6. AI-портрет
На основе базовой информации, «прожитых» событий и истории предыдущих транзакций (если есть), LLM формирует описательный AI-портрет клиента. Он строится по заранее определённым разработчиком критериям.

_psychographic_profile_prompt = """
Представь, что ты анализируешь поведение клиента банка, чтобы предсказать его дальнейшие шаги.
На основе предоставленной информации о клиенте и истории событий его жизни, и его ответных действий на них, создай портрет клиента по следующим характеристикам. Ответ дай на русском языке кратко, 1-2 слова по каждому критерию.
Информация о клиенте: {client_data}
Характеристики: {client_criteria}
"""
Шаг 7. Внешнее событие
Из среды синтетического мира поступает внешнее событие.

Типы событий могут быть абсолютно различными и задаются разработчиком или генерируются через ИИ, например:
[
{
"type": "экономическое",
"event": "Повышение ключевой ставки Центробанка"
},
{
"type": "социальное",
"event": "Демографический бум"
},
{
"type": "экологическое",
"event": "Наводнение, нарушившее работу офисов банка"
},
{
"type": "технологическое",
"event": "Массовый сбой в системе онлайн-банкинга"
},
{
"type": "политическое",
"event": "Изменение правил пенсионных накоплений"
},
… ]
Событие из внешнего мира поступает в банковскую среду, где оказывает влияние на клиента. В зависимости от события и персональных характеристик он будет принимать решение о последующих действиях.
Шаг 8. Реакция
На данном этапе в LLM поступают следующие параметры:
данные клиента
история жизненных событий клиента
история операций в банке
выявленный AI-портрет
само внешнее событие
AI-модель, анализируя всю информацию в совокупности, «предсказывает» наиболее вероятное следующее действие клиента в ответ на событие-триггер. Решения всегда сугубо индивидуальны и поведение каждого клиента связано с его жизненным контекстом и персональными характеристиками.

_next_action_prompt = """
Представь, что ты анализируешь поведение клиента банка. На основе с��едующих характеристик клиента и истории операций предскажи его вероятное действие в ответ на указанную новость. Ответь на русском языке одним вариантом из предложенных действий без дополнительных пояснений.
Информация о клиенте: {personal_data}
Психографический портрет клиента: {ai_portrait}
Возможные действия в банке: {actions}
Новость: {event}
Вероятное действие клиента:
"""
Шаг 9. Активация действия
В зависимости от выбранного действия, применяется Function Calling-механизм, запускающий цепочку действий в Langchain. Она генерирует сопутствующие данные и обращается к API банка для выполнения операций.
Представим, клиент решил взять кредит. Далее LLM формирует дополнительные данные, необходимые для заполнения заявки, которые будут в определенном формате, прописанном в документации банка. Например:
Тип кредита
Сумма
Валюта (RUB, USD, CNY)
Срок
Назначение кредита
Доход заявителя
Заполненная форма по API отправляется в банковскую систему на прохождение последующих внутренних операций и проверок, тестируя все этапы выдачи кредита от создания заявки до валидации, скоринга и одобрения/отклонения запроса.
У клиента, тем временем, в профиле меняется состояние: из state=“active” в state=“awaiting”. От данного параметра зависит маршрутизация клиента в следующей итерации.
Таким образом происходит реальное взаимодействие несуществующего человека с настоящим банком.

Шаг 10. Взросление
После каждого полного цикла внутри банка у агента увеличивается возраст. Одна итерация – +1 один год жизни.
Так обеспечивается взросление популяции, переход по возрастным этапам и эволюция поведенческих реакций в зависимости от новых прожитых личных событий.
* Пенсия. Был установлен «порог взросления», после которого система перестает «дергать» агента и запускать в банк по причине неактуальности. Эта граница – 80 лет. При достижении 80 лет агент переводится в состояние "retired" и исключается из дальнейших активаций. Этот агент больше не будет «проживать» новые события, не будет «ходить» в банк, увеличивая возраст. Исторические данные о нем будут оставаться в общем хранилище. То же происходит и с теми агентами, чья жизненная история завершилась преждевременной смертью — агент также получает статус "retired"и остаётся в общей базе.

Таким образом, запуская микро-цикл функционирования агентов внутри банка, управляемый родительским циклом активной жизни в синтетическом мире, который также развивается в своем направлении, происходит полная симуляция реальной жизни нереальных персонажей в цифровой среде.
Примечательно, что все они в конечном итоге выполняют настоящие физические действия по отношению к банковской системе через API. Тем самым происходит функциональное и нагрузочное тестирование инфраструктуры, выявляются уязвимости и проблемные зоны документации, а также появляется возможность п��огнозировать и анализировать поведение различных слоёв населения на экологические, политические, социальные, экономические и другие триггеры — без необходимости использования конфиденциальных персональных данных реальных людей.

Мир усложняется, и банковские системы должны быть готовы к нестабильности, неожиданностям и изменению поведения клиентов. По сути, фреймворк HumanDynamics – это автономный оркестр, который управляет потоком жизней и событий, которые порождает, воспроизводит и развивает абсолютно самостоятельно. Сценарии — случайны, но логичны. Поведение агентов — вариативно и ограничивается лишь «фантазией» LLM, но в рамках предоставленных банком возможностей. Фреймворк дает возможность протестировать вызовы внешней среды и их влияние на внутреннюю среду банка в некой цифровой песочнице.
Так, обычная задача генерации синтетических данных в рамках R&D-проекта обрела совершенно новое обличие и позволила расширить вымышленные горизонты невымышленного мира.