AAYMA
RU
Войти

Fusion

AML-инструмент, который превращает сеть транзакций в очередь проверки с приоритетами.

Рабочий MVP
Команда «Fusion» 11💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Fusion
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP

Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)

Суть

AML-инструмент, который превращает сеть транзакций в очередь проверки с приоритетами. Строит направленный граф переводов, определяет структурные роли (consolidator, транзитный, распределяющий узел и другие), делит сеть на кластеры Louvain и выдаёт Top-20 с объяснением priority score.

Как устроено

Три parquet-файла (nodes, edges, transactions) проходят проверку данных, из них в NetworkX строится направленный граф. Из графа считаются признаки, детерминированные правила ролей и priority score из пяти составляющих с понижающим множителем наблюдаемости для узлов на границе данных (depth). Кластеры находятся методом Louvain. Pipeline записывает nodes_roles.csv, clusters.csv, top_nodes.csv и run_report.json. FastAPI отдаёт данные в React с графом на Cytoscape.js. OpenAI Responses API только объясняет уже посчитанные факты, при недоступности основной расчёт продолжает работать.

Ключевые решения

  • NetworkX
  • Louvain
  • направленный граф транзакций
  • rule-based роли узлов
  • priority score с поправкой на наблюдаемость
  • Cytoscape.js
  • grounded LLM-объяснения

Особенности

Приоритет учитывает ограничения наблюдаемости: для узлов на границе выборки (depth=4) применяется понижающий множитель, изолированные seed не помечаются как terminal по ошибке. README содержит конкретные проверочные GID с ожидаемыми значениями. По заявлению команды: 2248 узлов, 88 кластеров, 34 проверки данных и 99 из 99 тестов. Можно загрузить свой набор parquet или ZIP.

Стек

Python 3.12 · pandas · PyArrow · NetworkX · SciPy · FastAPI · React · TypeScript · Vite · Cytoscape.js · unittest

Модели

OpenAI Responses API


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-6480017d-fusion.

README

README.md

Fusion — кого проверить первым?

Fusion — аналитический инструмент для AML-аналитика банка. Он превращает транзакционную сеть в приоритизированную очередь проверки и отвечает на главный вопрос:

Кого из клиентов проверять первым и почему?

На исходном наборе Fusion анализирует 2 248 участников, строит направленный граф переводов, определяет роли, кластеры и Top-20 по приоритету. Основные расчёты выполняются локально и не зависят от LLM.


1. Что решает продукт

AML-аналитик получает список уже известных клиентов и должен вручную восстановить, куда идут деньги, где они концентрируются, через какие узлы проходят и кого проверять дальше.

Fusion автоматизирует этот этап.

Система:

  • строит направленный граф денежных переводов;
  • выделяет структурные роли участников;
  • группирует сеть по кластерам;
  • формирует Top-20 узлов для первичной проверки;
  • показывает входящие и исходящие связи, суммы и количество операций;
  • объясняет, из каких факторов сформирован priority score;
  • показывает ограничения наблюдаемости данных.

Для выбранного GID аналитик видит:

  • роль;
  • место в общем рейтинге;
  • priority score;
  • входящие и исходящие денежные потоки;
  • кластер;
  • объяснение роли и приоритета;
  • ограничения данных.

Бизнес-результат

Fusion сокращает время на:

  • ручную трассировку цепочек переводов;
  • поиск точек консолидации;
  • поиск транзитных и распределяющих узлов;
  • поиск структурно значимых участников;
  • первичную приоритизацию AML-проверки.

Система не принимает решение о виновности клиента и не заменяет AML-аналитика.

Fusion формирует аналитическую гипотезу и показывает, куда смотреть в первую очередь. Решение об углублённой проверке и дальнейших действиях остаётся за AML-аналитиком.


2. Как запустить

Требования:

  • Python 3.12
  • Node.js 22
  • Git

Команды выполнять из корня проекта.

1. Получить код и установить зависимости

git clone https://github.com/BAITC-Hacks/hack-6480017d-fusion.git Fusion
cd Fusion

python3.12 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements-dev.txt
npm --prefix frontend ci

2. Положить исходные данные в data/

