Контекстное окно: почему 1M токенов — это не память

Обложка

Каждый новый релиз языковой модели начинается с одной и той же цифры, и с каждым разом она всё нелепее: «контекст теперь 128к», «256к», «миллион токенов!». Звучит как обещание вечной памяти: закинул в чат всю свою жизнь — и модель всё помнит. На деле миллион токенов — это не память. Это рабочий стол. Огромный, но всё ещё рабочий стол, который протирают тряпкой после каждой смены.

Я это выучил на своей шкуре, когда завёл домашнего агента на локальных моделях и начал ждать от него памяти. Спустя пару недель стало очевидно: агент помнит ровно до перезапуска. Дальше — чистый лист, хоть ты ему вчера целый дневник в окно загрузил.

Что такое окно контекста на самом деле

Окно контекста — это не жёсткий диск и не долговременная память. Это оперативка. Все токены, которые модель видит прямо сейчас — твой вопрос, её ответы, системный промпт, история переписки — лежат в одном буфере. Пока буфер жив, модель «в курсе». Как только буфер пересоздаётся — сессия умерла, и контекст испарился бесследно.

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

Тут обычно вступает маркетинг и шепчет: «ну так загрузи всё обратно, окно-то вон какое». И вот тут начинается самое интересное.

Компакция: сжатие вместо памяти

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

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

Внешняя память в файлах — вот где собака зарыта

Настоящая память агента живёт не в окне, а на диске. В моей лабе это три простые штуки, и ни одна не просит «миллион токенов».

Дневники. Файлы вида memory/YYYY-MM-DD.md, куда сыпятся сырые логи дня: что делали, что сломали, что починили. Это черновик, не парадная память — грязный, но настоящий.

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

Векторный поиск. Когда нужно найти «ту самую мысль», но не помнишь, в каком файле и какими словами она записана. Эмбеддинги раскладывают заметки по смыслу, и вопрос тянет к нужному месту даже при полном несовпадении формулировок. У меня это bge-m3 на локальном железе — ничего в облако не уезжает.

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

Наши цифры: что реально тянет локальное железо

Маркетинг обещает миллионы, а локальный инференс на AMD-графике честно показывает, где границы. Моя основная модель — gemma3 на 12 миллиардов параметров — формально имеет окно в 131072 токена. Запасная, на 4 миллиарда, — 32768. Разница в четыре раза, и это чувствуется.

Средняя 8B-модель, которую я держал для простых вопросов, вообще живёт в окне около 33 тысяч токенов и требует свежей сессии: зашёл в длинный разговор — и всё, буфер забит, агент начинает путаться и нести мусор. Приходилось перезапускать сессию, чтобы вернуть его в чувство.

А теперь самое смешное. ROCm-хак на этой связке нестабилен ровно там, где окно пытаются использовать на полную: 12B-модель падает с ROCm error: CUBLAS_STATUS_INTERNAL_ERROR на промптах больше десяти килобайт. Короткие вопросы — летает. Сунул длинный конфиг — здравствуй, ошибка. Младшая 4B те же тридцать килобайт переваривает, но так медленно, что проще сходить заварить чай. То есть на бумаге окно большое, а по факту длинный контекст на локальном железе — это либо падение, либо ожидание.

Цена длинного контекста

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

Кэш. Каждый раз, когда ты досылаешь в окно новое сообщение, модель перечитывает всё, что уже лежит в буфере. Промахи по кэшу — это пересчёт одних и тех же токенов снова и снова. Чем длиннее контекст, тем дороже каждое следующее сообщение, даже если ты просто написал «ок».

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

Внимание. И самая коварная часть — «потеря в середине». Модель лучше всего помнит начало и конец окна, а всё, что в середине, — в тумане. Загрузил три конфига, короткий вопрос в конце, и ответ строится по первому файлу и последней фразе, а ключевая строка из середины благополучно проигнорирована. Длинный контекст не делает модель внимательнее — он размазывает внимание по большему полю.

Что реально помогает

Никаких секретов, всё скучное и рабочее.

Короткие файлы-заметки вместо гигантского промпта. Вместо того чтобы впихнуть в окно полконфига роутера, кладу его в файл, а в окно — ссылку и пару строк сути. Агент читает файл, когда нужно, а не держит всё в голове.

Дисциплина «записал — значит помню». Всё, что важно, оседает в дневнике или кураторской памяти в тот же день. Тогда «память» агента не зависит от того, уцелела ли сессия после рестарта. Сессия может умереть — файлы останутся.

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

Итог

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

#llm #openclaw #selfhosting