Хватит улучшать промпт. ИИ агенту нужен контекст проекта

Хватит улучшать промпт. ИИ агенту нужен контекст проекта

Даже подробный промпт не объясняет агенту, как устроен ваш проект. Для этого нужен отдельный, актуальный контекст.

Вы просите ИИ-агента добавить форму заявки на сайт.

Через пару минут форма готова. Выглядит нормально: кнопка нажимается, поля заполняются. Только стоит она не там. В ней появился email, хотя вам нужен телефон. Агент ещё продублировал форму в футере и слегка «улучшил» дизайн, который никто не просил трогать.

Формально задача выполнена. По факту опять нужно объяснять всё заново.

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

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

Промпт отвечает за действие сейчас

Промпт может быть простым:

Добавь форму заявки на сайт.

Он задаёт действие. Но внутри этой фразы нет ответов на вполне практические вопросы:

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

Если ответы не переданы, модель заполняет пробелы наиболее вероятным вариантом.

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

Контекст описывает проект и его границы

Для той же задачи контекст может выглядеть так:

Проект: B2B-лендинг на Next.js. Форма открывается в правой боковой панели. Поля: — имя; — телефон; — описание задачи. Существующие компоненты и цвета не менять. Новые backend-сервисы не добавлять. После изменения запустить: — lint; — тесты; — smoke-тест формы.

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

Я храню такие вещи отдельно от команды. Часть находится в правилах проекта, часть — в описании текущей задачи.

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

«Дай больше контекста» тоже можно довести до абсурда

Если скормить агенту весь репозиторий, историю чатов, заметки из Obsidian и пару лет переписки, лучше не станет.

Старые решения начнут спорить с текущими. В архиве найдётся стек, который уже заменили. Среди полезных заметок окажутся черновики и идеи, от которых давно отказались.

Мне нужен не максимальный объём информации, а актуальная выжимка под конкретную задачу:

  • что мы делаем сейчас;
  • какие части проекта можно менять;
  • какие правила уже приняты;
  • что обязательно нужно проверить;
  • где агент должен остановиться и спросить человека.

Остальное можно подтянуть позже, если оно действительно понадобится.

Рабочий цикл, который у меня прижился

Я использую такую последовательность:

Цель → контекст → план → микрозадачи → код → проверка → обновление контекста

Сначала я фиксирую измеримый результат. Затем агент читает актуальные правила проекта и предлагает план.

Большую работу мы разбиваем на небольшие изменения, каждое из которых можно проверить отдельно.

После написания кода запускаются реальные команды:

  • тесты;
  • линтер;
  • сборка;
  • smoke-проверки.

Фраза «готово» от агента ничего не доказывает, пока нет результата проверки.

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

Что положить в минимальный контекст

Для небольшой задачи обычно хватает пяти блоков.

1. Цель

Что должно измениться для пользователя.

2. Область изменений

Какие файлы или модули можно менять.

3. Ограничения

Что трогать нельзя и какие технологии не нужно добавлять.

4. Проверки

Какие команды необходимо запустить и какой результат ожидается.

5. Definition of Done

По каким признакам человек примет работу.

Готовый шаблон:

Цель: Что должно измениться для пользователя. Область изменений: Какие файлы и модули можно менять. Ограничения: Что трогать нельзя. Какие технологии и зависимости нельзя добавлять. Проверки: Какие команды нужно запустить. Какой результат считается успешным. Definition of Done: По каким признакам задача считается выполненной.

Это можно хранить в описании задачи, Markdown-файле или трекере. Название инструмента здесь вторично.

Суть в том, чтобы агент видел один актуальный источник требований, а не собирал их по старым чатам.

Секреты контекстом не становятся

API-ключ, access token, пароль, seed-фраза и данные карты не помогают модели понять проект. Они только увеличивают последствия возможной ошибки.

В контексте достаточно написать:

Используй переменную окружения API_KEY. Реальное значение не читать и не выводить в лог.

Сами значения должны оставаться в менеджере секретов, переменных окружения или другом предназначенном для этого хранилище.

Что изменилось у меня

Я перестал ждать, что одна формулировка каким-то образом передаст агенту устройство всего проекта.

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

Агент всё ещё ошибается. Просто теперь ошибка быстрее обнаруживается и реже повторяется второй раз.

Для меня это намного полезнее, чем очередная коллекция «50 промптов, которые изменят вашу работу».

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

Продолжения и рабочие заметки публикую в Telegram-канале UnderCode.

2