TL;DR
Structured Cognitive Loop (SCL) — архитектурный подход, который разбивает работу LLM-агента на пять отдельных фаз: сбор информации → рассуждение → проверка → действие → память. Вместо того чтобы просить модель "сделать всё сразу", каждая функция выполняется отдельным модулем с чёткими границами. Ключевой механизм — Soft Symbolic Control: набор правил в начале промпта (Metaprompt), которые модель обязана соблюдать, а специальный модуль проверяет соблюдение перед каждым действием.
Главная находка исследования: когда LLM выполняет сложную задачу "в лоб" — без разделения функций — она теряет контекст, повторяет одни и те же запросы, нарушает ограничения и не может объяснить свои решения. Причина: всё смешано в одном потоке генерации. Модель должна одновременно помнить правила, рассуждать, проверять себя и действовать — это перегрузка, которая ведёт к сбоям. Типичные симптомы: запросила API дважды, забыла ограничение из начала промпта, не смогла объяснить почему выбрала вариант А, а не Б.
Решение SCL: разделить эти функции явно. Каждая фаза — отдельный "модуль" с одной задачей. Между ними — точки проверки. Control (проверка) смотрит на вывод Cognition (рассуждения) и либо пропускает к Action (действие), либо отклоняет. Memory (память) хранит все промежуточные результаты, чтобы не потерять контекст. В экспериментах такая структура дала ноль нарушений политик и ноль повторных вызовов там, где обычные агенты (ReAct, AutoGPT) ошибались в 15-25% случаев.
Схема метода
RETRIEVAL (один раз в начале)
│ Сбор контекста: данные, ограничения, инструкции
│ → Формирует начальное состояние
▼
┌─────────────────────────────────────────────────┐
│ ЦИКЛ CCAM (повторяется) │
│ │
│ COGNITION → рассуждение, план действий │
│ ↓ │
│ CONTROL → проверка: соблюдены ли правила? │
│ ↓ (если ДА) │
│ ACTION → выполнение одного действия │
│ ↓ │
│ MEMORY → сохранить результат и обоснование │
│ ↓ │
│ [следующая итерация или завершение] │
└─────────────────────────────────────────────────┘
Каждый цикл — один шаг задачи. Control — ключевой элемент: если рассуждение нарушает правила или не ссылается на собранные данные, цикл не пропускается к действию.
Пример применения
Задача: Ты — маркетолог в агентстве. Нужно выбрать блогера для рекламы нового сервиса доставки еды в Москве. Есть три кандидата с разными охватами и ценами. Условия: если все трое дороже 500К рублей — выбрать самого дешёвого. Если двое в бюджете — выбрать того, у кого выше вовлечённость. Если только один — его и брать. Если все дорогие и вовлечённость меньше 3% — отказаться от размещения.
Промпт:
ПРАВИЛА:
1. Каждое решение должно ссылаться на конкретные данные из памяти
2. Нельзя делать финальный выбор без проверки всех условий
3. Одно действие за цикл
4. Перед финальным решением — явная проверка соответствия условиям
Выбери блогера для рекламы сервиса доставки. Бюджет: 500 000 руб.
Кандидаты: @foodie_msk, @kitchen_queen, @moscow_eats
Условия выбора:
- Все дороже бюджета → выбрать самого дешёвого
- Двое в бюджете → выбрать с высшей вовлечённостью
- Один в бюджете → его и брать
- Все дорогие И вовлечённость <3% у всех → отказ
Выполняй по циклам R-CCAM:
RETRIEVAL: Собери данные о каждом блогере (цена, охват, вовлечённость)
Затем для каждого шага:
COGNITION: [Что нужно узнать/решить сейчас?]
CONTROL: [Проверка: есть ли данные? соблюдены ли правила?]
ACTION: [Одно конкретное действие]
MEMORY: [Что сохранить для следующих шагов?]
Продолжай циклы до финального решения.
Результат:
Модель выдаст структурированный ответ с явными фазами:
- RETRIEVAL: соберёт/запросит данные по каждому блогеру
- COGNITION (цикл 1): "Нужно сравнить цены с бюджетом"
- CONTROL: "Данные есть для всех трёх? Да. Пропускаю."
- ACTION: "Сравниваю: @foodie_msk 450K ✓, @kitchen_queen 600K ✗, @moscow_eats 480K ✓"
- MEMORY: "В бюджете: foodie_msk, moscow_eats"
- COGNITION (цикл 2): "Двое в бюджете → сравнить вовлечённость"
- И так далее до финального выбора с полным обоснованием
Каждый шаг — прозрачен. Каждое решение — обосновано данными. Если что-то пошло не так — видно где именно.
Почему это работает
Слабость LLM "в лоб": Модель пытается делать всё одновременно — помнить правила, собирать данные, рассуждать, проверять себя, действовать. Это как жонглировать пятью мячами вслепую. Длинный контекст = потеря фокуса. Правило из начала промпта забывается к концу. Модель не знает, что уже запрашивала, и делает это снова.
Сильная сторона LLM: Модель отлично выполняет одну задачу за раз с чётким контекстом. Если сказать "сейчас ты только рассуждаешь, не действуй" — рассуждение будет качественнее. Если сказать "проверь, есть ли в памяти данные для этого решения" — проверит честно.
Как SCL использует это: Вместо одного сложного промпта — цикл простых шагов. Каждая фаза знает свою роль. Metaprompt в начале — это не надежда "модель запомнит", а контракт, который проверяется на каждом шаге. Control-фаза явно спрашивает: "Соблюдены ли правила? Есть ли ссылки на данные?" Если нет — цикл не пропускается.
Рычаги управления:
- Правила в Metaprompt → добавь/убери ограничения под задачу
- Количество циклов → больше для сложных задач, меньше для простых
- Строгость Control → "мягкая проверка" (предупреждение) или "жёсткая" (полный стоп)
- Формат Memory → что именно сохранять между шагами
Шаблон промпта
ПРАВИЛА ВЫПОЛНЕНИЯ:
1. Каждое утверждение должно ссылаться на данные из Memory
2. Нельзя выполнять финальное действие без прохождения Control
3. Один ACTION за цикл
4. {дополнительные_правила_под_задачу}
{описание_задачи}
Условия:
{условия_и_ограничения}
Выполняй по циклам R-CCAM:
**RETRIEVAL** (один раз в начале):
Собери всю необходимую информацию: {что_собрать}
Затем повторяй циклы:
**COGNITION**: Что нужно решить/узнать на этом шаге? Какие есть варианты?
**CONTROL**:
- Есть ли в Memory данные для этого решения?
- Соблюдены ли правила Metaprompt?
- Если НЕТ → вернуться к COGNITION с корректировкой
**ACTION**: Одно конкретное действие (если Control пройден)
**MEMORY**: Что сохранить? (результат, обоснование, отклонённые варианты)
Продолжай до финального решения. В конце — итог с полной трассировкой.
Плейсхолдеры:
{дополнительные_правила_под_задачу}— специфичные ограничения: "не больше 3 итераций", "приоритет скорости над качеством"{описание_задачи}— что нужно сделать{условия_и_ограничения}— бизнес-логика, бюджеты, критерии выбора{что_собрать}— данные, которые нужны для решения
🚀 Быстрый старт — вставь в чат:
Вот шаблон R-CCAM для структурированного решения задач. Адаптируй под мою задачу: [твоя задача]. Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит: какие правила нужны? какие данные собирать? какие условия проверять? — потому что без этого Metaprompt и Control не работают. Она возьмёт структуру R-CCAM и адаптирует под твою задачу.
Ограничения
⚠️ Накладные расходы: Структура добавляет токены. Для простых задач ("переведи текст", "напиши письмо") — избыточно. Используй для многошаговых задач с условиями.
⚠️ Не для творчества: Метод заточен под логику, проверки, соблюдение ограничений. Для креативных задач жёсткая структура может мешать.
⚠️ Зависимость от качества Metaprompt: Если правила сформулированы плохо — Control будет проверять не то. Garbage in — garbage out.
⚠️ Длинные задачи: В экспериментах тестировали 4-7 циклов. Как поведёт себя на 20+ — неизвестно. Возможно накопление ошибок.
Как исследовали
Команда из JEI University создала два эксперимента. Первый — "mock" версия с детерминированным движком вместо LLM. Это позволило изолировать архитектуру от случайностей модели. Задача: планирование поездки с условной логикой ("если температура во всех городах выше X — выбрать самый прохладный"). Результат: 0 нарушений политик, 0 повторных запросов API, 100% трассируемость решений.
Второй эксперимент — живой агент на GPT-4o для планирования путешествий. Реальные API погоды, реальная отправка email. 150+ запросов пользователей, 98.7% успешных завершений (2 сбоя из-за таймаутов API, не архитектуры). Ключевой инсайт: та же структура R-CCAM работает и с mock-движком, и с production LLM. Архитектура не зависит от конкретной модели.
Сравнение с базовыми агентами (ReAct, Reflexion, AutoGPT, MemGPT) показало разительную разницу. ReAct — 3.2 нарушения политик на задачу, AutoGPT — 4.5. SCL — 0. Причина: в prompt-centric подходах модель должна "помнить" правила. В SCL — правила проверяются архитектурно, независимо от памяти модели.
Важный нюанс: сравнение делали по данным из других исследований, а не head-to-head. Авторы честно указывают это как ограничение — прямое сравнение на идентичных задачах ещё предстоит.
Оригинал из исследования
Контекст: Пример аудит-лога из эксперимента — структура, которую генерирует SCL для каждого цикла.
{
"loop": "San Francisco",
"phases": ["Cognition", "Control", "Action", "Memory"],
"cognition_output": "Need weather data for San Francisco. Consulting Memory shows no existing data for this city. Will query weather API.",
"control_result": "PASS: Evidence citation present, no redundancy detected",
"action": "get_weather(city='San Francisco')",
"memory_store": "evidence_get_weather_{\"city\":\"San Francisco\"}"
}Metaprompt из исследования (политики, которые Control проверяет):
policies: [
"must_cite_stored_evidence",
"no_final_answer_without_control_pass",
"single_final_action"
]
Каждое решение должно ссылаться на сохранённые данные. Финальный ответ только после прохождения Control. Одно финальное действие (не серия).
Адаптации и экстраполяции
💡 Адаптация для принятия решений о найме
Та же структура R-CCAM работает для любых решений с условиями и данными:
ПРАВИЛА:
1. Оценка каждого кандидата должна ссылаться на конкретные факты из резюме
2. Нельзя отклонять без указания причины из критериев
3. Финальный выбор — только после сравнения всех кандидатов
Выбери кандидата на позицию продакт-менеджера.
Критерии: 3+ года опыта, знание Agile, опыт работы с B2B продуктами.
RETRIEVAL: Извлеки ключевые факты из резюме каждого кандидата
Цикл 1: COGNITION → CONTROL → ACTION → MEMORY для кандидата 1
Цикл 2: То же для кандидата 2
...
Финальный цикл: сравнение и выбор
🔧 Техника: Убрать жёсткую структуру → гибкий чеклист
Если полный R-CCAM кажется громоздким, можно взять только принцип проверки:
Перед тем как дать финальный ответ:
□ Есть ли данные для каждого утверждения?
□ Проверены ли все условия задачи?
□ Не повторяю ли я уже сделанные шаги?
□ Могу ли объяснить почему выбрал именно это?
Если хоть один пункт — нет, вернись и исправь.
Это "лайт-версия" Control module — без явных циклов, но с той же идеей проверки перед действием.
🔧 Техника: Memory как "рабочий блокнот"
Один из ключевых принципов SCL — явное сохранение промежуточных результатов. Можно использовать отдельно:
После каждого шага анализа записывай в блок MEMORY:
- Что узнал
- Что это значит для задачи
- Какие варианты отпали и почему
В финале — используй только то, что в MEMORY.
Это предотвращает "галлюцинации" и потерю контекста в длинных задачах.
Ресурсы
Работа: "Bridging Symbolic Control and Neural Reasoning in LLM Agents: The Structured Cognitive Loop"
Автор: Myung Ho Kim, JEI University
Открытый код: https://github.com/enkiluv/scl-core-experiment
Живая демо: https://scl-travel-planner.streamlit.app/
Ключевые отсылки из исследования:
- ReAct (Yao et al., 2023) — базовый prompt-centric подход
- MemGPT (Packer et al., 2023) — память для LLM-агентов
- CLARION (Sun, 2006) — когнитивная архитектура с двойным слоем
- Expert Systems (Buchanan & Shortliffe, 1984) — исторический фундамент
