Вайбцех

Контекст в коде: как перепечатать изменения

Опубликовано Обновлено 15 мин чтенияБазовый
Автор с приложенного фото показывает карточку о контексте, рядом удивлённый кот и схема изменения.
Что узнаете
  • простое объяснение контекста в коде
  • схема слоёв контекста и передачи сообщений
  • порядок ручной перепечатки изменений
  • шаблон журнала для решений и проверок
  • список причин, по которым контекст теряется или переполняется
Применить за 30 мин
Базовый
12просмотров
Что в инструкции
  1. Что такое контекст в коде?
  2. Как появляется контекст вызова?
  3. В каком контексте выполняется этот код?
  4. Из чего складывается контекст программы?
  5. Как перепечатать изменение и не потерять смысл?
  6. Что меняется, когда меняется контекст?
  7. Что ломается без полного контекста?
  8. Что делать, если контекст стал слишком большим?
  9. Вопросы и ответы

Что такое контекст в коде?

Представь фрагмент кода, который запускается внутри программы. Он не существует в пустоте. Рядом есть значения, доступные функции, настройки и данные. Они влияют на то, что произойдёт при выполнении.

Такой набор доступных значений, функций и настроек называют контекстом фрагмента.

У ИИ-помощника похожая логика, но слоёв больше. Модель получает текст запроса, предыдущие сообщения, системные инструкции, подключённые инструменты и их результаты. Всё это влияет на следующий ответ.

Anthropic называет контекстное окно рабочей памятью модели:

Контекстное окно - это всё, на что языковая модель может ссылаться при генерации ответа. Это рабочая память модели, а не большая база данных, на которой она обучалась».

- Anthropic, Context windows

Слово «память» здесь легко сбивает с толку. Контекстное окно содержит текст, доступный модели во время конкретного хода. Оно не означает, что модель записала информацию навсегда.

Отсюда две разные ситуации:

  • файл лежит на диске, но модель его ещё не читала;
  • файл прочитан и его содержимое попало в текущий контекст.

Для первой ситуации файл существует в проекте. Для второй он доступен конкретному ответу.

Если агент переписал половину проекта, причина часто не в том, что он «ничего не понимает». Он мог получить другой набор инструкций, файлов и сообщений. Контекст изменился, поэтому изменился и результат.

Я бы держал в голове короткую формулу:

Контекст = что доступно операции прямо сейчас

Для обычного кода объект контекста задаёт окружение выполнения. Для Claude - содержимое запроса и накопленная история работы.

Как появляется контекст вызова?

Кот прикрывает морду лапой рядом с цепочкой сообщения, ответа и результата инструмента.

Вызов не стартует из ниоткуда. Перед операцией уже есть задача и данные, с которыми она должна работать. Функция получает своё окружение, выполняет действие и возвращает результат.

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

У Claude последовательность видна ещё нагляднее:

  1. Ты отправляешь сообщение.
  2. Claude формирует ответ.
  3. Claude может создать блок tool_use.
  4. Программа запускает инструмент.
  5. Результат добавляется как tool_result.
  6. Новый запрос отправляется с обновлённой историей.

Anthropic описывает это так:

Anthropic объясняет, что предыдущая история разговора передаётся через параметр messages, а модель генерирует следующее сообщение разговора.

Ответ Claude становится частью следующего контекста. Результат инструмента тоже становится частью следующего контекста. Поэтому агент после чтения файла или запуска команды уже работает не с тем же набором данных, что был в начале.

В API разговор не хранится сам по себе. Приложение передаёт историю заново в каждом запросе. Текущий ответ добавляется к этой истории, затем отправляется следующий запрос.

Получается цепочка:

сообщение
  -> ответ Claude
  -> tool_use
  -> tool_result
  -> новый запрос

Если результат инструмента собран неправильно или оказался не на своём месте, продолжение разговора может сломаться. В документации Anthropic есть отдельное требование: блок tool_result должен сразу идти после соответствующего tool_use.

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

В каком контексте выполняется этот код?

Начни с самого фрагмента. Потом двигайся наружу.

