- 4 уровня контекста: якорь, эмоциональный старт, стилевые модификаторы, доводка
- Нижние уровни модифицируют верхние и никогда их не перебивают
- Выбранный пользователем артефакт живёт в состоянии агента и идёт аргументом каждого вызова
Задача
Агент вызывает инструмент генерации: картинки, видео, копирайта. Контекста у него больше, чем принимает сигнатура функции. Соблазн — передать только структурированные поля формы, а остальное бросить на пол. Результат: шаблонные на ощущение выходы, каким бы путём пользователь к ним ни пришёл. Он выбрал идею, написал бриф, а получил среднее по анкете.
Типичный пример: инструмент craft_prompt(nomination, image_type, style, user_intent). Выбранная идея и исходный бриф остались в чате и никогда не дошли до композера промпта. Технически LLM в петле, но пользователь чувствует, что его не слышат.
flowchart LR
F[Поля формы] --> T[craft_prompt]
C[Чат: выбранная идея<br/>и исходный бриф] -. не доходит .-> T
T --> O[Среднее<br/>по анкете]
classDef key stroke:#FF3600,stroke-width:2px
class O keyПриём
Передавать все четыре уровня контекста в генерационный шаг и явно ранжировать их в системном промпте.
| Уровень | Роль | Источник |
|---|---|---|
| 1. Якорь | главный субъект, драйвер | артефакт, который пользователь выбрал: идея, референс, принятая подсказка |
| 2. Эмоциональный старт | мотивация, тон | исходный free-text бриф |
| 3. Стилевые модификаторы | ручки обработки | структурированные выборы в форме: номинация, тип изображения, теги |
| 4. Доводка | last-mile | строка intent или follow-up инструкция |
Правило иерархии: нижние уровни модифицируют верхние, никогда не перебивают. Тег «minimalist» не меняет субъект — он меняет, как субъект отрендерён. Если выбранная идея сидит на третьем уровне как модификатор, а не на первом как якорь, каждый выход скатывается к середине пространства анкеты.
flowchart TD
L1[Якорь:<br/>выбранная идея] --> L2[Эмоциональный старт:<br/>исходный бриф]
L2 --> L3[Стилевые модификаторы:<br/>выборы в форме]
L3 --> L4[Доводка:<br/>intent, follow-up]
classDef key stroke:#FF3600,stroke-width:2px
class L1 keyМеханика в четыре шага:
- Хранить уровни 1 и 2 в общем состоянии агента (session store или серверная запись прогона). Не выводить их заново из истории чата: история шумная и обрезается.
- Переносить их структурированными аргументами на каждом tool-вызове. Сигнатура функции явно принимает все четыре уровня.
- Системный промпт композера декларирует иерархию дословно: перечисляет уровни, называет роль каждого, инструктирует якориться на первом.
- Fallback-шаблон зеркалит иерархию. Когда LLM-вызов падает и срабатывает детерминированный шаблон, он всё равно ведёт с описания выбранной идеи. Иначе fallback противоречит доктрине, и пользователь видит регрессию.
flowchart LR
S[Состояние агента:<br/>якорь и бриф] --> A[Аргументы<br/>каждого вызова]
A --> P[Системный промпт:<br/>иерархия дословно]
A --> FB[Fallback-шаблон:<br/>ведёт с идеи]В упомянутом кейсе фикс был почти целиком про проводку: расширить состояние прогона, чтобы оно несло originalBrief и chosenIdea; расширить аргументы инструмента до четырёх уровней; переписать системный промпт композера и fallback-шаблон. Выходы сразу перестали ощущаться шаблонными. Остальная система эту иерархию уже подразумевала, просто поверхность инструмента её не выражала.
Обновление, сентябрь 2026. Тот же сбой проводки повторился в новостном конвейере zdes.media. Пост в канале обещал «бенчмарки и тарифы внутри», а на странице был короткий пересказ: в среднем 1170 знаков и 0,19 дополнительного фото на новость. Писатель видел только двухсотсловные факты, а автор призыва не видел страницу вовсе. Фикс снова в проводке: сборщик хранит подробный конспект источника с цитатами, статья пишется из него со списками и таблицами, призыв получает опись того, что есть на странице. Переписана 21 опубликованная новость.
Где ломается
- История чата как источник. Восстанавливать якорь из переписки ненадёжно: контекст обрезается, идея размывается уточнениями.
- Иерархия только в коде. Если уровни переданы, но системный промпт не говорит, какой главный, модель ранжирует сама и часто отдаёт вес самому конкретному полю, то есть модификатору.
- Fallback без иерархии. Самый частый случай тихой регрессии: основной путь исправлен, деградированный — нет, и пользователь на нём чувствует разницу.
- Конфликт уровней. Бриф просит одно, выбранная идея — другое. Правило «якорь побеждает» помогает, но противоречие лучше поднять пользователю, чем разрешить молча.
Итог
- Четыре уровня, явный порядок, все на каждом вызове.
- Основная работа обычно не в промпте, а в проводке: состояние агента и сигнатура инструмента.
- Ортогонально типизированной композиции референсов: та управляет ролью каждого входа, эта — приоритетом, когда источники конкурируют.
- Ортогонально template-dispatch: диспатч выбирает промпт, иерархия задаёт его содержимое.
© Александр Никулин. Цитирование — с указанием автора и ссылкой · Версия для LLM