Білінг AI-сервісів: облік токенів, GPU-годин і API-запитів

Сервіс на моделях зростає — і витрати на обчислення перестають бути передбачуваними: рахунок не сходиться, а винних немає. Ми впроваджуємо білінг AI як сервіс під ключ: облік токенів, годин обчислень і запитів, режими тарифікації та регламенти, які залишаються у вашої команди. Кожен напрям бачить свої витрати, спірні рахунки закриваються даними.
Часті запитання

Чому білінг AI як сервіс ламається при зростанні навантаження

Облік токенів майже завжди пишеться асинхронно: відповідь іде клієнту, а подія витрати стає в чергу й фіксується пізніше. Стрімінг погіршує картину — фактичний обсяг генерації відомий лише наприкінці потоку, тому при обриві з'єднання запит обслуговано, а списання не записано. Це і є втрачені запити: вони не падають з помилкою, їх просто не видно у звіті.

Зворотний бік — повторна доставка того самого звернення після тайм-ауту. Без ключа дедуплікації за ідентифікатором запиту повторний виклик списує витрату двічі, і розбіжність випливає вже в акті.

Ліміти й квоти перевіряються на вході в шлюз за знімком, який оновлюється раз на кілька хвилин, а фактичне споживання рахується за журналом після обробки — на піковій витраті ці два числа розходяться найсильніше.

Черга розтягує час відповіді, агрегація усереднює сплеск, і клієнт, формально впершись у квоту, продовжує вибирати спільний пул прискорювачів.

Окрема проблема — різні одиниці обліку: токени, секунди прискорювача й виклики інтерфейсу живуть у своїх таблицях і не складаються в один рядок рахунку.

Поки це так, ручна звірка споживання залишається єдиним способом звести вивантаження, а розбіжність у пару відсотків тягне за собою спірні списання й повернення «на довірі». Розбираємо, як це закривається.

Що дає наскрізний облік споживання: ефекти в цифрах

Наскрізний облік споживання тримається на одному принципі: кожне звернення до моделі залишає вимірюваний слід — вхідні й вихідні токени, зайняті GPU-години, кількість викликів.

Запис створюється в момент запиту й прив'язується до акаунта, проєкту та ключа, а не відновлюється заднім числом із журналів.

Недообліковані запити: частка падає до одиниць відсотків

Основна втрата раніше виникала на потокових відповідях і повторних спробах: запит ішов, з'єднання обривалося, лічильник не спрацьовував.

Облік на боці шлюзу фіксує факт виклику до віддавання відповіді й закриває запис із завершенням потоку — частка недооблікованих запитів падає до десятих часток відсотка. У залишку лише службові перевірки доступності та тестові виклики, і вони позначені явно.

Звірка споживання: з днів до годин

Звірка перестає бути окремою кампанією наприкінці місяця. Звіти постачальника моделі, наприклад OpenAI, зіставляються з внутрішніми записами автоматично, а розбіжності йдуть у чергу розбору із зазначенням конкретного ключа.

Час звірки скорочується з кількох днів до двох-чотирьох годин, і розрахунковий період закривається того самого дня, коли закінчився.

Звідси — передбачуваність витрат: ліміти та пороги виставляються на рівні ключа й проєкту, поточний залишок видно без запиту до підтримки. Заодно зникає цілий клас відмов, коли рахунок виставляється заднім числом, а спірні рядки доводиться закривати вручну.

Режими білінгу: порівняння варіантів обліку

Режим тарифікації — це обмеження на архітектуру, а не налаштування вітрини. Від нього залежить, які події споживання фіксуються і коли перетворюються на нарахування: постоплата потребує журналу подій із захистом від повторної обробки, підписка — контролю ліміту на вході в сервіс.

Схема в усіх режимів одна: подія споживання, агрегація за вікно, нарахування за правилом. Різняться момент списання, ризик недоспоживання й жорсткість стелі. Гібрид «підписка плюс перевитрата», як у Stripe, — базовий платіж і лічильники понад включений обсяг.

Варіант Коли підходить Обмеження
Постоплата за фактом Рівний потік, великі клієнти Закриття періоду, ризик несплаченої витрати
Підписка з лімітом Масовий сервіс із передбачуваним профілем У стелю ліміту впираються, далі клієнт іде
Прискорювачі за годинами зайнятості Довгі задачі та піки навантаження Рахувати треба час утримання, а не лише роботи
Пакети токенів Швидкий старт і разові проєкти Залишок згорає, баланс потребує окремого обліку
Підписка з перевитратою База за підпискою, сплески за фактом Складніші правила, потрібна єдина черга подій

Як вибрати режим під профіль навантаження

Вибирайте за профілем навантаження. Рівному потокові підходить підписка з лімітом: витрата планується, нарахування не дробляться. Піковим і разовим сценаріям — постоплата, пакети токенів або гібрид, де база закрита підпискою, а сплеск рахується за фактом. Спільна вимога — єдина черга подій: різні підсистеми обліку дають розбіжності на звірці.