Проверь:

  • какие инструкции действуют;
  • какие файлы уже прочитаны;
  • какие прошлые сообщения влияют на задачу;
  • какие зависимости доступны;
  • какие инструменты подключены;
  • какие результаты инструментов появились;
  • не было ли сжатия или очистки истории.

Файл в папке ещё не означает, что он входит в текущий контекст. Модель должна получить его содержимое через сообщение, чтение файла или другой доступный механизм.

В Claude Code я передаю нужные файлы явно. Перед началом такой проверки можно свериться с разбором работы Claude Code над проектом:

Разбери изменение, код не меняй.
Прочитай @src/auth/login.ts, @src/auth/session.ts и @tests/auth/login.test.ts.
Сначала перечисли зависимости между файлами.

Такой запрос задаёт границу проверки. Агент не получает расплывчатую задачу «посмотри весь проект», а работает с названными файлами.

Для управления контекстом я задаю пять вопросов:

  1. Что попросили сделать?
  2. Какие правила действуют?
  3. Какие файлы прочитаны?
  4. Что вернули инструменты?
  5. Что именно модель предлагает изменить?

Если на один вопрос нет ответа, я останавливаюсь и не принимаю правку автоматически.

У Claude Code есть отдельная проверка загруженных файлов инструкций:

/memory

Команда показывает, какие CLAUDE.md и CLAUDE.local.md попали в текущую сессию. Если нужного файла в списке нет, его содержание не доступно модели как инструкция этой сессии.

Проверяй и рабочую директорию: контекст среды может дать другой набор файлов инструкций. Claude Code загружает файлы инструкций, двигаясь вверх от текущего каталога. Запуск из соседней папки может дать другой набор файлов.

Одна и та же строка кода поэтому может вести себя по-разному в двух местах. Не потому, что строка изменилась. Изменилось окружение вокруг неё.

Практикум «Старт»

Три дня живой практики: от идеи до работающего проекта по ссылке

2 000 ₽старт 5 августа, 18:00 МСК

Из чего складывается контекст программы?

Разложу структуру контекста на слои. Состав Claude Code меняется от версии к версии, поэтому я использую эту схему как рабочую, а не как вечный контракт. Но для разбора конкретного хода такая схема подходит.

Системные инструкции. Это правила, которые задают рабочий режим модели. Они могут определять доступные действия и порядок работы.

История сообщений. Сюда входят твои запросы и ответы Claude. Предыдущий ответ не исчезает сразу. Он может стать входом для следующего хода.

Изображения и документы. Они тоже занимают место в запросе. Контекст не ограничен обычным текстом.

Определения инструментов. Если модель умеет читать файлы, запускать команды или обращаться к другим функциям, описание этих инструментов тоже входит в запрос.

Ответы модели. Сгенерированный текст становится частью дальнейшей истории. Extended thinking тоже учитывается в размере хода и контекстного окна.

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

CLAUDE.md. Файлы с таким именем загружаются в начале сессии. Они занимают место рядом с диалогом. В них часто лежат правила проекта, команды запуска и ограничения для агента.

Auto memory. Это отдельный способ переносить знания между сессиями Claude Code. Новая сессия ИИ-агента получает свежий контекст, а устойчивые сведения могут попасть туда через CLAUDE.md и auto memory.

Контексты программы могут конкурировать: инструкции проекта занимают место рядом с историей диалога. Инструкции проекта занимают место рядом с историей диалога. Чем больше правил и справочных материалов загружено, тем меньше места остаётся под сообщения, код и результаты инструментов.

Я бы различал рабочую историю и сохранённое решение:

  • рабочая история нужна текущему ходу;
  • CLAUDE.md хранит устойчивые правила;
  • auto memory переносит отдельные знания между сессиями;
  • журнал изменений хранит человеческие решения и проверки.

Это разные вещи. Резюме после compaction помогает модели продолжить работу. Оно не заменяет журнал, в котором записано, почему конкретная правка принята.

Новая операция помогает создавать контекст заново, поэтому у программы нет одного вечного контейнера. Он собирается для операции, растёт после действий, сокращается при очистке и может начаться заново в новой сессии.

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

Как перепечатать изменение и не потерять смысл?

