Рішення за 18 мілісекунд.
Навіть коли половина платформи лежить.
«Кворум» — шар ухвалення рішень для платіжних систем: антифрод, поведінковий скоринг і динамічні ліміти. Ми проєктуємо не «точність моделі на валідації», а поведінку системи в найгірший день кварталу — коли відвалився регіон, фічестор віддає застарілі ознаки, а трафік утричі вищий за прогноз.
Каскад деградації: відповідь є завжди
Модель може бути повільною, ознаки — застарілими, GPU — зайнятим. Але платіжний термінал не вміє чекати: через 60 мс емітент отримає таймаут, і транзакція зірветься. Тому рішення ухвалює не одна модель, а три рівні з жорсткими бюджетами часу. Кожен наступний — простіший, швидший і гірший за якістю; перехід між ними автоматичний і непомітний для клієнта.
Ансамбль повного контексту
Градієнтний бустинг на 340 ознаках + послідовнісна модель на історії транзакцій пристрою + графові сигнали по мережі отримувачів. Найвища якість, найбільша залежність від інфраструктури.
Дистильована модель на кеші ознак
Компактна модель (INT8, ~9 МБ), навчена відтворювати рішення L1. Живе в пам'яті кожного вузла, читає лише «теплі» ознаки з локального кешу. Втрата AUC проти L1 — 0,017.
Детермінована скорингова карта
Правила, підписані ризик-комітетом: ліміти за сумою, країною, MCC і віком картки. Без мережі, без залежностей, без ML. Свідомо консервативна: краще зайвий раз попросити 3-D Secure, ніж пропустити шахрая.
Що з цього випливає для бізнесу. Немає стану «система недоступна» — є лише поступова втрата якості, яку видно на дашборді як зростання частки L2/L3. Ми продаємо не модель, а гарантію відповіді в межах бюджету.
Кворум замість «основного сервера»
Найдорожчі інциденти у фінтеху — не падіння, а розʼїзд даних: два вузли вважають себе головними й обидва списують кошти. Ми прибрали саме поняття «основного сервера»: запис вважається підтвердженим лише тоді, коли його зафіксували щонайменше двоє з трьох учасників кворуму.
Реплікація журналу через Raft
Вибори лідера з випадковим таймаутом 150–300 мс, журнал транзакцій із монотонними індексами. Втрата будь-якого одного регіону не зупиняє запис; втрата двох переводить систему в режим «лише читання» — свідомо, замість ризику розʼїзду.
Ідемпотентність кожної операції
Клієнт надсилає ключ ідемпотентності; ми зберігаємо результат першої обробки на 72 години. Повтор після мережевого таймауту поверне ту саму відповідь, а не другий платіж. Це робить безпечним агресивний ретрай на боці клієнта.
Подвійний запис і звірка
Реєстр побудований за принципом подвійного запису: кожна проводка має дебет і кредит, сума за добу має сходитися в нуль. Автоматична звірка о 03:00 порівнює наш реєстр із випискою банку-партнера; розбіжність понад 0,01 UAH піднімає інцидент.
Запобіжники й ізоляція навантаження
Кожна зовнішня залежність — за запобіжником: 20 помилок поспіль розмикають ланцюг на 30 секунд, трафік іде в каскад. Пули з'єднань розділені за типом операції, щоб звіти не з'їдали ресурси авторизацій.
Що насправді визначає затримку
У проді час рішення майже ніколи не «з'їдає» сама нейромережа. Його з'їдають ознаки: скільки звернень до сховища потрібно, щоб зібрати вектор, і чи коректні ці ознаки в часі. Ось як розкладається наш бюджет у 18,1 мс на рівні p99.
Фічестор із коректністю в часі
Навчальна вибірка збирається тим самим кодом, що й онлайн-вектор, із прив'язкою до моменту події. Це прибирає витік з майбутнього — класичну причину моделі, яка «показувала AUC 0,94 на бектесті й 0,71 у проді».
Квантизація й пакетування
Моделі експортуються в ONNX і квантизуються до INT8: утричі менше пам'яті, вдвічі швидший інференс, втрата якості в межах шуму. Мікропакетування вікном 2 мс вирівнює навантаження на пікових хвилинах.
Ансамбль різної природи
Бустинг ловить табличні закономірності, послідовнісна модель — ритм поведінки пристрою, графова — зв'язки між отримувачами й дропами. Помилки в них різні, тому агрегація дає приріст, якого не дає стек однотипних моделей.
Асиметрична ціна помилки
Пропущений шахрайський платіж коштує в середньому 4 700 грн, хибне відхилення чесного — близько 180 грн втраченої маржі плюс ризик відтоку. Поріг рішення рухається за цією економікою, а не за F1-мірою.
Дрейф, тінь і канарка
Модель у фінтеху псується не тому, що її погано навчили, а тому, що змінюється світ: нова схема шахрайства, сезон, курс, новий партнер із іншим профілем платежів. Тому кожна версія проходить однаковий шлях, а рішення про відкат ухвалює автоматика, а не нарада.
Тіньовий режим
Нова версія два тижні отримує 100 % реального трафіку, але її відповіді нікуди не йдуть — лише пишуться в лог і порівнюються з чинною. Шукаємо не середню якість, а розбіжності: де саме й на яких сегментах моделі не згодні.
Канарковий викат 1 → 5 → 25 %
Кожна сходинка тримається, доки не набереться статистично значуща вибірка за трьома метриками: частка відхилень, скарги в підтримку, рівень чарджбеків. Погіршення будь-якої — автоматичний відкат за 90 секунд.
Виявлення дрейфу
Щогодини рахуємо PSI по кожній ознаці та розподіл вихідних оцінок. PSI понад 0,25 на ознаці з високою важливістю — алерт черговому; різкий зсув у розподілі оцінок — привід перевірити не модель, а джерело даних.
Зворотний зв'язок із затримкою
Чарджбек приходить через 30–120 днів після транзакції. Тому перенавчання працює на двох горизонтах: швидкий контур на підтверджених скаргах і повільний — на фінальній розмітці, коли вона визріла.
Пояснюване рішення, а не «чорна скринька»
Клієнт має право знати, чому йому відмовили, а регулятор — перевірити, що рішення не було дискримінаційним. Автоматизоване рішення без можливості пояснення — це не технічна елегантність, а юридичний ризик.
Причина в людських словах
До кожного відхилення додається три головні чинники впливу, перекладені зрозумілою мовою: «нетипова для вас країна операції», «четверта спроба за 10 хвилин». Оператор підтримки бачить те саме, що й алгоритм.
Незмінний аудиторський слід
Зберігаємо версію моделі, знімок вектора ознак і поріг на момент рішення. Через рік можна відтворити рішення побайтово — це вимога і до спорів із клієнтом, і до перевірки.
Паспорт моделі
Для кожної версії — документ із даними навчання, відомими обмеженнями, метриками за сегментами та переліком ознак, які заборонено використовувати прямо чи опосередковано.
Людина в контурі
Рішення з високою ціною помилки не виконуються автоматично: вони потрапляють у чергу ризик-аналітика з таймером. Модель тут — не суддя, а пріоритезатор черги.
Відповідність вимогам: PCI DSS 4.0, вимоги НБУ щодо захисту інформації в платіжних системах, GDPR (зокрема ст. 22 — автоматизоване ухвалення рішень), ISO 20022 в обміні повідомленнями.
Бюджет помилок замість обіцянок
SLO у нас має наслідки: поки бюджет помилок не вичерпано — команда котить фічі; щойно вичерпано — усі релізи, крім виправлень надійності, зупиняються до кінця вікна. Дані за поточний 30-денний період.
| Показник | Ціль | Факт 30 днів | Бюджет | Стан |
|---|---|---|---|---|
| Доступність API авторизації | 99,99 % | 99,995 % | спожито 48 % | у нормі |
| Затримка рішення, p99 | ≤ 20 мс | 18,1 мс | спожито 31 % | у нормі |
| Частка рішень рівня L3 | ≤ 0,20 % | 0,11 % | спожито 27 % | у нормі |
| Свіжість ознак (вік p95) | ≤ 90 с | 104 с | спожито 86 % | під наглядом |
| Час відновлення регіону (RTO) | ≤ 60 с | 41 с | спожито 12 % | у нормі |
| Розбіжність у добовій звірці | 0,00 UAH | 0,00 UAH | — | у нормі |
Ми ламаємо прод за розкладом
Резервування, яке не перевіряли, — це припущення. Щодругої середи о 14:00 ми свідомо виводимо з ладу компонент у проді на реальному трафіку. Нижче — хронологія останнього навчання: відключення регіону-лідера 27 серпня.
Мережеву звʼязність kyiv-a обірвано
Черговий інженер не попереджений — перевіряємо реакцію, а не сценарій. Клієнтський трафік у цей момент: 3 100 запитів/с.
Вузли зафіксували втрату лідера
Три пропущені heartbeat поспіль. Записи не приймаються — 11 секунд система свідомо недоступна на запис, замість ризику подвійного списання.
Обрано нового лідера — fra-1
Вибори за один раунд; журнал уже був синхронний, тож догін не знадобився. Fencing-токен інкрементовано, старий лідер більше не зможе писати навіть після повернення.
Прийом запису відновлено
Частка рішень рівня L2 піднялася до 4,3 % на дві хвилини — локальні кеші ознак у Франкфурті прогрівалися. Жодної підтвердженої транзакції не втрачено (RPO = 0).
Що зламалося насправді
Знайшли реальний дефект: дашборд підтримки показував статус старого лідера ще 90 секунд. Виправлено. Саме заради таких знахідок навчання й проводять на проді, а не на стенді.
Пілот на вашому трафіку — 6 тижнів
Два тижні в тіньовому режимі на ваших реальних платежах, чотири — на канарковому трафіку. На виході ви отримуєте звіт: скільки шахрайства ми піймали понад вашу поточну систему і скільки чесних клієнтів перестали отримувати відмову.