О проекте
Команда: 500
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
Рабочее место AML-аналитика: строит направленный граф переводов, выделяет группы счетов и их роли и формирует объяснимую очередь проверки с интерактивным графом и AI Analyst.
Как устроено
pipeline.py читает nodes/edges/transactions.parquet, проверяет схему и согласованность данных и считает для каждого счёта признаки: PageRank, взвешенный PageRank, приближённое посредничество, глубину, быстрые похожие суммы и временные признаки. Louvain на ненаправленной взвешенной проекции даёт кластеры. Затем правила назначают роли (координация, консолидация, распределение, транзит, конечный получатель, периферия) и приоритет проверки с объяснением. Результаты выгружаются в CSV и dashboard.json, отдаются через FastAPI и показываются в Next.js. AI Analyst через OpenAI Responses API получает только рассчитанные факты, относящиеся к вопросу.
Ключевые решения
- NetworkX
- PageRank
- weighted PageRank
- betweenness centrality (approx)
- Louvain
- rule-based role assignment
- resilience experiment (удаление топ-узлов)
- OpenAI Responses API
Особенности
Приоритет проверки отделён от оценки вины, ограничения выборки явно перечислены (обход до глубины 4, нет переводов меньше 5 000 ₸). Есть API-эксперимент на устойчивость сети при удалении топ-узлов. LLM получает только уже посчитанные факты.
Стек
Python · pandas · NumPy · SciPy · NetworkX · PyArrow · FastAPI · Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · pytest
Модели
OpenAI (модель из OPENAI_MODEL, в примере gpt-6-luna)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-463a9525-500.
README
README.mdMoneyGraph — Граф денег
MoneyGraph — локальное рабочее место для AML-аналитика и жюри хакатона. Оно превращает обезличенные переводы в направленный граф и помогает понять, какие счета проверить в первую очередь, какие связи и группы их окружают и на каких наблюдаемых признаках основан вывод.
В приложении нет оценки вины: роль счёта и приоритет проверки — это гипотезы для ручной проверки операций.
Проблема и пользователи
В большой выгрузке переводов трудно быстро увидеть посредников, точки консолидации и распределения средств, а также связанные группы счетов. MoneyGraph даёт аналитику единый путь от выгрузки до объяснимого списка для проверки:
- строит граф плательщик → получатель;
- рассчитывает структурные и временные признаки;
- выделяет сообщества и вероятные роли;
- показывает очередь, граф, карточки счетов и выгрузки.
Интерфейс рассчитан на AML-аналитика. Жюри может пройти тот же сценарий, открыть конкретный GID и увидеть данные, из которых сформирован вывод.
Что реализовано
- Загрузка и валидация
nodes.parquet,edges.parquet,transactions.parquet. - Направленный взвешенный граф переводов с PageRank, взвешенным PageRank, приближённым посредничеством, глубиной обхода, связями между группами и временными признаками.
- Кластеризация Louvain на взвешенной ненаправленной проекции графа.
- Роли: координация, консолидация, распределение, возможный транзит, возможный конечный получатель и периферия.
- Отдельный приоритет проверки с объяснением для каждого счёта.
- CSV-выгрузки ролей, кластеров и топа очереди.
- Полноэкранный интерфейс: обзор, интерактивный граф, очередь проверки, группы счетов, методика и AI Analyst.
- Поиск GID, фильтры по роли, кластеру, глубине и приоритету, просмотр соседей и направленного пути.
- FastAPI для работы с рассчитанным снимком данных.
- AI Analyst с OpenAI Responses API: в модель передаются только относящиеся к вопросу рассчитанные факты, а упомянутые GID открываются в графе.
Интерфейс
![]() Обзор сети | ![]() Граф переводов | ![]() Очередь проверки |
![]() Группы счетов | ![]() AI Analyst |
Как работает решение
Parquet-данные
│
▼
Валидация → графовые и временные признаки → кластеры, роли, приоритет
│
▼
CSV-выгрузки + dashboard.json
│
▼
FastAPI → Next.js интерфейс и AI Analyst
Основной сценарий:
- Пайплайн читает обезличенные данные и проверяет схему, уникальность GID, концы рёбер, суммы и согласованность агрегированных связей с транзакциями.
- Для каждого счёта рассчитываются показатели сети и активности: число входящих и исходящих связей, объёмы, центральность, достижимость исходных счетов, быстрые похожие суммы и другие признаки.
- Счета объединяются в группы, получают роль и приоритет проверки.
- Пайплайн сохраняет результаты в
outputs/. - FastAPI отдаёт рассчитанные данные интерфейсу. Аналитик может открыть очередь, выбрать GID, изучить связи, группу и задать вопрос AI Analyst.
Технологии
| Задача | Технологии |
|---|---|
| Пайплайн и API | Python, pandas, NumPy, SciPy, NetworkX, PyArrow, FastAPI, Uvicorn |
| Веб-интерфейс | Next.js 16, React 19, TypeScript |
| Стили и компоненты | Tailwind CSS 4, shadcn/ui-структура, Lucide React, Border Beam |
| AI Analyst | OpenAI Python SDK, OpenAI Responses API, модель из OPENAI_MODEL |
| Тесты | pytest, FastAPI TestClient |
Архитектура проекта
data/*.parquet
│
▼
pipeline.py ───────────────► outputs/*.csv + outputs/dashboard.json
│
▼
backend/main.py
FastAPI /api/*
│
▼
Next.js: app/ + components/
| Компонент | Назначение |
|---|---|
pipeline.py | Валидация данных, признаки, роли, кластеры, приоритеты и экспорт результатов |
outputs/ | Рассчитанные CSV и снимок dashboard.json |
backend/main.py | Read-only API для графа, поиска, узлов, кластеров, путей, устойчивости и AI Analyst |
app/, components/ | Страницы и интерактивные элементы Next.js |
tests/test_product.py | Проверка инвариантов данных и ключевых API-сценариев |
Данные и интеграции
Набор данных хранится в data/ и включает:
| Файл | Содержание |
|---|---|
nodes.parquet | Уникальные GID, глубина появления и признак исходного счёта |
edges.parquet | Агрегированные пары плательщик → получатель, суммы и количество операций |
transactions.parquet | Отдельные операции с датой и суммой |
Текущий снимок охватывает июль 2026 года: 2 248 счетов, 3 119 направленных связей, 4 840 операций, 81 исходный счёт, 91 кластер и наблюдаемый оборот 365,9 млн ₸.
OpenAI используется только для AI Analyst и только после добавления локального ключа. Остальная аналитика, граф, роли, CSV и API работают без внешних сервисов.
Установка и запуск
Требования
- Python 3.10+
- Node.js 20.9+
- npm
Быстрый запуск
git clone https://github.com/BAITC-Hacks/hack-463a9525-500.git
cd hack-463a9525-500
./run.sh
Скрипт создаёт виртуальное окружение при необходимости, устанавливает зависимости, пересчитывает outputs/, запускает FastAPI на http://127.0.0.1:8000 и Next.js на http://127.0.0.1:3000.
API-документация доступна по адресу http://127.0.0.1:8000/docs.
Запуск вручную
В первом терминале:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python pipeline.py --data data --out outputs
MONEYGRAPH_OUTPUT_DIR="$PWD/outputs" .venv/bin/python -m uvicorn backend.main:app --host 127.0.0.1 --port 8000
Во втором терминале:
npm ci
BACKEND_URL=http://127.0.0.1:8000 npm run dev -- --port 3000
Настройка AI Analyst
Скопируйте шаблон и внесите локальный ключ:
cp .env.example .env.local
MONEYGRAPH_OPENAI_API_KEY=ваш_ключ
OPENAI_MODEL=gpt-6-luna
После этого перезапустите ./run.sh. .env.local находится в .gitignore; ключ не передаётся в браузер и не должен попадать в Git.
Как проверить решение
- Запустите проект и откройте
http://127.0.0.1:3000. - На главной странице проверьте показатели: 2 248 счетов, 3 119 связей и 4 840 операций.
- Откройте «Очередь проверки» и выберите первый GID. Нажмите «Посмотреть связи».
- На странице графа посмотрите входящих и исходящих соседей, роль, глубину, приоритет и ограничения наблюдаемой сети.
- Откройте «Группы счетов», выберите группу и перейдите к ключевому счёту.
- Откройте «Методика», чтобы сверить критерии ролей и границы данных.
- При настроенном OpenAI API key откройте AI Analyst и спросите: «Почему GID 100000003684369100 в начале очереди?»
- Проверьте сборку и тесты:
.venv/bin/python -m pytest -q
npm run typecheck
npm run build
API
Основные маршруты FastAPI:
GET /api/overview— показатели и ограничения снимка.GET /api/graph— отфильтрованный граф.GET /api/nodes/{gid}— карточка счёта, связи, признаки и ограничения.GET /api/top-nodes— очередь проверки.GET /api/clustersиGET /api/clusters/{cluster_id}— группы счетов.GET /api/search?q=— поиск GID.GET /api/path?source=&target=— направленный путь.GET /api/resilience?remove_top=— структурный эксперимент при удалении топ-узлов.POST /api/analyst— ответ AI Analyst при настроенном ключе OpenAI.
Полное описание параметров доступно в Swagger UI: http://127.0.0.1:8000/docs.
Ограничения текущей версии
- Данные ограничены исходящим обходом от 81 исходного счёта до глубины 4.
- В выборке отсутствуют переводы менее 5 000 ₸ и внешние входящие операции.
- Для узла на четвёртой глубине отсутствие исходящих операций не означает завершение движения средств.
- Нет данных о владельцах счетов и размеченной истины, поэтому роль и приоритет нельзя использовать как доказательство нарушения.
- Текущая реализация NetworkX и полная загрузка
dashboard.jsonрассчитаны на предоставленный набор из 2 248 узлов. Для существенно больших графов потребуются пакетная обработка и специализированное графовое хранилище. - Развёрнутая версия в репозитории не указана. Проект запускается локально.
Полезные файлы
Авторы коммитов
История коммитов
- 2026-09-23 16:26docs: add Russian hackathon READMEDynamite01
- 2026-09-23 16:09Accept legacy analyst chat history from open tabsDynamite01
- 2026-09-23 16:05Polish methodology and connect evidence-based OpenAI chatDynamite01
- 2026-09-23 15:14Make investigation workspace interactive and explainableDynamite01
- 2026-09-23 14:41Build explainable analytics pipeline and FastAPI investigation APIDynamite01
- 2026-09-23 14:34Capture reference design and i-impeccable design systemDynamite01
- 2026-09-23 14:34Build full-screen Next.js AML dashboard and network explorerDynamite01
- 2026-09-23 14:14Implement explainable network analysis and exportsDynamite01
Все коммиты (9)
- 2026-09-23 14:11Add supplied transaction dataset and starter referenceDynamite01
Структура репозитория (61 файлов)
.env.example .gitignore .impeccable/design.json .impeccable/live/config.json AGENTS.md CLAUDE.md DESIGN.md PRODUCT.md README.md app/analyst/page.tsx app/api/analyst/route.ts app/clusters/page.tsx app/exports/[file]/route.ts app/globals.css app/icon.png app/layout.tsx app/methodology/page.tsx app/network/page.tsx app/page.tsx app/priorities/page.tsx backend/__init__.py backend/main.py components.json components/AnalystWorkspace.tsx components/Dashboard.tsx components/GraphCanvas.tsx components/InvestigationTables.tsx components/NetworkExplorer.tsx components/Shell.tsx components/ui/border-beam.tsx components/ui/demo.tsx data/README.md data/edges.parquet data/nodes.parquet data/transactions.parquet docs/architecture.md docs/reference-dashboard.png docs/screenshots/ai-analyst.png docs/screenshots/clusters.png docs/screenshots/network.png docs/screenshots/overview.png docs/screenshots/priorities.png lib/data.ts lib/utils.ts next-env.d.ts outputs/clusters.csv outputs/dashboard.json outputs/nodes_roles.csv outputs/top_nodes.csv package-lock.json package.json pipeline.py postcss.config.mjs public/brand/moneygraph-logo.png requirements.txt run.sh starter/README.md starter/requirements.txt starter/starter.py tests/test_product.py tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.