Собака поднимает лапу рядом с тремя карточками ручного переноса изменения.
  1. Попроси небольшой фрагмент.

    Не начинай с команды «перепиши весь проект». Назови один файл, одну функцию или одно изменение. Попроси сначала показать предложение в чате и diff, а не применять его автоматически, как в схеме проверки diff до правки.

    В первоисточнике этот режим описан прямо:

    «Я прошу помощника по программированию сгенерировать код в чате, а затем сам вручную вношу все изменения».

    Используй такой промпт:

    Сначала объясни, потом предложи небольшой фрагмент
    Прочитай только указанные файлы и не меняй проект.
    
    Задача: добавить одно небольшое изменение.
    Сначала:
    1. назови файл и место изменения;
    2. объясни, какие данные и зависимости использует фрагмент;
    3. покажи только нужный код;
    4. перечисли, что проверить после переноса.
    
    Не создавай, не редактируй, не перемещай и не удаляй файлы.
    Не запускай команды, которые меняют файлы, зависимости или состояние проекта.
  2. Получи объяснение до кода.

    Прочитай ответ и найди место нового фрагмента. Сверь его с соседним кодом, связанными импортами и типами. Если нужный файл не прочитан, попроси сначала прочитать его или передай файл явно через @.

    Я не принимаю предложение, если не понимаю три вещи: что оно меняет, откуда берёт данные и что должно произойти после выполнения.

  3. Перенеси код руками.

    Набери предложенный фрагмент в редакторе сам. Не нажимай автоматическое принятие изменения. Не отдавай агенту право самостоятельно менять файл.

    Автор первоисточника объясняет эффект так:

    «Пока я вручную набираю каждую строку кода, созданного LLM, я строю мысленную модель того, как он работает и как вписывается в существующую кодовую базу».

    • Анкур Сети, Prevent cognitive debt by manually retyping LLM-generated code

    Здесь нет обещания максимальной скорости. Автор связывает ручную перепечатку с тем, что ответственность за каждую строку остаётся у человека.

  4. Адаптируй код к проекту.

    Не переноси фрагмент механически, если в проекте другие имена, пути или правила. Измени его так, чтобы он совпадал с уже работающим кодом. Если правка требует нового файла или зависимости, остановись и отдельно запроси это изменение.

    Для практики подойдёт маленькая локальная задача, которую можно запускать отдельно и наблюдать связь между изменением и результатом.

    Для проверки оставь запускаемое состояние проекта после переноса. Так связь между изменением и результатом можно проверить отдельно.

  5. Запиши принятое решение.

    Не оставляй смысл изменения только в переписке. Создай журнал в Markdown и добавь туда источник, файл или фрагмент, описание изменения, новое понимание и проверку.

    markdown
    # Журнал изменений
    
    ## Дата и задача
    
    - Источник:
    - Файл или фрагмент:
    - Что изменилось:
    - Почему выбран этот вариант:
    - Что теперь понятно:
    - Как проверил:
    - Результат:

    Журнал не должен превращаться в копию всего диалога. Запиши только принятое решение и наблюдаемый результат. Если решение потеряется после новой сессии или compaction, этот файл останется внешним носителем контекста.

  6. Выполни проверку.

    Запусти проверку, которая относится именно к изменению. Сверь результат с тем, что обещал фрагмент. Если проверка не выполнена, не называй изменение готовым.

    Проверка в журнале должна быть конкретной:

    Проверка: запустил сценарий с существующим значением и сценарий с неизвестным значением.
    Результат: оба сценария дали ожидаемый ответ.

    Не пиши «всё работает» без результата команды или описанного сценария. Фактура не даёт универсального чек-листа качества, поэтому я не буду притворяться, что один список подходит для любого проекта. Минимум здесь один: проверить именно то поведение, ради которого переносился код.

  7. Остановись после одного изменения.

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

    Если агент предлагает переписать большую часть проекта, верни его к границе задачи:

    Верни изменение к одному фрагменту
    Не переписывай проект целиком.
    
    Оставь только одно изменение:
    - один файл;
    - одна функция или один связанный фрагмент;
    - одна проверка результата.
    
    Покажи текущий код, предложенный код и объяснение различия.
    Файлы не меняй.

Что меняется, когда меняется контекст?

В агентной работе контекст меняется после каждого заметного действия.

