— Нам нужны люди.
  — Какие?
  — Которых не существует. Но которые живут.
  — ?!

Статья Елизаветы Курочкиной, старшего специалиста по Data Science, компании Neoflex, посвящена рассказу о том, как простая задача генерации синтетических данных для банка переросла в создание фреймворка симуляции цифровой цивилизации под названием HumanDynamics.

Зачем вообще понадобилось что-то симулировать?

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

Однажды сотрудники Neoflex обратились к штатному R&D-специалисту по Data Science с запросом: «Сгенерируй пользовательские данные для банка».

На уровне идеи задача была довольно понятна — нужна синтетика. На практике всё оказалось немного сложнее.

Исходная постановка задачи или о специфике работы на R&D-проектах

Формально задача звучала как «создать синтетических клиентов банку». Но R&D редко работает с формальными задачами. Как правило, это область без чётких требований, с размытыми границами и высокой степенью неопределённости. Никакого готового решения, никакого roadmap’а. Только конечная точка того, как что-то должно выглядеть. В ходе брейнштормов с коллегами прозвучали следующие мысли. Цитата из обсуждений:

Для теста банковской среды нам нужны люди, которых не существует. Мы не можем использовать реальные данные – нужны неживые персонажи. Но при этом — они должны жить. Каждый из них должен быть уникален: кому-то 8 лет, кому-то 33, 45, 60. Кто-то пусть будет женат, кто-то – только поступает в университет. У каждого должна быть индивидуальная история: разводы, смена работы, путешествия, болезни, миграции, участие в преступлениях, победы и неудачи, банкротства. Все как у людей. И при этом — они должны жить в своем мире.

Мир тоже должен развиваться, в нем должны происходить внешние события: экономические кризисы, рост рынка, катастрофы, политические изменения, социальные потрясения. Люди должны это как-то учитывать. И, как реальные клиенты, идти в банк и пытаться, например, взять кредит, открыть счёт или запросить страховой продукт. И они должны жить в системе и регулярно обновляться, проживая каждый свою историю. И пусть эта система выявит нам все недостатки механизмов внутри инфраструктуры банка, которые существуют…

Звучит здорово, правда?

В этом смысле проект HumanDynamics оказался типичным Research & Development-проектом. Никаких готовых инструментов под такую задачу не существовало. Стандартные генераторы данных не подходили — слишком примитивны. Симуляторы поведения оказывались негибкими и неглубокими. Модели случайных процессов не давали нужной детализации, контекста и вариативности.

Поэтому мы решили строить собственную систему. По сути — инструмент для построения динамической среды, где возможны уникальные сценарии, а персонажи ведут себя максимально приближенно к настоящим клиентам банка. Фреймворк – своего рода, «контролируемая среда бесконтрольного поведения».

Итак, для чего?

  1. Тестировать скоринговые и андеррайтинговые системы. Банку нужна такая система для тестирования инфраструктуры без привлечения настоящих клиентов.

  2. Оценивать устойчивость процессов в условиях кризисов, массового оттока, паники.

  3. Имитировать мошенничество и другие риски, чтобы проверять корректность работы систем защиты.

  4. Анализировать поведение клиентов в ответ на внешние события.

Из чего?

Компоненты системы, из которых сложился фреймворк:

Агенты

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

Среда жизни

Здесь происходят события, влияющие на агентов: поступление в университет, увольнение, свадьба, развод, рождение детей, болезнь, переезд, пенсия. Каждый агент проходит свой уникальный набор таких событий — как в реальной жизни.

Банковская среда

Это часть среды, где агент может начать взаимодействие с банком: подать заявку на кредит, открыть счёт, запросить или отказаться от продукта и т.д. Всё с корректным 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-проекта обрела совершенно новое обличие и позволила расширить вымышленные горизонты невымышленного мира.