AAYMA
RU
Войти

MoneyGraph

Рабочее место AML-аналитика: строит направленный граф переводов, выделяет группы счетов и их роли и формирует объяснимую очередь проверки с…

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

О проекте

Команда: 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.md

MoneyGraph — Граф денег

MoneyGraph — локальное рабочее место для AML-аналитика и жюри хакатона. Оно превращает обезличенные переводы в направленный граф и помогает понять, какие счета проверить в первую очередь, какие связи и группы их окружают и на каких наблюдаемых признаках основан вывод.

В приложении нет оценки вины: роль счёта и приоритет проверки — это гипотезы для ручной проверки операций.

Проблема и пользователи

В большой выгрузке переводов трудно быстро увидеть посредников, точки консолидации и распределения средств, а также связанные группы счетов. MoneyGraph даёт аналитику единый путь от выгрузки до объяснимого списка для проверки:

  1. строит граф плательщик → получатель;
  2. рассчитывает структурные и временные признаки;
  3. выделяет сообщества и вероятные роли;
  4. показывает очередь, граф, карточки счетов и выгрузки.

Интерфейс рассчитан на AML-аналитика. Жюри может пройти тот же сценарий, открыть конкретный GID и увидеть данные, из которых сформирован вывод.

Что реализовано

  • Загрузка и валидация nodes.parquet, edges.parquet, transactions.parquet.
  • Направленный взвешенный граф переводов с PageRank, взвешенным PageRank, приближённым посредничеством, глубиной обхода, связями между группами и временными признаками.
  • Кластеризация Louvain на взвешенной ненаправленной проекции графа.
  • Роли: координация, консолидация, распределение, возможный транзит, возможный конечный получатель и периферия.
  • Отдельный приоритет проверки с объяснением для каждого счёта.
  • CSV-выгрузки ролей, кластеров и топа очереди.
  • Полноэкранный интерфейс: обзор, интерактивный граф, очередь проверки, группы счетов, методика и AI Analyst.
  • Поиск GID, фильтры по роли, кластеру, глубине и приоритету, просмотр соседей и направленного пути.
  • FastAPI для работы с рассчитанным снимком данных.
  • AI Analyst с OpenAI Responses API: в модель передаются только относящиеся к вопросу рассчитанные факты, а упомянутые GID открываются в графе.

Интерфейс

Обзор сети MoneyGraph
Обзор сети
Граф переводов
Граф переводов
Очередь проверки
Очередь проверки
Группы связанных счетов
Группы счетов
AI Analyst
AI Analyst

Как работает решение

Parquet-данные
      │
      ▼
Валидация → графовые и временные признаки → кластеры, роли, приоритет
      │
      ▼
CSV-выгрузки + dashboard.json
      │
      ▼
FastAPI → Next.js интерфейс и AI Analyst

Основной сценарий:

  1. Пайплайн читает обезличенные данные и проверяет схему, уникальность GID, концы рёбер, суммы и согласованность агрегированных связей с транзакциями.
  2. Для каждого счёта рассчитываются показатели сети и активности: число входящих и исходящих связей, объёмы, центральность, достижимость исходных счетов, быстрые похожие суммы и другие признаки.
  3. Счета объединяются в группы, получают роль и приоритет проверки.
  4. Пайплайн сохраняет результаты в outputs/.
  5. FastAPI отдаёт рассчитанные данные интерфейсу. Аналитик может открыть очередь, выбрать GID, изучить связи, группу и задать вопрос AI Analyst.

Технологии

ЗадачаТехнологии
Пайплайн и APIPython, pandas, NumPy, SciPy, NetworkX, PyArrow, FastAPI, Uvicorn
Веб-интерфейсNext.js 16, React 19, TypeScript
Стили и компонентыTailwind CSS 4, shadcn/ui-структура, Lucide React, Border Beam
AI AnalystOpenAI 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.pyRead-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.

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

  1. Запустите проект и откройте http://127.0.0.1:3000.
  2. На главной странице проверьте показатели: 2 248 счетов, 3 119 связей и 4 840 операций.
  3. Откройте «Очередь проверки» и выберите первый GID. Нажмите «Посмотреть связи».
  4. На странице графа посмотрите входящих и исходящих соседей, роль, глубину, приоритет и ограничения наблюдаемой сети.
  5. Откройте «Группы счетов», выберите группу и перейдите к ключевому счёту.
  6. Откройте «Методика», чтобы сверить критерии ролей и границы данных.
  7. При настроенном OpenAI API key откройте AI Analyst и спросите: «Почему GID 100000003684369100 в начале очереди?»
  8. Проверьте сборку и тесты:
.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 узлов. Для существенно больших графов потребуются пакетная обработка и специализированное графовое хранилище.
  • Развёрнутая версия в репозитории не указана. Проект запускается локально.

Полезные файлы

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
9
Авторы
1
Файлы
61
Ветки
1

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

Dynamite01 9

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

  • 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 комментариев

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

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