Что такое «token budget» для агента и как его выставлять?

Краткий тезис

budget — это заранее установленный лимит на количество токенов, которые агент может потратить за один call|вызов LLM, за одну сессию взаимодействия или за календарный период (день/месяц). Правильная настройка budget критична для контроля стоимости работы агента, предотвращения зацикленных или бесконечных цепочек вызовов и безопасной эскалации к человеку при превышении лимита. Бюджет выставляется на основе эмпирических замеров средней сложности задач, стоимости модели и допустимого времени ответа, а затем корректируется через мониторинг реального потребления.


1. Термин: Token budget (бюджет токенов)

budget — это максимальное количество токенов (единиц обработки LLM), которое агент может израсходовать в рамках одного или нескольких последовательных вызовов языковой модели. Токены включают как входные (prompt + контекст), так и выходные (сгенерированный ответ). Бюджет задаётся на трёх основных уровнях:

  • Per task — на одну задачу (один полный цикл "мысль → действие → наблюдение");
  • Per session — на одну сессию пользователя (несколько задач в рамках одного диалога);
  • Per month — на аккаунт/пользователя/проект (суммарный лимит за месяц).

Зачем нужен budget? Без него агент может:

  • попасть в бесконечный цикл вызовов (например, при плохо спроектированных цепочках мыслей);
  • чрезмерно накручивать стоимость API (особенно при длинных контекстах);
  • генерировать ответы, не укладывающиеся в ограничения по времени или ёмкости памяти.

2. Уровни бюджета: сравнение

УровеньТипичный лимитПримерКогда применятьРиски при превышении
Per task1000–8000 токенов (вход+выход)4000 input + 1000 outputПростые одношаговые командыАгент не завершит задачу полностью
Per session10 000–100 000 токенов50 000 на диалогМногошаговые рассуждения, планированиеСессия прерывается, потеря контекста
Per month1 000 000–10 000 000 токенов5 млн на пользователяSaaS-продукты, корпоративные аккаунтыБлокировка доступа, дополнительные счета

Как видно, бюджет per task — самый детальный и критичный для архитектуры агента. Именно его мы настраиваем в первую очередь.


3. Как выставлять token budget?

Выставление бюджета — итеративный процесс, сочетающий эмпирику, анализ модели и мониторинг.

3.1 Эмпирический метод

  1. Запустите агента без ограничений на 10–100 типовых задач.
  2. Соберите статистику: количество токенов на вход, на выход, общее за задачу.
  3. Возьмите перцентиль 95 (P95) или 99 (P99) от распределения — это и будет per task budget.
  4. Для per session — сложите типичное число шагов задачи, умножьте на per task budget, добавьте запас 20–30%.

Пример:

  • P95 токенов на задачу = 5000.
  • Обычно задача решается за 3 шага → бюджет сессии = 3 × 5000 × 1,2 = 18 000 токенов.

3.2 Основанный на модели

Если известны лимиты контекстного окна LLM (например, GPT-4 Turbo – 128k), бюджет можно выставить как долю от окна:

  • Per task 10–25% от максимального окна (чтобы оставалось место для истории взаимодействия).
  • Per session 50–75% от окна, чтобы не перегружать модель.

3.3 Мониторинговый метод

Используйте инструменты логирования (LangSmith, Weights & Biases, собственный счётчик) для отслеживания фактического потребления. На основе трендов корректируйте бюджет: если 20% задач превышают текущий лимит, пора его увеличивать.


4. Механизмы при превышении token budget

Когда агент достигает лимита, система должна реагировать предсказуемо. Типовые механизмы:

  • Остановка (hard stop): агент немедленно завершает выполнение, возвращает сообщение пользователю "Лимит токенов исчерпан".
  • Урезание контекста (truncation): автоматически обрезается самая старая часть истории, чтобы уложиться в budget (например, суммирование предыдущих шагов).
  • Эскалация человеку (human handoff): агенту не хватает бюджета — он передаёт управление оператору с частичным контекстом.
  • Динамическое расширение если задача признана важной (например, VIP-пользователь), бюджет может быть увеличен до следующего уровня.

На практике комбинируют: сначала обрезают контекст, при повторном превышении — эскалация.


5. Мониторинг и оповещения

Мониторинг строится на журналировании каждого вызова LLM. Важные метрики:

  • Budget usage процент использованного бюджета от лимита.
  • Token overshoot на сколько токенов превышен лимит (для анализа).
  • Cost per task стоимость одного выполнения.

Рекомендуется настроить алерт при 80% usage — это даёт время на реакцию до полного исчерпания бюджета.

Пример структуры лога (JSON):