data/
├── nodes.parquet
├── edges.parquet
└── transactions.parquet

3. Рассчитать результаты и запустить приложение

macOS / Linux

source .venv/bin/activate

Windows PowerShell

.venv\Scripts\Activate.ps1

:: Windows CMD .venv\Scripts\activate.bat


.venv/bin/python -m backend.pipeline
.venv/bin/python scripts/run_local.py

Открыть:

http://127.0.0.1:5173

Проверка уже запущенного приложения:

.venv/bin/python scripts/run_local.py --check

Для основного расчёта и интерфейса OpenAI-ключ не требуется.

Если хотите проверить Fusion на другом наборе данных, в интерфейсе нажмите «Данные» и загрузите либо 3 файла Parquet (nodes.parquet, edges.parquet, transactions.parquet), либо один ZIP-архив, содержащий эти три файла.


3. Какие технологии используются

flowchart LR
    D[3 Parquet] --> A[Проверка данных]
    A --> G[Направленный граф]
    G --> C[Признаки, роли, priority]
    G --> L[Louvain clustering]
    C --> F[3 CSV]
    C --> B[FastAPI]
    L --> B
    B --> U[React + Cytoscape]
    B --> O[OpenAI explanation]
    O --> U

Основной стек:

  • Python 3.12
  • pandas / PyArrow — обработка parquet
  • NetworkX / SciPy — графовая аналитика
  • FastAPI — backend
  • React + TypeScript + Vite — frontend
  • Cytoscape.js — визуализация графа
  • Louvain — кластеризация
  • OpenAI Responses API — дополнительное объяснение рассчитанных фактов

AI не определяет роли и не рассчитывает priority score. Если OpenAI недоступен, основной pipeline, интерфейс и CSV продолжают работать.

Структура проекта:

backend/     — расчёты, API, AI
frontend/    — интерфейс и граф
data/        — исходные parquet
artifacts/   — результаты расчёта
docs/        — методика, аудит и demo

4. Как проверить решение

Шаг 1. Запустить полный расчёт

.venv/bin/python -m backend.pipeline

После запуска должны появиться:

artifacts/nodes_roles.csv
artifacts/clusters.csv
artifacts/top_nodes.csv
artifacts/run_report.json

Ожидаемый результат на исходном наборе:

  • nodes_roles.csv — 2 248 строк;
  • clusters.csv — 88 кластеров;
  • top_nodes.csv — не менее 20 узлов;
  • обязательные поля заполнены;
  • расчёт укладывается в лимит 5 минут.

Шаг 2. Запустить автоматические проверки

.venv/bin/python -m backend.audit
.venv/bin/python -m unittest discover -s backend/tests -v
.venv/bin/python -m pip check
npm --prefix frontend run build

Актуальный подтверждённый прогон:

  • 34 проверки данных;
  • 99/99 backend-тестов;
  • frontend production build — успешен.

Шаг 3. Проверить интерфейс за 3 минуты

В сводке должно быть:

  • 2 248 участников;
  • 3 119 связей;
  • 4 840 транзакций;
  • 81 seed;
  • Top-20 по приоритету проверки.

Проверочный GID:

100000004015047100

Ожидается:

  • роль: consolidator;
  • priority: 0.625090;
  • место: 5 из 2248;
  • 9 плательщиков / 1 получатель;
  • 919 104 / 69 195 KZT;
  • видны пять составляющих priority;
  • видны полные входящие и исходящие связи.

Проверка границы данных:

100000008175078100

Должен отображаться статус depth=4 и понижающий множитель наблюдаемости.

Проверка изолированного seed:

100000000456947100

Должен отображаться нулевой приоритет и отсутствие наблюдаемых потоков без ошибочной классификации как terminal.

Проверка кластера:

  • выбрать Cluster 0;
  • ожидается 278 участников;
  • 1 seed;
  • внутренний оборот 31 237 334,24 KZT;
  • доступны лидеры и гипотеза кластера.

Главный критерий проверки

После выбора любого GID должно быть понятно:

Почему этот участник получил такую роль и почему AML-аналитику предлагается проверить его с таким приоритетом?


