Llm · 6 мин чтения

Канарейка для LLM: как понять, что ваш AI-чат начал деградировать

Техника «канарейки» — простой способ отслеживать деградацию контекста в LLM в реальном времени. Инструкции для Claude и Cursor.

Канарейка для LLM: как понять, что ваш AI-чат начал деградировать

Содержание

Представьте: вы час работаете с Claude над архитектурой проекта. В начале сессии задали правило — «всегда отвечай в формате JSON». Первые десять ответов идеальны. Потом модель незаметно перестаёт соблюдать формат, начинает противоречить тому, что говорила раньше, выдумывает детали которых не было. Вы продолжаете доверять ответам — и только через полчаса понимаете, что работали с деградировавшим контекстом.

Именно для таких ситуаций существует техника «канарейки» — простой способ заметить деградацию контекста до того, как она стала проблемой.


Откуда взялся термин

В угольных шахтах XIX века горняки брали с собой канареек. Птицы чувствительнее людей реагируют на угарный газ — если канарейка переставала петь или падала, шахтёры знали: пора эвакуироваться.

В кибербезопасности canary token — это скрытая метка в данных или системе, которая срабатывает при несанкционированном доступе. Если метка обнаружена — значит кто-то добрался до защищённых данных.

В контексте работы с LLM идея та же: вы встраиваете в инструкции маркер, который модель должна воспроизводить в каждом ответе. Маркер исчез — сигнал тревоги.


Как работает метод

Суть проста: в системном промпте или в начале диалога вы даёте модели инструкцию всегда включать определённый элемент в ответ. Это может быть:

  • Имя пользователя. «Всегда обращайся ко мне по имени Алексей в начале каждого ответа.»
  • Эмодзи или символ. «Начинай каждый ответ с символа 🟢.»
  • Структурный маркер. «Каждый ответ начинай со строки STATUS: OK.»
  • Тег. «Оборачивай итоговый вывод в теги <answer></answer>

Пока модель воспроизводит маркер — контекст работает нормально. Маркер пропал — пора насторожиться.


Почему контекст деградирует

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

Это не баг — это архитектурная особенность трансформерных моделей. Механизм внимания (attention) равномерно распределяется по всему контексту, и чем он длиннее, тем меньше «веса» достаётся инструкциям из начала.

На практике это выглядит так: модель перестаёт следовать правилам форматирования, начинает выдумывать детали, игнорирует ограничения, которые вы задали в начале сессии.


Как добавить канарейку в Claude и Cursor

Claude (claude.ai)

Самый простой способ — добавить канарейку в Custom Instructions (Пользовательские инструкции). Они применяются автоматически к каждому новому чату.

  1. Откройте claude.ai и перейдите в Settings → Custom Instructions
  2. Добавьте в поле инструкцию:
В начале каждого своего ответа добавляй строку: [✓ контекст активен]
Если ты видишь эту инструкцию — значит контекст работает нормально.

Когда строка [✓ контекст активен] перестанет появляться в ответах — сессию пора перезапустить.

Для более надёжной проверки добавьте также контрольный факт:

Запомни: кодовое слово этой сессии — «малахит».
Если я спрошу «кодовое слово?» — ответь именно им.

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 — и у вас есть рабочий мониторинг контекста с нулевыми затратами.