О проекте
Команда: ООО «Бнал»
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
Анализ транзакционной сети 81 seed-клиента (2 248 узлов): роли узлов, кластеры Louvain с гипотезами, топ-50 приоритетов проверки, интерактивный граф и AI-помощник.
Как устроено
Parquet/CSV (nodes, edges, transactions) валидируются, строится граф NetworkX с метриками (PageRank, betweenness, потоки, haircut-атрибуция). Правила из config.yaml назначают роли consolidator/distributor/transit/terminal/coordinator/peripheral с баллом и обоснованием, Louvain выделяет кластеры, приоритет — взвешенная сумма перцентилей seed-оборота, PageRank/betweenness и роли. Дополнительно ищутся циклы до 5, повторяющиеся цепочки A→B→C, дробление платежей, устойчивость сети; AI-помощник на gpt-4.1-mini с function calling по графу, офлайн-фолбэк.
Ключевые решения
- NetworkX
- Louvain
- PageRank
- betweenness
- rule-based role scoring
- haircut attribution
- cycle detection
- function calling
Метрики
Расчёт ≈2 мин (<5 мин) на 2 248 узлах/3 119 связях/4 840 транзакциях; найдено 120 повторяющихся цепочек и 7 групп дробления
Особенности
Прозрачные настраиваемые правила ролей и формула приоритета; защита граничных узлов 4-го колена от ложной роли terminal; помимо обязательных CSV выдаёт next_requests.csv — список следующих запросов данных для аналитика. Есть онлайн-демо на Vercel и видео.
Стек
Python · pandas · PyArrow · NumPy · SciPy · NetworkX · FastAPI · vis-network · Vercel · Streamlit · pyvis · Altair · pytest
Модели
gpt-4.1-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-db041ec5-team.
README
README.mdГраф денег — HackAlem AI
Трек: Финансы · Кейс: восстановление финансовой структуры организованной группы по транзакционной сети.
🌐 Онлайн-демо: https://moneygraph-hackalem.vercel.app (без пароля, конкурсный набор уже рассчитан) 🎬 Видео работы: https://youtu.be/76Vf1yPgT2w