Етапи впровадження: від аудиту споживання до передачі регламентів

Облік споживання ІІ-сервісів ламається не на етапі розробки, а пізніше — коли тарифи, ліміти та фактична звірка починають розходитися. Тому роботу ведемо етапами, і кожен закінчується перевірюваним артефактом, а не усною домовленістю.

  1. Аудит споживання. Інвентаризуємо потоки запитів: хто викликає сервіс, за якими ключами, які моделі та обсяги, де витрата рахується двічі або не рахується взагалі.
  2. Схема обліку. Фіксуємо одиницю вимірювання — токени, GPU-години, виклики API, — точки збору, прив'язку до акаунта й ключа, захист від повторного списання при повторі запиту.
  3. Налаштування тарифів і лімітів. Збираємо правила округлення, пороги та поведінку при перевищенні: відмова, черга або переведення на інший клас обслуговування.
  4. Перевірка звірки. Прогоняємо схему на історичних даних і порівнюємо з попередніми нарахуваннями: розбіжність за кожним акаунтом має пояснюватися конкретним правилом.
  5. Навчання команд. Показуємо підтримці та продукту, як читати нарахування, де дивитися деталізацію й як розбирати спірний запит користувача.
  6. Передача регламентів. Віддаємо опис схеми, правила тарифікації, порядок зміни лімітів і точки ескалації.

Контрольні точки етапів

Етап закривається артефактом: карта потоків, узгоджена схема обліку, тарифна матриця, звіт звірки. Так роботу приймають за фактом, а спірні місця випливають до запуску, а не в перших рахунках.

Що відбувається після запуску

Перші тижні ведемо звірку в режимі спостереження: розбіжності розбираємо одразу, правила уточнюємо до того, як вони стануть предметом спору. Далі облік живе за регламентом — зміни тарифів і лімітів проходять через зрозумілу процедуру з фіксацією відповідального.

Що передаємо на руки: схеми, політики, регламенти

Передаємо не доступи й паролі, а робочу систему: кожен артефакт пояснює, звідки береться цифра в рахунку й хто має право її змінити. Через місяць після запуску ваша команда веде білінг самостійно, а ми підключаємося лише до змін тарифів і підключення нових сервісів.

Схеми обліку та політики доступу

  • Схема потоків запитів: від виклику моделі до рядка в рахунку, з точками, де токени, GPU-години та зовнішні звернення складаються в одну позицію.
  • Карта джерел: які лічильники беремо зі шлюзу, які з черги, які з журналів кластера, і як звіряються розбіжності між ними.
  • Матриця ролей: хто бачить зведені витрати, хто править тарифні правила, хто лише читає журнал; кожна зміна прав фіксується окремо.
  • Політики ідемпотентності та лімітів: правила повторної обробки запиту, стелі на користувача й на команду, поведінка при перевищенні.

Документація та регламенти виставлення

  • Регламент виставлення: період закриття, порядок перерахунку спірних позицій, строки коригувань.
  • Журнал розбіжностей: шаблон запису, класифікація причин — втрачений лічильник, задвоєний запит, зміна тарифу — і строк розбору кожної.
  • Інструкції для команд: як підключити новий сервіс до обліку, які мітки обов'язкові, як перевірити свою витрату до виставлення.
  • Чек-ліст приймання: контрольні сценарії, за якими звіряється паритет між вашою та нашою стороною обліку.

Кейс: як потік запитів став передбачуваним за витратою

Вихідна ситуація

Платформа AI-сервісів приймала потік запитів від десятків команд: частина йшла через спільний шлюз, частина — напряму до моделей. Облік токенів і зайнятих прискорювачів вівся у двох різних сервісах, а звірка з фактичним споживанням робилася вручну за вивантаженнями.

При обриві з'єднання й повторних надсиланнях події губилися: до реєстру потрапляла лише частина навантаження.

На кінець періоду частка розбіжностей сягала 15%, час закриття періоду займав до десяти робочих днів, а кількість спірних рахунків ішла на десятки на місяць. Підтримка розбирала претензії за цифрами замість розвитку продукту.

Що змінили

Збір подій винесли в окремий шар: кожне звернення отримує ідентифікатор, а метрика споживання пишеться в журнал до надсилання відповіді, тому втрата запису більше не залежить від доступності сервісу.

Повторні надсилання й дублі відсікаються за ключем ідемпотентності, а дані по інфраструктурі стікаються з Kubernetes з розбивкою за просторами імен і командами. Нічна звірка зіставляє нарахування з журналом і позначає розбіжності до виставлення рахунку.

Результат після впровадження

  • Кількість спірних рахунків скоротилася до одиниць за квартал, частка розбіжностей із фактичним споживанням — з 15% до 0,4%.
  • Час закриття періоду — один робочий день замість десяти.
  • Звернення до підтримки за цифрами впали вчетверо.

