Расчёт и прогнозирование стоимости API
Напишите вспомогательную программу на Python, которая оценивает стоимость до отправки запроса, подсчитывая токены и применяя расценки для каждой модели, чтобы избежать неожиданных счетов.
«Расчёт и прогнозирование стоимости API» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.
Почему важно прогнозировать затраты
При большом масштабе затраты на API для приложений с LLM могут оказаться неожиданно высокими. Один запрос, который кажется дешёвым при стоимости $0,002, превращается в $200 при 100 000 запусков. Без прогнозирования затрат и мониторинга функции ИИ могут привести к неожиданно большим счетам за облачные ресурсы, которые превысят все расходы на инфраструктуру.
Хорошая новость заключается в том, что затраты на LLM можно полностью предсказать до отправки запроса: Вы знаете модель, можете посчитать входные токены с помощью tiktoken и оценить количество выходных токенов на основе настройки max_tokens или исторических средних значений. Внедрение прогнозирования затрат в приложение с самого начала предотвращает неожиданные счета.
Структура цен OpenAI
OpenAI отдельно взимает плату за входные токены и выходные токены, причём вывод обычно стоит в 3–4 раза дороже. Цены зависят от модели. Ориентиры на 2025 год (всегда проверяйте актуальную страницу с ценами, поскольку они меняются):
- gpt-4o-mini: около $0,15 за миллион входных токенов, около $0,60 за миллион выходных
- gpt-4o: около $2,50 за миллион входных токенов, около $10,00 за миллион выходных
- text-embedding-3-small: около $0,02 за миллион токенов
Разница в стоимости моделей огромна: один входной токен в gpt-4o примерно в 17 раз дороже, чем в gpt-4o-mini. Выбор модели — Ваш главный инструмент управления затратами: всегда начинайте с самой дешёвой модели, которая соответствует требованиям к качеству.
Вспомогательная функция оценки затрат
Создайте средство оценки затрат, которое будет вызываться перед отправкой любого запроса. Оно подсчитывает входные токены с помощью tiktoken, оценивает количество выходных токенов по параметру max_tokens, находит цену для конкретной модели и возвращает примерную стоимость в долларах. Вызывайте его во время разработки и записывайте результаты в журнал, чтобы лучше понимать стоимость запросов разных типов.
import tiktoken
# Prices per million tokens as of early 2025
PRICING = {
'gpt-4o': {'input': 2.50, 'output': 10.00},
'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
'gpt-4-turbo': {'input': 10.00, 'output': 30.00},
'text-embedding-3-small': {'input': 0.02, 'output': 0.0},
}
def estimate_cost(messages, model='gpt-4o-mini', expected_output_tokens=500):
enc = tiktoken.encoding_for_model(model)
input_tokens = sum(
len(enc.encode(m.get('content', ''))) + 4
for m in messages
) + 3
if model not in PRICING:
raise ValueError(f'Unknown model: {model}')
rates = PRICING[model]
input_cost = (input_tokens / 1_000_000) * rates['input']
output_cost = (expected_output_tokens / 1_000_000) * rates['output']
total = input_cost + output_cost
print(f'Model: {model}')
print(f'Input tokens: {input_tokens} (${input_cost:.6f})')
print(f'Est. output tokens: {expected_output_tokens} (${output_cost:.6f})')
print(f'Estimated total: ${total:.6f}')
return totalОтслеживание фактических затрат по ответам API
После каждого вызова API объект ответа содержит фактическое количество использованных токенов. Извлекайте эти данные, чтобы записывать реальные затраты и сравнивать их с оценками. Со временем разница между оценочным и фактическим количеством выходных токенов покажет, насколько точно Вы прогнозируете использование, а журналы предоставят разбивку затрат по функциям или группам пользователей.
import openai
client = openai.OpenAI()
PRICING = {
'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
}
def chat_with_cost_tracking(model, messages):
response = client.chat.completions.create(
model=model, messages=messages
)
usage = response.usage
rates = PRICING.get(model, {'input': 0, 'output': 0})
actual_cost = (
(usage.prompt_tokens / 1_000_000) * rates['input'] +
(usage.completion_tokens / 1_000_000) * rates['output']
)
print(f'Input: {usage.prompt_tokens} tokens')
print(f'Output: {usage.completion_tokens} tokens')
print(f'Total: {usage.total_tokens} tokens')
print(f'Actual cost: ${actual_cost:.6f}')
return response, actual_costПрогнозирование ежемесячных затрат
Когда известны средняя стоимость запроса и ожидаемый объём запросов, прогнозировать ежемесячные затраты несложно. Создайте электронную таблицу с моделью затрат или простой скрипт на Python, позволяющий проверять разные предположения: что произойдёт, если число ежедневно активных пользователей удвоится? Что произойдёт, если добавить функцию, которая выполняет 3 вызова API вместо 1 на одно действие пользователя?
def project_monthly_cost(
avg_cost_per_request,
requests_per_day,
days=30
):
daily_cost = avg_cost_per_request * requests_per_day
monthly_cost = daily_cost * days
print(f'Avg cost/request: ${avg_cost_per_request:.6f}')
print(f'Requests/day: {requests_per_day:,}')
print(f'Daily cost: ${daily_cost:.2f}')
print(f'Monthly cost: ${monthly_cost:.2f}')
# Growth scenarios
for multiplier in [2, 5, 10]:
scaled = monthly_cost * multiplier
print(f' At {multiplier}x traffic: ${scaled:.2f}/month')
# Example: customer support bot
project_monthly_cost(
avg_cost_per_request=0.002, # 2 cents per support query
requests_per_day=5000
)Влияние выбора модели на затраты
Самый эффективный способ снизить затраты — использовать самую дешёвую модель, соответствующую требованиям к качеству. Во многих задачах gpt-4o-mini работает на сопоставимом уровне с gpt-4o, но стоит примерно в 17 раз дешевле. Прежде чем выбрать самую мощную модель по умолчанию, сравните более дешёвую модель на Вашей конкретной задаче и переходите на более дорогую только в том случае, если качество опускается ниже установленного порога.
Ещё эффективнее стратегия маршрутизации по уровням: классифицируйте входящие запросы по сложности, направляя простые запросы к дешёвым моделям, а сложные — к дорогим. Даже если направлять 70% запросов к дешёвой модели, а 30% — к дорогой, можно сэкономить примерно 70% затрат на ИИ.
Длина запроса и стоимость
Каждый токен в Вашем запросе стоит денег. Подробный системный запрос, который можно сократить без потери смысла, напрямую увеличивает Ваш счёт за API при каждом запросе. Измеряйте количество токенов в своих запросах и ищите возможности сделать формулировки лаконичнее. Аналогично, длинные примеры для обучения по нескольким образцам часто можно заменить более короткими эквивалентами без ущерба для точности.
В системах RAG извлечённый контекст часто составляет наибольшую часть запроса. Возврат 10 больших фрагментов, когда достаточно 3 грамотно выбранных небольших фрагментов, приводит к потере токенов при каждом запросе. Настройте извлечение так, чтобы минимизировать избыточный контекст и одновременно максимизировать релевантность.
Пакетная обработка для снижения затрат
OpenAI предлагает пакетный API, который обрабатывает запросы асинхронно со скидкой 50% от стандартной цены. Если в Вашем случае задержка не критична — например, при обработке документов, ночном анализе или массовой генерации контента, — пакетный API позволит вдвое сократить затраты при минимальных изменениях кода.
Пакетные запросы отправляются в виде файлов JSONL, обрабатываются в течение 24 часов, а результаты извлекаются через API. Это идеально подходит для конвейеров предварительной обработки, которые запускаются по расписанию и не требуют ответов в реальном времени.
import openai
import json
client = openai.OpenAI()
# Create batch request file
requests = [
{'custom_id': f'doc-{i}',
'method': 'POST',
'url': '/v1/chat/completions',
'body': {
'model': 'gpt-4o-mini',
'messages': [{'role': 'user', 'content': f'Summarize document {i}'}],
'max_tokens': 200
}}
for i in range(100)
]
# Write to JSONL
with open('/tmp/batch_input.jsonl', 'w') as f:
for req in requests:
f.write(json.dumps(req) + '\n')
# Upload and submit (50% off list price)
print('Would submit batch for 100 documents at 50% discount')
# batch_file = client.files.create(file=open('/tmp/batch_input.jsonl','rb'), purpose='batch')
# batch = client.batches.create(input_file_id=batch_file.id, endpoint='/v1/chat/completions', completion_window='24h')Установка лимитов расходов
Всегда устанавливайте лимиты расходов, чтобы предотвратить неконтролируемый рост затрат. В панели управления OpenAI можно задать месячные лимиты расходов, после достижения которых доступ к API будет отключён. Установите жёсткий лимит на уровне максимально приемлемой суммы, а мягкий — на уровне 80% от неё, чтобы получить предупреждение по электронной почте до достижения жёсткого лимита.
В коде приложения реализуйте бюджет для каждого пользователя или функции и храните его в базе данных. Проверяйте бюджет перед каждым вызовом API и возвращайте ошибку, если он исчерпан. Это не позволит одному пользователю с неконтролируемым поведением или ошибке в пакетном задании израсходовать всю Вашу месячную квоту за несколько часов.
Кэширование для предотвращения повторных вызовов API
Самый дешёвый вызов API — тот, который Вы вообще не выполняете. Реализуйте кэширование на уровне приложения, чтобы возвращать идентичные запросы из кэша, а не снова обращаться к API. Даже простой кэш Redis с ключом в виде хэша SHA256 запроса может устранить значительную долю повторных вызовов в рабочем приложении.
Для векторных представлений кэширование особенно эффективно: один и тот же текст следует преобразовывать в вектор только один раз. Храните векторные представления в своей векторной базе данных, используя исходный текст в качестве ключа, и проверяйте наличие существующего представления перед вызовом API векторизации. В конвейере RAG векторные представления документов вычисляются один раз во время индексации и используются повторно для каждого запроса, при котором эти документы извлекаются.
import hashlib
import json
# Simple in-memory cache (use Redis in production)
_cache = {}
def cached_completion(client, model, messages, **kwargs):
cache_key = hashlib.sha256(
json.dumps({'model': model, 'messages': messages}).encode()
).hexdigest()
if cache_key in _cache:
print('Cache HIT - no API call made')
return _cache[cache_key]
response = client.chat.completions.create(
model=model, messages=messages, **kwargs
)
_cache[cache_key] = response
print('Cache MISS - API call made')
return responseСоздание панели мониторинга затрат
В рабочей среде Вам необходимо видеть затраты на ИИ с разбивкой по функциям, пользователям и моделям. Создайте панель мониторинга затрат: записывайте сведения о количестве токенов и связанные метаданные каждого вызова API (идентификатор пользователя, название функции, модель) в базу данных временных рядов. Затем выполняйте агрегацию, чтобы отвечать на такие вопросы: какая функция приводит к наибольшим расходам? Не создают ли опытные пользователи непропорционально высокие затраты? Растёт ли стоимость запроса после изменения запроса к модели?
Такая прозрачность необходима для принятия решений по оптимизации на основе данных, а не для предположений о том, где следует сокращать расходы. Большинство компаний обнаруживают, что 20% их функций обеспечивают 80% затрат на ИИ, поэтому оптимизация этих функций даёт непропорционально большой результат.
Быстрая проверка
Проверьте, насколько хорошо Вы усвоили концепции разработки систем ИИ из этого урока.
Итоги урока
В этом уроке Вы узнали, что стоимость API можно спрогнозировать до отправки запроса, подсчитав входные токены с помощью инструмента для подсчёта токенов и оценив количество выходных токенов, выбор модели — самый эффективный способ снизить затраты: gpt-4o-mini может быть в 17 раз дешевле gpt-4o для подходящих задач, а кэширование, пакетная обработка и лимиты расходов предотвращают неконтролируемый рост затрат в рабочей среде. Далее мы рассмотрим стратегии управления длинными беседами, которые превышают размер контекстного окна.
Часто задаваемые вопросы
Урок «Расчёт и прогнозирование стоимости API» бесплатный?
Да — полный текст урока «Расчёт и прогнозирование стоимости API» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.
Чему я научусь в уроке «Расчёт и прогнозирование стоимости API»?
Напишите вспомогательную программу на Python, которая оценивает стоимость до отправки запроса, подсчитывая токены и применяя расценки для каждой модели, чтобы избежать неожиданных счетов. Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Engineering Academy?
Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Расчёт и прогнозирование стоимости API»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Engineering Academy?
Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое токен
- Контекстные окна: размер и последствия
- Расчёт и прогнозирование стоимости API
- Стратегии соблюдения ограничений контекста