# Забудьте вечный ReAct: как заставить ИИ-агента повторять рутину и срезать 96% расходов на токены
Каноническая страница: https://plainews.ru/posts/zabudte-vechnyy-react-kak-zastavit-ii-agenta-povtoryat-rutinu-i-srezat-96-rashod
Опубликовано: 2026-10-16T07:04:11.567Z

Когда разработчик поручает автономному ИИ агенту регулярную задачу — например, еженедельный парсинг и аудит прайс листов поставщиков с поиском рыночных цен — пе
Когда разработчик поручает автономному ИИ-агенту регулярную задачу — например, еженедельный парсинг и аудит прайс-листов поставщиков с поиском рыночных цен — первый прогон кажется магией. Но при следующем запуске агент заново перебирает инструменты, блуждает по шагам, сжигает бюджет на рассуждения и выдает отчет в совершенно другой структуре.

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

## Сколько стоит перепланирование в агентном цикле

Агентный запуск стандартно работает как цикл ReAct (Reasoning + Acting): модель считывает контекст, выбирает тул (инструмент), получает результат выполнения и заново прогоняет раздувшийся контекст через LLM на следующем витке. Входной контекст накапливается лавинообразно, увеличивая задержку (latency) и чек за API.

Представим типовой сценарий сверки цен на 10 последовательных шагов:

- Системный промпт с описанием доступных тулов забирает 8 000 токенов.
- Каждый промежуточный шаг (вызов инструмента и возвращенный payload) добавляет в контекст по 1 500 токенов.
- Суммарный входной поток за 10 вызовов рассчитывается по нарастающей: $8000 + (8000 + 1500) + (8000 + 3000) + \dots + (8000 + 13500) = 147 500$ входных токенов.

Если вынести логику в детерминированную структуру (граф или код), модель вызывается всего один раз — в финальном узле аналитики, получая чистые агрегированные данные объемом 6 000 токенов. Разница по входным токенам достигает 25 раз, а цепочка из десяти долгих сетевых запросов схлопывается в единичный вызов.

| Архитектурный уровень | Кто строит план при повторе | Входные токены (10 шагов) | Устойчивость к смене формата | Риск галлюцинаций в логике |
| --- | --- | --- | --- | --- |
| 1. Сохраненный промпт | Модель с нуля на каждом запуске | ~147 500 токенов | Высокая (адаптируется сама) | Высокий |
| 2. Скиллы (Agent Skills) | Модель по жесткой инструкции | ~50 000 – 90 000 токенов | Средняя | Умеренный |
| 3. Граф шагов (Graph) | Жесткий граф узлов + модель | ~6 000 токенов | Низкая (требует правок графа) | Минимальный |
| 4. Детерминированный код | Python/JS код (без LLM в логике) | 0 токенов (только финальный анализ) | Нулевая (ломается от сдвига колонок) | Нулевой |

> **К сведению.** Префиксное кэширование (Automatic Prefix Caching в vLLM или Prompt Caching в облачных API) срезает стоимость повторяющегося системного промпта и общего контекста, но не избавляет от задержек: модель все равно делает 10 последовательных вызовов.

## Уровень 1: Запуск по расписанию и триггерам

Самый простой вариант — сохранить текст запроса и повесить его на триггер. Планирование здесь целиком остается внутри LLM: на каждый запуск открывается новая изолированная сессия, где агент формирует цепочку действий заново.

Подобный подход реализован вендорами "из коробки":

1. **ChatGPT (Scheduled Tasks):** три режима работы (разовый/повторяющийся по расписанию, мониторинг изменений, триггеры по событиям). Событийные задачи отслеживают новые письма в Gmail, сообщения в каналах Slack или обновления pull request в GitHub. Лимит платформы: не более 30 срабатываний в час и не более 720 в сутки на пользователя.
2. **Claude Cowork:** запуск по расписанию через команду /schedule. Сценарий можно написать с нуля либо выполнить задачу вручную, после чего Claude преобразует успешный сеанс в периодический промпт. Внутри проектов Cowork действует общая память, связывающая контекст соседних запусков.
3. **Claude in Chrome:** пользователь включает режим записи действий в браузере, а платформа транслирует клики и переходы в воспроизводимый шорткат.

Плюс метода — гибкость: если поставщик внезапно переименует колонку «Цена с НДС» в «Прайс (брутто)», агент разберется на лету. Минус — непредсказуемый формат итогового отчета и максимальная стоимость выполнения.

## Уровень 2: Упаковка логики в открытый формат скиллов

Скилл (Agent Skill) — это стандартизированная папка с файлом SKILL.md и вспомогательными скриптами. Спецификацию предложила компания Anthropic для Claude Code, после чего формат стал открытым стандартом для Codex, ChatGPT, Gemini CLI, Cursor и GitHub Copilot.

Скилл организует контекст через механизм progressive disclosure (поэтапное раскрытие): система не скармливает модели всю документацию сразу, а держит в постоянной памяти лишь метаданные.

Типовая структура директории скилла:

```plain
price-audit/
├── SKILL.md
├── scripts/
│   ├── read_price.py
│   └── deviation.py
└── assets/
    └── report_template.xlsx
```

Файл SKILL.md содержит фронтмэттер (YAML-шапку) и markdown-инструкцию:

