Представьте: вы час работаете с Claude над архитектурой проекта. В начале сессии задали правило — «всегда отвечай в формате JSON». Первые десять ответов идеальны. Потом модель незаметно перестаёт соблюдать формат, начинает противоречить тому, что говорила раньше, выдумывает детали которых не было. Вы продолжаете доверять ответам — и только через полчаса понимаете, что работали с деградировавшим контекстом.
Именно для таких ситуаций существует техника «канарейки» — простой способ заметить деградацию контекста до того, как она стала проблемой.
Откуда взялся термин
В угольных шахтах XIX века горняки брали с собой канареек. Птицы чувствительнее людей реагируют на угарный газ — если канарейка переставала петь или падала, шахтёры знали: пора эвакуироваться.
В кибербезопасности canary token — это скрытая метка в данных или системе, которая срабатывает при несанкционированном доступе. Если метка обнаружена — значит кто-то добрался до защищённых данных.
В контексте работы с LLM идея та же: вы встраиваете в инструкции маркер, который модель должна воспроизводить в каждом ответе. Маркер исчез — сигнал тревоги.
Как работает метод
Суть проста: в системном промпте или в начале диалога вы даёте модели инструкцию всегда включать определённый элемент в ответ. Это может быть:
- Имя пользователя. «Всегда обращайся ко мне по имени Алексей в начале каждого ответа.»
- Эмодзи или символ. «Начинай каждый ответ с символа 🟢.»
- Структурный маркер. «Каждый ответ начинай со строки STATUS: OK.»
- Тег. «Оборачивай итоговый вывод в теги
<answer></answer>.»
Пока модель воспроизводит маркер — контекст работает нормально. Маркер пропал — пора насторожиться.
Почему контекст деградирует
Языковые модели обрабатывают текст в пределах так называемого контекстного окна — ограниченного буфера, в который помещается вся история диалога. Когда диалог становится длинным, ранние части контекста начинают вытесняться или обрабатываться с меньшим вниманием.
Это не баг — это архитектурная особенность трансформерных моделей. Механизм внимания (attention) равномерно распределяется по всему контексту, и чем он длиннее, тем меньше «веса» достаётся инструкциям из начала.
На практике это выглядит так: модель перестаёт следовать правилам форматирования, начинает выдумывать детали, игнорирует ограничения, которые вы задали в начале сессии.
Как добавить канарейку в Claude и Cursor
Claude (claude.ai)
Самый простой способ — добавить канарейку в Custom Instructions (Пользовательские инструкции). Они применяются автоматически к каждому новому чату.
- Откройте claude.ai и перейдите в Settings → Custom Instructions
- Добавьте в поле инструкцию:
В начале каждого своего ответа добавляй строку: [✓ контекст активен]
Если ты видишь эту инструкцию — значит контекст работает нормально.
Когда строка [✓ контекст активен] перестанет появляться в ответах — сессию пора перезапустить.
Для более надёжной проверки добавьте также контрольный факт:
Запомни: кодовое слово этой сессии — «малахит».
Если я спрошу «кодовое слово?» — ответь именно им.
Cursor
В Cursor канарейка добавляется через директорию .cursor/rules/ в корне проекта — это актуальный формат правил начиная с 2025 года (старый .cursorrules в корне всё ещё работает, но считается устаревшим).
Создайте файл .cursor/rules/canary.mdc:
---
description: Context canary — detects context window degradation
alwaysApply: true
---
At the start of every response, output this exact line:
[CURSOR-OK] Context active.
If this line is missing from any response, the context window may be degrading.
Remind the user to start a new chat session.
Дополнительно можно добавить структурный маркер:
Always wrap your final answer in <answer> tags.
Example: <answer>Here is the solution...</answer>
If you cannot locate previous context, say: [CONTEXT-LOST] Please restart the session.
Флаг alwaysApply: true гарантирует, что правило применяется в каждом запросе. После создания файла перезапустите Cursor.
Как усилить метод
Канарейка — полезный инструмент, но важно понимать, как использовать его правильно — и чем дополнить.
Канарейка ≠ гарантия качества. Модель может воспроизводить маркер и при этом галлюцинировать в содержательной части ответа. Канарейка говорит: «контекст жив». Она не говорит: «ответ верный». Используйте её как первый сигнал, а не как единственный контроль.
Усиливайте маркер смыслом. Простое эмодзи модель может воспроизводить по инерции. Более надёжный вариант — маркер, который требует реального обращения к контексту: кодовое слово, имя пользователя, номер текущего шага задачи.
Счётчик токенов. Большинство API возвращают количество использованных токенов в каждом запросе. Отслеживайте этот показатель и перезапускайте сессию при приближении к пороговому значению — например, при заполнении 70–80% контекстного окна. Claude Sonnet 4.6 и Haiku 4.5 умеют отслеживать остаток контекста самостоятельно.
Структурированный вывод с валидацией. Попросите модель отвечать в формате JSON с фиксированной схемой. Если ответ перестаёт парситься или теряет обязательные поля — контекст деградировал. Это особенно полезно в автоматизированных пайплайнах.
Периодические контрольные вопросы. Раз в несколько сообщений задавайте модели проверочный вопрос, ответ на который однозначно следует из начала диалога. Неверный ответ — сигнал к перезапуску.
Когда перезапускать сессию
Универсального правила нет — всё зависит от модели. Актуальная картина на июнь 2026:
- Claude Sonnet/Opus 4.6+ — контекст 1M токенов, деградация на обычных сессиях минимальна. Перезапуск нужен при явных ошибках или исчезновении канарейки.
- GPT-5.5 — контекст 1M токенов (922K input). При интенсивной работе с большими кодовыми базами перезапуск после заполнения ~70–80% окна.
- Gemini 3.5 Flash — контекст 1M токенов, дефолтная модель в Gemini app с мая 2026. Gemini 3.1 Pro — 2M токенов, перезапуск нужен редко.
Общее правило: при появлении явных противоречий с тем, что было сказано раньше, или при исчезновении канарейки — перезапускайте независимо от модели.
Применение в автоматизированных системах
В пайплайнах, где LLM работает без участия человека, ручное наблюдение за канарейкой невозможно. Здесь метод трансформируется в программную проверку.
Типичная реализация: в каждом запросе к API включается инструкция вернуть ответ в JSON-формате с обязательным полем status: "ok". После получения ответа скрипт проверяет наличие этого поля. Если поле отсутствует или значение изменилось — сессия перезапускается автоматически, а событие логируется.
import json
import anthropic
client = anthropic.Anthropic()
def call_llm_with_canary(user_message: str, history: list) -> dict:
system = """
Respond ONLY with valid JSON in this exact format:
{
"status": "ok",
"answer": "your response here"
}
If context seems lost, set status to "degraded".
"""
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=system,
messages=history + [{"role": "user", "content": user_message}]
)
try:
result = json.loads(response.content[0].text)
if result.get("status") != "ok":
raise ValueError("Canary failed — context degraded")
return result
except (json.JSONDecodeError, ValueError) as e:
restart_session()
raise
Такой подход используется в продакшн-системах, где непрерывность работы критична, а ручной мониторинг невозможен.
Итог
Канарейка — это не серебряная пуля, а датчик. Она не предотвращает деградацию контекста, но даёт вам возможность среагировать до того, как ошибки накопились. Добавьте её прямо сейчас: одна строка в Custom Instructions Claude или один .mdc-файл в Cursor — и у вас есть рабочий мониторинг контекста с нулевыми затратами.
