О проекте
Команда: hackyou
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
Платформа для аналитика AML: загрузка сети переводов из трёх parquet, объяснимые гипотезы ролей, сообщества и приоритеты проверки, граф-эксплорер и выгрузка трёх CSV и Excel.
Как устроено
FastAPI сохраняет кейсы (SQLite, Alembic) и запускает движок tracegraph_ai в отдельном процессе. Движок строит признаки на pandas/NetworkX, роли (consolidator, transit, distributor, terminal, coordinator, peripheral) назначает правилами с порогом силы 0.45 (0.60 для coordinator) и флагом неоднозначности 0.08. Аномальность для приоритета даёт PyTorch Autoencoder с запасным IsolationForest. Результат: nodes_roles.csv, clusters.csv, top_nodes.csv с обоснованиями, в UI граф входящих и исходящих связей с окраской по ролям и сообществам.
Ключевые решения
- NetworkX
- rule-based role hypotheses
- IsolationForest
- PyTorch Autoencoder
- community detection
- temporal episodes
- counterfactual analysis
Метрики
2248 участников, 91 сообщество, 2248 ранжированных строк за 7.71 с (IsolationForest, seed 42); Autoencoder 19.56 с
Особенности
Уверенность в роли отделена от силы признаков и учитывает полноту наблюдения, неоднозначные роли помечаются. Есть синтетический демо-набор для быстрой проверки. Выгрузка в Excel сохраняет ID без потери цифр. Движок и API работают в разных Python-окружениях.
Стек
Python · FastAPI · Pydantic · SQLAlchemy · Alembic · SQLite · pandas · NumPy · PyArrow · SciPy · PyTorch · scikit-learn · React · TypeScript · Vite · TanStack Query · openpyxl
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-c2a931d4-hackyou.
README
README.mdTraceGraph — анализ сети денежных переводов
Проект команды hackyou для кейса HackAlem «Граф денег». TraceGraph помогает аналитику понять, кто собирает, распределяет и переводит средства, и выбрать участников для дальнейшей проверки. Результат — направленный граф переводов, гипотезы ролей, сообщества и приоритеты с объяснениями.
Что реализовано
- Кейсы, загрузка и проверка трёх Parquet-файлов, запуск анализа и история результатов.
- Диаграммы ролей и приоритетов, поиск участников по GID, фильтры и карточки с основаниями выводов.
- Граф входящих и исходящих переводов: направления, суммы, число операций и переходы между участниками. Узлы можно окрашивать по ролям или сообществам; легенда объясняет цвета, отдельная обводка выделяет выбранного участника.
- Гипотезы сообществ с числовыми основаниями: состав ролей, внутренние и внешние потоки, исходные узлы (seed) и границы наблюдения. При отсутствии потоков явно указывается недостаточность данных.
- Три CSV для сдачи и отдельный Excel-файл с русским текстом и точными идентификаторами. JSON сохраняются как внутренний снимок для API, графа и карточек.
- В Python SDK — подробные операции, пошаговые расследования и три локальных аналитических агента. Эти функции SDK пока не подключены к веб-интерфейсу.
Критерии ролей
Роли определяются объяснимыми правилами по структуре, суммам и датам переводов. ML оценивает аномальность для приоритета проверки. Основные условия допуска:
| Роль | Наблюдаемые основания |
|---|---|
consolidator | Не менее двух отправителей и положительный вход; учитываются объёмы и сходимость seed |
transit | Положительные вход и выход; доступен баланс или временной проход средств |
distributor | Не менее двух получателей и положительный выход; учитываются охват и синхронность переводов |
terminal | Положительный вход, отсутствие исходящих связей, узел не находится на границе обхода |
coordinator | Не менее двух достижимых seed, положительные вход и выход, посредничество или мост между сообществами |
peripheral | Ни одна допустимая роль не достигла порога; сюда входят изолированные узлы |
Из допустимых ролей выбирается максимальная сила гипотезы: порог 0,45, для coordinator — 0,60. Разница сил двух гипотез не более 0,08 отмечается как неоднозначность. Это пороги силы признаков, а не role_score: уверенность рассчитывается отдельно с учётом полноты наблюдения. Полные формулы, веса и ограничения — в методике ролей.
Установка и запуск
Нужны Python 3.12, Node.js 22.12+ или 24 LTS и Git. Интернет требуется для установки зависимостей. Docker, API-ключи и отдельный сервер БД не нужны.
Скачайте проект:
git clone https://github.com/BAITC-Hacks/hack-c2a931d4-hackyou.git
cd hack-c2a931d4-hackyou
Windows PowerShell — выполните из корня проекта:
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r backend\requirements.txt
py -3.12 -m venv .venv-engine
.\.venv-engine\Scripts\python.exe -m pip install -r ml\requirements-lock.txt
.\.venv-engine\Scripts\python.exe -m pip install -e ./ml --no-deps
npm.cmd --prefix frontend ci
.\.venv\Scripts\python.exe scripts\dev.py
Если py недоступна, замените py -3.12 на python версии 3.12. Активация окружений и создание .env не требуются.
Linux / macOS
python3.12 -m venv .venv
.venv/bin/python -m pip install -r backend/requirements.txt
python3.12 -m venv .venv-engine
.venv-engine/bin/python -m pip install -e ./ml
npm --prefix frontend ci
.venv/bin/python scripts/dev.py
Эта установка использует IsolationForest. Установка Autoencoder с CPU PyTorch описана в документации движка; Windows-команды выше уже включают PyTorch.
Откройте http://127.0.0.1:5173. Скрипт запускает интерфейс и API вместе; Ctrl+C останавливает оба. Повторный запуск — только последняя команда для вашей ОС.
Кейсы и результаты сохраняются локально в storage/, SQLite и миграции создаются автоматически. Проверка API должна вернуть status: "ok" и engine: "configured". Документация API.
Если проект уже установлен: остановите его через Ctrl+C, выполните git pull --ff-only origin main, повторите команды установки зависимостей для вашей ОС и запустите scripts/dev.py. В частности, для Excel нужен openpyxl из backend/requirements.txt. Установка движка с -e ./ml использует обновлённый код. Обновите страницу браузера. Для новых гипотез сообществ запустите анализ заново: сохранённые результаты не пересчитываются автоматически.
Как проверить решение
- В интерфейсе нажмите «Новый кейс» и создайте кейс с любым названием.
- Загрузите три файла из папки
data/репозитория:nodes.parquet,edges.parquet,transactions.parquet. Нажмите «Проверить и сохранить». Во вкладке «Исходные данные» ожидаются 2 248 участников, 3 119 связей и 4 840 операций. - Во вкладке «Исследование» нажмите «Запустить анализ» и дождитесь статуса «Готово». В обзоре выберите роль или приоритет, найдите участника по GID и откройте его карточку.
- Нажмите «Исследовать связи». Отправители расположены слева, получатели — справа. Переключите входящие/исходящие связи и «Цвет узлов» → «По ролям» / «По сообществам»; проверьте легенду. Нажмите сумму для деталей или соседний узел для перехода.
- В «Обзор и участники» → «Результаты анализа · CSV» скачайте три файла ниже. Для просмотра в таблицах есть отдельная кнопка «Скачать для Excel · .xlsx»: идентификаторы сохраняются как текст, без потери цифр. В
clusters.csvпроверьте гипотезы и суммы потоков; вtop_nodes.csv— ранги и объяснения. - Обновите страницу: кейс и результат должны сохраниться. Откройте прежний анализ из истории.
| Файл для сдачи | Что содержит |
|---|---|
nodes_roles.csv | Все участники: GID, роль, уверенность role_score, сообщество, приоритет и основания |
clusters.csv | Сообщества: размер, число seed, внутренний оборот, ключевые участники и гипотеза |
top_nodes.csv | Участники по убыванию приоритета: ранг, роль, score и объяснение; первые 20 строк — Top-20 |
Шесть JSON рядом с CSV — внутренний снимок анализа для графа, карточек, операций и восстановления. Они сохраняются на диске и доступны API, но скрыты из списка пользовательских скачиваний. Для обязательной сдачи нужны три CSV, Excel — удобная копия этих таблиц.
Контрольный прогон исходной выборки с IsolationForest и стандартным seed 42 дал 2 248 участников, 91 сообщество, 2 248 ранжированных строк за 7,71 с внутри движка. Для воспроизведения используйте команду CLI ниже с --input data: три CSV создаются при запуске. Autoencoder может дать другие приоритеты; выбранный backend отражается в отчёте запуска.
Для короткой проверки на полностью вымышленных данных используйте три Parquet из synthetic-demo/: ожидаются 38 участников, 37 связей и 96 операций. Подробная сверка с требованиями — в аудите готовности.
Проверка только движка, без интерфейса и API, после установки выше:
.\.venv-engine\Scripts\python.exe -m tracegraph_ai --input synthetic-demo --output out-demo --model isolation_forest
На Linux/macOS замените путь к Python на .venv-engine/bin/python. Ожидаются 5 сообществ и 3 CSV + 6 JSON в out-demo/. Для исходной выборки замените --input synthetic-demo на --input data. Флаг --model isolation_forest явно выбирает лёгкую модель; без него движок автоматически использует доступный backend.
Что уже проверено: чистый запуск платформы, загрузка через API, анализ и восстановление результата; сборка интерфейса; адресные тесты гипотез и совместимости снимков. Полный SDK-прогон исходной выборки с Autoencoder занимал 19,56 с; финальный синтетический прогон с IsolationForest — 0,42 с внутри движка, без установки зависимостей и запуска Python. Это локальные замеры, время на другом компьютере может отличаться. Методика, сравнение ролей и ограничения — в отчёте качества; границы выполненных проверок — в аудите готовности.
Технологии и архитектура
React / TypeScript → FastAPI → отдельный процесс TraceGraph AI
↓ ↓
SQLite + файлы граф и ML на CPU
| Компонент | Технологии |
|---|---|
| Интерфейс | React, TypeScript, Vite, TanStack Query, React Router |
| API и хранение | FastAPI, Pydantic, SQLAlchemy, Alembic, SQLite |
| Анализ данных | pandas, NumPy, PyArrow, NetworkX, SciPy |
| ML | PyTorch Autoencoder; резервная модель — scikit-learn IsolationForest |
| Экспорт | CSV, JSON, XLSX / openpyxl |
Backend и движок используют отдельные Python-окружения. Расчёты выполняет движок; API проверяет и сохраняет результаты, интерфейс показывает их аналитику.
Для масштаба около миллиона узлов потребуется обработка данных частями, очередь фоновых расчётов, приближённые графовые метрики и выдача окрестностей по запросу. Это направление развития; текущий прототип на таком объёме не проверен. Подробнее — архитектура.
Данные, внешние сервисы и ограничения
- В
data/находится обезличенная выборка организаторов HackAlem: узлы, связи и операции за июль 2026 года. - После установки решение работает локально, без LLM и внешних API. Демонстрация доступна по локальному адресу выше.
- Роли и приоритеты — гипотезы для проверки, а не доказательство нарушения.
role_scoreпоказывает поддержку роли по наблюдаемым признакам в диапазоне 0–1; это не accuracy и не вероятность нарушения. Разметки подтверждённых ролей в данных нет. - Данные ограничены одним банком, исходящим обходом до четырёх шагов, порогом 5 000 ₸ и точностью дат до дня. Связи не доказывают движение одних и тех же денег.
- На графе показываются до 6, 12 или 20 соседей по выбранному лимиту; итоги участника учитывают всё окружение.
- Это локальный MVP без авторизации и разграничения доступа, рассчитанный на один процесс API.
Подробности: SDK и движок, методика ролей, проверки и ограничения модели, настройки платформы, компоненты, лицензии и использование AI.
Авторы коммитов
История коммитов
- 2026-09-23 17:57docs: keep generated analysis outputs out of submission treeAibar
- 2026-09-23 17:56docs: finalize submission artifacts and requirements evidenceAibar
- 2026-09-23 17:51docs: clarify launch verification and submission outputsAibar
- 2026-09-23 17:47feat: complete graph highlighting and grounded community hypothesesAibar
- 2026-09-23 17:39merge: preserve shared README while integrating verified demoAibar
- 2026-09-23 17:39docs: record requirements audit and clean-start verificationAibar
- 2026-09-23 17:38docs: simplify setup and final project READMEMukhammedZhumali
- 2026-09-23 17:35Merge branch 'main' of https://github.com/BAITC-Hacks/hack-c2a931d4-hackyouAibar
Все коммиты (44)
- 2026-09-23 17:35feat: add synthetic demo and simplify submission walkthroughAibar
- 2026-09-23 17:33Merge pull request #3 from BAITC-Hacks/codex/readable-money-flowsMuhammedZhumali
- 2026-09-23 17:30feat: add Excel export preserving Unicode and exact identifiersMukhammedZhumali
- 2026-09-23 17:30fix: separate money flow directions and readable edge labelsMukhammedZhumali
- 2026-09-23 17:08Merge pull request #2 from BAITC-Hacks/codex/analyst-dashboardMuhammedZhumali
- 2026-09-23 17:04Merge commit '0d9610c' into codex/analyst-dashboardMukhammedZhumali
- 2026-09-23 17:02Merge remote-tracking branch 'origin/main' into codex/analyst-dashboardMukhammedZhumali
- 2026-09-23 17:00feat: add analyst dashboards and directed neighborhood explorerMukhammedZhumali
- 2026-09-23 17:00docs: publish role quality comparison and integration guidanceAibar
- 2026-09-23 16:59fix: ground role confidence in available behavioral evidenceAibar
- 2026-09-23 16:41merge: integrate platform with engine 0.3 and preserve setup guidesAibar
- 2026-09-23 16:35docs: keep interface mockups outside the engine repositoryAibar
- 2026-09-23 16:25docs: document setup integration and measured enrichment resultsAibar
- 2026-09-23 16:24Merge pull request #1 from BAITC-Hacks/codex/fullstack-foundationMuhammedZhumali
- 2026-09-23 16:23feat: enrich investigations with three cited analytical agentsAibar
- 2026-09-23 16:16feat: connect real engine with analysis history and results UIMukhammedZhumali
- 2026-09-23 15:56merge: sync engine 0.2 snapshots and investigations from mainMukhammedZhumali
- 2026-09-23 15:52docs: hand off the resumable prototype and verified integration workflowAibar
- 2026-09-23 15:50feat: investigate selected nodes with fresh branch-local calculationsAibar
- 2026-09-23 15:47feat: prepare analyst review cases and measure labeled usefulnessAibar
- 2026-09-23 15:46feat: restore portable analyses and expose traceable operation viewsAibar
- 2026-09-23 15:45merge: integrate TraceGraph AI engine branchMukhammedZhumali
- 2026-09-23 15:45fix: require linked temporal episodes for coordination evidenceAibar
- 2026-09-23 15:43feat: persist and validate analysis result snapshotsMukhammedZhumali
- 2026-09-23 15:32docs: document integration and verify reproducible CPU prototypeAibar
- 2026-09-23 15:27feat: expose analysis SDK exports and bounded evidence investigationsAibar
- 2026-09-23 15:26feat: add case history and validated parquet importsMukhammedZhumali
- 2026-09-23 15:23feat: calculate graph evidence and explainable role prioritiesAibar
- 2026-09-23 15:23feat: add CPU autoencoder with deterministic anomaly fallbackAibar
- 2026-09-23 15:19feat: establish TraceGraph package and lossless integration contractAibar
- 2026-09-23 15:04chore: scaffold local FastAPI and React applicationMukhammedZhumali
- 2026-09-23 14:56docs: define architecture and engine contractsMukhammedZhumali
- 2026-09-23 14:39md initMukhammedZhumali
- 2026-09-23 13:45upd readmeaiz
- 2026-09-19 10:50Update README.mdMuhammedZhumali
- 2026-09-19 10:50Testaiz
Структура репозитория (144 файлов)
.env.example .gitattributes .gitignore README.md backend/__init__.py backend/app/__init__.py backend/app/analysis_schemas.py backend/app/api.py backend/app/config.py backend/app/database.py backend/app/errors.py backend/app/insight_schemas.py backend/app/main.py backend/app/models.py backend/app/repositories.py backend/app/schemas.py backend/app/services/__init__.py backend/app/services/analyses.py backend/app/services/cases.py backend/app/services/datasets.py backend/app/services/engine.py backend/app/services/excel.py backend/app/services/insights.py backend/app/services/results.py backend/app/services/validation.py backend/app/storage_lock.py backend/backend.md backend/engine_worker.py backend/migrations/env.py backend/migrations/versions/0001_baseline.py backend/migrations/versions/0002_cases_datasets.py backend/migrations/versions/0003_analysis_runs.py backend/requirements.in backend/requirements.txt backend/tests/test_analyses.py backend/tests/test_cases.py backend/tests/test_engine_integration.py backend/tests/test_engine_runtime.py backend/tests/test_excel.py backend/tests/test_insights.py data/edges.parquet data/nodes.parquet data/transactions.parquet docs/ai-engine-contract.md docs/ai-engine-readme.md docs/analyst-review.md docs/architecture.md docs/demo.md docs/engine-contract.md docs/enrichment-metrics.md docs/implementation-plan.md docs/investigation-enrichment.md docs/metrics/enrichment-0.3.0.json docs/metrics/model-evaluation-after-0.3.1.json docs/metrics/model-evaluation-before-0.3.0.json docs/model-quality-review.md docs/model.md docs/platform-guide.md docs/role-methodology.md docs/submission-readiness.md docs/third-party-components.md docs/validation.md frontend/.prettierrc.json frontend/frontend.md frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/App.tsx frontend/src/analyst.css frontend/src/api.ts frontend/src/components/ErrorMessage.tsx frontend/src/components/Modal.tsx frontend/src/features/analysis/AnalysisDashboard.tsx frontend/src/features/analysis/AnalysisPanel.tsx frontend/src/features/analysis/GraphExplorer.tsx frontend/src/features/analysis/NodeDrawer.tsx frontend/src/features/analysis/flowLayout.test.ts frontend/src/features/analysis/flowLayout.ts frontend/src/features/analysis/presentation.ts frontend/src/features/cases/CaseWorkspace.tsx frontend/src/features/cases/CreateCase.tsx frontend/src/features/cases/Dashboard.tsx frontend/src/features/cases/ImportPanel.tsx frontend/src/features/cases/QualityPanel.tsx frontend/src/features/cases/Status.tsx frontend/src/files.test.ts frontend/src/files.ts frontend/src/format.ts frontend/src/main.tsx frontend/src/styles.css frontend/tsconfig.json frontend/vite.config.ts ml/examples/enrich_investigation.py ml/examples/evaluate_enrichment.py ml/examples/evaluate_model.py ml/examples/generate_synthetic_data.py ml/examples/integrate.py ml/examples/review_results.py ml/ml.md ml/pyproject.toml ml/requirements-lock.txt ml/src/tracegraph_ai/__init__.py ml/src/tracegraph_ai/__main__.py ml/src/tracegraph_ai/anomaly.py ml/src/tracegraph_ai/autoencoder.py ml/src/tracegraph_ai/communities.py ml/src/tracegraph_ai/config.py ml/src/tracegraph_ai/counterfactual.py ml/src/tracegraph_ai/diagnostics.py ml/src/tracegraph_ai/engine.py ml/src/tracegraph_ai/enrichment/__init__.py ml/src/tracegraph_ai/enrichment/alternatives.py ml/src/tracegraph_ai/enrichment/config.py ml/src/tracegraph_ai/enrichment/orchestrator.py ml/src/tracegraph_ai/enrichment/paths.py ml/src/tracegraph_ai/enrichment/patterns.py ml/src/tracegraph_ai/enrichment/runtime.py ml/src/tracegraph_ai/errors.py ml/src/tracegraph_ai/evidence.py ml/src/tracegraph_ai/exports.py ml/src/tracegraph_ai/features.py ml/src/tracegraph_ai/features_temporal.py ml/src/tracegraph_ai/inference.py ml/src/tracegraph_ai/investigation.py ml/src/tracegraph_ai/investigation_actions.py ml/src/tracegraph_ai/io.py ml/src/tracegraph_ai/persistence.py ml/src/tracegraph_ai/review.py ml/src/tracegraph_ai/serialization.py ml/tests/test_communities.py ml/tests/test_confidence.py ml/tests/test_critical_cases.py ml/tests/test_enrichment.py ml/tests/test_investigation_actions.py ml/tests/test_review.py ml/tests/test_saved_analysis.py ml/tests/test_temporal_episodes.py pyproject.toml scripts/dev.py synthetic-demo/edges.parquet synthetic-demo/nodes.parquet synthetic-demo/transactions.parquet tasks/plan.md tasks/todo.md
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.