Fighter90/MiroFish

MirPrognoz — система прогнозного моделирования общественного мнения, основанная на технологиях GraphRAG и мультиагентной симуляции.

★ 1Forks 0PythonGitHub ↗Compare

Project website ↗

README

MirPrognoz

Multi-Agent Social Opinion Simulation System

v1.3.2

GitHub Stars GitHub Forks Docker

Vue.js Vite Python Flask Docker OpenAI Node.js


Обзор

MirPrognoz — система прогнозного моделирования общественного мнения, основанная на технологиях GraphRAG и мультиагентной симуляции.

Система решает задачу: «Как отреагирует общество на событие X до того, как оно произойдёт?»

Из исходных документов (аналитические отчёты, новостные материалы, описания ситуаций) система автоматически строит граф знаний, извлекая именованные сущности (организации, социальные группы, публичные персоны), факты, позиции сторон и причинно-следственные связи. На основе графа генерируется популяция автономных AI-агентов — каждый с индивидуальным когнитивным профилем, набором убеждений, долговременной памятью (ZEP) и социальными связями.

Агенты помещаются в симулированную социальную среду, где взаимодействуют как реальные пользователи: публикуют посты, комментируют, голосуют, делают ретвиты и формируют кластеры мнений. Система фиксирует динамику распространения информации, выявляет лидеров влияния, точки поляризации и прогнозирует реакцию аудитории.

Вход: загрузите документы с контекстом ситуации и опишите триггерное событие (сценарий) на естественном языке.

Выход: структурированный аналитический отчёт с выявленными трендами, кластерами мнений, лидерами влияния — и интерактивная среда для верификации результатов (интервью с агентами, пакетные опросы).


Архитектура

Технологический стек

Слой Технология Назначение
Vue.js Vue.js 3 + Composition API Реактивный SPA-интерфейс: загрузка документов, настройка параметров, визуализация результатов
Vite Vite Сборка фронтенда, HMR, проксирование API-запросов на бэкенд
Python Python 3.11+ Ядро бэкенда: обработка документов, генерация онтологий, управление пайплайном
Flask Flask REST API: маршрутизация запросов, SSE для стриминга прогресса, файловый аплоад
OpenAI Qwen 3.5 (122B / 27B) через OpenRouter Генерация онтологий, профилей агентов, контента симуляции, аналитических отчётов
Zep Zep Cloud GraphRAG: граф знаний, долговременная память агентов, гибридный поиск (векторный + графовый)
OASIS OASIS Framework Движок мультиагентной симуляции: среда Twitter/Reddit, раундовое взаимодействие
Docker Docker + Docker Compose Контейнеризация: единый образ с фронтендом и бэкендом, деплой одной командой
GitHub Actions GitHub Actions CI/CD: линтинг, типизация, тесты, автоматический деплой на VPS через SSH

Рабочий процесс (пайплайн)

Система работает как конвейер из пяти последовательных этапов:


Этап 1. Построение графа знаний (GraphRAG)

Загруженные документы (PDF, Markdown, TXT) анализируются NLP-движком Zep Cloud. Документ разбивается на эпизоды, из которых извлекаются:

  • Именованные сущности — организации (Минфин, Профсоюзы), социальные группы (IT-специалисты, Молодёжь), публичные персоны, СМИ, государственные органы. Каждая сущность — это будущий AI-агент
  • Факты — конкретные утверждения с привязкой к источнику: «67% работающих граждан поддерживают идею», «производительность выросла на 39,9%»
  • Связи между сущностями — кто поддерживает кого (Профсоюзы → за реформу), кто выступает против (Минфин → против), кто сотрудничает (Минтруд ↔ Эксперты ВШЭ)
  • Онтология — система генерирует набор типов сущностей, специфичный для конкретной темы. Для темы «четырёхдневная неделя» это могут быть: GovernmentAgency, TradeUnion, SocialGroup, ExpertCommunity, MediaOutlet

Параллельно бэкенд вызывает LLM (Qwen 3.5 122B) для генерации онтологии: система анализирует текст и определяет, какие типы сущностей релевантны для данной темы, какие примеры сущностей должны быть, какие типы связей между ними существуют.