Відкат можливий: старий контур обліку працює в режимі порівняння й знімається після двох збіжних періодів.

Чим тарифікація за токенами відрізняється від обліку GPU-годин?

Токенова тарифікація вимірює обсяг обробленого тексту — на вході й на виході, тоді як облік зайнятості прискорювачів рахує час, протягом якого обчислювальний ресурс реально зайнятий задачею. Це різні величини: перша відображає роботу моделі, друга — споживання інфраструктури. Розбіжність між ними тим помітніша, чим неоднорідніший потік запитів.

Для коротких синхронних звернень точніші токени: підготовка, завантаження ваг і перемикання контексту займають зіставний із корисною роботою час, і клієнт із тисячею дрібних запитів платив би за простій прискорювача. Тут токенова тарифікація дає передбачуваний рахунок і прямий зв'язок «обсяг запиту — нарахування».

Тривала обробка — генерація зображень, донавчання, пакетні завдання — влаштована інакше: тексту в них мало, а прискорювач зайнятий годинами.

Токени в такому навантаженні сильно занижують споживання, тому облік зайнятості прискорювачів точніше відображає витрачений ресурс, але потребує коректно відділяти загальний час від корисної завантаженості.

На практиці частіше виграє гібридна модель: токени як база для інтерактивних сценаріїв плюс окрема метрика на час прискорювача для важких завдань.

Вибір метрики обліку робимо за профілем навантаження — частка коротких запитів, наявність пакетів, середня тривалість задачі — і перевіряємо на накопичених журналах звернень, щоб виставлений рахунок сходився з фактичним споживанням.

Часті технічні сумніви перед впровадженням обліку

На технічній зустрічі керівника напряму цікавить не сітка тарифів, а поведінка обліку на граничних сценаріях: складені запити, влучання в кеш, спроби обійти шлюз. Нижче — розбір п'яти сумнівів, які випливають найчастіше.

Мультимодельні запити: як тарифікується відповідь із кількох моделей?

Кожен виклик моделі пишеться окремим записом з ідентифікатором батьківського запиту, тому ланцюжок не згортається в один рядок. Підсумок за операцією збирається з ланок, і видно витрату на кожній — аж до проміжних викликів усередині одного сценарію.

Кешовані відповіді списуються повторно?

Влучання в кеш позначається окремою ознакою й не створює другого нарахування за той самий виклик. Такі звернення йдуть у звіті окремим рядком — видно, яку частку трафіку тримає кеш і де його варто розширити.

Що, якщо команда звертається до моделі напряму, минаючи шлюз?

Ключі видаються лише через шлюз, прямі відкликаються при підключенні, а вихідні звернення до зовнішніх адрес моделей закриті мережевою політикою. Тимчасовий обхід для налагодження маркується й усе одно потрапляє до журналу.

Як влаштований роздільний облік за командами?

Виклик маркується на рівні проєкту, ключа й довільних міток, тому витрата розкладається за командами, продуктами та середовищами без ручного зіставлення. Ієрархія задається один раз, звіти будуються за будь-яким її вузлом.

Чи можна змінити модель тарифікації — наприклад, з токенів на GPU-години?

Правила версіонуються: нова версія діє з дати переходу, а закриті періоди не перераховуються заднім числом. Історію можна перезібрати окремим звітом за новими правилами, не чіпаючи вже виставлені зрізи.

Обговоримо вашу задачу: облік споживання під профіль навантаження

Розмова про білінг AI як сервіс швидше переходить в оцінку, коли на вході є факти про споживання, а не припущення. Нижче — те, що варто підготувати до обговорення: із цим ми одразу бачимо одиниці тарифікації, точки знімання метрик і обсяг робіт з інтеграцій.

  • Профіль навантаження: пікова й середня частота запитів, довжина входу й відповіді, частка потокових відповідей і розподіл за моделями — від цього залежить одиниця обліку.
  • Облік обчислювальних ресурсів: спільний пул або виділені групи, частка пакетної обробки, чи потрібно рахувати простій і резервування GPU-годин.
  • Перелік інтеграцій: шлюз, черги, внутрішні сервіси, панель замовника, системи виставлення рахунків — що віддає події, а що їх лише споживає.
  • Вимоги до звітності: деталізація до користувача, команди й проєкту, період закриття, формати вивантаження, строк зберігання та сценарії звірки із зовнішніми лічильниками постачальника.
  • Склад команд-споживачів: хто отримує доступ, чи потрібні квоти й ліміти, що робити при перевищенні та як повідомляти відповідальних.
  • Правила на межах: неуспішні та повторні запити, частково віддана відповідь, округлення часток — тут найчастіше виникають спірні нарахування.

Опишіть задачу в цих рамках — повернемося з оцінкою, схемою обліку та планом робіт.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142