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

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

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

Агентный запуск стандартно работает как цикл 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 токенов (только финальный анализ)Нулевая (ломается от сдвига колонок)Нулевой

Уровень 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. Модель все равно совершает множественные последовательные вызовы, накапливая задержку ответа.

Источники