Результат: граф знаний в Zep Cloud — узлы (сущности с типами, описаниями, атрибутами) и рёбра (факты-связи между ними).


Этап 2. Генерация популяции агентов

Каждая сущность из графа превращается в полноценного AI-агента. Процесс генерации многоступенчатый:

  1. Нормализация имён — LLM приводит все имена к именительному падежу и корректному написанию. «депутатов Государственной Думы» → «Депутаты Государственной Думы», «профсоюзы» → «Профсоюзы»

  2. Обогащение контекста — для каждой сущности выполняется гибридный поиск по графу Zep: извлекаются все связанные факты, рёбра, соседние узлы. Это даёт агенту «память» о своих связях и позициях

  3. Генерация профиля через LLM — на основе имени, типа, описания и контекста LLM генерирует детальный профиль:

    • Демография: возраст, пол, страна, профессия
    • Психотип: MBTI-тип (INTJ, ENFP и т.д.), влияющий на стиль коммуникации
    • Bio: краткое описание для профиля в соцсети (до 200 символов)
    • Persona: развёрнутое описание характера, мотиваций, стиля общения, отношения к теме (до 1000 символов)
    • Интересы: список тем, которые интересуют агента
    • Социальные метрики: количество подписчиков, друзей, постов, карма
  4. Параллельная генерация — профили создаются в 5 параллельных потоках. Каждый профиль сохраняется в реальном времени, прогресс транслируется на фронтенд через SSE

Результат: JSON-файл с профилями агентов (формат Reddit) и/или CSV (формат Twitter), готовые для загрузки в OASIS.


Этап 3. Мультиплатформенная симуляция

Агенты загружаются в движок OASIS и помещаются в две параллельные социальные среды:

Платформа Формат контента Взаимодействия Стиль агентов
Twitter Короткие посты (до 280 символов) Ретвиты, лайки, ответы, подписки Лаконичные высказывания, хештеги, эмоции
Reddit Длинные посты в тематических сабреддитах Комментарии, голосования (upvote/downvote), треды Развёрнутые аргументы, ссылки на данные, дебаты

Симуляция проходит в раундах (по умолчанию 20–40). В каждом раунде каждый агент:

  1. Читает ленту — просматривает новые посты и комментарии других агентов
  2. Принимает решение — на основе своего профиля, убеждений и контекста решает: проигнорировать, лайкнуть, прокомментировать, сделать ретвит или написать собственный пост
  3. Генерирует контент — LLM создаёт текст поста/комментария от имени агента, учитывая его persona, стиль платформы и текущий контекст дискуссии
  4. Взаимодействует — публикует контент, подписывается на интересных агентов, голосует за/против постов

Триггерный пост (из промпта пользователя) публикуется в начале симуляции и запускает волну реакций.

Результат: полная хронология взаимодействий на обеих платформах — посты, комментарии, голоса, подписки, ретвиты.


Этап 4. Аналитический отчёт (ReportAgent)

По завершении симуляции специализированный агент-аналитик (ReportAgent) обрабатывает весь массив сгенерированного контента и формирует структурированный отчёт:

  • Основные тренды — какие нарративы доминировали, как менялась повестка от раунда к раунду
  • Кластеры мнений — какие группы агентов объединились в позиции «за» и «против», какие промежуточные позиции сформировались
  • Лидеры влияния — какие агенты формировали повестку, чьи посты получали максимум взаимодействий, кто менял мнения других
  • Точки бифуркации — моменты, когда дискуссия резко меняла направление (например, когда агент-эксперт опубликовал статистику, изменившую тон обсуждения)
  • Линии поляризации — по каким осям разделились мнения (возрастная, профессиональная, идеологическая)
  • Прогноз реакции — обобщённая оценка того, как реальная аудитория может отреагировать на аналогичное событие

Этап 5. Верификация результатов

Интерактивный режим для проверки и углубления анализа. После завершения симуляции агенты «остаются на связи» — вы можете:

  • Интервью с агентом — выберите конкретного агента и задайте ему вопросы. Он отвечает «в образе», опираясь на свой профиль, убеждения и опыт симуляции. Например: «Почему вы поддержали реформу?» или «Что изменило ваше мнение?»
  • Пакетные опросы — задайте вопрос всем агентам одновременно и получите распределение ответов. Например: «Поддерживаете ли вы переход на 4-дневную неделю?» — и увидите процентное распределение по группам
  • Анализ мотивации — исследуйте, почему конкретный агент принял определённую позицию, какие факты повлияли, чьи посты изменили его мнение

