AAYMA
RU
Войти

Cifron AI

AML-инструмент: строит транзакционный граф из трёх Parquet-файлов, назначает роли узлам, выделяет кластеры и выдаёт ранжированный топ для ручной…

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

О проекте

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

Cifron 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. Порядок правил такой:

  1. coordinator: centrality и priority не ниже 90-го percentile плюс минимум две связи с seed или минимум два seed в кластере.
  2. distributor: исходящий degree и число уникальных получателей не ниже 75-го percentile, исходящий degree больше входящего.
  3. consolidator: входящий degree и число уникальных отправителей не ниже 85-го percentile, входящий observed volume не ниже 75-го percentile.
  4. transit: не-seed, есть входящие и исходящие, pass_through_ratio от 0.8 до 1.2.
  5. terminal: не-seed, out_degree == 0 и depth < 4.
  6. 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-специалистом.

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

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

Damir Nurkenov 4Damir Nurkenov 1

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

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

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

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