{
  "session_id": "sess_001",
  "task_id": "task_001",
  "step": 2,
  "input_tokens": 1200,
  "output_tokens": 340,
  "total_used": 1540,
  "budget_per_task": 2000,
  "budget_remaining": 460,
  "timestamp": "2025-03-15T10:30:00Z"
}

6. Пример кода на Python: счётчик и проверка бюджета

Демонстрация простой реализации для агента на основе OpenAI API:

import time
from openai import OpenAI

class AgentWithBudget:
    def __init__(self, client: OpenAI, per_task_budget: int = 5000, model: str = "gpt-4"):
        self.client = client
        self.per_task_budget = per_task_budget
        self.model = model
        self.total_used = 0
        self.task_used = 0
    
    def _count_tokens(self, messages: list) -> int:
        # Упрощённый подсчёт: длина строки * коэффициент (в реальности — tiktoken)
        total = sum(len(str(m["content"])) for m in messages) // 4
        return total
    
    def call_llm(self, messages: list) -> str:
        prompt_tokens = self._count_tokens(messages)
        if prompt_tokens + 200 > self.per_task_budget - self.task_used:
            raise BudgetExceeded("Превышен бюджет задачи")
        
        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            max_tokens=min(200, self.per_task_budget - self.task_used - prompt_tokens)
        )
        used = prompt_tokens + response.usage.completion_tokens
        self.task_used += used
        self.total_used += used
        return response.choices[0].message.content

class BudgetExceeded(Exception):
    pass

Пояснения:

  • per_task_budget — лимит на одну задачу.
  • task_used сбрасывается при старте новой задачи.
  • При превышении выбрасывается исключение — агент может его перехватить и выполнить эскалацию.

7. Связь с токенизацией и стоимостью LLM

Token budget напрямую влияет на cost per task. Стоимость вызова = (input_tokens × price_input) + (output_tokens × price_output). Например, для GPT-4 (2024): $0.03 за 1k входных, $0.06 за 1k выходных. Если budget per task = 5000 токенов (скажем, 4000 input + 1000 output), то максимальная стоимость одной задачи ≈ ($0.03×4) + ($0.06×1) = $0.18.

Зная бюджет, можно оценить:

  • стоимость тысячи решённых задач;
  • ежемесячные расходы на агента;
  • точку окупаемости по сравнению с ручной обработкой.

8. Практические советы по настройке

  • Начинайте с консервативных значений например, 2000 токенов per task, 20 000 per session.
  • Для multi-step агентов (ReAct, Plan-and-Execute) считайте бюджет на шаг: каждый шаг потребляет токены на размышление, действие и наблюдение.
  • Используйте динамический budget если задача простая (например, получить погоду), лимит мал; для сложных резюмирований — больше.
  • Отслеживайте тренды если среднее потребление растёт, возможно, агент стал галлюцинировать или зацикливаться.
  • Разделяйте бюджет на "наблюдение" (observation) и "действие" (action): можно жёстко ограничить длину ответа модели, но разрешить большой контекст.

Пет-проект для закрепления

Задача Разработать агента-исследователя, который получает запрос пользователя, формулирует несколько поисковых запросов к веб-поиску, анализирует результаты и даёт сводку. Агент должен иметь настраиваемый token budget и механизм эскалации при превышении.

Инструменты Python, OpenAI API, tiktoken для точного подсчёта токенов, requests для поиска (можно имитировать), библиотека logging.

Шаги:

  1. Напишите класс AgentWithTokenBudget, который принимает per_task_budget и max_steps.
  2. Внутри каждого шага (вызов LLM для формулировки запроса, обдумывания результатов) используйте tiktoken для подсчёта токенов.
  3. После каждого шага проверяйте остаток бюджета; если он меньше 200 токенов, вызовите _escalate() — отправьте уведомление в лог и верните частичный результат пользователю.
  4. Ведите CSV-лог по каждому вызову: step, input_tokens, output_tokens, accumulated.
  5. Запустите на 10 случайных запросах, соберите статистику, подберите оптимальный per_task_budget через анализ P95.

Ожидаемый результат

  • Скрипт агента, который ни разу не превышает заданный бюджет и корректно завершается или эскалирует.
  • График распределения потребления токенов (гистограмма) с указанием P50, P95.
  • Рекомендация по выставлению бюджета для конкретной модели.

Связь с другими вопросами

ВопросТема
5Оценка качества retrieval в RAG
7Уменьшение latency RAG-системы
10Self-RAG и когда его использовать
778Понятие "tool use" в агентах
780Стратегии reranking в Agentic RAG
785Мониторинг затрат на LLM в продакшене

Навигация