Какую проблему решаем
У аналитика финмониторинга есть 81 подозрительный клиент (seed) и выгрузка их переводов на 4 колена: 2 248 клиентов, 3 119 связей, 4 840 транзакций. Вручную понять, кто в этой сети собирает деньги, кто раздаёт, кто транзит, а кто конечный получатель, — это дни работы.
«Граф денег» за один запуск (≤ 5 минут, на практике ≈ 2 минуты):
- Назначает роль каждому узлу:
consolidator,distributor,transit,terminal,coordinator,peripheral, с баллом 0–1 и текстовым обоснованием. - Находит группы (кластеры) методом Louvain и формулирует гипотезу о назначении каждой группы.
- Ранжирует узлы по приоритету проверки (топ-50) и объясняет, почему узел в топе.
- Показывает интерактивный граф: поиск по gid, направления переводов, раскраска по ролям и кластерам, карточка узла с потоками и сработавшими правилами.
- Отвечает на вопросы через AI-помощника (OpenAI, вызов инструментов по данным графа). Без ключа помощник работает офлайн по правилам.
Результаты — гипотезы для проверки аналитиком, а не доказательство вины. Все правила прозрачны и настраиваются в config.yaml.
| Граф и карточка узла | Кластеры и гипотезы |
|---|---|
![]() | ![]() |
Технологии
| Слой | Стек |
|---|---|
| Анализ | Python 3.12, pandas, PyArrow, NumPy, SciPy, NetworkX (PageRank, betweenness, Louvain) |
| Веб-версия | FastAPI + vis-network, деплой на Vercel (api/index.py) |
| Локальный интерфейс | Streamlit, pyvis, Altair |
| AI-помощник | OpenAI API (gpt-4.1-mini, function calling, JSON Schema), офлайн-фолбэк |
| Качество | pytest: tests/ (расчёт, API) и tests_c/ (UI, помощник) |
Быстрый запуск
Вариант 1. Открыть онлайн
https://moneygraph-hackalem.vercel.app — ничего устанавливать не нужно.
Вариант 2. Windows, в один клик
Нужен Python 3.12. Положите nodes.parquet, edges.parquet, transactions.parquet в папку data/ (необязательно: без них откроется форма загрузки).
| Действие | Что произойдёт |
|---|---|
Двойной клик START.cmd | Создаст .venv, поставит зависимости, выполнит расчёт по data/ и откроет Streamlit на http://localhost:8501 |
Двойной клик START_WEB.cmd | Запустит веб-версию (как на Vercel) на http://127.0.0.1:8600 |
START.cmd -Check | Запустит все тесты |
START.cmd -Demo | Демо на вымышленных данных, без расчёта |
Вариант 3. Вручную (любая ОС)
python3.12 -m venv .venv
# Windows: .venv\Scripts\activate | Linux/macOS: source .venv/bin/activate
pip install -r requirements-lock.txt
# 1) Расчёт: Parquet → CSV (≤ 5 минут)
python -X utf8 run.py --data data --out output/current --config config.yaml
# 2) Интерфейс
streamlit run app.py # локальный UI
python -m uvicorn api.index:app --port 8600 # веб-версия
AI-помощник (необязательно): скопируйте .env.example в .env и укажите OPENAI_API_KEY. Расчёт ролей, кластеров и приоритетов от ключа не зависит. Подробности: docs/OPENAI_VERCEL.md.
Как проверить решение (для жюри)
- Расчёт. Выполните
run.py(см. выше) и откройтеoutput/current/run_report.json: там должны быть"status": "ok"иelapsed_seconds < 300. - Обязательные выгрузки в
output/current/:nodes_roles.csv:gid, role, role_score, cluster_id, priority_score, evidence. Все 2 248 узлов с ролью и обоснованием.clusters.csv:cluster_id, n_nodes, n_seed, sum_kzt_internal, top_gids, hypothesis.top_nodes.csv:rank, gid, role, priority_score, why. Топ-50.
- Интерфейс. Обзор → Приоритеты → Граф: найдите gid из топа и откройте карточку. В ней роль, балл, сработавшие правила и входящие и исходящие потоки.
- Свои данные. Блок «Загрузить файлы и выполнить анализ» принимает Parquet или CSV по схеме ниже. Некорректные файлы отклоняются с объяснением.
- Помощник. Вкладка чата, например вопрос: «Кто главный консолидатор и откуда к нему идут деньги?»
- Тесты.
python -X utf8 -m pytest -q.
Подробный сценарий и контрольные узлы: docs/CHECK_PROJECT.md.
Формат входных данных
| Файл | Обязательные колонки |
|---|---|
nodes.parquet / .csv | gid (int64), depth (0 = seed), is_seed (bool / 0-1) |
edges.parquet / .csv | src, dst, sum_kzt, n_tx, depth |
transactions.parquet / .csv | src, dst, date (ISO), sum_kzt |
CSV: UTF-8, разделитель — запятая. Концы рёбер должны быть в nodes, суммы в edges должны сходиться с transactions. Описание конкурсного датасета: docs/DATASET.md.
Как принимаются решения
| Роль | Основное условие |
|---|---|
| consolidator | ≥ 5 плательщиков; балл учитывает число источников и равномерность входов |
| distributor | не граница выборки, ≥ 10 получателей |
| transit | не граница, степени ≤ 3, есть исходящие; для не-seed out/in от 0,8 до 1,2 |
| terminal | не граница, вход ≥ медианы; нет исходящих (или out/in ≤ 0,2 для не-seed) |
| coordinator | не граница; ≥ 2 сигнала: сходимость seed, ролевые соседи, мостовая позиция |
| peripheral | ни одно правило не сработало |
Приоритет = 0,35 × перцентиль seed-оборота + 0,20 × перцентиль seed-источников + 0,15 × max(перцентиль PageRank, betweenness) + 0,30 × вес роли × role_score (для самих seed × 0,85). Формулы: docs/roles.md, методы: docs/METHODS.md.
Дополнительные сигналы: транзит в окне 2 дней, повторяющиеся цепочки A→B→C, дробление платежей (≥ 3 близкие суммы в день), циклы длиной до 5, устойчивость сети при удалении топ-узлов, список следующих запросов данных. На конкурсном наборе найдено 120 повторяющихся цепочек и 7 групп близких платежей.
Дополнительные выгрузки: node_features.csv, graph.json, data_quality.md, next_requests.csv, cluster_metrics.csv, cycles.csv, resilience.csv, repeated_routes.csv, splitting.csv.
Архитектура