Быстрый старт

Вариант 1: Из исходного кода (рекомендуется)

Предварительные требования

Инструмент Версия Проверка
Node.js 18+ node -v
Python 3.11–3.12 python --version
uv Последняя uv --version

1. Настройка переменных окружения

cp .env.example .env

Обязательные переменные:

# Flask
FLASK_DEBUG=false
# Сгенерировать: python3 -c "import secrets; print(secrets.token_hex(32))"
SECRET_KEY=replace_with_64_hex_chars

# LLM API (OpenAI-совместимый формат)
# Можно использовать OpenRouter, DashScope, OpenAI или любой совместимый провайдер
LLM_API_KEY=your_api_key
LLM_BASE_URL=https://openrouter.ai/api/v1
LLM_MODEL_NAME=qwen/qwen3.5-122b-a10b

# Быстрая модель (вспомогательные задачи: нормализация имён, лёгкая генерация)
LLM_BOOST_API_KEY=your_api_key
LLM_BOOST_BASE_URL=https://openrouter.ai/api/v1
LLM_BOOST_MODEL_NAME=qwen/qwen3.5-27b

# ZEP Cloud — сервис памяти агентов и графа знаний
# Бесплатный тариф: https://app.getzep.com/
ZEP_API_KEY=your_zep_api_key

В продакшне помимо переменных окружения поднимите перед Docker-сервисом nginx с HTTPS и Basic Auth (или OAuth-proxy). В docker-compose.yml порты 3000/5001 уже забинжены на 127.0.0.1 — приложение доступно только через reverse-proxy, прямой доступ из интернета закрыт.

2. Установка зависимостей

# Все зависимости одной командой
npm run setup:all

Или пошагово:

npm run setup           # Node-зависимости (корень + фронтенд)
npm run setup:backend   # Python-зависимости (бэкенд)

3. Запуск

npm run dev
  • Фронтенд: http://localhost:3000
  • API бэкенда: http://localhost:5001

Вариант 2: Docker

cp .env.example .env
# Отредактируйте .env, заполнив API-ключи
docker compose up -d

Контейнер автоматически установит все зависимости, соберёт фронтенд и запустит оба сервера.


Тестовые примеры

Для быстрого старта используйте готовые тестовые данные:

Файл Описание
test-document.md Документ о переходе на четырёхдневную рабочую неделю в России
test-prompt.txt Сценарий симуляции: реакция социальных групп на реформу

Как использовать:

  1. Загрузите test-document.md в поле «Исходные данные»
  2. Скопируйте содержимое test-prompt.txt в поле «Сценарий симуляции»
  3. Нажмите «Запустить симуляцию»

Что произойдёт: система построит граф знаний из документа, извлечёт сущности (Профсоюзы, Депутаты Государственной Думы, Минфин, Минтруд, IT-специалисты, Молодёжь, Пенсионеры, Промышленные рабочие и др.), сгенерирует AI-агентов с уникальными профилями и запустит параллельную симуляцию на Twitter и Reddit. По завершении — аналитический отчёт с трендами, кластерами мнений и лидерами влияния.


Подготовка данных для симуляции

Требования к документу (исходные данные)

Документ — это основа для построения графа знаний. От его качества напрямую зависит точность и глубина симуляции. Система принимает форматы PDF, Markdown (.md) и текстовый файл (.txt).

Что должен содержать документ:

  • Участники / стороны — конкретные лица, организации, социальные группы, государственные органы, СМИ. Каждый участник станет отдельным AI-агентом в симуляции. Чем больше участников с разными позициями — тем богаче и реалистичнее моделирование
  • Факты и данные — статистика, цифры, результаты исследований, опросов, экспериментов. Агенты используют их как аргументы в дискуссиях: публикуют в постах, ссылаются в комментариях, спорят о трактовке
  • Позиции сторон — кто за, кто против, кто нейтрален, какие аргументы у каждой стороны. Это формирует когнитивные профили агентов — их убеждения, мотивации и стиль аргументации
  • Контекст — экономическая ситуация, исторические предпосылки, международный опыт, правовые рамки. Контекст обогащает дискуссию и позволяет агентам приводить более глубокие аргументы
  • Отношения между участниками — кто поддерживает кого, кто конфликтует, кто сотрудничает. Система извлечёт эти связи и отразит в социальном графе агентов

