Як не втратити бюджет на LLM: token counting і бюджетування
Уявіть: команда розробників інтегрувала GPT-4 для обробки запитів клієнтів, а за місяць рахунок за API зріс до $5000 замість очікуваних $500. Причина — кожен запит містив системний промпт на 2000 токенів, а дублюючі запити не кешувалися. Token counting і бюджетування — це не опція, а необхідність для будь-якого продакшену, що працює з LLM. Без них ви ризикуєте отримати рахунок у 5–10 разів більший за очікування. OpenAI підтверджує, що token counting знижує витрати на 20–40%.
Ми впровадили систему управління витратами для SaaS-платформи з 10 000 щоденних запитів до GPT-4 і Claude. Результат: зниження витрат на 35% за перший місяць. Як ми це зробили і як повторити успіх — розберемо нижче.
Чому важливо бюджетувати запити LLM?
LLM-запити непередбачувані за вартістю: довжина вихідного токену варіюється, а системні промпти часто роздуваються без контролю. Без бюджетування легко отримати рахунок у 5–10 разів більший за очікування. Бюджетування вирішує три завдання:
- Запобігання перевитратам: алерти при перевищенні денного або місячного ліміту.
- Оптимізація вартості: виявлення неефективних промптів і моделей.
- Прозорість для команд: дашборди з деталізацією по користувачах, функціях і моделях.
Як працює token counting у продакшені?
Token counting — це оцінка кількості токенів запиту до відправлення. Для OpenAI використовуємо бібліотеку tiktoken, для Anthropic — вбудований лічильник. Приклад підрахунку:
import tiktoken def count_tokens_openai(text: str, model: str = "gpt-4") -> int: enc = tiktoken.encoding_for_model(model) return len(enc.encode(text)) def estimate_request_cost(prompt: str, max_completion: int = 1000, model: str = "gpt-4-turbo") -> dict: input_tokens = count_tokens_openai(prompt, model) total_tokens = input_tokens + max_completion prices = { "gpt-4-turbo": {"input": 10.0, "output": 30.0}, "gpt-4o": {"input": 5.0, "output": 15.0}, "gpt-4o-mini": {"input": 0.15, "output": 0.60}, "claude-3-5-sonnet": {"input": 3.0, "output": 15.0}, } price = prices.get(model, {"input": 10.0, "output": 30.0}) estimated_cost = (input_tokens / 1_000_000 * price["input"] + max_completion / 1_000_000 * price["output"]) return {"input_tokens": input_tokens, "max_output_tokens": max_completion, "estimated_cost_usd": estimated_cost} Оцінка вартості дозволяє відхиляти запити, що перевищують ліміт користувача або команди.
Як знизити витрати на LLM?
Один із ефективних методів — автоматичний роутинг моделей. Наприклад, для простих завдань (вилучення даних, базова класифікація) використовуємо GPT-4o-mini, який у 10 разів дешевший за GPT-4-turbo, але дає порівняні результати. Для складних генерацій залишаємо топові моделі. У нашому кейсі це знизило середню вартість запиту з $0.03 до $0.008.
Також впроваджуємо кешування: дублюючі запити (наприклад, повторні питання від користувачів) обслуговуємо з Redis-кешу, що економить до 40% бюджету. Використовуємо LRU-кеш з TTL 24 години.
Система бюджетування з Redis і Middleware
Для зберігання лімітів використовуємо Redis — він швидкий і підтримує атомарні операції. Структура бюджету:
from dataclasses import dataclass, field import threading @dataclass class TokenBudget: daily_limit_usd: float monthly_limit_usd: float per_user_daily_limit_usd: float = 1.0 spent_today: float = field(default=0.0) spent_month: float = field(default=0.0) _lock: threading.Lock = field(default_factory=threading.Lock) class LLMBudgetManager: def __init__(self, redis_client, budget: TokenBudget): self.redis = redis_client self.budget = budget def check_and_reserve(self, user_id: str, estimated_cost: float) -> bool: """Перевірка бюджету перед запитом""" daily_spent = float(self.redis.get(f"budget:daily") or 0) if daily_spent + estimated_cost > self.budget.daily_limit_usd: raise BudgetExceededError(f"Денний бюджет ${self.budget.daily_limit_usd} перевищено") user_spent = float(self.redis.get(f"budget:user:{user_id}:daily") or 0) if user_spent + estimated_cost > self.budget.per_user_daily_limit_usd: raise BudgetExceededError(f"Денний бюджет користувача ${self.budget.per_user_daily_limit_usd} перевищено") pipe = self.redis.pipeline() pipe.incrbyfloat(f"budget:daily", estimated_cost) pipe.expire(f"budget:daily", 86400) pipe.incrbyfloat(f"budget:user:{user_id}:daily", estimated_cost) pipe.expire(f"budget:user:{user_id}:daily", 86400) pipe.execute() return True def record_actual_cost(self, user_id: str, actual_cost: float, estimated_cost: float): correction = actual_cost - estimated_cost if abs(correction) > 0.001: self.redis.incrbyfloat("budget:daily", correction) Middleware для автоматичного обліку витрат
import functools def track_llm_cost(model: str = "gpt-4o"): def decorator(func): @functools.wraps(func) async def wrapper(*args, **kwargs): result = await func(*args, **kwargs) if hasattr(result, 'usage'): cost = compute_cost(result.usage.prompt_tokens, result.usage.completion_tokens, model) analytics.record(function=func.__name__, model=model, cost=cost, input_tokens=result.usage.prompt_tokens, output_tokens=result.usage.completion_tokens) return result return wrapper return decorator Типовий результат впровадження: зниження витрат на LLM на 20–40% за рахунок виявлення неефективних запитів (довгі непотрібні системні промпти, дублюючі запити без кешування) та правильного вибору моделі для кожного завдання.
Практичні результати token counting
Без підрахунку токенів ви не знаєте, скільки витрачаєте на кожен запит. Ми впровадили дашборди в Grafana, де видно вартість за користувачами, моделями та функціями. Це дозволило замовнику виявити, що 30% запитів — це повторення з однаковими промптами. Після включення кешу — економія $1500 на місяць. Хочете таку ж економію? Пишіть нам для консультації.
Порівняння моделей за вартістю
Різниця у вартості між GPT-4-turbo та GPT-4o-mini може сягати 66 разів за вхідними токенами і 50 разів за вихідними. Це робить вибір моделі ключовим фактором економії. Для простих завдань (класифікація, вилучення) використовуйте легкі моделі, для складних — топові. Роутинг запитів за складністю — стандартна практика.
| Модель | Вхідні токени (за 1М) | Вихідні токени (за 1М) |
|---|---|---|
| GPT-4-turbo | $10.00 | $30.00 |
| GPT-4o | $5.00 | $15.00 |
| GPT-4o-mini | $0.15 | $0.60 |
| Claude 3.5 Sonnet | $3.00 | $15.00 |
Які типові помилки при бюджетуванні LLM?
Ми часто стикаємося з однаковими помилками: ігнорування системних промптів, відсутність кешування, використання дорогої моделі для простих завдань, відсутність лімітів на користувача та моніторингу. Кожна з них може збільшити витрати в 10–50 разів. Рішення — впровадити token counting, алерти та роутинг моделей.
Покрокове налаштування token counting
- Підключіть бібліотеку tiktoken.
- Реалізуйте функцію підрахунку токенів для вашої моделі.
- Оцініть вартість запиту за цінами моделі.
- Додайте перевірку бюджету перед викликом API.
- Налаштуйте логування та дашборди.
Що входить в роботу з впровадження системи бюджетування
Ми пропонуємо впровадження системи token counting і бюджетування під ключ. В рамках проекту:
- Аудит поточної архітектури та профілю запитів.
- Інтеграція tiktoken і Anthropic SDK у ваш код.
- Налаштування Redis для зберігання лімітів та статистики.
- Реалізація middleware для автоматичного обліку.
- Дашборди моніторингу (Grafana + Prometheus) з доступом для вашої команди.
- Навчання команди та документація.
- Підтримка протягом місяця після впровадження.
Наш досвід у MLOps — понад 5 років, ми реалізували системи бюджетування для компаній з навантаженням до 1 млн запитів на день. Ми гарантуємо зниження витрат на 20–40% завдяки перевіреним методикам. Сертифіковані фахівці з MLOps забезпечують якість. Терміни впровадження: 2–4 тижні для базової системи, до 6 тижнів для складних архітектур. Пишіть нам для оцінки вашого проекту — безкоштовна консультація.







