Банк ИИ-агентов
Просто говоряПлатформа генерирует ИИ-агентов, отражающих демографию города, — до 50 000 под город и район: возраст, доход, занятость, машина или транспорт, привычные маршруты. Для каждого вопроса из банка выбирается базовая панель в 46 агентов — всегда одна и та же при тех же условиях, поэтому прогон можно повторить и проверить; по кнопке панель воспроизводимо уточняется до 200.
Важно: профили стабильны. Новости и обращения не меняют агенту возраст или доход — меняется только контекст вокруг него. Так варианты решений сравниваются на одной и той же панели.
- ResidentBank — версионированный банк агентов, генерация до 50 000 профилей; активная версия населения — v3 (PopulationModelSnapshot с content-addressed ID и source-as-of датами источников)
- модель населения именуется честно: маргинальные распределения, без кросс-таблиц — пока их не передал заказчик
- детерминированная выборка панели: draw(46) ⊆ draw(200) — уточнение расширяет панель, не пересобирая её, и наследует версию населения и снимок контекста
- взвешивание: районы × две взрослые возрастные полосы; признаки мобильности: carAccess, destinationDistrict
- panelComposition-гейт: состав панели проверяется до прогона
- RunManifest фиксирует версию банка, seed и параметры — прогон воспроизводим
Контекст города
Просто говоряОбращения жителей и публикации из открытых источников — это карта того, что в городе болит: по каждому району видно её собственную «температуру». Но платформа принципиально не считает их голосованием — пишут не все и не обо всём.
Поэтому контекст прикладывается к прогону отдельным слоем: агент панели «знает» о проблемах своего района, но его ответ на новую меру — его собственный.
- PostgreSQL: обращения + сигналы соцмедиа, дедупликация, GIN full-text (russian)
- corpusForMeasure — корпус текстов, релевантных конкретной мере, собирается под прогон
- гео-обогащение по словарю улиц: у обращений без явного адреса район восстанавливается из текста
- снимок контекста фиксируется на момент прогона — сравнение вариантов идёт на одном снимке
- обезличивание: персональные данные вычищаются на входе
Три движка симуляции
Просто говоряБыстрый движок — «опрос» панели: каждый ИИ-агент отвечает на меру, из ответов складывается картина принятия. Это минуты.
Два глубоких движка отвечают на другой вопрос — не «что думают», а «что будет с обсуждением»: агентная лента показывает, какие аргументы разгоняются; графовая симуляция — разгорится тема или затухнет. Они запускаются по кнопке поверх готового отчёта.
- Fast — одноходовой опрос LLM-персон в основном процессе: независимые сэмплы на персону, bootstrap-интервал, светофор-вердикт
- oasis-sim — отдельный Python-сервис (движок OASIS / camel-ai, Apache-2.0) за HTTP: Reddit-подобная среда, 2–3 раунда чтения ленты и реакций
- MiroFish — независимый форк за HTTP: граф знаний (Zep) + до 36 раундов эмерджентной динамики; AGPL-3.0 намеренно изолирован сервисной границей
- гейт качества прогонов динамики (v6) отбраковывает вырожденные раунды
- синтез-слой возвращает выводы динамики в план меры — с бейджем «динамика», не подменяя числа Fast
Обсуждение живёт в графе знаний.
MiroFish моделирует, как тема пойдёт по сообществам: агенты раунд за раундом читают граф и дописывают его. Судьба темы видна по связям — плотнеют они или угасают.
Сущности и связи с датами: кто, о чём и когда. Каждый раунд агенты читают срез графа и дописывают его — так у симуляции появляется история.
Плотнеют связи вокруг темы — она разгорается. Граф не растёт — затухает. Промежуточное состояние — «тлеет»: искры есть, разгона нет.
Глубокая симуляция даёт качественные сигналы динамики. Проценты принятия она не трогает — это принцип разделения контуров.
MiroFish работает за HTTP-границей отдельным сервисом (AGPL-3.0 не смешивается с кодовой базой) — долгий фоновый расчёт не мешает платформе.
Контур честности
Просто говоряГлавный риск любой LLM-системы — красиво рассказанная неправда. «Пульс города» построен так, чтобы текст отчёта физически не мог разойтись с расчётом: числа и вердикты идут из детерминированного кода, язык — только вокруг них.
А чтобы не обманывать себя, платформа ведёт журнал: каждый прогноз позже сопоставляется с фактом — и результаты сверки публикуются как есть, включая ошибочные.
- контрактный реестр фактов: каждое число в тексте отчёта обязано ссылаться на расчётный факт
- гард Fast сверяет отчёт с репрезентативным сэмплом сырых ответов панели
- panelPrecision: точность доли ≈ 98/√ESS п.п.; порог различимости вариантов — лидер внутри шума не объявляется
- паспорт расчёта: панель, ESS, ±п.п., дисклеймер «симуляция, не опрос» — в каждом отчёте
- постфлайт-аудит с guard'ом чисел и вердиктов; журнал прогнозов и ретро-бэктест с вердиктами confirmed / partial / refuted
- слепой бенчмарк против one-shot LLM по внешней рубрике (нормативка РФ), без атрибуции стилей
Исследователь и инструменты
Просто говоряВнутри платформы работает исследовательский агент: проверяет меру на соответствие нормативке, ищет пропущенные шаги, дополняет план — вплоть до рекомендации личного выезда на место. Но у него нет права трогать числа: найти пропуск он может, «подправить» прогноз — нет.
- research-агент работает только по нормативной базе РФ
- MCP-инструменты: submit_action_supplement (дополнение плана мерами), IncidentBrief (структурная сводка инцидента — без права давать поручения)
- evidence-bound коммуникация: каждый тезис черновика объявления привязан к свидетельству
- жёсткая граница: внешний research не может изменить cast, веса, проценты или вердикт
Инциденты и мониторинг
Просто говоряСигналы города — всплески обращений, публикации в соцсетях, происшествия — собираются в реальном времени во входящие инциденты со статусами и историей. Ранние признаки недовольства видны до эскалации; по инциденту в один шаг запускается прогон панели — «как жители отреагируют, если мы сделаем X» — прямо из карточки события.
- incident inbox в PostgreSQL: статусы, журнал, поколения инцидента
- дедупликация сигналов и мониторинг здоровья источников (sourceHealth)
- war room группирует прогоны по источнику: инцидент → меры → сравнение вариантов
- из инцидента — «Исследовать» (сводка) или «Предложить меры» (прогон панели)
Стек и развёртывание
Просто говоряОбычная серверная инсталляция без экзотики: платформа целиком работает в контуре заказчика на одном сервере. Тяжёлые симуляции вынесены в отдельные сервисы — основной интерфейс остаётся быстрым.
- приложение: Next.js (Node.js); данные: PostgreSQL; очереди и кэш: Redis
- развёртывание: Docker Compose; симуляция динамики — отдельные HTTP-сервисы (Python)
- LLM-провайдеры за абстракцией; режимы «Быстрая» / «Дольше, но лучше»
- графовая память глубокой симуляции: Zep
- интерфейс — полностью на русском