← Назад к статьям

Контекстная инженерия в LLM

обучение
ai-codingllmcontext

Каждый раз, когда вы общаетесь с ИИ - с языковой моделью, например ChatGPT или чем-то подобным - она полностью «забывает» вас сразу после завершения диалога. Тогда как же поддерживается связность разговора, когда вы отправляете следующее сообщение? Именно этому мы сегодня и посвятим наше исследование. Это называется инженерия контекста, и на самом деле это фундаментальный аспект того, как мы строим агентные системы - то есть как сохраняем непрерывность диалога с языковой моделью (LLM). К концу этого разбора вы узнаете, как взаимодействуют между собой промпты, память, файлы, инструменты - всё это единое целое в рамках инженерии контекста. Понимание этого критически важно, если вы планируете серьёзно работать с агентными или сложными рабочими процессами на базе LLM. Поэтому давайте окунёмся и составим общую картину того, что же такое инженерия контекста на самом деле.

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

Как уже упоминалось, каждый раз, когда вы взаимодействуете с LLM, модель понятия не имеет, кто вы. Единственный способ «познакомить» её с вами - это представляться каждый раз заново. И эта информация - ваше имя, предыдущие реплики, загруженные файлы - и есть контекст. Вы, безусловно, слышали термин «контекстное окно», знаете, что оно ограничено по объёму: нельзя впихнуть туда бесконечное количество файлов или текста. Следите за контекстом - не растрачивайте его попусту. По сути, вся суть в том, что при каждом обращении к LLM вы должны передать ей всё, что ей необходимо, чтобы выполнить ваш запрос.

Например, если вы просите: «Извлеки из моих заметок такую-то информацию» - вам придётся приложить сами заметки. Если вы отправили их в предыдущем сообщении, в следующем LLM уже ничего об этом не помнит. Именно поэтому такие системы, как ChatGPT, управляют контекстом за вас. Контекст здесь - это просто «ведро», в которое складывается вся информация, отправляемая модели: это концептуальный контейнер, содержащий всё, что модель может использовать для формирования ответа.

Теперь рассмотрим составляющие контекста подробнее.

Чем лучше вы понимаете эту структуру - поверьте, тем точнее будете управлять поведением LLM. Это верно и для простого общения с LLM, и для построения полноценных агентных систем в будущем. Эта информация критически важна - буквально для всех, кто работает с LLM, а сегодня это - почти все мы.

1. Память (Memory)

Первое понятие, которое стоит разобрать - это память. Этот термин заимствован из нейробиологии и означает информацию из прошлого, которая каким-то образом сохраняется и доступна в текущем моменте. С LLM ситуация аналогична: «память» - это данные из предыдущих шагов диалога.

Например, если вы загрузили файл в ChatGPT и попросили сделать краткое содержание, а затем в следующем сообщении сказали: «А теперь выдели ключевые задачи» - LLM снова должна «увидеть» тот же файл, иначе она не поймёт, о чём речь. Всё содержимое (включая файл и предыдущие реплики) должно быть повторно отправлено в контексте.

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

Однако с инженерной точки зрения вы обязаны управлять памятью. Представьте длинный диалог: тысячи реплик. Рано или поздно общий объём превысит лимит контекстного окна. Что делать? Здесь вступает инженерное решение: системе приходится сводить (суммировать) прежнюю часть беседы, выделяя ключевые детали, и оставлять только самые свежие (скажем, последние 10 сообщений), которым придаётся наибольший вес - ведь активность сейчас сосредоточена именно в них.

Именно из-за этой свёртки возникает эффект дрейфа. Чем дольше длится диалог, тем слабее модель «помнит» ваши прежние указания: «Разве я не просил не использовать таблицы?», «Почему ты снова вернулся к старому формату? Я же говорил - только визуализации на холсте!»
Всё это - следствие автоматического управления историей: система пытается уместить всё важное, но что-то теряется по пути.

2. Файлы (Files)

Файлы - наиболее очевидная часть контекста. Вы загружаете их явно. Например, перетаскиваете заметки в ChatGPT и просите: «Пожалуйста, сделай краткое содержание». В этом случае файл становится частью контекста.

Особенно полезны скриншоты. Например, вы делаете снимок экрана со слайдом презентации и спрашиваете: «Можешь на основе этого создать промпт?» - модель действительно способна это сделать. Я сам неоднократно использовал такой подход: загружал слайд в ChatGPT и получал готовый, хорошо структурированный промпт. Совет: начните активно использовать скриншоты - это мощный, но недооценённый инструмент.

3. RAG (Retrieval-Augmented Generation)

RAG - Retrieval-Augmented Generation, или «генерация с расширенным поиском». Это технический термин, обозначающий процесс: перед тем как отправить запрос в LLM, система сначала ищет в собственной базе данных информацию, релевантную вашему вопросу, и подкладывает её в контекст.

Пример: вы заходите на сайт интернет-магазина и спрашиваете: «Какие конфеты были самыми популярными в прошлом месяце?»
Если просто отправить этот вопрос в ChatGPT - вы получите общий ответ, основанный на общедоступных данных. Но владелец магазина хочет, чтобы в ответе фигурировали только его три товара.