flowchart LR
A[Parquet / CSV] --> B[Валидация<br/>moneygraph/io.py]
B --> C[Граф и метрики<br/>graph, features, flow]
C --> D[Роли и кластеры<br/>roles, clusters]
D --> E[Приоритет и CSV<br/>priority, export]
E --> F[Streamlit UI<br/>app.py, ui/]
E --> G[FastAPI + Vercel<br/>api/index.py]
F & G --> H[AI-помощник<br/>assistant/]
moneygraph/ расчётный конвейер (граф, метрики, роли, кластеры, приоритет, экспорт)
assistant/ LLM-агент с инструментами по графу + офлайн-фолбэк
api/ FastAPI для веб-версии (Vercel)
ui/, app.py Streamlit-интерфейс
run.py CLI: Parquet → CSV
config.yaml все пороги и веса
tests/, tests_c/ автотесты
docs/ методы, роли, проверка, демо
Ограничения
- Пороги ролей — наши эвристики. Разметки (ground truth) нет, поэтому
role_score— это не вероятность, а accuracy не измерена. - Граница выборки (4-е колено) защищена от ложной роли
terminal: у крайних узлов исходящие просто не выгружены. - Haircut-атрибуция моделирует пропорциональное смешение денег и не доказывает движение конкретной операции.
- Решение рассчитано на конкурсный объём. Для миллиона узлов понадобятся чтение по частям, CSR/igraph и приближённые центральности; на таком объёме проект не проверялся.
- Данные организаторов обезличены и включены в
showcase/только для демонстрации; репозиторий приватный. Решение не использует ФИО, ИИН и иные персональные данные..envи окружения в Git не входят.
Команда
- Artyom — граф, метрики, атрибуция потоков
- Kostya — роли, скоринг, конвейер
- Maksim — интерфейс и AI-помощник
Авторы коммитов
История коммитов
- 2026-09-23 17:46docs: update demo video link and drop backup videolegez
- 2026-09-23 17:41docs: replace README screenshots with current web designlegez
- 2026-09-23 17:39docs: rewrite README for jury reviewlegez
- 2026-09-23 17:22Complete Money Graph analysis, OpenAI assistant and Vercel dashboardatomi7e
- 2026-09-23 16:05Rewrite jury README with reproducible setup and verificationatomi7e
- 2026-09-23 15:54Prepare NVIDIA adapter and verify delivery in clean environmentatomi7e
- 2026-09-23 15:26Integrate real data, precise graph IDs and UI verification across A B Catomi7e
- 2026-09-23 15:21Merge Maksim UI and assistant into Artyom with verified backendatomi7e
Все коммиты (13)
- 2026-09-23 15:21Validate real organizer data and preserve backend fixes before UI integrationatomi7e
- 2026-09-23 15:14Integrate Streamlit dashboard, offline assistant and team handoffKostyaKostolom
- 2026-09-23 14:50Verify integrated A/B pipeline with default CLI configurationatomi7e
- 2026-09-23 14:45Implement role scoring, priority and integrated pipelineKostyaKostolom
- 2026-09-23 14:02Implement graph metrics, source attribution and clusteringatomi7e
Структура репозитория (115 файлов)
.env.example .gitignore .streamlit/config.toml .vercelignore README.md START.cmd START_WEB.cmd api/__init__.py api/index.py app.py assistant/__init__.py assistant/agent.py assistant/fallback.py assistant/schemas.py assistant/tools.py config.yaml docs/ABC_INTEGRATION.md docs/ARCHITECTURE.md docs/AUDIT.md docs/A_handoff.md docs/B_handoff.md docs/CHECK_PROJECT.md docs/C_CHECKLIST.md docs/C_README.md docs/DATASET.md docs/DELIVERY_CHECK.md docs/DEMO.md docs/DEMO_CURRENT.md docs/INTEGRATION.md docs/METHODS.md docs/NVIDIA_SETUP.md docs/OPENAI_VERCEL.md docs/PROJECT_AUDIT_2026-09-23.md docs/RUN_WEB.md docs/TZ_compliance.md docs/VERIFICATION.md docs/VERIFICATION_CURRENT.md docs/architecture.png docs/backend_verification.md docs/demo/01-overview.png docs/demo/02-network.png docs/demo/03-activity.png docs/demo/frames.txt docs/real_data_review.md docs/roles.md docs/screens/clusters.png docs/screens/graph.png docs/screens/overview.png moneygraph/__init__.py moneygraph/clusters.py moneygraph/export.py moneygraph/features.py moneygraph/flow.py moneygraph/gaps.py moneygraph/graph.py moneygraph/hypotheses.py moneygraph/io.py moneygraph/patterns.py moneygraph/prepare.py moneygraph/priority.py moneygraph/resilience.py moneygraph/roles.py moneygraph/uploads.py pyproject.toml requirements-a.txt requirements-b.txt requirements-demo.txt requirements-lock.txt requirements.txt run.py scripts/build_backup_video.py scripts/demo_pipeline.py scripts/package_release.py scripts/prepare_showcase.py showcase/analysis.json.gz showcase/source/edges.parquet showcase/source/nodes.parquet showcase/source/transactions.parquet start.ps1 starter/starter/README.md starter/starter/requirements.txt starter/starter/starter.py tests/conftest.py tests/test_audit.py tests/test_flow.py tests/test_graph_metrics.py tests/test_invariance.py tests/test_outputs.py tests/test_priority.py tests/test_roles.py tests/test_uploads_patterns.py tests/test_validation_edges.py tests/test_vercel_api.py tests/test_web_integration.py tests_c/conftest.py tests_c/test_agent.py tests_c/test_app.py tests_c/test_dashboard.py tests_c/test_data.py tests_c/test_large_ids.py tests_c/test_tools.py ui/__init__.py ui/constants.py ui/dashboard.py ui/data.py ui/demo.py ui/graph_view.py ui/node_card.py ui/pages.py ui/style.py ui/uploads.py vercel.json web/app.js web/index.html web/style.css
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.

