Контекстное окно: что делать, когда запрос не помещается
Контекстное окно — предел того, сколько текста модель удерживает в одном обращении. В него входит всё: инструкция, история диалога, подмешанные документы и место под сам ответ. Когда предел исчерпан, начинаются странности, причину которых трудно найти.
Что попадает в окно
Четыре части, и каждая растёт по своим причинам.
**Системная инструкция** постоянна, но со временем обрастает уточнениями: каждый раз, когда модель ошиблась, кто-то добавляет туда абзац.
**История диалога** растёт линейно с каждой репликой, если её не сворачивать.
**Подмешанные документы** — самая объёмная часть в системах, отвечающих по базе знаний.
**Ответ** тоже занимает место в окне. Если оставить ноль запаса, модель оборвёт ответ на середине фразы.
Как это ломается
Неприятность в том, что переполнение проявляется по-разному. Иногда приходит явная ошибка — это лучший случай, вы сразу видите проблему.
Хуже, когда лишнее молча отбрасывается. Модель видит начало документа и не видит конец, а ответ выглядит уверенно. Проверить его можно только по источнику, которого у вас перед глазами нет.
Ещё один вариант — ответ обрывается на полуслове, потому что места не осталось. В коде это выглядит как успешный запрос с испорченным результатом.
В каком порядке сокращать
Порядок неслучаен. Старые реплики диалога теряют ценность быстрее всего: свернув их в короткую сводку, вы почти ничего не теряете. Документы стоит фильтровать до отправки, оставляя релевантные абзацы. Системную инструкцию имеет смысл пересматривать раз в квартал — обычно из неё убирается треть без потери качества.
Свёртка истории на практике
Работающая схема выглядит так. В контексте держатся последние три-четыре реплики целиком. Всё, что старше, один раз пересказывается моделью в короткую сводку и дальше передаётся уже в этом виде.
Сводка обновляется не на каждой реплике, а раз в несколько шагов, иначе вы платите за неё чаще, чем экономите.
Что обязательно сохранять в сводке: принятые решения, названные числа и даты, имена и идентификаторы. Что можно терять: вежливые обороты, повторы и уточнения, которые уже привели к результату.
Длинное окно — не всегда решение
Модели с большим окном соблазняют простотой: положил весь документ и не думаешь. Но платить приходится дважды.
Во-первых, деньгами: контекст оплачивается целиком, независимо от того, пригодился он или нет.
Во-вторых, качеством. Модель хуже удерживает детали, лежащие в середине очень длинного контекста, чем те, что в начале или в конце. Отобранные три абзаца часто дают более точный ответ, чем сто страниц целиком.
Если система стала отвечать хуже после того, как вы увеличили количество подмешиваемых документов, это не совпадение. Проверьте гипотезу: верните меньшее число фрагментов и сравните на тестовом наборе.
Как считать заранее
Оценивайте объём до отправки, а не после отказа. Для русского текста грубая прикидка — два-три символа на токен. Этого достаточно, чтобы поставить проверку: если расчётный объём превышает окно за вычетом запаса под ответ, запускается сокращение.
Проверка стоит ноль и избавляет от целого класса плавающих ошибок, которые иначе воспроизводятся раз в неделю на длинных документах.
Как понять, что дело в контексте
Симптомы переполнения легко спутать с плохим промптом или неудачной моделью. Несколько признаков, которые указывают именно на контекст.
**Качество падает к концу длинного диалога.** Первые реплики хорошие, десятая хуже — история вытеснила всё остальное.
**Ответ игнорирует часть присланного документа.** Причём всегда конец, а не случайные места.
**Ответ обрывается на середине предложения.** Классический признак того, что запаса под ответ не осталось.
**Проблема воспроизводится только на больших входных данных.** На коротких примерах всё работает.
Проверяется гипотеза за пять минут: возьмите тот же запрос, вручную уберите половину контекста и повторите. Если ответ стал правильным — причина найдена.
Что положить в начало и в конец
Модели лучше удерживают то, что находится по краям контекста, чем то, что лежит в середине. Это стоит использовать при сборке запроса.
Инструкцию и требования к формату разумно продублировать: один раз в начале и коротким напоминанием в конце, прямо перед вопросом. Приём стоит нескольких десятков токенов и заметно повышает шанс, что модель соблюдёт формат на длинном контексте.
Самое важное из документов ставьте ближе к вопросу, а не в начало подборки. Если у вас есть ранжирование фрагментов по релевантности, порядок «менее релевантные сначала, самый релевантный последним» на практике работает лучше обратного.
Короткий вывод
Держите под ответ явный запас, сворачивайте историю, фильтруйте документы до отправки и считайте объём заранее. И помните, что молчаливая потеря части контекста — самая коварная поломка: код при ней не падает, а ответы становятся хуже без видимой причины.