/
Вопросы и ответы
/
Промт-инжиниринг
/

Как снизить стоимость API-вызовов к LLM?

Как снизить стоимость API-вызовов к LLM?

10 часов назад

Никита Вихров

Ответы

0

Как снизить стоимость API-вызовов к LLM

LLM-API стоит денег. На прототипе это незаметно — в продакшне с тысячами запросов в день счёт может удивить. Разберём конкретные способы снизить расходы без потери качества.


Считай токены до деплоя

from anthropic import Anthropic

client = Anthropic()

system_prompt = open("prompts/system.txt").read()
sample_messages = [
    {"role": "user", "content": "Типичный вопрос пользователя длиной около ста символов"},
]

token_count = client.messages.count_tokens(
    model="claude-opus-4-5",
    system=system_prompt,
    messages=sample_messages
)

# Стоимость claude-opus-4-5: $15 за 1M input токенов
cost_per_request = (token_count.input_tokens / 1_000_000) * 15
print(f"Токенов на запрос: {token_count.input_tokens}")
print(f"Стоимость одного запроса: ${cost_per_request:.4f}")
print(f"Стоимость 10 000 запросов/день: ${cost_per_request * 10_000:.2f}")
print(f"Стоимость в месяц: ${cost_per_request * 10_000 * 30:.2f}")

Считай до деплоя, а не после первого счёта.


Выбирай модель под задачу

Не все задачи требуют самой мощной модели:

def route_to_model(task_type: str, complexity: str) -> str:
    """Выбирает модель по типу и сложности задачи"""

    # Простые задачи: классификация, извлечение данных, форматирование
    if task_type in ["classify", "extract", "format"]:
        return "claude-haiku-4-5"  # быстро и дёшево

    # Средние: суммаризация, генерация контента, вопрос-ответ
    if task_type in ["summarize", "generate", "qa"] and complexity == "low":
        return "claude-sonnet-4-5"  # баланс цена/качество

    # Сложные: анализ кода, рассуждения, сложные агентные задачи
    return "claude-opus-4-5"  # лучшее качество


# Разница в цене:
# claude-haiku-4-5:  $0.25 / 1M input токенов
# claude-sonnet-4-5: $3.00 / 1M input токенов
# claude-opus-4-5:   $15.00 / 1M input токенов

# На простых задачах Haiku в 60 раз дешевле Opus

Кэшируй системный промпт

Если системный промпт одинаков во всех запросах — Anthropic может кэшировать его и не считать повторно:

response = client.messages.create(
    model="claude-opus-4-5",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": long_system_prompt,
            "cache_control": {"type": "ephemeral"}  # кэшируем промпт
        }
    ],
    messages=messages
)

# При повторном запросе с тем же промптом:
# - cache_read_input_tokens: токены из кэша (в 10x дешевле)
# - cache_creation_input_tokens: токены для создания кэша (в 1.25x дороже, но разово)
# - input_tokens: обычные входные токены

usage = response.usage
print(f"Из кэша: {usage.cache_read_input_tokens}")
print(f"Создание кэша: {usage.cache_creation_input_tokens}")
print(f"Обычные: {usage.input_tokens}")

Кэш эффективен когда системный промпт большой (>1000 токенов) и один и тот же промпт используется во многих запросах.


Кэшируй детерминированные ответы

Одинаковые вопросы — одинаковые ответы. Не плати дважды:

import hashlib
import json
import redis

cache = redis.Redis()

def cached_llm_call(
    system: str,
    user_message: str,
    model: str = "claude-haiku-4-5",
    ttl: int = 3600  # 1 час
) -> str:
    # Ключ кэша = хэш от всех параметров
    cache_key = hashlib.sha256(
        json.dumps({"system": system, "message": user_message, "model": model}).encode()
    ).hexdigest()

    # Проверяем кэш
    cached = cache.get(cache_key)
    if cached:
        return cached.decode()

    # Делаем запрос
    response = client.messages.create(
        model=model,
        max_tokens=1024,
        system=system,
        messages=[{"role": "user", "content": user_message}]
    )

    result = response.content[0].text

    # Сохраняем в кэш
    cache.setex(cache_key, ttl, result)
    return result

Подходит для классификации, извлечения данных, FAQ — где ответ на одинаковый вопрос одинаков.


Сокращай промпт без потери качества

# Было: 450 токенов
verbose_prompt = """Пожалуйста, проанализируй предоставленный текст и определи,
какое настроение он выражает. Возможные варианты настроения включают в себя:
положительное, отрицательное или нейтральное. После тщательного анализа
предоставь свой ответ в виде одного слова."""

# Стало: 28 токенов — то же самое
concise_prompt = """Определи настроение текста: positive/negative/neutral.
Отвечай одним словом."""

# Экономия: ~93% токенов промпта

Audit системных промптов раз в месяц — часто находятся устаревшие инструкции, примеры которые давно не нужны, повторяющиеся фразы.


На курсе «ИИ для разработчиков» на Хекслете разбирают как выстраивать экономичный AI-workflow: выбор моделей, кэширование, мониторинг расходов в продакшне.

10 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845