Ты добавил инструкцию. Она заняла место в запросе.

Ты передал файл. В следующем ответе появился новый источник данных.

Ты запустил команду. В историю добавился её результат.

Ты получил ответ Claude. Он стал частью следующего хода.

Anthropic описывает этот цикл так: после действия инструмента программа добавляет ответ Claude и результат инструмента в историю, затем отправляет новый запрос.

Поэтому изменение контекста не всегда означает изменение исходного кода. Иногда меняется только то, что доступно следующему ответу.

Пример с проектными инструкциями. Если в истории есть правило «не меняй файлы», а потом появляется другая инструкция с просьбой применить правку, агент получает конкурирующие указания. Инструкции проекта тоже занимают место рядом с историей диалога и могут менять объём доступного контекста.

Пример с thinking tokens. Длинное рассуждение учитывается в лимитах хода и контекстного окна. Чем больше места занято таким ответом, тем меньше его остаётся для кода и следующих ходов.

Я бы разбирал неожиданную правку в таком порядке:

  1. Что добавилось после предыдущего ответа?
  2. Какой файл или результат инструмента появился?
  3. Не изменилась ли инструкция проекта?
  4. Не произошёл ли compaction?
  5. Не стало ли thinking tokens больше, чем в прошлый ход?

После этого сравнивай не только два куска кода. Сравни два набора входных данных.

Программа реагирует на изменившееся состояние. Ассистент реагирует на изменившуюся историю, инструкции и результаты инструментов. В обоих случаях новый результат начинается с нового окружения.

Практикум «Старт»

Три дня живой практики: от идеи до работающего проекта по ссылке

2 000 ₽старт 5 августа, 18:00 МСК

Что ломается без полного контекста?

Мужчина прикрывает лицо рядом с тремя шагами восстановления потерянного контекста.

Решения между Claude.ai и Claude Code. Контекст Claude.ai не переносится автоматически в Claude Code. Если решение важно для проекта, я сохраняю его в PLAN.md или DECISIONS.md, как в схеме журнала решений между сессиями.

Фраза «запомни» тоже не означает запись на диск. Постоянные правила я кладу в CLAUDE.md, а состояние проекта храню в STATUS.md.

Минимальная запись выглядит так:

markdown
# Решения

- Используем pnpm вместо npm.
- Следующее изменение вручную внести в middleware.
- После переноса проверить сценарий с пустым токеном.

Инструкции после /compact. Инструкция, оставленная только в чате, может потеряться после сжатия. Корневой CLAUDE.md переживает compaction, но вложенные инструкции не переинъектируются автоматически.

Перед сжатием укажи, что сохранить:

/compact keep the current plan, accepted changes, rejected approaches, test output, and the next manual edit

Критичное решение всё равно запиши в файл. Резюме модели не заменяет внешний журнал.

Частичное чтение файла. Если агент прочитал только часть файла, он может внести правку без связанных импортов, типов и соседнего кода. Проси конкретный фрагмент только тогда, когда связи уже понятны. Для новой части проекта сначала передай связанные файлы.

Неподходящий файл инструкций. CLAUDE.md может лежать на диске, но не загружаться в текущую сессию. Проверь рабочую директорию и выполни /memory.

Если контекст потерялся, не пытайся чинить результат новым длинным сообщением. Сначала зафиксируй имя контекста и восстанови опорные данные: Сначала восстанови опорные данные:

  1. найди журнал решений;
  2. передай нужные файлы;
  3. повтори правило коротко;
  4. попроси объяснить текущий код без изменений;
  5. только потом запроси следующий фрагмент.

Так случайная правка превращается в проверяемое продолжение работы.

Что делать, если контекст стал слишком большим?

Есть два разных сбоя.

Если вход уже слишком большой, API отклоняет запрос с ошибкой:

400 invalid_request_error
prompt is too long

Если запрос принят, но генерация упирается в предел, ход останавливается с причиной:

model_context_window_exceeded

Не путай эти случаи. В первом надо уменьшить вход до отправки. Во втором генерация дошла до ограничения уже во время хода.

