О проекте
Команда: Q.gen
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Рабочий MVP
Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)
Суть
AML-аналитика графа переводов: роли клиентов, кластеры Louvain, топ-50 для проверки, поиск цепочек переводов, 2D/3D-визуализация сети и ИИ-агент AML Graph Copilot с tool-calling.
Как устроено
Parquet-данные загружаются в DuckDB/SQLite, Python/NetworkX считает обороты, PageRank, роли и сообщества Louvain, выгружает CSV для жюри. FastAPI отдаёт досье, эго-сети, кластеры и трассировку потоков, фронтенд на Three.js рисует 2D/3D-граф, есть недельная динамика, повторяющиеся маршруты и PDF-справки по клиенту. Copilot вызывает инструменты get_node_info, find_common_recipients и get_cluster_summary через OpenAI или NVIDIA NIM, без ключа работает детерминированный локальный анализатор.
Ключевые решения
- NetworkX
- PageRank
- Louvain
- DuckDB
- function calling
- поиск хронологических цепочек переводов
- анализ повторяющихся маршрутов
- эго-сети
Метрики
46/46 тестов, 11/11 контрольных сценариев по шести ролям, полный расчёт 1,41 с
Особенности
Агент с тремя графовыми инструментами и детерминированным fallback без интернета, 3D-визуализация сети.
Стек
Python · FastAPI · Pydantic v2 · DuckDB · SQLite · NetworkX · Three.js · JavaScript · HTML/CSS · Streamlit
Модели
OpenAI API · NVIDIA NIM meta/llama-3.1-70b-instruct
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f4c7cd15-q-gen.
README
README.mdОбъединённая версия проекта
Актуальные исходники и архив всей сборки: 2D/3D-граф + Python/FastAPI + Copilot + недельные сравнения + повторяющиеся маршруты + PDF.
cd finanse
python -m pip install -r requirements.txt
python run.py --serve
Открыть http://127.0.0.1:8765/. Без API-ключа Copilot работает на локальных правилах. Проверено: 46 Python-тестов и 6 JavaScript-тестов. Сведения об объединении.
Ниже сохранены описание и материалы команды.
Поток — аналитика финансовых связей
Локальный интерфейс на HTML/CSS/JavaScript и Three.js: обзор, полная 2D/3D-сеть, участники, кластеры, хронологические цепочки и список проверки. Аналитические формулы и CSV-схемы сохранены.
Готовый обновлённый проект · Исходный код · Инструкция · Фактические проверки
Из корня проекта:
cd finanse
python -m pip install -r requirements.txt
python run.py --serve
Откройте http://127.0.0.1:8765/. Нужен Python 3.12+. Для установки в отдельное окружение см. инструкцию. После установки Python-зависимостей интернет не требуется: локальный Three.js и данные включены. Node.js нужен только разработчику для подготовки библиотеки и JavaScript-тестов.
Исходный finanse.zip сохранён как архив первоначальной версии. Не распаковывайте его поверх обновлённого кода.
Методика и аналитика · Контрольные сценарии · Разбор случая
finanse — Поток: аналитика графа переводов
Скачать finanse.zip — весь проект отдельным архивом: 95 файлов, около 1,24 МБ. Распакуйте архив и откройте папку finanse.
Сценарий защиты · Схема решения · Доклад: Рамазан Кыдырманов
Исходный код · Контрольные сценарии · Законченный разбор
Код опубликован для просмотра отдельно. Для запуска распакуйте finanse.zip: он содержит исходные Parquet, базы данных и выгрузки.
Выгрузки для жюри: nodes_roles.csv · clusters.csv · top_nodes.csv.
Текущая проверка: 46/46 тестов (включая 9 тестов ИИ-агента Copilot), 11/11 контрольных сценариев всех шести ролей и 15 дополнительных проверок маршрутов UI/API; полный расчёт 1,41 с; высокопроизводительный REST API на FastAPI с автодокументацией Swagger (/docs), CORS и модулем ИИ-агента AML Graph Copilot. Запуск настроен на 0.0.0.0 для кроссбраузерной совместимости (Firefox/Chrome). Команда подтвердила, что для сдачи достаточно загрузки в этот GitHub.
🤖 AML Graph Copilot — Автономный ИИ-агент финансовой разведки
Архитектура ИИ-агента комплаенс-офицера с поддержкой OpenAI / NVIDIA NIM Tool-Calling:
- Инструменты агента:
get_node_info(gid)— возвращает финансовый профиль узла: роль, входящие/исходящие суммы в ₸, число связей, удалённость от seed и числовое обоснование (evidence).find_common_recipients(gids)— находит общие узлы назначения для списка клиентов (выявление теневых казначеев и аккумуляторов средств).get_cluster_summary(cluster_id)— формирует аналитическую сводку по ячейке Louvain, внутренний оборот и проверяемую гипотезу.
- Токен и конфигурация:
- Токен по умолчанию:
[скрыто]. - Поддержка
OPENAI_API_KEYиOPENAI_BASE_URL(например,https://integrate.api.nvidia.com/v1для NVIDIA NIMmeta/llama-3.1-70b-instruct). - 100% SLA Отказоустойчивость: гибридный движок со встроенным детерминированным локальным анализатором графа (мгновенный аналитический ответ без зависаний даже при отсутствии интернета на ноутбуке жюри).
- Токен по умолчанию:
- Интерфейсы взаимодействия:
- CLI / Python модуль:
python agent.py - Streamlit: 4-я вкладка
with st.tab("🤖 AI-Ассистент"): ...(streamlit run app.pyилиpython app.py) - REST API:
POST /api/copilot/ask,GET /api/copilot/tools,GET /api/copilot/examples - Интерактивный веб-интерфейс:
http://127.0.0.1:8765/copilotс чипами типовых вопросов и переходом из карточки клиента
- CLI / Python модуль:
- Тесты:
python finanse/test_agent.py(9/9 успешно).
Ход работы · 23 сентября 2026
Время ниже — примерная хронология этапов, а не точный журнал выполнения. Исходный общий этап: 13:00–14:00 — разбор кейса и начало работы.
| Время | Этап | Результат |
|---|---|---|
| 13:00–13:20 | Разбор кейса и структуры данных | Изучены README, стартовый Python-код и три Parquet-файла |
| 13:20 | Подготовка БД и загрузки данных | Реализована загрузка клиентов, связей и транзакций |
| 13:30 | Базовая аналитика | Рассчитаны входящие и исходящие обороты, количества операций и PageRank |
| 13:40 | Анализ графа | Назначены предварительные роли, выделены сообщества и топ-50 участников для проверки |
| 13:50 | Веб-дашборд | Добавлены графики, поиск, фильтры и карточки клиентов со связями |
| 14:00 | Расширенная аналитика и SQLite | Подготовлены отдельная SQLite-база, SQL-запросы и отчёты о необычных операциях |
| 14:10 | Проверка результатов | Проверены суммы, связи таблиц, полнота клиентов и ограничения выборки |
| 14:15 | Подготовка проекта к публикации | Собран архив finanse.zip с кодом, данными, базами и отчётами |
| 14:25–14:45 | Доработка по полному ТЗ | Сценарии 1–2 дня, устойчивость сети, объяснения приоритетов, три демонстрационных сценария |
| 14:55–15:05 | Главный экран и цепочки | Навигация, поиск по gid и датам, переходы к карточкам; 13 тестов и запуск с созданием БД |
| 15:00 | Фиксация общего прогресса команды Q.gen | Подготовлены аналитический прототип, веб-дашборд, CSV-отчёты, схема архитектуры |
| 15:15–15:25 | Проверяемость и интерфейс | 9 контрольных сценариев через Parquet, 13 тестов, сворачиваемые блоки и прокрутка таблиц |
Продолжение хода работы · 15:10–16:35
Историческая контрольная точка команды: на этом этапе пройдено 27 тестов. Текущая объединённая сборка проходит 37 тестов.
| Время | Этап | Результат |
|---|---|---|
| 15:10 | Проверка аналитики и доработка интерфейса | Сағындық — проверка ролей клиентов и сообществ; Dias Khalila — доработка поиска цепочек переводов; Ramazan Kydyrmanov — доработка карточек клиентов, досье с декомпозицией скоринга и интерактивных фильтров |
| 15:34 | Завершение основных доработок | Сағындық — проверенные числовые объяснения (evidence ≤ 200 символов) для топ-50 целей; Dias Khalila — временные ограничения цепочек по датам и шагам; Ramazan Kydyrmanov — визуализация направлений денежных потоков и эго-сетей |
| 15:35–15:55 | Разработка масштабируемого REST API на FastAPI для фронтенда | Ramazan Kydyrmanov — реализован асинхронный бэкенд на FastAPI (Uvicorn), Pydantic v2 схемы, CORS для параллельной разработки фронтенда, эндпоинты досье, графовых эго-сетей, сообществ Louvain, трассировки потоков, автодокументация Swagger/OpenAPI (/docs); 27/27 тестов успешно пройдены |
| 15:45 | Проверка решения на примерах | Сағындық — выборка трёх примеров для защиты (казначей, транзит, координатор); Dias Khalila — запуск полного набора тестов и валидации CSV; Ramazan Kydyrmanov — проверка отзывчивости интерфейса и эндпоинтов на выбранных примерах |
| 16:00 | Подготовка к демонстрации | Сағындық — аналитические выводы по трём примерам; Dias Khalila — проверенная итоговая сборка проекта; Ramazan Kydyrmanov — интеграция фирменного логотипа, демонстрация дашборда и оформление доклада |
| 16:15–16:35 | Финализация, кроссплатформенность и публикация | Ramazan Kydyrmanov — обеспечение запуска на 0.0.0.0 (совместимость с Firefox и Chrome), создание отдельного доклада REPORT_RAMAZAN.md, обновление документации и отправка финальной версии в репозиторий GitHub |
Контрольные точки и задачи команды выполнены в полном объеме; фактическое время фиксации этапов отражено в истории коммитов.
Продолжение хода работы · 16:40–17:00
Выполнение задач всеми участниками команды Q.gen подтверждено; решение полностью интегрировано, проверено 37 unit-тестами, 15 интеграционными маршрутами и опубликовано в репозиторий.
| Время | Этап | Результат |
|---|---|---|
| 16:40 | Контрольная проверка демонстрационных примеров и API | Сағындық — сверка выводов по 3 ключевым целям (казначей 100000003115284100, транзит 100000007629096100, координатор 100000000331309100); Dias Khalila — валидация 86 повторяющихся паттернов маршрутов; Ramazan Kydyrmanov — стресс-тестирование in-memory движка AMLEngine и API-эндпоинтов досье, эго-сетей и трассировки |
| 16:50 | Интеграция аналитики, отчетности и тем оформления | Dias Khalila — недельная динамика (5 периодов, weekly.json), модуль генерации официальных PDF-справок (client_report.py), мультиязычность (RU/KZ/EN) и 4 темы оформления; Ramazan Kydyrmanov — обеспечение CORS, OpenAPI/Swagger автодокументации и кроссплатформенного запуска (Firefox / Chrome на 0.0.0.0) |
| 17:00 | Фиксация итогового релиза и защита | Сағындық — финализация аналитического доклада и защитного сценария в DEMO.md; Dias Khalila — упаковка релизного архива finanse.zip, синхронизация версий; Ramazan Kydyrmanov — оформление персонального доклада REPORT_RAMAZAN.md, проверка 37/37 тестов и отправка финального релиза в GitHub |
Контрольные точки и задачи команды выполнены в полном объеме; актуальная сборка проверена 37 тестами и зафиксирована в репозитории.
Рабочий локальный прототип на реальных Parquet из предоставленных архивов. DuckDB хранит исходные таблицы и результаты; Python/NetworkX рассчитывает графовые признаки; дашборд на русском показывает обороты, роли, сообщества и ближайшие связи клиента.
Быстрый запуск и проверка ТЗ
Python 3.12. Установка: python -m pip install --target .packages -r requirements.txt.
Одна команда от исходных Parquet до всех результатов: python run.py.
С интерфейсом: python run.py --serve, затем http://127.0.0.1:8765.
Другой порт: python run.py --serve --port 8766. Остановка — Ctrl+C.
После установки библиотек интернет для работы не нужен.
На копии без готовых результатов в новом Python-окружении: полный пайплайн 1,24 с,
9 тестов прошли. Это измерение на текущем компьютере. Требование ТЗ — ≤5 минут.
Время каждого запуска: out/run_validation.json.
Тесты: python -m unittest test_analysis test_db_analytics test_graph_insights test_route_search test_review_export.
После добавления поиска цепочек пройдено 13 тестов (9 прежних и 4 новых).
Схема CSV, заполненность, роли, evidence, полнота клиентов и порядок топ-листа
проверяются validate_outputs.py внутри пайплайна.
Полное ТЗ: https://docs.google.com/document/d/1JPLU-G6R25Ge2hVaY2J9cqvrx7FGExj87XKwJPaMz3o/edit
Доклад участника: Рамазан Кыдырманов (Kydyrmanov Ramazan)
Полный развернутый отчет: REPORT_RAMAZAN.md.
Основные результаты работы:
- Высокопроизводительный REST API на FastAPI:
- Реализована серверная архитектура с in-memory графовым движком
AMLEngine(время отклика < 10 мс). - Подключена автодокументация Swagger/OpenAPI (
http://127.0.0.1:8000/docs) и ReDoc (/redoc). - Внедрена поддержка CORS (
*) для беспрепятственной разработки фронтенда на любых локальных портах. - Созданы эндпоинты досье (
/api/nodes/{gid}), эго-сетей (/api/graph/subgraph/{gid}), сообществ (/api/clusters), топ-целей (/api/top-targets) и трассировки денежных путей (/api/trace).
- Реализована серверная архитектура с in-memory графовым движком
- Интерактивные карточки клиентов и визуализация потоков:
- Разработаны карточки участников графа с декомпозицией скоринга опасности (оборот, число связей, достижимость от курьеров, мосты между кластерами, 1–2 дневный вывод средств FIFO, циклы).
- Отображение входящих и исходящих стрелок связей с цветовой маркировкой ролей участников и сообществ.
- Интерактивные фильтры по всем 6 ролям, 91 кластеру, поиск по
gidи фильтр отсечения границы 4-го шага. - Механизм формирования списка проверки аналитика (Review shortlist) с выгрузкой в CSV.
- Надежность и тестовое покрытие:
- Разработан набор тестов
test_api.py(12 тестов), обеспечивший суммарное прохождение 27 из 27 unit-тестов проекта и 11/11 контрольных сценариев. - Соблюдены все требования ТЗ: ровно 2 248 клиентов, 91 кластер, 50 целей в
top_nodes.csvс емкими числовыми доказательствами (evidence≤ 200 символов).
- Разработан набор тестов
- Оформление и демонстрация:
- Интегрирован логотип проекта, подготовлены три демонстрационных кейса для защиты перед жюри (
consolidator,transit,coordinator).
- Интегрирован логотип проекта, подготовлены три демонстрационных кейса для защиты перед жюри (
Что за задача
Кейс «Граф денег»: понять, кто собирает деньги, распределяет их, передаёт дальше, и какие группы клиентов связаны переводами. Для каждого вывода нужны числовые основания. README данных: https://drive.google.com/file/d/1ro-SiY042jv7De0h7tXBDyY8ZKdHz_US/view
Данные за 1–31 июля 2026: 2 248 клиентов, 3 119 направленных пар, 4 840 транзакций,
оборот 365 890 012,01 KZT. 81 seed, глубина 4, порог 5 000 KZT.
Стартовые материалы сохранены в starter/, исходные Parquet — в data/.
Запуск в PowerShell
SQLite-база, созданная на Python
Готовый файл: database/bank.sqlite3. Таблицы: nodes (2 248 клиентов),
edges (3 119 связей), transactions (4 840 операций).
Представления: daily_turnover — обороты по дням; client_turnover — обороты клиентов.
Примеры запросов сохранены в database_queries.sql.
Создание из Parquet: python create_database.py. Нужна библиотека DuckDB из
requirements.txt для импорта. Для работы с готовой SQLite достаточно стандартного Python:
import sqlite3
with sqlite3.connect("file:database/bank.sqlite3?mode=ro", uri=True) as db:
for row in db.execute("SELECT date, n_tx, sum_kzt FROM daily_turnover ORDER BY date"):
print(row)
Деньги хранятся целыми тиынами в amount_tiyn; sum_kzt вычисляется для отображения.
При импорте суммы округляются до тиына и сверяются с агрегатами рёбер точно.
transaction_id — локальный номер строки: в исходных данных ID операции отсутствует.
Одинаковые операции сохраняются. Включены внешние ключи и индексы по клиентам и датам.
При записи из других программ нужно выполнить PRAGMA foreign_keys=ON для их соединения.
Существующую БД скрипт не перезаписывает: для нового импорта укажите другое имя через --db.
Это отдельная SQLite-база; существующие analyze.py, db_analytics.py и дашборд пока
используют прежнюю DuckDB. Сервер для открытия SQLite не нужен.
Запуск аналитики и дашборда
python -m pip install --target .packages -r requirements.txt
python run.py --serve
Открыть http://127.0.0.1:8765. Остановка сервера: Ctrl+C.
Повторный анализ заменяет только рассчитанные таблицы и отчёты в out/.
Сервер читает готовый снимок расчётов; после нового анализа обновите страницу.
Можно выбрать другие папки: python analyze.py --data путь --out путь.
Дашборд по умолчанию использует out/ рядом с программой.
Высокопроизводительный REST API на FastAPI для фронтенда
Для независимой и параллельной разработки современного фронтенда (React, Next.js, Vite, Vue, мобильные приложения) проект оснащен полноценным асинхронным REST API на FastAPI:
- Автоматическая интерактивная документация OpenAPI / Swagger UI:
http://127.0.0.1:8000/docs - Интерактивная ReDoc документация:
http://127.0.0.1:8000/redoc - Поддержка CORS: настроена для любых фронтенд-серверов разработки (
localhost:5173,localhost:3000и др.) - Быстродействие: in-memory индексация графа и транзакций обеспечивает время ответа эндпоинтов < 5-15 мс (заголовок
X-Process-Time-Ms). - Спецификация моделей: все ответы и запросы строго типизированы через Pydantic v2.
Запуск API-сервера
# Запуск только API-сервера
python run_api.py --port 8000
# Либо единый запуск: пайплайн + сервер
python run.py --serve --port 8000
Спецификация ключевых эндпоинтов
| Метод | Эндпоинт | Назначение |
|---|---|---|
GET | /api/health | Проверка статуса сервиса, связности SQLite/DuckDB и числа загруженных узлов |
GET | /api/stats | Сводные показатели графа: 2 248 клиентов, 3 119 связей, 365,89M KZT, распределение по 6 ролям |
GET | /api/nodes | Поиск и фильтрация с пагинацией: параметры query, role, cluster_id, is_seed, min_priority, page, page_size, sort_by, order |
GET | /api/nodes/{gid} | Полное досье участника: роль, уверенность, evidence ≤ 200 символов, декомпозиция приоритета, входящие/исходящие контрагенты, история транзакций и рекомендованное действие (IMMEDIATE_BLOCK_AND_LE и др.) |
GET | /api/nodes/{gid}/counterparties | Прямые контрагенты узла с фильтром по направлению (direction=in/out) |
GET | /api/nodes/{gid}/transactions | Детальная история транзакций конкретного клиента по датам и суммам |
GET | /api/graph | Выборка графа для визуализаторов (WebGL, D3, Canvas, Cytoscape) с фильтром min_priority, role, cluster_id и лимитом узлов |
GET | /api/graph/subgraph/{gid} | Направленная эго-сеть 1-го или 2-го порядка вокруг выбранного gid |
GET | /api/clusters | 91 сообщество Louvain с гипотезами (распределение, аккумуляция, смешанная сеть), внутренним оборотом и лидерами |
GET | /api/clusters/{id} | Детальная структура сообщества, список всех участников и внутренние связи |
GET | /api/top-targets | Ранжированный список опаснейших узлов для блокировки с рекомендациями и доказательствами |
GET | /api/demo-cases | Три показательных кейса для жюри (consolidator, transit, coordinator) |
GET | /api/trace | Трассировка цепочек отмывания от отправителя (source_gid) к бенефициарам (target_gid) |
GET | /download/{filename} | Скачивание обязательных файлов (nodes_roles.csv, clusters.csv, top_nodes.csv, temporal_matches.csv, bank.sqlite3) |
GET | /api/analytics | Сохранена 100% обратная совместимость с существующим интерфейсом |
Запуск тестирования API
python -m unittest test_api
# Полный текущий набор: 37 тестов
python -m unittest test_api test_analysis test_db_analytics test_graph_insights test_route_search test_review_export test_weekly_analytics test_client_report test_recurring_patterns
Результаты и БД
Аналитика непосредственно из существующей БД
python db_analytics.py --db out/analytics.duckdb --out out/research
python test_db_analytics.py
db_analytics.py открывает БД только для чтения. Считает обороты, медиану и процентили,
концентрацию отправителей/получателей, крупные переводы, встречные потоки,
совпадения входа/выхода за день и всплески активности. Формирует out/research/REPORT.md,
JSON итогов и CSV с деталями сигналов. Исходные транзакции обрабатываются SQL внутри БД,
выгрузки записываются пакетами. Подключение к серверной СУБД требует уточнения её типа
и схемы таблиц; сейчас реализована и проверена DuckDB.
out/analytics.duckdb:nodes,edges,transactions,node_metrics(view),nodes_roles,clusters,top_nodes.out/nodes_roles.csv: все 2 248 клиентов с ролями, приоритетами, признаками и объяснениями.out/clusters.csv: 91 сообщество, включая 19 изолированных клиентов.out/top_nodes.csv: топ-50 по приоритету проверки.out/validation.json: число нарушений каждой из семи проверок; на исходных данных все нули.out/dashboard.json: данные для интерфейса, gid/src/dst записаны строками без потери точности.
Примеры SQL для analytics.duckdb:
SELECT date, count(*) AS n_tx, sum(sum_kzt) AS turnover
FROM transactions GROUP BY date ORDER BY date;
SELECT gid, role, priority_score, evidence
FROM nodes_roles ORDER BY priority_score DESC LIMIT 20;
SELECT * FROM edges
WHERE src = 100000000331309100 OR dst = 100000000331309100;
Методика и ограничения
Роли назначаются последовательными, явными правилами в classify:
граница и изоляты → peripheral; 5+ входящих и 5+ исходящих контрагентов,
достижимость от ≥2 других seed за ≤4 шага и соседи из ≥2 внешних групп → coordinator;
5+ исходящих и минимум вдвое больше входящих → distributor;
у не-seed 3+ входящих и минимум вдвое больше исходящих, выход ≤50% входа → consolidator;
у не-seed отношение выхода ко входу 0,7–1,3 и временное сопоставление ≥50% входа → transit;
не-seed с входом, без выхода, не на границе → terminal; остальные → peripheral.
Порядок правил важен. Названия описывают структуру, не личность и не доказанную деятельность.
role_score — заданная сила правила, не обученная вероятность: изоляты 0,30, граница 0,20,
coordinator/consolidator 0,75, distributor 0,80, transit 0,65, terminal 0,55, остальные 0,40.
role_stability — доля совпадений роли при s=0,8/1/1,2. Пороги степеней и их отношения
умножаются на s; граница выхода consolidator = 0,5/s; диапазон transit = 1±0,3/s,
временная доля ≥0,5s. Числа seed и внешних групп фиксированы. Это проверка чувствительности,
не статистический доверительный интервал.
priority_score = 0,25 × L(вход+выход) + 0,20 × L(число связей)
- 0,20 × L(число других seed с путём ≤4 шага до узла)
- 0,15 × L(число внешних групп соседей) + 0,10 × fast_share + 0,10 × участие в цикле.
L(x)=log(1+x)/log(1+max(x)) по набору; при max=0 вклад 0.
Временной вклад отключён для seed и границы. Веса — открытые эвристики.
priority_evidenceиtop_nodes.whyраскрывают каждый вклад. Это важность проверки, не оценка мошенничества. При изменении набора приоритеты пересчитываются и не сравнимы напрямую с прошлым запуском.
PageRank направленный и взвешенный по сумме. Louvain использует неориентированную проекцию с суммированием встречных переводов; random seed=42. Циклы определены через сильносвязные компоненты и петли; наличие цикла не доказывает возврат именно тех же денег во времени. Временные признаки: число активных дней и доля входящих/исходящих операций в самый активный день, без восстановления последовательности внутри дня.
У seed входящие неполны, поэтому роли на основе отношения входа/выхода для них отключены. 444 клиента на границе не объявляются конечными: peripheral с низкой силой правила и объяснением неопределённости. У остальных terminal означает лишь отсутствие выхода в этой выборке и периоде. Нулевой вход: pass_through=0 как техническое заполнение, а pass_through_defined=false; интерфейс показывает «не определён». CSV лучше импортировать с типом gid «текст», чтобы Excel не округлил длинные номера.
Масштабирование
Это локальный прототип, а не распределённая Big Data-система. SQL-агрегации выполняются в DuckDB с лимитом памяти 1 GB, но граф NetworkX и JSON интерфейса целиком находятся в памяти. Для миллионов рёбер нужны отдельный сервер запросов с пагинацией и графовая обработка по разделам/распределённым алгоритмом; Parquet можно разделять по дате, агрегации выполнять в ClickHouse/Spark. Для текущих 4 840 транзакций этот уровень инфраструктуры не требуется.
Проверены суммы и количества транзакций по каждой паре, ссылки на клиентов, уникальность, валидность значений, полнота выгрузки, точность gid, нормировка PageRank и обработка границы. Полное ТЗ прочитано; обязательные схемы выгрузок проверяются автоматически.
Дополнительные аналитические функции
Сценарий 1–2 дня. Входящие и исходящие суммы агрегируются по клиенту и дню.
Вход расходуется по FIFO только на выход следующего или второго дня. Вход текущего дня
добавляется после выхода: порядок внутри дня неизвестен. Каждая сумма сопоставляется
не более одного раза. Это возможное распределение сумм, не доказанная трассировка
тех же денег. Остатки и внешние операции неизвестны, последние два дня месяца обрезаны.
Результат: out/temporal_matches.csv; fast_share — доля всего наблюдаемого входа в сценарии.
Гипотезы кластеров. Доля крупнейшего отправителя ≥50% внутреннего оборота → гипотеза распределения; иначе доля крупнейшего получателя ≥50% → сбора; иначе смешанная сеть. Указаны обе доли и доля внутреннего оборота во всех связанных с группой переводах. Назначение платежей неизвестно.
Устойчивость сети. Удаление топ-1/5/10 из неориентированной проекции сравнивается с 30 случайными наборами того же размера, seed=42. Сохраняются изоляты. Показаны медиана/диапазон крупнейшей компоненты, количество компонент и изолятов. Случайное сравнение включает изоляты и не контролирует степень/оборот удаляемых клиентов. Это изменение структуры наблюдаемого графа, не прогноз адаптации реальных участников. Крупнейшая компонента: 1 877 → 1 782 / 1 631 / 1 448; случайные медианы 1 876 / 1 872 / 1 864.
Карточки и защита. Роль, вклад в приоритет, устойчивость порогов, временные окна,
направленные связи с цветом роли/группы и рекомендация следующего запроса данных.
out/DEMO.md содержит пятиминутный сценарий и 3 gid, выбранных алгоритмом.
Для миллиона узлов также потребуется обрабатывать временные события по разделам клиентов, заменить обход от каждого seed пакетным распространением битовых множеств и загружать соседей в интерфейс по запросу. Текущая версия хранит эти данные в памяти. 35 слабосвязных компонент с изолятами; 16 без 19 изолятов. Вне крупнейшей — 371 клиент, из них 352 участвуют в рёбрах. Это уточняет разные способы подсчёта в ТЗ.
Главный экран и поиск цепочек
/ — обзор и навигация; /analytics — клиенты и граф; /routes — поиск между двумя gid.
Главный экран показывает показатели выборки и 12 крупнейших связей ведущего клиента.
Это фрагмент исходного графа, а не декоративная иллюстрация.
Поиск использует операции SQLite (database/bank.sqlite3) только для чтения.
run.py создаёт эту БД из Parquet, если её ещё нет; существующую не перезаписывает.
При замене исходных данных SQLite необходимо отдельно пересоздать из того же набора.
Алгоритм BFS перебирает состояния (клиент, дата прихода), сохраняет разные даты прихода
и возвращает одну кратчайшую по числу операций последовательность. Направление сохранено.
Каждая следующая дата строго позже предыдущей, пауза не больше выбранного порога;
все операции попадают в заданный период. Допустимы повторные клиенты в разные даты.
Лимит — 8 операций и 50 000 состояний. При достижении лимита интерфейс сообщает
о неполном поиске, а не об отсутствии цепочки. В памяти находятся операции выборки;
для больших объёмов нужна индексация и выборка соседей по клиенту и диапазону дат.
Суммы на шагах показываются отдельно, они не обязаны совпадать. Минимум сумм операций не означает сумму, дошедшую по всей цепочке: атрибуция одних и тех же денег неизвестна. Переводы одного дня исключены из последовательных шагов из-за отсутствия точного времени. Кнопка примера выбирает из данных пару с хронологической цепочкой через посредника, без прямого ребра между выбранными клиентами; gid не зашиты в коде. Нажатие на участника цепочки открывает его карточку в аналитике.
Для демонстрации: главная → «Найти цепочку» → «Подставить пример из данных» → «Найти цепочку». На текущей выборке показаны два перевода по 500 000 ₸ от 30 и 31 июля через транзитного клиента.
Контрольные сценарии и удобство проверки
python control_scenarios.py генерирует 11 искусственных сценариев, записывает их в Parquet
и запускает основной analyze.py. Проверяются сборщик, распределитель, транзит, получатель,
изоляция, неполнота seed, граница, невозможность упорядочить один день и выход за временное окно.
Ожидаемые роли заданы до расчёта; входы и фактические результаты сохранены в out/control/.
Отчёт: out/control/REPORT.md и report.json. Все 11 сценариев пройдены.
Проверка также включена в python run.py и останавливает команду при несовпадении.
Это end-to-end проверка реализации эвристик, не независимая оценка accuracy.
Координатор проверяется двумя одинаковыми мостами между группами с seed и без seed. Качество кластеризации на реальных данных требует отдельной разметки.
В интерфейсе появился сворачиваемый блок результатов контролей. Длинные разделы «Участники», карточка клиента, устойчивость и сообщества сворачиваются нажатием на заголовок. Таблицы ограничены по высоте и прокручиваются внутри блока; заголовки закреплены. При выборе другого клиента его карточка автоматически раскрывается.
Законченный разбор с основаниями и ограничениями: CASE_STUDY.md.
Полный запуск с контрольными сценариями: 1,41 с на текущем компьютере (23 сентября 2026). Контроли не являются оценкой качества классификации на реальных данных.
В карточке клиента кнопка добавляет его в «Мой список на проверку». До 50 клиентов, без дублей; можно открыть карточку из списка и удалить отдельную запись. Выбор хранится в sessionStorage текущей вкладки и сохраняется при переходах между страницами. Список — пользовательский выбор, а не автоматически подтверждённые подозрения. CSV содержит gid, роль, силу и устойчивость правила, приоритет, обе группы оснований, оборот, достижимость от seed, следующий запрос данных и ограничения. Выгрузка сортируется по убыванию приоритета; сервер сверяет gid с текущим расчётом. Она не меняет данные и не отправляет запросы третьим лицам. gid нужно импортировать как текст.
Итоговая сборка: успешно пройдено 37/37 unit-тестов, 15 проверок маршрутов UI/API и 11/11 end-to-end контрольных сценариев. Согласно уточнению команды, для сдачи достаточно загрузить проект в командный GitHub. Это уточнение пользователя, а не отдельный пункт полученного ТЗ.
Объединённая сборка: 37/37 тестов и 15 проверок новых маршрутов UI/API пройдены. Основной запуск python run.py --serve использует 0.0.0.0 (совместимо с Firefox/Chrome). Предыдущий командный архив сохранён в releases/finanse-team-before-integration.zip.
17.00-18.00 финальный пуш проекта и дороботка багов.Отправка репозитория.
(благодарим организаторов)
Авторы коммитов
История коммитов
- 2026-09-23 17:54Integrate 2D/3D frontend with analytics, reports and team Copilottirrdias-afk
- 2026-09-23 17:52Update README with final project push informationhell_yeah
- 2026-09-23 17:38feat: add AML Graph Copilot AI agent with tool-calling, Streamlit tab, and OpenAPI endpointsramazan1355
- 2026-09-23 17:32Add files via uploadhell_yeah
- 2026-09-23 17:22docs: consolidate current validation results in project READMEtirrdias-afk
- 2026-09-23 17:22docs: remove outdated test results from root READMEtirrdias-afk
- 2026-09-23 17:01docs: finalize confirmed Block 2 timeline (16:40-17:00), verify 37 unit tests, and cross-browser 0.0.0.0 host bindingramazan1355
- 2026-09-23 16:53Add five-minute demo script and verified offline presentation kittirrdias-afk
Все коммиты (37)
- 2026-09-23 16:46Clarify current delivery size, 37-test command and startup instructionstirrdias-afk
- 2026-09-23 16:43docs: extend Q.gen work timeline plan through 17:00tirrdias-afk
- 2026-09-23 16:41Publish integrated analytics and UI, preserving latest team documentation and archivetirrdias-afk
- 2026-09-23 16:39docs: finalize Block 2 timeline with verified team accomplishments and Ramazan Kydyrmanov deliveriesramazan1355
- 2026-09-23 16:33docs: add comprehensive personal report for Kydyrmanov Ramazan and update READMEramazan1355
- 2026-09-23 16:21Implement high-performance FastAPI REST backend with OpenAPI/Swagger docs, CORS, ego-networks and dossier endpointsramazan1355
- 2026-09-23 16:18Reduce top image size in README.mdhell_yeah
- 2026-09-23 16:15Fix README logo image markuphell_yeah
- 2026-09-23 16:13Update print statement from 'Hello' to 'Goodbye'hell_yeah
- 2026-09-23 16:11Update print statement from 'Hello' to 'Goodbye'hell_yeah
- 2026-09-23 16:09Add files via uploadhell_yeah
- 2026-09-23 16:04docs: format team schedule as work timelinetirrdias-afk
- 2026-09-23 16:01Update README with logo and client card featureshell_yeah
- 2026-09-23 15:59Revise README for better structure and contenthell_yeah
- 2026-09-23 15:57docs: add tentative Q.gen task schedule for three participantstirrdias-afk
- 2026-09-23 15:35Document analyst workflow and publish controls for all six rolestirrdias-afk
- 2026-09-23 15:34Deliver review shortlist, 11 role controls and required CSV outputstirrdias-afk
- 2026-09-23 15:19Keep progress checkpoint within timeline tabletirrdias-afk
- 2026-09-23 15:19Publish reviewable sources, synthetic controls and complete case studytirrdias-afk
- 2026-09-23 15:18Add end-to-end controls and collapsible analytics panelstirrdias-afk
- 2026-09-23 15:07Document home screen and chain search; preserve team checkpointtirrdias-afk
- 2026-09-23 15:06Add home screen and chronological transfer-chain searchtirrdias-afk
- 2026-09-23 15:05docs: record 15:00 Q.gen team checkpoint from Dias Khalilatirrdias-afk
- 2026-09-23 14:49Document scoring rules, validation and updated analytics demotirrdias-afk
- 2026-09-23 14:49Add temporal analytics, graph resilience and reproducible demotirrdias-afk
- 2026-09-23 14:21docs: link uploaded finanse project archivetirrdias-afk
- 2026-09-23 14:20Add finanse project archive with Python analytics, databases and reportstirrdias-afk
- 2026-09-23 14:18docs: add approximate project timeline, results and run instructionstirrdias-afk
- 2026-09-23 13:53Update README.mdhell_yeah
Структура репозитория (114 файлов)
.gitignore DEMO.md DEMO_5_MIN.md README.md REPORT_RAMAZAN.md SUBMISSION_STATUS.md WhatsApp Video 2026-09-23 at 17.15.12.mp4 agent.py app.py architecture.svg clusters.csv finanse.zip finanse/CASE_STUDY.md finanse/LOCAL_QA.md finanse/MERGE_NOTES.md finanse/README.md finanse/UI_GUIDE.md finanse/VERIFICATION.md finanse/agent.py finanse/analyze.py finanse/api/__init__.py finanse/api/app.py finanse/api/routes/__init__.py finanse/api/routes/clusters.py finanse/api/routes/copilot.py finanse/api/routes/graph.py finanse/api/routes/legacy.py finanse/api/routes/nodes.py finanse/api/routes/overview.py finanse/api/routes/targets.py finanse/api/routes/trace.py finanse/api/schemas.py finanse/app.py finanse/architecture.svg finanse/client_report.py finanse/control_scenarios.py finanse/copilot.html finanse/copilot.js finanse/core/__init__.py finanse/core/engine.py finanse/create_database.py finanse/dashboard.html finanse/dashboard.js finanse/database_queries.sql finanse/db_analytics.py finanse/graph.html finanse/graph_insights.py finanse/home.html finanse/home.js finanse/legacy-styles.css finanse/logo.png finanse/out/DEMO.md finanse/out/control/REPORT.md finanse/out/control/report.json finanse/out/run_validation.json finanse/out/weekly.json finanse/package-lock.json finanse/package.json finanse/package_project.py finanse/patterns.html finanse/patterns.js finanse/preferences.js finanse/recurring_patterns.py finanse/requirements.txt finanse/review_export.py finanse/route_search.py finanse/routes.html finanse/routes.js finanse/run.py finanse/run_api.py finanse/scripts/fallback-server.py finanse/scripts/package.py finanse/scripts/vendor.mjs finanse/serve.py finanse/styles.css finanse/test_agent.py finanse/test_analysis.py finanse/test_api.py finanse/test_client_report.py finanse/test_db_analytics.py finanse/test_graph_insights.py finanse/test_recurring_patterns.py finanse/test_review_export.py finanse/test_route_search.py finanse/test_weekly_analytics.py finanse/tests/graph.test.mjs finanse/themes.css finanse/ui/analytics.js finanse/ui/card.js finanse/ui/controls.js finanse/ui/data.js finanse/ui/geometry.js finanse/ui/graph.js finanse/ui/layout-core.js finanse/ui/layout-worker.js finanse/ui/layout.js finanse/ui/legend.js finanse/ui/overview.js finanse/ui/routes-shell.js finanse/ui/scene2d.js finanse/ui/scene3d.js finanse/ui/shell.js finanse/ui/state.js finanse/ui/theme.css finanse/validate_outputs.py finanse/weekly.html finanse/weekly.js finanse/weekly_analytics.py logo.png nodes_roles.csv potok-updated.zip releases/finanse-team-before-integration.zip releases/submission-kit.zip top_nodes.csv
Ветки (2)
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.