О проекте
Команда: 404team
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
Локальная система AML-скрининга по графу внутрибанковских переводов: структурные роли счетов, приоритетные узлы, сообщества Louvain, временные сигналы. Интерактивный граф на Canvas и опциональный AI-ассистент.
Как устроено
Из nodes/edges/transactions.parquet строится ориентированный граф NetworkX. По каждому узлу считаются потоки, степени и глубина, правила назначают роли (coordinator, consolidator, distributor, transit, terminal, peripheral) с текстовым evidence и priority_score. Внутри компонент выделяются взвешенные сообщества Louvain. По сырым транзакциям ищутся сигналы: транзит в окне 48 ч, всплески, синхронные входящие, повторяющиеся маршруты и суммы, циклы длины 2–3. На выходе CSV (nodes_roles, clusters, top_nodes), React-интерфейс и чат на gpt-5.4-nano по извлечённым фрагментам с цитированием gid.
Ключевые решения
- NetworkX DiGraph
- Louvain
- rule-based структурные роли
- priority_score
- детекция циклов длины 2–3
- транзитное окно 48 ч
- симуляция устойчивости при удалении top-N узлов
- retrieval-grounded чат с цитированием gid
- Web Worker layout
Особенности
Явно описаны ограничения данных: узлы глубины 4 без исходящих рёбер могут быть обрезанной границей, а не терминалами, входящие потоки seed неполны. Роли подаются как гипотезы, не доказательства. Есть симуляция устойчивости сети при удалении ключевых узлов.
Стек
Python 3.12 · FastAPI · Uvicorn · pandas · PyArrow · NetworkX 3.7 · React 19 · Vite 6 · Canvas · SQLite · OpenAI Responses API
Модели
gpt-5.4-nano
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-0141a35d-404team.
README
README.mdAML Graph
Локальная система анализа графа транзакций для первичного AML-скрининга. Проект помогает аналитику быстро увидеть связи между счетами, выделить структурные роли и приоритетные узлы, исследовать сообщества и получить объяснимые гипотезы для дальнейшей проверки.
Система работает с наблюдаемыми внутрибанковскими переводами из Parquet-файлов и не подменяет расследование доказательством нарушения.
Что реализовано
- построение ориентированного графа счетов и переводов;
- расчёт метрик входящих и исходящих потоков, степеней, контрагентов, глубины и компонентов связности;
- назначение структурных ролей:
coordinator,consolidator,distributor,transit,terminal,peripheral; - объяснение каждой роли текстовым
evidence; - расчёт нормированного
priority_scoreпо наблюдаемому объёму потоков; - воспроизводимое выделение кластеров алгоритмом Louvain;
- анализ временных и структурных сигналов: транзитное совпадение в окне 48 часов, всплески активности, синхронные входящие операции, повторяющиеся маршруты и суммы, циклы длины 2–3, выбросы по глубине;
- интерактивный граф на React и Canvas: поиск, масштабирование, панорамирование, фильтры кластеров, просмотр соседей, история навигации и карточка узла;
- симуляция устойчивости топологии при удалении топ-N узлов;
- экспорт
nodes_roles.csv,clusters.csvиtop_nodes.csv; - локальный русско-английский интерфейс;
- опциональный AI-ассистент для вопросов по результатам анализа. Ассистент получает ограниченные извлечённые фрагменты данных, цитирует
gidи хранит историю локально в SQLite.
Как работает решение
- Пользователь помещает
nodes.parquet,edges.parquetиtransactions.parquetв одну папку. - Pipeline проверяет обязательные поля, приводит типы и исключает связи с неизвестными узлами и петли.
- Из узлов и агрегированных рёбер строится ориентированный граф NetworkX.
- Для каждого узла рассчитываются потоки и структурные показатели, затем применяются правила ролей и приоритизации.
- Внутри компонентов связности строятся взвешенные сообщества Louvain, после чего формируются CSV-выгрузки и сигналы по сырым транзакциям.
- В веб-интерфейсе аналитик запускает анализ, изучает обзор графа или конкретный узел, фильтрует сообщества и скачивает результаты. При наличии API-ключа можно задать вопрос AI-ассистенту.
Технологии
- Python 3.12+;
- FastAPI и Uvicorn — локальный API и раздача собранного интерфейса;
- pandas и PyArrow — обработка таблиц и Parquet;
- NetworkX 3.7 — ориентированный граф, компоненты связности и Louvain;
- React 19, Vite 6 и JavaScript — интерфейс;
- Canvas и Web Worker — визуализация и расчёт layout графа;
- OpenAI Python SDK и Responses API, модель по умолчанию
gpt-5.4-nano— только для опционального ассистента; - SQLite — локальная память диалогов;
python-dotenv— чтение.env.
Архитектура проекта
Parquet-вход
│
▼
src/aml_graph/io.py ──> graph.py ──> analysis.py ──> roles.py
│ │
├──> clustering.py ──> exports.py
└──> patterns.py
│
run_pipeline.py (CLI) │
│ │
└────────────── app.py (FastAPI)
│
frontend/src (React + Canvas) ◄─┘
│
OpenAI API (только чат, опционально)
run_pipeline.pyзапускает пакетный анализ и сохраняет CSV в указанную папку.app.pyпредоставляет/api/analyze, экспорт, карточки узлов, resilience и chat API, а также отдаётfrontend/dist.src/aml_graph/содержит загрузку, анализ, роли, кластеры, сигналы, экспорт и AI retrieval.frontend/содержит интерфейс и тесты браузерного сценария.entryset/содержит пример входного набора,outputset/— результаты пакетного запуска.
Установка и запуск
Требуются Python 3.12+ и Node.js 22+.
python -m pip install -r requirements.txt
if (!(Test-Path .env)) { Copy-Item .env.example .env }
cd frontend
npm ci
npm run build
cd ..
python app.py
Откройте http://127.0.0.1:8000 и нажмите Run analysis. По умолчанию веб-приложение читает entryset/. В поле папки можно указать другой каталог на Python-сервере, если в нём есть все три Parquet-файла.
Для пакетного режима без веб-интерфейса:
python run_pipeline.py --input entryset --output outputset
Для разработки интерфейса запустите python app.py в одном терминале и npm run dev из frontend/ в другом. Vite проксирует /api на 127.0.0.1:8000.
AI-ассистент не обязателен для основного анализа. Чтобы включить его, укажите ключ в локальном .env:
OPENAI_API_KEY=your_key_here
OPENAI_MODEL=gpt-5.4-nano
Файл .env игнорируется Git и не должен содержать ключ в коммите. Без ключа анализ графа и остальные функции продолжают работать, но чат недоступен.
Как проверить решение
Повторяемый сценарий для жюри:
- Выполнить установку и сборку выше.
- Запустить
python app.py. - Открыть http://127.0.0.1:8000, оставить
entrysetи нажать Run analysis. - Найти
gidчерез поиск или выбрать строку рейтинга. - Открыть карточку узла, посмотреть роль, доказательство, потоки, сигналы и предложенные запросы данных.
- Переключить кластерный фильтр, изменить направление обхода и масштаб графа.
- Скачать три CSV через интерфейс.
Проверка API:
Invoke-RestMethod http://127.0.0.1:8000/api/health
Invoke-RestMethod -Method Post http://127.0.0.1:8000/api/analyze -ContentType 'application/json' -Body '{}'
Документация API доступна по http://127.0.0.1:8000/api/docs.
Автоматические проверки:
python -m unittest discover -s tests -v
cd frontend
npm test
npm run build
Браузерные smoke-тесты требуют запущенного сервера и установленного Microsoft Edge:
node tests/browser.mjs
node tests/seeds.mjs
node tests/features.mjs
node tests/clusters.mjs
Данные и интеграции
Входная папка должна содержать:
nodes.parquet:gid,depth,is_seed;edges.parquet:src,dst,sum_kzt,n_tx,depth;transactions.parquet:src,dst,date,sum_kzt.
В репозитории есть пример entryset/. В текущем наборе pipeline проверяет 2 248 узлов, 81 seed и 444 узла на границе глубины 4; эти значения пересчитываются при запуске и не зашиты в код.
Внешняя интеграция только одна: при включённом AI-ассистенте сервер отправляет в OpenAI ограниченные контексты и результаты локального retrieval. API-ключ остаётся на сервере. Проверка соединения (/api/chat/check) выполняет отдельный небольшой запрос без данных графа. Основной анализ, визуализация и экспорты выполняются локально.
Ограничения
- Анализ использует только наблюдаемые внутрибанковские переводы из входного набора; внешние поступления, операции ниже порога 5 000 KZT, балансы, клиентские атрибуты и назначение платежа отсутствуют.
- Входящие потоки seed-узлов неполны, а узлы глубины 4 без исходящих рёбер могут быть обрезанной границей графа, а не настоящими терминальными узлами.
- Роли и
priority_score— объяснимые правила и сортировка наблюдаемого объёма, а не вероятность нарушения, баланс или доказательство вины. - Сигналы временной совместимости не доказывают, что перемещались те же деньги; resilience описывает только статическую топологию.
- Приложение рассчитано на одного локального аналитика, слушает loopback, не имеет аутентификации и многопользовательской изоляции запусков.
- Результаты и память чата локальны; AI-чат зависит от наличия ключа, доступа к выбранной модели, квоты и сети.
- Граф и расчёты выполняются в памяти; полноценное масштабирование до очень больших графов в текущей версии не реализовано.
Deployed-версия
В текущем репозитории подтверждённой ссылки на deployed-версию нет. Приложение запускается локально по адресу http://127.0.0.1:8000.
Выходные файлы
nodes_roles.csv— строка на каждый узел: роль, scores, кластер и объяснение;clusters.csv— размер, seed-узлы, внутренний объём, top-узлы и гипотеза кластера;top_nodes.csv— ранжированные кандидаты для первичного просмотра и причина попадания в список.
Авторы коммитов
История коммитов
- 2026-09-23 17:56feat: complete AML graph analysis updatesErkosh-IT
- 2026-09-23 17:51docs: add Russian project READMEErkosh-IT
- 2026-09-23 16:55Add integrated AML node evidence, reproducible communities and local AI chatErkosh-IT
- 2026-09-23 16:09Merge remote-tracking branch 'origin/main' into feature/aml-graph-baselineznsrk
- 2026-09-23 16:08Preserve seed navigation and coverage audit before remote integrationznsrk
- 2026-09-23 16:03Improve dense graph layouterkeb
- 2026-09-23 15:27Add project contributorserkeb
- 2026-09-23 15:20Merge remote-tracking branch 'origin/main' into feature/aml-graph-baselineznsrk
Все коммиты (15)
- 2026-09-23 15:20Update AML analysis outputsznsrk
- 2026-09-23 15:05Replace Streamlit with React workspace and Python APIznsrk
- 2026-09-23 14:32Simplify AML logic and replace graph UI rendererznsrk
- 2026-09-23 14:18Merge pull request #1 from BAITC-Hacks/feature/aml-graph-baselineZhanserik
- 2026-09-23 14:15Add minimal hoverable AML network UIznsrk
- 2026-09-23 14:08Add explainable AML graph analysis baselineznsrk
- 2026-09-23 14:01Add work pipeline explanation to READMEerkeb
Структура репозитория (55 файлов)
.env.example .gitignore README.md app.py docs/assistant-memory.md docs/pattern-rules.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/CanvasScene.js frontend/src/Chat.jsx frontend/src/Graph.jsx frontend/src/NodeCard.jsx frontend/src/Resilience.jsx frontend/src/features-i18n.js frontend/src/features.css frontend/src/graph.js frontend/src/i18n.js frontend/src/layout.worker.js frontend/src/main.jsx frontend/src/refinements.css frontend/src/style.css frontend/tests/browser.mjs frontend/tests/clusters.mjs frontend/tests/features.mjs frontend/tests/graph-helpers.mjs frontend/tests/graph.test.js frontend/tests/seeds.mjs frontend/vite.config.js outputset/clusters.csv outputset/nodes_roles.csv outputset/top_nodes.csv remote.md requirements.txt run_pipeline.py scripts/check_assistant.py src/aml_graph/__init__.py src/aml_graph/ai_errors.py src/aml_graph/analysis.py src/aml_graph/assistant.py src/aml_graph/clustering.py src/aml_graph/config.py src/aml_graph/exports.py src/aml_graph/graph.py src/aml_graph/io.py src/aml_graph/patterns.py src/aml_graph/pipeline.py src/aml_graph/roles.py tests/test_ai_errors.py tests/test_api.py tests/test_assistant.py tests/test_clustering.py tests/test_config.py tests/test_patterns.py tests/test_requirements.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.