```plain
---
name: price-audit
description: Сверка прайс-листов поставщиков с рыночными данными и генерация отчета
---
# Инструкция по выполнению аудита

1. Запусти скрипт парсинга входного файла: `python scripts/read_price.py --file <input_path>`
2. Для каждой позиции рассчитай дельту через `python scripts/deviation.py`
3. Сформируй итоговый файл, взяв за основу assets/report_template.xlsx
```

Подключение скилла кардинально снижает энтропию: модель больше не фантазирует архитектуру пайплайна, а исполняет детерминированные скрипты из папки scripts/. Расход токенов падает, так как тяжелые расчеты уходят в локальный рантайм Python.

## Уровень 3: Фиксация пайплайна графом состояний

Когда логика стабилизировалась, цикл рассуждений устраняют полностью. Задачу оборачивают в граф (state graph), где каждый шаг — это изолированная функция, а модель привлекается точечно.

Инструменты вроде LangGraph или n8n позволяют собрать жесткую цепочку: чтение файла $\to$ валидация колонок $\to$ HTTP-запрос к API цен $\to$ расчет дельты $\to$ узел LLM для краткого резюме аномалий $\to$ отправка в Slack.

Пример минимального узла валидации и подготовки контекста на Python:

```python
import pandas as pd
from typing import Dict, Any

def process_price_feed(file_path: str, threshold: float = 0.15) -> Dict[str, Any]:
    df = pd.read_excel(file_path)
    # Детерминированный расчет без привлечения LLM
    df["deviation"] = (df["market_price"] - df["supplier_price"]) / df["market_price"]
    anomalies = df[df["deviation"].abs() > threshold]
    
    return {
        "total_positions": len(df),
        "anomalies_count": len(anomalies),
        "payload_for_llm": anomalies.to_dict(orient="records")
    }
```

Модели больше не передается 5 000 строк исходного прайса и системные промпты десяти тулов. Она получает компактный JSON с отфильтрованными аномалиями и решает ровно одну задачу — генерирует текстовое резюме для закупщика.

## Уровень 4: Полная компиляция в детерминированный код

Финальная стадия оптимизации — полное вытеснение ИИ из процесса выполнения рутины. Если на шаге 1 агент написал рабочий Python-скрипт, отладил регулярные выражения и нашел селекторы, этот код сохраняется в репозиторий и запускается через стандартный cron или CI/CD-пайплайн.

> **Важно.** Переход на уровень кода полностью обнуляет расходы на токены и убирает задержку генерации. Однако детерминированный код абсолютно хрупок: при любом изменении схемы входящих данных пайплайн падает с ошибкой, требуя вмешательства разработчика или вызова агента-ремонтника.

## Где это ломается: подводные камни фиксации

Главный компромисс агентных систем: **чем жестче зафиксирован план, тем ниже его толерантность к изменениям среды.**

- **Хрупкость входных контрактов.** Детерминированные графы и Python-скрипты ломаются, когда поставщик меняет заголовки колонок, переходит с формата .xlsx на .csv или упаковывает значения в объединенные ячейки. Агент первого уровня справится с этим незаметно, а жесткий пайплайн упадет в runtime.
- **Лимиты триггеров.** Платформенные триггеры (например, в OpenAI Scheduled Tasks с лимитом 30 вызовов в час) могут стать узким горлышком при резком всплеске событий во внешних сервисах.
- **Иллюзия стабильности промпта.** При уровне 1 обновление весов модели на стороне провайдера способно разрушить рабочий сценарий: прежний текстовый промпт начнет пропускать шаги, которые раньше отрабатывали корректно.

## Что попробовать дальше

1. **Проведите аудит агентных задач:** выделите сценарии, запускаемые чаще 3 раз в неделю, и переведите их из обычного чата в формат спецификации SKILL.md.
2. **Изолируйте вычисления:** вынесите парсинг таблиц, валидацию и математику из контекста модели в локальные Python-скрипты.
3. **Настройте гибридный контур:** запускайте детерминированный граф, а вызов неструктурированного агентного цикла используйте только как fallback-механизм в блоке except Exception, если формат данных изменился.

## FAQ

### Чем формат скилла SKILL.md отличается от обычного системного промпта?

Скилл хранится локально в структурированной папке и загружается по принципу progressive disclosure. Модель видит только название и краткое описание из YAML-шапки, пока задача не потребует открытия полной инструкции или вызова вспомогательного скрипта.

### Можно ли полностью исключить обращение к LLM в повторяющихся задачах?

Да, если задача сводится к четким алгоритмам: сбору данных, парсингу по регулярным выражениям и математическим расчетам. В таких сценариях агент нужен лишь один раз — чтобы сгенерировать и протестировать исполняемый Python-скрипт.

### Когда стоит остаться на Уровне 1 (сохраненный текстовый промпт)?

Уровень 1 незаменим в условиях высокой неопределенности: когда источники данных постоянно меняют структуру, формулировки входящих писем нетипичны, а цена ошибки при перепланировании ниже затрат на разработку и поддержку графа.

### Как кэширование префикса (Prompt Caching) влияет на стоимость сложных агентов?

Кэширование снижает стоимость повторного чтения системного промпта и истории сообщений, но не уменьшает число шагов в цикле ReAct. Модель все равно совершает множественные последовательные вызовы, накапливая задержку ответа.

## Источники

- Habr ML: Как ИИ-агенты повторяют задачу: промпт, скилл, граф или код