Документация

  • docs/METHODOLOGY.md — правила ролей и priority;
  • docs/DATA_AUDIT.md — аудит данных;
  • docs/DEMO.md — сценарий демонстрации;
  • docs/PROGRESS.md — текущий статус проекта.
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
13
Авторы
3
Файлы
83
Ветки
1

Авторы коммитов

ummvvaa 8Dinmukhammed Begali 4dimka077 1

История коммитов

  • 2026-09-23 17:57Update README with virtual environment activation instructionsdimka077
  • 2026-09-23 17:51docs: publish updated project READMEummvvaa
  • 2026-09-23 17:45data: include original HackAlem parquet datasetDinmukhammed Begali
  • 2026-09-23 17:37feat: import validated datasets and document current Fusion workflowummvvaa
  • 2026-09-23 17:17Redesign Fusion as a compact dark AML workspaceDinmukhammed Begali
  • 2026-09-23 16:53Expose complete node flows, priority evidence and observation coverageummvvaa
  • 2026-09-23 16:35Audit Fusion pipeline, ranking robustness and submission readinessDinmukhammed Begali
  • 2026-09-23 16:18Add grounded OpenAI analysis, compact dialog and complete MVP guideummvvaa
Все коммиты (13)
  • 2026-09-23 15:54Document local launch, API settings and alternating team commitsDinmukhammed Begali
  • 2026-09-23 15:48Add interactive transaction graph, node analysis and CSV exportsummvvaa
  • 2026-09-23 15:23feat: add deterministic role analysis and CSV pipelineummvvaa
  • 2026-09-23 15:04test: verify Fusion stage one and restore progress reportummvvaa
  • 2026-09-23 14:45feat: add Fusion stage-one app and team Git workflowummvvaa
Структура репозитория (83 файлов)
.gitignore
AGENTS.md
MANIFEST.json
README.md
START_HERE.md
artifacts/.gitkeep
backend/.env.example
backend/__init__.py
backend/ai_config.py
backend/ai_evidence.py
backend/ai_models.py
backend/ai_providers.py
backend/ai_service.py
backend/analysis_config.py
backend/analysis_service.py
backend/app.py
backend/audit.py
backend/datasets.py
backend/features.py
backend/pipeline.py
backend/requirements-dev.txt
backend/requirements.in
backend/requirements.txt
backend/roles.py
backend/serialization.py
backend/tests/__init__.py
backend/tests/test_ai_evidence.py
backend/tests/test_ai_providers.py
backend/tests/test_ai_service.py
backend/tests/test_analysis_api.py
backend/tests/test_api.py
backend/tests/test_audit.py
backend/tests/test_datasets_api.py
backend/tests/test_node_details_api.py
backend/tests/test_pipeline.py
backend/tests/test_serialization.py
backend/validate_ai.py
data/README.md
data/edges.parquet
data/nodes.parquet
data/transactions.parquet
docs/AI_DESIGN.md
docs/AI_VALIDATION.md
docs/COLLABORATION.md
docs/DATA_AUDIT.md
docs/DATA_NOTES.md
docs/DEMO.md
docs/LOCAL_SETUP.md
docs/METHODOLOGY.md
docs/PLAN.md
docs/PROGRESS.md
docs/TECHNICAL_AUDIT.md
docs/case.md
docs/dataset.md
frontend/index.html
frontend/package-lock.json
frontend/package.json
frontend/src/AiPanel.tsx
frontend/src/App.tsx
frontend/src/ClusterSummary.tsx
frontend/src/DatasetPanel.tsx
frontend/src/NetworkGraph.tsx
frontend/src/NodeFlows.tsx
frontend/src/PriorityExplanation.tsx
frontend/src/ai.css
frontend/src/aiApi.ts
frontend/src/api.ts
frontend/src/cluster-summary.css
frontend/src/dataset.css
frontend/src/datasetApi.ts
frontend/src/main.tsx
frontend/src/node-flows.css
frontend/src/presentation.ts
frontend/src/priority-explanation.css
frontend/src/styles.css
frontend/tsconfig.json
frontend/vite.config.ts
prompts/01_START.md
prompts/UPDATE_TWO_PROVIDERS.md
scripts/run_local.py
starter/README.md
starter/requirements.txt
starter/starter.py

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.