Сначала проверь состав запроса, а для длинной сессии используй схему разделения запроса на этапы:

  • системные инструкции;
  • историю сообщений;
  • изображения и документы;
  • определения инструментов;
  • ответы Claude;
  • результаты инструментов;
  • thinking tokens;
  • добавленные файлы.

Токен тоже занимает место в контекстном окне, а кэш не расширяет это окно. Он сохраняет префикс конкретного запроса, но закэшированные токены всё равно занимают место в контекстном окне. Поэтому фраза «кэш включён, лимит больше не важен» ошибочна.

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

Если вход превышает окно стабильно, разбей задачу на короткие этапы. Для независимой части начни новую сессию. Для продолжающейся задачи используй compaction, но заранее сохрани решения в журнале.

Вопросы и ответы

Вопросы и ответы

В каком контексте выполняется код?

Код выполняется в окружении, доступном ему в конкретный момент: с определёнными данными, инструкциями, зависимостями, файлами и результатами предыдущих действий. Для Claude дополнительно проверь историю сообщений, системный промпт, определения инструментов, изображения и документы.

В чём суть контекста?

Суть контекста в том, что операция не работает отдельно от окружения. Контекст показывает, какие сведения доступны функции, программе или модели прямо сейчас. В Claude это рабочее содержимое текущего запроса, а не постоянная память.

Что значит контекст?

Здесь под контекстом я имею в виду набор данных и инструкций, доступных текущему фрагменту кода или ответу модели. Набор меняется после нового сообщения, чтения файла, вызова инструмента, результата команды или сжатия истории.

Какие данные входят в контекст?

В контекст входят значения, документы, сообщения, инструкции и результаты, которые операция может использовать в конкретный момент. В запросе Anthropic учитываются системный промпт, сообщения, результаты инструментов, изображения, документы и определения инструментов.

Без контекста?

Без контекста фрагмент теряет сведения о связанных файлах, правилах и состоянии проекта. Claude.ai не переносит разговор в Claude Code автоматически, а инструкция, оставленная только в чате, может исчезнуть после /compact.

Контекст запроса?

Контекст запроса - всё содержимое, которое программа передаёт вместе с текущим обращением. В API туда входят предыдущие сообщения, текущий текст, результаты инструментов, изображения, документы, системные инструкции и определения инструментов.

Контекст проекта?

Контекст проекта - связанные с задачей файлы, инструкции, зависимости, решения и состояние проекта, доступные текущему ходу. CLAUDE.md загружается в начале сессии, но конкретный состав контекста Claude Code может зависеть от сессии, конфигурации и версии.

Управление контекстом?

Управление контекстом - это ручной контроль того, какие файлы, инструкции, сообщения и результаты передаются следующему ходу. Для новичка практический порядок такой: передать небольшой фрагмент, получить объяснение, перенести изменение руками, записать решение и выполнить проверку.

Источники

Практикум «Старт»

Три дня живой практики: от идеи до работающего проекта по ссылке

2 000 ₽старт 5 августа, 18:00 МСК

Материал был полезен?
Сергей Мазур
Автор
Сергей Мазур
Основатель Вайбцеха

Собираю продукты с ИИ-агентами и рассказываю, как это делать без программиста.

Читайте также

Claude Code теряет контекст на третьем часу: 4 причины и что делать в 2026

Он не сломался и ты не «неправильно попросил»: посреди длинной сессии переписка сжимается в пересказ, и половина договорённостей исчезает. Разбираем, что съедает память и как удержать проект в файле, а не в чате.

21 мин

Хостинг для сайта из Claude: 3 сервиса для публикации HTML в сети

Готовый сайт от ИИ ещё не доступен посетителям, пока не опубликован по рабочей ссылке. Разбираем три способа размещения: GitHub Pages, Cloudflare Pages и Surge.

15 мин

MCP: как ужать контекст при 58 инструментах через локальный CLI

MCP подключает ИИ-агента к внешним данным и действиям. Показываю локальный сценарий через `mcptoon`, конфиг в JSON и проверку ошибок.

12 мин

MCP Memory: как настроить локальную память проекта за 5 шагов в 2026 году

MCP Memory сохраняет решения проекта в локальных Markdown-файлах и возвращает их Claude Code между сессиями. Ниже показано подключение, настройка и проверка памяти.

10 мин

Термины из инструкции