О проекте
Команда: Lions
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
AML-инструмент: строит транзакционный граф из трёх Parquet-файлов, назначает роли узлам, выделяет кластеры и выдаёт ранжированный топ для ручной проверки; интерфейс на Next.js с опциональным AI-анализом узла.
Как устроено
Python-пайплайн валидирует входы, считает степени, объёмы, degree centrality и pass_through_ratio, затем назначает роли по порогам-перцентилям (coordinator 90-й, distributor 75-й, consolidator 85-й и т.д.). priority_score считается как нормализованная комбинация centrality, объёма и связи с seed. На выходе nodes_roles.csv, clusters.csv с гипотезами и top_nodes.csv. Next.js UI показывает граф с focus-режимом и поиском по gid, OpenAI даёт текстовую гипотезу по выбранному узлу, при ошибке работает локальный fallback.
Ключевые решения
- пороги по перцентилям распределения
- degree centrality
- pass-through ratio
- кластеризация графа
- structured AI-ответ с fallback
Особенности
Осторожная интерпретация: узлы depth=4 без исходящих не считаются terminal, гипотезы кластеров сформулированы без утверждения о нарушении. Есть раздел о масштабировании до ~1 млн узлов (igraph/graph-tool, Spark).
Стек
Python · pandas · Next.js · TypeScript · Tailwind
Модели
OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-73a02bbe-lions.
README
README.mdCifron AI
Cifron AI — локальный AML-инструмент, который читает три обезличенных Parquet-файла, строит транзакционный граф, считает объяснимые метрики, назначает роли, выделяет кластеры и формирует ранжированный список узлов для ручной проверки. Next.js UI показывает граф и demo-сценарий; AI-анализ выбранного узла является дополнительным, а не базовым расчётным слоем.
Архитектура
edges.parquet + nodes.parquet + transactions.parquet
-> validation -> graph metrics -> roles and scores
-> clusters -> nodes_roles.csv / clusters.csv / top_nodes.csv
-> Next.js UI -> optional OpenAI node analysis
Базовый pipeline выполняется локально, без внешних API, GPU и облачных сервисов. OpenAI используется только для дополнительного текстового объяснения выбранного узла и не меняет базовые роли или scores.
Быстрый запуск UI
npm install
npm run dev
Откройте http://localhost:3000. Можно загрузить UTF-8 CSV с колонками transaction_id,timestamp,sender,receiver,amount; demo-кнопка использует небольшой демонстрационный набор и не является полным датасетом ТЗ. Для выбранного узла доступны поиск по gid, граф, глубина цепочки, focus-режим и AI-анализ с локальным fallback.
Pipeline
Установите Python-зависимости в виртуальное окружение:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r pipeline/requirements.txt
Положите в data/ файлы edges.parquet, nodes.parquet, transactions.parquet, затем запустите одной командой:
npm run pipeline
Команда эквивалентна:
python -m pipeline.run --data-dir data --output-dir outputs
Pipeline валидирует файлы и обязательные колонки, приводит gid к int64, суммы к числам и is_seed к bool. Он обрабатывает все строки nodes.parquet, включая узлы без рёбер, и не ограничивает вход 1000 строками. При ошибке до записи проверяются все входы; outputs не заменяются частичным результатом.
Входные схемы:
edges.parquet:src,dst,sum_kzt,n_tx,depth;nodes.parquet:gid,depth,is_seed;transactions.parquet:src,dst,date,sum_kzt.
Схемы outputs
outputs/nodes_roles.csv содержит одну строку на каждый gid из nodes.parquet и ровно колонки:
gid,role,role_score,cluster_id,priority_score,evidence
role_score и priority_score находятся в диапазоне [0,1], evidence непустой и не длиннее 200 символов.
outputs/clusters.csv имеет ровно колонки:
cluster_id,n_nodes,n_seed,sum_kzt_internal,top_gids,hypothesis
top_gids содержит до пяти узлов кластера по priority score, hypothesis — осторожное русскоязычное объяснение без утверждения о нарушении.
outputs/top_nodes.csv имеет ровно колонки:
rank,gid,role,priority_score,why
Список сортируется по priority_score по убыванию, затем по gid по возрастанию, и содержит min(20, n_nodes) строк.
Роли и scores
Используются machine-readable роли consolidator, transit, distributor, terminal, coordinator, peripheral.
Pipeline считает in_degree, out_degree, уникальных входящих и исходящих соседей, наблюдаемые входящие и исходящие объёмы, число транзакций, depth, is_seed, degree centrality как proxy центральности и pass_through_ratio. Последний считается только для не-seed с положительным наблюдаемым входящим объёмом.
Пороги рассчитываются по распределению текущего датасета: высокий исходящий degree — 75-й percentile, высокий входящий degree и число уникальных отправителей — 85-й percentile, высокий входящий объём для консолидации — 75-й percentile, высокая centrality — 90-й percentile, высокий priority — 90-й percentile. Порядок правил такой:
coordinator: centrality и priority не ниже 90-го percentile плюс минимум две связи с seed или минимум два seed в кластере.distributor: исходящий degree и число уникальных получателей не ниже 75-го percentile, исходящий degree больше входящего.consolidator: входящий degree и число уникальных отправителей не ниже 85-го percentile, входящий observed volume не ниже 75-го percentile.transit: не-seed, есть входящие и исходящие,pass_through_ratioот 0.8 до 1.2.terminal: не-seed,out_degree == 0иdepth < 4.peripheral: остальные узлы.
Узел depth=4 без исходящих не считается terminal автоматически: в evidence указывается граница наблюдаемого графа. Для seed observed ratio не трактуется как полный баланс клиента. priority_score — нормализованная комбинация degree centrality, observed volume и связи с seed.
Ограничения данных
- В выгрузке видны только исходящие переводы от стартовых seed-клиентов.
- Обход ограничен четырьмя коленами.
- Переводы ниже 5000 KZT не видны.
depth=4без исходящих означает границу наблюдения, а не доказанный terminal.- У seed неполные наблюдаемые входящие, поэтому полный баланс по ним недоступен.
- Размеченных ролей ground truth нет; результаты являются объяснимыми гипотезами для ручной проверки.
- Атрибутов клиентов, ФИО, ИИН, возраста, дохода и внешнего обогащения нет.
- На предоставленном объёме ожидается полный пересчёт менее чем за 5 минут на обычном ноутбуке.
Масштабирование
При росте до примерно 1 млн узлов потребуется перейти на igraph/graph-tool или Spark, использовать разреженные структуры, запускать community detection по компонентам, обрабатывать данные batch/partition-способом и хранить их в Parquet или другом columnar storage. UI-агрегации следует обслуживать асинхронно через очередь. Это план масштабирования, а не утверждение, что он уже реализован в MVP.
AI-слой
AI — опциональный ассистент аналитика. Он не рассчитывает базовые роли, кластеры и scores, получает только обезличенный профиль выбранного узла и формулирует гипотезы для ручной проверки. При отсутствии API или ошибке используется локальный fallback.
Проверка результатов
head -n 3 outputs/nodes_roles.csv
head -n 3 outputs/clusters.csv
head -n 3 outputs/top_nodes.csv
wc -l outputs/nodes_roles.csv
Количество строк данных в nodes_roles.csv должно совпадать с количеством строк в nodes.parquet.
Документы: схема решения и demo-сценарий.
Проверки проекта
npm run lint
npx tsc --noEmit
npm run build
Cifron AI — вспомогательный аналитический инструмент. Результаты не подтверждают факт нарушения и требуют проверки AML-специалистом.
Авторы коммитов
История коммитов
- 2026-09-23 17:58Submit Cifron AI HackAlem MVPDamir Nurkenov
- 2026-09-23 16:41fix: complete structured AML AI responsesDamir Nurkenov
- 2026-09-23 15:19feat: improve graph focus mode and AI analysis entry pointDamir Nurkenov
- 2026-09-23 15:04fix: handle malformed CSV parsing errorsDamir Nurkenov
- 2026-09-23 14:48feat: initialize Cifron AI AML graph MVPDamir Nurkenov
Структура репозитория (32 файлов)
.env.example .gitignore README.md data/.gitkeep docs/demo-script.md docs/solution-architecture.md eslint.config.mjs next-env.d.ts next.config.ts package-lock.json package.json pipeline/__init__.py pipeline/analysis.py pipeline/requirements.txt pipeline/run.py postcss.config.mjs src/app/api/ai-analysis/route.ts src/app/globals.css src/app/layout.tsx src/app/page.css src/app/page.tsx src/components/money-flow-graph.tsx src/lib/ai-fallback.ts src/lib/ai-profile.ts src/lib/ai-schema.ts src/lib/analysis.ts src/lib/demo-data.ts src/lib/validation.ts src/types/ai.ts src/types/aml.ts tailwind.config.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.