Алексей Маркин рабочий журнал

ищет по заголовкам и тексту записей и заметок

запись 3 сентября 2026 г. · 4 мин
Все статьи

Контекстное окно — это не память

Модель не помнит прошлый разговор и не читает контекст равномерно. Разбираю, что она видит на самом деле и как из этого следуют вполне практические правила.

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

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

Что происходит при каждом обращении

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

Из этого следуют вещи, которые обычно узнают на практике по одной.

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

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

Ничего из того, что модель «пообещала запомнить», не существует в следующем вызове, если вы сами это не передали.

Внимание распределено неравномерно

Второе, что стоит понимать: даже то, что попало в окно, читается не ровно.

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

позиция в контексте →↑ как хорошо используетсяначалосерединаконецправилазадачасюда не кладут важное
рис. 1 Как используется контекст в зависимости от положения. Края работают надёжно, середина проседает — поэтому инструкции ставят в начало, а конкретную задачу в конец.

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

Мусор в контексте хуже, чем его отсутствие

Соблазн понятный: раз окно большое, положим туда всё, вдруг пригодится.

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

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

Кеш меняет форму промпта

Практическое следствие, о котором стоит знать до того, как писать код.

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

Значит, всё стабильное — правила, справочники, примеры — идёт в начало и не меняется. Всё изменчивое — текущая задача, дата, идентификатор пользователя — в конец. Одна переменная, случайно поставленная в начало, обнуляет кеш на каждом запросе, и это самая обидная из потерь: она невидима, пока не сравнишь счета.

Чего я делать не стал бы

Не полагался бы на «запомни это на будущее». Модель может ответить, что запомнила. Это вежливость, а не факт.

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

Не считал бы большое окно заменой памяти. Память — это то, что переживает сессию и лежит снаружи: база, файл, запись в системе. Окно переживает один вызов.

Условие несогласия

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

Открытый вопрос

Мне неясно, как правильно решать, что из разговора стоит переносить в долговременную память, а что нет — и делать это автоматически. Ручной отбор работает и не масштабируется; автоматический легко превращается в накопление шума, который потом сам же и мешает.

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