Что происходит «под капотом»: система анализирует ваш запрос, ищет соответствующие записи в БД и добавляет их в контекст - незаметно для вас. Затем LLM формирует ответ, опираясь и на ваш вопрос, и на эту подгруженную информацию. Вуаля - вы получаете: «Вот топ-3 конфет, которые мы рекомендуем: …» - точный, целевой, коммерчески эффективный ответ.

4. Инструменты (Tools)

Инструменты - неотъемлемая часть агентных систем. Вы, возможно, слышали термин tool calling (вызов инструментов). Современные LLM умеют «понимать», когда им нужно обратиться к внешнему инструменту - но не исполнять его напрямую, а скорее - сформировать запрос на его вызов.

LLM - это, по сути, решающий движок, который генерирует ответ в виде текста, изображения и т.п. Сама по себе она не делает HTTP-запросов или не листает базы данных. Вместо этого она говорит:

«Я не знаю погоду в Лондоне завтра. Но у меня есть инструмент - веб-поиск. Пожалуйста, запусти его с запросом “погода в Лондоне завтра”, собери результаты и верни мне - тогда я дам точный ответ».

На практике это выглядит так:

  • В системном промпте указывается: «Вам доступен инструмент: веб-поиск. Описание: простой поиск в интернете. Требуется только текст запроса».
  • Пользователь спрашивает: «Какая погода в Лондоне?»
  • LLM отвечает: «Нужно вызвать инструмент web_search с аргументом погода в Лондоне завтра».
  • Ваша система выполняет вызов, получает данные (например, JSON с прогнозом), вкладывает их в контекст (аналогично RAG), и только потом LLM генерирует человекочитаемый ответ.

Этот механизм очень похож на RAG - с той лишь разницей, что источники данных теперь - не статичные базы, а динамические сервисы.

5. Prompt Engineering - и почему она здесь, в синем блоке

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

Но зачем мы выделяем столько компонентов - инструменты, файлы, память, промпты? Потому что каждый из них - это ручка настройки, которую вы можете поворачивать независимо.

Когда вы осознанно начинаете работать с контекстом - даже в ChatGPT - вы переходите от пассивного пользователя к инженеру:

  • Что будет, если добавить примеры?
  • А если ужесточить ограничения?
  • А если изменить роль модели?

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


Структура промпта: разбираем по частям

Промпт - это в конечном счёте просто строка текста. Но чтобы управлять ею эффективно, полезно разбить её на логические блоки:

1. Роль (Role)

Настраивает «личность» модели:

«Вы - эксперт по всему, что связано с Райаном Рейнольдсом»
(Что, согласитесь, должна быть обязательная компетенция для любой уважающей себя системы.)

2. Характер / Темперамент (Personality)

Дополнительно задаёт стиль общения:

«Вы очень разговорчивы, но ненавидите быть многословным»
(Да, это парадокс - и модель с ним справится. Именно такие тонкости делают ответы живыми.)

3. Запрос (Request)

Собственно, ваша задача:

«Перечисли пять лучших боевиков с Райаном Рейнольдсом за последние пять лет»

4. Формат (Format)

Как должен выглядеть ответ:

«Верни список в виде нумерованного перечня. Никаких таблиц. Только краткие описания - по одному предложению»
(Вы удивитесь, но явное указание формата резко повышает точность.)

5. Примеры (Examples)

Крайне недооценённый элемент! Если вы ожидаете строгой структуры - дайте хороший и плохой примеры:

«Хорошо: “1. Дэдпул и Росомаха - остросюжетный кроссовер…”
Плохо: “Ну, там был один фильм про супергероев…”»

Это своего рода «обучение в промпте» - и работает оно на удивление хорошо.

6. Ограничения (Constraints)

Чёткие запреты:

«Никаких фильмов с Райаном Гослингом. Только Рейнольдс. Точка.»

7. Проверки (Evals)

Автоматическая или ручная валидация результата. В агентных системах часто используется второй LLM-вызов:

«Проверь: все ли фильмы действительно с Рейнольдсом? Все ли даты - в пределах 2020–2025?»
Но вы можете встроить это и в промпт:
«Убедись, что в списке нет “Барби”, даже если очень хочется».

Практический пример

Я взял скриншот этого разбора, загрузил его в ChatGPT и попросил:

«Создай на основе этого файла промпт для поиска лучших фильмов Райана Рейнольдса».

Результат был отличным. Давайте его протестируем:
Запрос: «Какие пять лучших боевиков с Райаном Рейнольдсом вышли за последние пять лет? Никакого Гослинга. И сделай ответ максимально многословным, но с сарказмом - как сам Рейнольдс».

Ответ ChatGPT:

«Итак, ты хочешь ТОП-5 боевиков за последние 5 лет - и только с Рейаном Рейнольдсом? Без всяких Го-го-Гослингов? Вызов принят.
Будет больно каламбурно, саркастично - до боли «рейнольдсово». И да, я буду говорить слишком много. Прости. Но когда ты в отрицании - ты просто не останавливаешься…

  1. Дэдпул и Росомаха
  2. Проект „Адам“
  3. Свободный человек
  4. Красное уведомление
  5. Телохранитель жены киллера»

Работает идеально.

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

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

Поделиться