Все уроки · 44
Контекст и промпт-инжиниринг: что модель видит на самом деле
Ваш промпт — это одно сообщение, а контекст — всё, что видит модель: системный промпт, память, найденные документы, результаты инструментов, история. Почему контекстная инженерия становится более широкой дисциплиной, чем промпт-инжиниринг.
Вы заполняете окно, и промпт — лишь его часть
Вот аналогия, которой я объясняю это каждому новому коллеге: окно контекста — это письменный стол модели. Это единственная поверхность, которую модель видит, пока работает. Ваше сообщение — стикер, наклеенный на этот стол. Всё остальное тоже лежит на этом столе: системный промпт, прикреплённый к стене, вчерашние заметки, документы, которые кто-то достал из архива, распечатки, которые только что выдал инструмент. Модель прочитывает всю поверхность, прежде чем напишет первое слово. Чего нет на столе, того для неё не существует.
Стол невелик, за каждый его сантиметр приходится платить, а решаете, что на него положить, вы — или ваш код. От этого зависит, будет ли ассистент работать чётко или будто спьяну.
Вот вопрос, который отделяет новичков от практикующих AI-инженеров: когда вы отправляете модели сообщение, что модель на самом деле видит?
Большинство людей представляют себе реплику в чате — то, что они напечатали. Но это лишь крошечная доля того, что уходит по сети. Каждый вызов API отправляет модели целый контекст: системный промпт, историю разговора, всё, что достали из памяти или базы знаний, результаты предыдущих вызовов инструментов — а где-то среди всего этого и ваше сообщение.
Промпт-инжиниринг — это умение сформулировать то, что говорите вы в одном сообщении. Контекстная инженерия — это проектирование всего остального, что модель видит вокруг него. Промпт-инжиниринг по-прежнему остаётся навыком. Но в реальных продуктах промпт обычно оказывается самой маленькой частью.
Что входит в контекст
Типичный запрос к модели включает:
- Системный промпт — постоянные инструкции: роль, правила, тон, формат.
- История разговора — все предыдущие реплики этой сессии.
- Память — факты о пользователе или проекте, перенесённые из прошлых сессий.
- Найденные документы — фрагменты, которые RAG достаёт из вашей базы знаний под текущий вопрос.
- Результаты инструментов — вывод поисков, запросов к базе данных и вызовов API, которые модель сделала только что.
- Сообщение пользователя — часто меньше пяти процентов от общего объёма.
Заметьте, что большую часть этого собирает код — во время работы, при каждом запросе. Поэтому это называют инженерией.
Памяти нет — есть только этот вызов
Каждый вызов API независим от предыдущих (stateless). Модель не помнит ваш предыдущий запрос. Она не знает, кто вы, что она сказала минуту назад и чем занимается ваш продукт. Между вызовами она не хранит ничего.
Впечатление, будто чат-ассистент помнит разговор, создаёт ваш код: он каждый раз отправляет весь разговор заново. Пятая реплика — это не «модель продолжает», а новый запрос, который просто содержит реплики с первой по четвёртую плюс ваше новое сообщение. Иллюзия памяти целиком создаётся пересборкой на вашей стороне: сама модель между вызовами ничего не переносит.
Из этого вытекают два следствия, и в них вся дисциплина:
- На каждый запрос приходится ровно один артефакт: контекст. Модель видит этот текст и больше ничего: ни скрытых заметок, ни базы данных, ни памяти о прошлом разе.
- Чего нет в вызове, того не было. Если правило, факт или ограничение не попали в тело запроса, модель не может ими воспользоваться — и никакие хитрые формулировки в последнем сообщении их не вызовут.
Вот почему название «промпт-инжиниринг» принижает суть работы. Промпт — это одно поле в пакете данных, который собирает ваш код. Всё — это один вызов, и заполняете его вы.
Окно контекста — это бюджет
Модель может учитывать лишь фиксированное число токенов — это и есть окно контекста. Токен — это примерно три четверти слова (фрагмент текста, которым модель измеряет объём), и он служит единицей и для окна, и для счёта за использование. Современные модели принимают 128K, 200K, а иногда и миллион токенов, но окно конечно, а внимание распределяется по нему неравномерно. Относитесь к окну как к бюджету: каждый документ, каждое старое сообщение, каждый вывод инструмента тратит токены, которые могли бы пойти на что-то более полезное.
Вот как выглядит один реалистичный запрос внутри окна. Пройдитесь по событиям — и обратите внимание, куда попадает само сообщение пользователя:
Посмотрите на эту полосу. Если вы потратите полдня на шлифовку сообщения в 180 токенов, а остальные 7 800 токенов оставите на волю случая, вы украшаете дверную ручку дома без крыши.
Чтобы ощутить это, кодовая база не нужна. Вставьте промпт ниже в ChatGPT и посмотрите, как мало значит последний вопрос по сравнению с тем, что стоит над ним:
Ты помогаешь мне кое-что проверить. Ниже — разговор пользователя
с ассистентом, а затем заключительный вопрос.
Ответь ТОЛЬКО на заключительный вопрос, естественно продолжая
разговор.
--- разговор до этого момента ---
Пользователь: У меня небольшая пекарня. Терпеть не могу длинные письма.
Ассистент: Принято. Отныне короткие ответы и контекст пекарни.
Пользователь: Ржаной муки у нас не будет до четверга.
Ассистент: Понял — никаких ржаных изделий до четверга.
--- конец ---
Заключительный вопрос: Можно заказать ржаной хлеб на закваске на завтра?
Ответь одним коротким предложением.Заключительный вопрос состоит всего из восьми слов и ничем не примечателен. Ответ почти целиком зависит от строк над ним. Измените одну из них — например, «Терпеть не могу длинные письма» превратите в «Мне нужны подробные объяснения» — и тот же самый вопрос даст другой ответ. Это и есть контекстная инженерия: вы не редактировали вопрос, вы редактировали стол.
Почему контекстная инженерия становится более широкой дисциплиной
Три сдвига вывели контекст на первый план:
- Приложения стали многошаговыми. Агент делает десяток вызовов инструментов на одну задачу, и каждый результат возвращается в контекст. «Промпт» теперь — это поток, который собирает код.
- У моделей появились длинные окна. Когда доступно 128K токенов, узкое место сместилось с «как это сказать» на «что вообще туда положить».
- Сбои стали сбоями контекста. Когда ассистент в реальной эксплуатации выдаёт неверный ответ, виноваты обычно устаревшая память, нерелевантный найденный фрагмент или противоречивая старая инструкция, всё ещё лежащая в истории. Формулировка последнего сообщения тут редко что-то решает.
Промпт-инжиниринг — это слой внутри контекстной инженерии: сообщение по-прежнему важно, но это последние 200 токенов в задаче проектирования, которая охватывает тысячи.
Правило в одну строку
Прежде чем винить модель, прочитайте весь контекст, который она получила. В девяти случаях из десяти ответ там: слишком много шума, слишком мало сигнала или нужный факт зарыт в середине.
Кажется, ассистент помнит, что вы сказали десять минут назад. Что происходит на самом деле?
Ассистент в реальной эксплуатации начинает выдавать странные ответы. Формулировка сообщения пользователя не менялась. Куда вы посмотрите в первую очередь?
Что из этого НЕ входит в контекст, который видит модель?
Почему большое окно контекста не отменяет контекстную инженерию?
Итог
Окно — это бюджет, и большая его часть заполняется машиной. Как только вы начнёте видеть каждый запрос как «что сейчас лежит на столе», перестать это видеть уже не получится — и вопросы меняются с «как это сформулировать» на «что вообще здесь должно быть».
Есть вопросы?
Присоединяйтесь к Telegram-каналу — с радостью обсудим проектирование контекста и поделимся примерами.