О проекте
Команда: Pied Piper
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
Инструмент объяснимой AML-аналитики графа переводов: роли клиентов, сообщества, Top-20 для ручной проверки и три CSV, интерактивный граф в Streamlit и эксперимент устойчивости сети.
Как устроено
Pipeline читает nodes/edges/transactions.parquet (2 248 клиентов, 3 119 связей), считает метрики узлов, присваивает 6 объяснимых rule-based ролей, выделяет 105 сообществ и ранжирует по priority_score с текстовыми объяснениями; независимый validator проверяет выходные CSV. Streamlit UI с перетаскиваемым офлайн-графом, API и durable worker; what-if «исключение ключевых узлов» сравнивает удаление top-N по приоритету и по обороту (размер крупнейшей компоненты, изоляты).
Ключевые решения
- rule-based роли узлов
- выделение сообществ
- приоритизация узлов
- анализ устойчивости сети (удаление top-N)
- независимая валидация выходных CSV
Особенности
Эксперимент устойчивости сети: сравнение удаления top-N по приоритету против top-N по обороту показывает ценность ранжирования; отдельный validator и SHA-аудит опубликованного результата.
Стек
Python 3.12 · Streamlit · Parquet · Docker Compose · Makefile · uv · pytest
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-4c401bd7-pied-piper.
README
README.md
Money Graph · Граф денег
HackAlem AI · Трек Freedom · Команда Pied Piper
Объяснимая аналитика денежных потоков — от переводов до очереди ручной проверки.
Запустить · Методология · Демо для жюри · Backend / API · Вся документация
| Данные | Аналитика | Результат |
|---|---|---|
| 2 248 клиентов · 3 119 связей | 6 объяснимых ролей · 105 сообществ | Top-20 для проверки · 3 CSV |
Кейс трека Freedom: восстановление финансовой структуры по графу переводов. Разработано на HackAlem AI, Астана, 23 сентября 2026.
Организаторы и партнёры HackAlem AI
Среди организаторов и партнёров мероприятия на официальном сайте HackAlem AI указаны Astana Hub, Silkroad Innovation Hub, OpenAI и BAITC.
Локальный инструмент объяснимой AML-аналитики графа переводов команды Pied Piper. Роли и приоритеты — сигналы для ручной проверки, а не доказательства нарушения.
Эксперимент устойчивости сети
В «Сеть и сообщества» → «Устойчивость сети: исключение ключевых узлов» можно исключить top-1/3/5/10 клиентов по приоритету и сравнить результат с отбором по обороту. Показаны размер крупнейшей группы, новые изоляты, доля разобщённых пар оставшихся клиентов, затронутые суммы и списки gid. Расчёт использует полную сеть независимо от фильтров, не меняет роли и CSV. Это симуляция наблюдаемого графа, не рекомендация блокировки и не оценка предотвращённого ущерба. Метод и ограничения.
Структура
backend/ API, worker, pipeline и независимый validator
core/ загрузка, контракты, графовая аналитика, экспорт и чтение результатов
frontend/ Streamlit, визуализация графа и HTML-шаблон
docs/ архитектура, методология, контракты и отчёты аудита
tests/ аналитические, API, UI и интеграционные проверки
scripts/ служебные команды запуска и проверки
data/ исходные Parquet для сдачи (включены в Git)
outputs/ проверенный результат и current.json (включены в Git)
.streamlit/ настройки Streamlit для запуска из корня проекта
Dockerfile общий runtime-образ и отдельная стадия tests
compose.yaml UI, подготовка результатов, API, worker и CLI
requirements.lock закреплённые зависимости общего Python-окружения
Все команды выполняются из корня репозитория. Используется Python 3.12. UI читает опубликованные файлы напрямую; API и worker работают отдельным сервисом.
Локальный запуск
Windows PowerShell (нужен uv):
.\make.cmd setup
.\make.cmd demo
Синтетический демонабор создаётся локально и не требует исходных данных.
Предоставленные nodes.parquet, edges.parquet и transactions.parquet уже
включены в data/. Для повторного расчёта:
.\make.cmd run
Linux/macOS: make setup, затем make demo или make run.
Интерфейс: http://localhost:3000. Для существующих результатов — make ui / .\make.cmd ui.
API и worker: make backend / .\make.cmd backend (порт 8000).
Прямые команды после активации окружения:
python -m backend.pipeline --data data --out outputs
python -m backend.validate --data data --out outputs
python -m streamlit run frontend/app.py --server.port 3000 -- --outputs outputs
python -m backend
python -m pytest -q
Docker
Три входных Parquet для UI уже включены в data/:
docker compose build ui
docker compose up -d --no-build --pull never
prepare рассчитывает результаты в именованном volume results либо проверяет
существующую публикацию. ui запускается после успешной проверки на http://localhost:3000.
docker compose run --rm validate
docker compose run --rm --no-deps pipeline
docker compose --profile backend up -d api worker
docker compose build tests
docker compose run --rm tests
docker compose down
API доступен на http://localhost:8000. API/worker используют отдельный volume
backend-state, UI — results. Локальный outputs/ не является Docker volume.
Остановка через down сохраняет volumes. Данные и результаты не включаются в образ.
Аудит и документация
- Навигация по документации
- Подробное руководство
- Методология и архитектура
- Backend API и ограничения
- Воспроизводимые проверки
- Схема исходных данных
Исходные данные, результаты, окружения, runtime и кэши исключены из Git. На чистом клоне исходные данные предоставляются отдельно; тесты реальных данных требуют локального набора. Исторические отчёты описывают проверки указанных в них версий и не заменяют новый прогон. Ранее закоммиченные данные остаются в истории Git.
Авторы коммитов
История коммитов
- 2026-09-23 17:47fix: restore official data and validated submission bundleasari92
- 2026-09-23 17:46Merge remote-tracking branch 'origin/main'Azekaaa
- 2026-09-23 17:41feat: compare network resilience by priority and turnoverAzekaaa
- 2026-09-23 17:41Merge team branding into structured project documentationTheKasymov
- 2026-09-23 17:40Merge team role explanations into reorganized packagesTheKasymov
- 2026-09-23 17:39docs: brand repository for HackAlem AI Freedom trackasari92
- 2026-09-23 17:38Reorganize frontend backend and documentation for auditTheKasymov
- 2026-09-23 17:31Merge remote-tracking branch 'origin/main'asari92
Все коммиты (51)
- 2026-09-23 17:30feat: explain role gates in evidence and client cardsasari92
- 2026-09-23 17:28Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4c401bd7-pied-piperTheKasymov
- 2026-09-23 17:26Add backend scenario tests and HTTP workflow validationTheKasymov
- 2026-09-23 17:23Merge remote-tracking branch 'origin/main'Azekaaa
- 2026-09-23 17:18chore: remove obsolete starter and refresh docs with evidence auditAzekaaa
- 2026-09-23 17:17Merge latest Streamlit controls and record integration checksTheKasymov
- 2026-09-23 17:16Merge frontend graphs and review workflow with backendTheKasymov
- 2026-09-23 17:14ui: preserve Streamlit tools while hiding Deployasari92
- 2026-09-23 17:14Add local backend API and durable analysis workerTheKasymov
- 2026-09-23 17:10ui: hide Streamlit deployment controlsasari92
- 2026-09-23 17:04Merge origin/main: integrate role tests and frontend contract documentationasari92
- 2026-09-23 16:59Merge remote-tracking branch 'origin/main'Azekaaa
- 2026-09-23 16:58Merge origin/main: retain updated UI and integrate Docker launch changesasari92
- 2026-09-23 16:53test: cover role semantics and strict publication runtime limitAzekaaa
- 2026-09-23 16:52Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4c401bd7-pied-piperTheKasymov
- 2026-09-23 16:51feat: add frontend API contract and types for Money GraphTheKasymov
- 2026-09-23 16:51feat: guide client review and compact disconnected graph componentsasari92
- 2026-09-23 16:37feat: add draggable offline graphs and readable flow layoutasari92
- 2026-09-23 16:36docs: write complete Russian README for hackathon judgesAzekaaa
- 2026-09-23 16:33Separate Docker build and runtime and reuse validated resultsTheKasymov
- 2026-09-23 16:25Use port 3000 for frontend launchersTheKasymov
- 2026-09-23 16:22Containerize pipeline and UI and preserve bundle bytesTheKasymov
- 2026-09-23 16:21feat: add make stop for project UI by portasari92
- 2026-09-23 16:14build: add make commands for pipeline and Windows launcherAzekaaa
- 2026-09-23 16:09Merge remote-tracking branch 'origin/main'asari92
- 2026-09-23 16:09chore: include source dataset and validated results for private repo submissionasari92
- 2026-09-23 16:08Document semantic QA on official dataTheKasymov
- 2026-09-23 16:00docs: replan final two hours around release verification and demoasari92
- 2026-09-23 15:48test: verify real bundles in browser and record Lane B acceptanceasari92
- 2026-09-23 15:39Resolve documentation merge and record Lane A auditTheKasymov
- 2026-09-23 15:30Refactor engine and reporting modules; implement pipeline for validation and publishingTheKasymov
- 2026-09-23 15:30Merge branch 'main' of https://github.com/BAITC-Hacks/hack-4c401bd7-pied-piperAzekaaa
- 2026-09-23 15:27docs: add product QA and demo materialsAzekaaa
- 2026-09-23 15:14feat: add UTF-8 encoding to JSON output and implement new verification testsTheKasymov
- 2026-09-23 14:59feat: support v1 published bundles and candidate validationasari92
- 2026-09-23 14:45Merge origin/main: preserve revised schedule and integrate Lane A contractasari92
- 2026-09-23 14:43docs: replan remaining 200 minutes around real-data integrationasari92
- 2026-09-23 14:40Define v1 data contract for analytics and UITheKasymov
- 2026-09-23 14:39feat: add Lane B analyst UI and independent output validationasari92
- 2026-09-23 14:24add: analysisTheKasymov
- 2026-09-23 14:16docs: track dataset README while ignoring parquet filesasari92
- 2026-09-23 14:14docs: align implementation plan with simplified project layoutasari92
- 2026-09-23 14:00firstasari92
Структура репозитория (90 файлов)
.dockerignore .gitattributes .gitignore .streamlit/config.toml Dockerfile Makefile README.md backend/__init__.py backend/__main__.py backend/analytics.py backend/api.py backend/config.py backend/core/__init__.py backend/core/bundle_io.py backend/core/contracts.py backend/core/csv_export.py backend/core/data.py backend/core/engine.py backend/core/explanations.py backend/core/reporting.py backend/core/resilience.py backend/core/results.py backend/datasets.py backend/errors.py backend/models.py backend/pipeline.py backend/store.py backend/validate.py backend/worker.py compose.yaml data/README.md data/edges.parquet data/nodes.parquet data/transactions.parquet docs/AUDIT_LANE_A.md docs/PLAN.md docs/README.md docs/TECHNICAL_LANE_B.md docs/architecture.md docs/assets/money-graph-banner.svg docs/audit-sha256-20260923.md docs/backend-scenarios.md docs/backend-verification.md docs/backend.md docs/demo.md docs/evidence-audit.md docs/frontend-api.types.ts docs/frontend-contract.md docs/implementation-plan.md docs/methodology.md docs/product-guide.md docs/qa-real-data.md docs/qa.md docs/repository-layout.md frontend/__init__.py frontend/app.py frontend/graph.html frontend/graph_ui.py frontend/presentation.py frontend/view.py make.cmd outputs/current.json outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/clusters.csv outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/edges.parquet outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/node_metrics.parquet outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/nodes_roles.csv outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/run.json outputs/runs/036aae81-4aa5-42fd-b867-b8cc7297eb16/top_nodes.csv requirements.lock requirements.txt scripts/audit_evidence.py scripts/ensure_results.py scripts/smoke_backend.py scripts/stop_ui.py tests/browser_graph.py tests/browser_smoke.py tests/conftest.py tests/fixtures/ui/make_fixture.py tests/test_a_verification.py tests/test_backend.py tests/test_backend_http.py tests/test_backend_scenarios.py tests/test_bundle_protocol.py tests/test_csv_downloads.py tests/test_evidence_audit.py tests/test_graph_ui.py tests/test_resilience.py tests/test_role_semantics.py tests/test_ui.py tests/test_validation.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.