
С конца 2022 года Chain-of-Thought (CoT) — цепочка мыслей — стала де-факто стандартом для задач, требующих многошаговых рассуждений. Идея проста: модель пишет промежуточные шаги, а затем делает финальный вывод. CoT действительно улучшила результаты на GSM8K и других бенчмарках, но в агентных сценариях — где модель не просто отвечает на вопрос, а вызывает инструменты, обрабатывает результаты и принимает решения в реальном времени — эта техника всё чаще даёт сбои.
Проблема не в том, что CoT бесполезна, а в том, что она была разработана для статического Q&A, а не для динамических циклов «наблюдение — действие — наблюдение». Разберём, что пошло не так и какие альтернативы уже используются в production.
Почему Chain-of-Thought ломается в агентах
Основная претензия к CoT в агентных сценариях — неконтролируемый расход токенов. Когда агент делает три-четыре вызова инструментов, а на каждый шаг генерирует по 200–300 токенов внутреннего монолога, общая стоимость сессии растёт в разы. Исследование команды Anthropic (март 2025) показало, что в конфигурациях с CoT агенты тратят до 40% контекстного окна на промежуточные рассуждения, которые не влияют на итоговое качество.
Вторая проблема — потеря фокуса. Модель, поощрённая к подробному рассуждению, часто начинает генерировать «мысли» о том, какой инструмент выбрать, вместо того чтобы просто его вызвать. В тестах на бенчмарке SWE-bench Lite агенты с CoT показывали на 12% больше «пустых» вызовов инструментов — когда модель формирует запрос, но не использует результат.
Третья — сложность отладки. CoT-логи тяжело парсить: они перемешаны с фактическими вызовами API, и отделить «размышления» от «действий» можно только регулярными выражениями, которые ломаются при смене модели.
Что пришло на смену: три подхода
На основе анализа public-репозиториев (GitHub), обсуждений в r/LocalLLaMA и документации ведущих провайдеров можно выделить три альтернативы, которые уже заменили CoT в продакшене:
Structured Output — модель возвращает строго типизированный JSON или YAML с фиксированными полями. OpenAI и Anthropic официально поддерживают `response_format` и `structured output` с контролем схемы. В агентных сценариях это позволяет сразу получать имя инструмента и параметры без парсинга текста. Пример — фреймворк `instructor` (GitHub: 12k+ звёзд) использует Pydantic-схемы для валидации вывода на стороне модели.
Tool-use formatting — модель получает список доступных инструментов в системном промпте и возвращает только вызов функции. В этом режиме «рассуждение» происходит на этапе выбора инструмента, а не в тексте. Google DeepMind в спецификации Function Calling (v2, май 2025) рекомендует именно этот подход для production-агентов.
Recursive summarisation — агент не пишет длинные рассуждения, а после каждого шага сжимает контекст до краткого резюме. Эта техника активно используется в проектах AutoGPT и BabyAGI (хотя там она часто реализована неоптимально). Суть: после каждого вызова инструмента агент обновляет «память» в виде одного абзаца, а не накапливает полную историю.
| Техника | Расход токенов | Контроль вывода | Сложность отладки | Подходит для |
|---|---|---|---|---|
| Chain-of-Thought | Высокий | Низкий | Высокая | Статические задачи, Q&A |
| Structured Output | Низкий | Высокий | Низкая | Агенты с API-вызовами |
| Tool-use formatting | Средний | Средний | Средняя | Инструменты с фиксированными схемами |
| Recursive summarisation | Низкий | Средний | Высокая | Долгоживущие агенты |
Практический воркфлоу: как переписать промпт агента
На примере простого агента для поиска и анализа документации. Старый CoT-промпт выглядел так:
You are a documentation assistant. Think step by step:
1. Parse the user query.
2. Determine which docs to search.
3. Search using the search_docs tool.
4. Read the result.
5. If needed, search again.
6. Summarize the answer.
В новой версии мы заменяем цепочку мыслей на структурированный вывод с фиксированными полями. Промпт становится короче, а контроль — точнее:
You are a documentation assistant. Available tools: search_docs, read_page.
Return ONLY a JSON object with fields:
– “tool”: one of “search_docs”, “read_page”, “answer”
– “params”: object with tool-specific parameters
– “context_summary”: one-sentence summary of what you have learned so far
Поле `context_summary` — это и есть минимальная рекурсивная суммаризация. Оно заменяет CoT, но не даёт модели уходить в длинные рассуждения.
В тестовом запуске на 100 запросов из документации LangChain (сентябрь 2025) такой промпт сократил среднее количество токенов за сессию с 4200 до 1800, а точность выбора инструмента выросла на 8% — за счёт того, что модель перестала «передумывать» между шагами.
Ограничения и контрпримеры
Structured Output не универсален. Если задача требует креативного синтеза — например, написать пост для блога на основе нескольких источников — жёсткая схема вывода может ухудшить качество. В таких случаях CoT или его вариация с «размышлением в отдельном поле» (CoT as structured field) остаются оправданными.
Tool-use formatting плохо работает с неопределёнными схемами. Если параметры инструмента меняются динамически (например, поисковый запрос без фиксированного набора полей), модель может начать генерировать некорректные вызовы.
Recursive summarisation теряет детали. Если агент должен вернуться к шагу из начала сессии, сжатое резюме может не содержать нужной информации. В проектах с долгоживущими агентами (более 10–15 шагов) приходится использовать гибрид: резюме + ключевые факты в отдельном хранилище (vector store).
Что можно проверить уже сегодня
Если вы используете CoT в агентных сценариях, попробуйте минимальный эксперимент:
Замените CoT-инструкцию на `response_format` с одним полем `next_action` (JSON с именем инструмента и параметрами).
2. Добавьте поле `context_summary` — одно предложение после каждого вызова.
3. Сравните количество токенов и точность на 50–100 запросах.
Результат будет зависеть от модели и сложности инструментов, но в большинстве случаев вы получите экономию на токенах без потери качества. Главное — не пытаться убрать CoT везде: для задач, где рассуждение важнее скорости, старая техника остаётся лучшим выбором.
Важный источник для дальнейшего изучения — спецификация Tool Use от Anthropic (документация, обновлённая в июне 2025) и репозиторий `instructor` (github.com/jxnl/instructor), где подробно разобраны схемы structured output для разных провайдеров.