Рекомендации по составлению:

  • Называйте участников в именительном падеже (кто? что?): «Профсоюзы», «Депутаты Государственной Думы», а не «профсоюзов», «депутатов». Система автоматически нормализует падежи, но правильные формы в исходнике дают лучший результат
  • Указывайте конкретные организации и группы, а не абстрактные понятия: «Минфин» вместо «финансовые круги», «Эксперты ВШЭ» вместо «учёные»
  • Не используйте страны как участников — вместо «Исландия» пишите «Правительство Исландии» или описывайте «Исландский эксперимент с четырёхдневной неделей»
  • Добавляйте числовые данные: проценты поддержки, экономические показатели, результаты опросов — агенты будут оперировать ими в дискуссиях
  • Оптимальный объём: 1–5 страниц. Слишком короткий документ (< 500 слов) даст мало сущностей и поверхностную симуляцию. Слишком длинный (> 10 страниц) замедлит обработку без значительного прироста качества
  • Структурируйте документ по разделам: текущая ситуация → позиции сторон → контекст → возможные сценарии. Это помогает NLP-движку точнее извлекать связи

Требования к промпту (сценарий симуляции)

Промпт задаёт триггерное событие — новость, решение или ситуацию, на которую будут реагировать агенты. Это «стартовый пост», который запускает дискуссию.

Хороший промпт содержит:

  • Конкретное событие — что именно произошло? Объявление, решение, утечка, публикация. Чем конкретнее — тем реалистичнее реакции
  • Детали события — кто объявил, когда, какие условия, какие ограничения. Детали дают агентам материал для обсуждения
  • Вопросы для моделирования — какие реакции ожидаются? какие линии конфликта? какие аргументы будут доминировать? Вопросы фокусируют симуляцию
  • Упоминание целевых групп — какие именно социальные группы должны участвовать. Это помогает системе расставить приоритеты при генерации агентов

Пример хорошего промпта:

Правительство России объявило о запуске пилотного проекта по переходу на четырёхдневную рабочую неделю в пяти регионах. Участие добровольное, зарплаты сохраняются. Как отреагируют различные социальные группы — молодёжь, промышленные рабочие, IT-специалисты, пенсионеры? Какие аргументы будут доминировать в публичной дискуссии? Возникнет ли поляризация мнений и по каким линиям?

Пример плохого промпта:

Расскажи про четырёхдневную рабочую неделю.

(Нет события, нет вопросов, нет целевых групп — агентам не на что реагировать)

Куда публикуются посты агентов

Симуляция одновременно моделирует две социальные платформы:

Платформа Формат контента Взаимодействия Стиль агентов
Twitter Короткие посты (до 280 символов) Ретвиты, лайки, ответы, подписки Лаконичные высказывания, хештеги, эмоции
Reddit Длинные посты в тематических сабреддитах Комментарии, голосования (upvote/downvote), треды Развёрнутые аргументы, ссылки на данные, дебаты

Каждый агент публикует в обеих платформах, адаптируя стиль. Это позволяет сравнить динамику распространения мнений в разных средах и выявить, как формат платформы влияет на характер дискуссии.


Стоимость

Средняя стоимость одной симуляции — около $5 на API-вызовах (LLM + Zep). Основные расходы:

Этап Стоимость
Генерация онтологии и профилей агентов ~$1–2
Симуляция (20–40 раундов на двух платформах) ~$2–3
Аналитический отчёт ~$0.5–1

Для начала рекомендуется ограничить количество раундов до 20–40 и количество агентов до 10–15.


Changelog

Полная история изменений — в файле CHANGELOG.md.

Благодарности

Движок симуляции работает на базе OASIS (Open Agent Social Interaction Simulations). Благодарим команду CAMEL-AI за вклад в открытый код.

Contributors

666ghjFighter90Ghostubborncursoragent

Issues