
Эта публикация открывает цикл из двух материалов. Здесь базовая часть для новичков, а во второй статье — будут продвинутые советы по RAG, агентам и другим более сложным сценариям.
Каждую неделю в тредс или на реддите кто-то жалуется: «Попросил ChatGPT (Gemini, Grok, клод, нужное подчеркнуть) написать сопроводительное письмо, а получил кринж из штампов. Ну и фигня эта ваша нейронка». В комментах топикстартеру задают резонные вопросы: «Какой системный промпт ты писал? Контекст давал? Примеры приложил? Tone of voice описал?» А в ответ — тишина.
Эта статья про то, как не быть таким персонажем и перестать обижаться на ИИ.
Почему я ее пишу: я контент-маркетолог в Cloud.ru, и так уж получилось, что промпт-инженер (у меня и справка есть). Работаю с LLM каждый день уже более трех лет, долго сотрудничала с нашей ML-командой и хорошо представляю, как вводные на естественном языке трансформируются в выдачу. Часто разбираю чаты коллег, у которых не получилось добиться чего-то от LLM, и помогаю им составлять эффективные промпты под разные задачи.
А еще веду блок про правильное использование ИИ в нашей внутренней школе авторов. В этой статье решила собрать опыт, который закрывает 70% проблем тех, кто пообщался с машиной, получил неудовлетворительный результат и теперь доверяет ей разве что рецепт курочки на ужин.
Иллюзия «сделай красиво/хорошо/лучше»: zero-shot против few-shot
В книжках и постах про ИИ часто приводят метафору: общение с моделью похоже на работу с гиперактивным джуном, у которого тяжелая форма амнезии.
Да, он что-то знает, готов работать, но при этом забывает то, что вы говорили десять минут назад, и без подробного брифа сделает как получится.
Поэтому первый и самый частый способ получить плохой результат — это дать модели голую формулировку без примеров. На профессиональном жаргоне это называется zero-shot prompting и, по сути, переводится как «угадай, что я имел в виду».
Допустим, продакт-менеджер решает, не привлекая внимания санитаров разработчиков, модифицировать простой скрипт на сайте. Кидает кусок кода в нейронку с нулевым промптом: «Добавь сюда поп-ап при клике».
Нейросеть выдает результат. Менеджер копипастит это на сайт, но ничего не работает. Он начинает закидывать ошибки обратно в чат, ИИ предлагает новые варианты, код обрастает костылями, и все становится только запутаннее. Приходится звать на помощь коллег.
В чем была проблема? На старом сайте крутится легаси на jQuery. Но менеджер не дал контекста, а языковая модель решила блеснуть знаниями. Она увидела код и подумала: «Какой jQuery, бро? Держи ванильный JS. Я все переписала, добавила тайм-ауты для анимации, блеск!» А валидировать ответ менеджеру просто не хватает экспертности: он не отличает $(‘#btn’) от document.querySelector(‘#btn’).
Но менеджер и не должен в этом разбираться. Проблема возникает на шаг раньше: прежде чем открывать окно чата с ИИ, вы обязаны провести базовую разведку и собрать контекст своими руками.
Такой подход называется few-shot prompting. Когда вы не просто описываете задачу, а добавляете к ней несколько примеров того, как должен выглядеть хороший результат. Потому что нейросеть — это не системный аналитик и не экстрасенс. Вы не можете делегировать ей сбор исходных данных.
Вам не нужно разбираться в тонкостях архитектуры, но вы должны иметь максимум фактуры, которую отдадите в промпт. Не знаете стек? Подойдите к разработчику и спросите: «На чем работает этот лендинг?» Или используйте чит-код для нетехнарей: сделайте ваш самый первый промпт диагностическим.
Не просите сразу генерировать код, а напишите так:
«Вот кусок кода с нашего старого сайта. Я не разработчик. Проанализируй его и скажи, какой язык или библиотеки тут используются. Затем составь для себя же строгий список ограничений, которым ты будешь следовать, когда я попрошу тебя этот код изменить, чтобы не сломать сайт».
ИИ сам проанализирует контекст, сам напишет для себя ограничения — и только после этого вы ставите ему задачу. Сбор контекста — это ваша зона ответственности.
Плюс учитывайте, что законы Мерфи в работе с нейросетями никто не отменял. Если что-то может быть сделано через альтернативные места, оно будет сделано через альтернативные места.
Была у меня история из жизни: на работе у мужа есть летняя школа для детей, где им объясняют, что такое алгоритмы. Волонтер собирает детишек за столом, на котором лежит батон в упаковке, нож и масло. Задача — давать инструкции так, чтобы в конце получился бутерброд. Что вы думаете? Все уже ломается на стадии «Возьми нож в руку и нарежь батон».
То же самое работает для любой роли.
Пример: дизайнер просит покритиковать макет.
❌ Без референсов и ограничений получит банальные советы вроде «улучшите контрастность», «увеличьте отступы», «поиграйте со шрифтами».
✅ С приложенным гайдлайном и примерами будут конкретные замечания по типографике и сетке.
Если задуматься, то ничего нового здесь нет. В любой нормальной команде тимлиды годами учат стажеров и джунов правильно просить помощи: «Опиши задачу и всё, что уже попробовал, приложи логи или скрин ошибки, скажи, какого результата ждешь». Половина вопросов в этот момент отваливается сама: пока человек формулирует проблему, он сам же ее и решает. Есть целая культура, как правильно задавать вопросы, — от знаменитого How To Ask Questions The Smart Way до внутренних регламентов в чатах поддержки.

Универсальное правило здесь в том, что модель сама никогда не догадается. Она всегда подставит среднее по обучающей выборке, а это уныло. И чтобы вытащить из этого среднего что-то полезное, одного приема мало. Хороший промпт — это комбинация нескольких слоев: роли, аудитории, контекста, формата, ограничений.
Условия хорошего промпта
Когда вы пишете: «Ты senior backend engineer с опытом высоконагруженных систем», то происходит сдвиг весов — токены, связанные с профессиональной лексикой и паттернами, получают более высокую вероятность. Ответ становится более предметным, модель начинает использовать обороты, которые в обучающей выборке встречались рядом со словосочетанием «senior backend».
Второй важный пункт — определять аудиторию. «Объясни архитектуру kubernetes-кластера так, чтобы понял джун-фронтендер» и «Опиши ту же архитектуру для CTO, который принимает решение о бюджете» — это два разных текста.
Хорошая структура промпта будет такой:
-
Роль — кто ты сейчас.
-
Контекст — что происходит вокруг задачи.
-
Аудитория — для кого результат.
-
Сама задача — что конкретно нужно.
-
Формат вывода — как должен выглядеть ответ.
-
Ограничения — чего точно не делать.
Выглядит как ТЗ для подрядчика. По сути, это оно и есть. Он сделает ровно то, что написали, а не то, что имели в виду между строк.
Например, возьмем абстрактный, но узнаваемый кейс: «Помоги разобраться с инцидентом, у нас сервис ночью лег».
В zero-shot-варианте модель даст общую отписку: посоветует посмотреть логи, проверить инфраструктуру, сетевые проблемы, базу данных. Полезность такого ответа стремится к нулю.
А теперь добавим контекста по схеме «роль — данные — пример — формат»:
Комбопромпт для постмортема
Ты SRE с опытом расследования инцидентов в распределенных системах.
Мне нужен детальный разбор инцидента (постмортем) по падению сервиса оплаты.
Контекст:
— Сервис: оплата (payment‑service.
— Стек: Go, PostgreSQL, Kafka, Kubernetes.
— Время инцидента: с 03:12 до 03:47 по времени YYYY-MM-DD (инцидент можно считать начавшимся, когда сильно выросли latency и error rate.
** Что у меня есть:
1. Логи application‑сервиса оплаты за период 03:05–03:55 (чуть шире инцидента):
(В реальном запросе вставляем сюда свои настоящие логи за 03:05–03:55.)
2. Описание графиков метрик за тот же период (латентность, ошибки, лаг и т. п.):
(В реальном запросе даем свои реальные числа или краткое описание «на графике видно, что…».)
3. Детали инцидента и действий команды:
```text
Инцидент:
— start: 03:12;
— end: 03:47.
Алерты:
— 03:13 — алерт "payment: error_rate > 5% for 5m (current: 22%)" в PagerDuty;
— уведомление пришло в slack-канал #prod-incidents.
Действия во время инцидента:
— 03:15 — перезапустили deployment payment-service (2 pod’а);
— 03:20 — увеличили реплики с 2 до 4;
— 03:28 — вручную рестартнули Kafka consumer;
— 03:35 — отключили часть трафика (feature flag для одного из методов оплаты);
— 03:47 — метрики вернулись в норму, инцидент закрыли.
```
4. Краткое описание архитектуры сервиса оплаты:
```text
payment-service:
— принимает синхронные HTTP-запросы /api/payments;
— пишет транзакцию в PostgreSQL (таблица payments + несколько вспомогательных);
— после успешного коммита отправляет событие в Kafka (topic=payments-events);
— отдельный consumer читает payments-events и дергает сторонний PSP.
db:
— max_connections=200, для payment-service пул 50;
— есть ночной репорт, который иногда сильно грузит базу.
kafka:
— один consumer group payments-consumer, autoscale нет;
— retry на уровне consumer’а: 3 попытки, дальше сообщение уходит в DLQ.
```
5. Пример моего старого постмортема / желаемый стиль (я прикладываю кусок текста, можно анонимизированный, чтобы было видно, как оформлять разделы, таймлайн и action items).
***
Что нужно сделать
Сделай, пожалуйста, постмортем по той же структуре, к которой я привык:
1. Таймлайн событий
— по минутам / крупным шагам: что увидели в метриках, какие ошибки в логах, какие действия предпринимали.
2. Корневая причина (Root Cause)
— четкая формулировка одной-двумя фразами;
— обоснование по логам и метрикам (какие строки / какие графики на это указывают).
3. Что сработало в обнаружении
— какие алерты/метрики помогли;
— что было сделано быстро и правильно.
4. Что не сработало
— где было позднее срабатывание;
— каких сигналов или алертов не хватало;
— где нас подвела наблюдаемость или процессы.
5. Action items с приоритетами
— список задач в формате:
— [P1] ... — критично, надо сделать в первую очередь;
— [P2] ... — важно, но не горит;
— [P3] ... — nice to have / улучшения.
— привязка к конкретным проблемам, обнаруженным в инциденте (алерты, код, конфигурация PostgreSQL/Kafka/Kubernetes, дашборды).
Если каких‑то данных, на твой взгляд, не хватает для уверенной корневой причины, явно напиши в конце раздела «Корневая причина», какие именно наблюдения/метрики/логи нужно еще собрать, и сформулируй их в виде TODO.
Разница в выдаче будет огромная, так как мы сдвинули распределение вероятностей в сторону профессионального технического языка и конкретного формата.
Конфликт промптов: иерархия инструкций
В реальном ИИ-продукте на одну модель давит сразу несколько слоев инструкций:
-
System prompt — то, что задает промпт-инженер продукта: «Ты ассистент банка, отвечаешь только на финансовые вопросы, не материшься, не обсуждаешь политику».
-
Developer prompt — дополнительные технические инструкции от разработчиков, формат вывода, подключенные инструменты.
-
User message — то, что пишет пользователь.
-
Tool calls — результаты вызовов функций, RAG-чанки и прочие данные, которые подмешиваются в контекст.
Чем ниже слой, тем меньше доверия. System выигрывает у user. Поэтому ассистент банка не будет обсуждать политику и выдавать секретные промокоды, даже если вы очень вежливо попросите.
На нашей конференции GoCloud в апреле мы как раз делали стенд, где участники пытались взломать упрощенную версию Гига-помощника — заставить его обойти ограничения и поделиться промокодом. Для этого нужно было использовать системный промпт и избегать слов, на которые реагировали guardrails.
Знание слоев помогает:
-
Трезво оценивать, что ассистент может сделать, а чего не может. Если что‑то запрещено на уровне системы, нет смысла бесконечно переформулировать запрос, так как дело не в вашем ТЗ.
-
Формулировать вопросы в рамках роли ассистента. Не просите сломать правила, а ищите максимально полезное действие внутри допустимого лимита.
-
Меньше разочаровываться. Помните, что отсутствие ответа — не баг, а осознанное ограничение продукта.
Контекст-инжиниринг
В начале статьи мы говорили про продакта, решившего исправить старый скрипт на jQuery. Мы выяснили, что главная задача, перед тем как идти к нейросети, — собрать контекст. Но у этого правила есть другая, не менее разрушительная крайность.
С появлением моделей с контекстом в миллион токенов появилось искушение: «А давайте запихнем всю документацию и переписку из мессенджера в промпт — и пусть сам разбирается».
Остановитесь, это плохая идея по трем причинам:
-
Токены небесплатны. Большой контекст превращается в большой счет.
-
Производительность падает. Чем больше контекст, тем медленнее ответ (в инженерии это называется TTFT — Time To First Token).
-
Даже модель с миллионом токенов помнит начало контекста хуже, чем конец. Качество извлечения информации просаживается посередине очень длинных промптов. Такое явление получило название lost in the middle.
На рынке появилось даже отдельное направление — context engineering как развитие промпт-инжиниринга. Идея в том, что хороший промпт — это не магическая фраза, а правильно собранный контекст: что положили, что выкинули, как сжали историю, в каком порядке расставили.
Практические правила:
-
Самое важное помещайте в начало или в конец промпта, но не в середину.
-
Длинные документы прогоняйте через дешевые быстрые модели для суммаризации (создания выжимки) и только потом отдавайте результат в дорогой основной промпт.
-
Историю длинных диалогов сжимайте автоматически, не отправляйте все сообщения подряд.
-
Системный промпт держите коротким и плотным, без вежливых фраз и лирических отступлений.
Все вышесказанное — про текст. А как работать с промптами для визуала?
Промпты для картинок
Тут работает тот же принцип: плохие промпты дают плохие или просто очень примитивные результаты.
Структура хорошего промпта для картинки будет напоминать постановку кадра на съемочной площадке:
-
Subject — кто или что главное в кадре.
-
Action — что субъект делает.
-
Environment — где это происходит.
-
Style — фотореализм, акварель, киберпанк, конкретный референс.
-
Composition — план, ракурс, композиция.
-
Lighting — освещение.
-
Negative — чего точно не должно быть.
Отдельная боль — стереотипы, которые модель тащит из обучающих данных. На запрос «врач в кабинете» вы получите мужчину средних лет в белом халате.
«Бизнесмен» — он же, только в костюме и на фоне большого города.

Лечится явным описанием в промпте: возраст, телосложение, одежда, окружение, цвет кожи, волос, глаз и так далее.
Но стереотипы и шаблоны — это про то, что модель видела в обучении. Есть другая проблема: в любой компании есть огромный пласт того, что она не видела никогда, — внутренние документы, регламенты, проектная история, переписка с клиентами.
Именно поэтому индустрия массово обвешивает модели RAG-системами, чтобы модель опиралась на внутренние документы. Но об этом в следующей части.
Итоги и чек-лист грамотного юзера
LLM — это компилятор текста. Очень мощный, удобный, но компилятор. Качество выхода зависит от качества входа. Если на входе вы пишете: «Сделай круто, причеши, покрути», на выходе будет причесанное и перекрученное нечто, которое, скорее всего, вас разозлит.
А вот структурированный промпт с ролью, контекстом, примерами и форматом приведет к более предсказуемому и ожидаемому результату.
Поэтому навык писать ТЗ для машины — это новая базовая инженерная грамотность. И чтобы все вышесказанное не растворилось в потоке текста, держите компактный чек-лист.
Как лучше ставить ТЗ для ИИ
На постановке задачи:
-
Задайте роль — «Ты Senior X с опытом Y».
-
Опишите аудиторию — для кого результат.
-
Дайте контекст — что вокруг задачи, что делали, что получилось, какие ошибки.
-
Приложите примеры — два-три «как надо» и один «как точно не надо».
На итерации:
-
Не пытайтесь починить плохой результат добавлением «постарайся лучше». Чините структуру промпта.
-
Если просите факты, то требуйте источники и проверяйте сами.
-
Если результат получился слишком общим, добавьте отраслевую специфику в контекст.
-
Один и тот же запрос на разных моделях даст разные результаты. Пробуйте.
Антипаттерны: как точно не надо
-
«Сделай красиво» без референсов и примеров — модель сделает усредненно.
-
«Подумай хорошенько» — никак не помогает. Помогает Chain-of-Thought с явной структурой рассуждения.
-
Шесть противоречащих ролей в одном системном промпте: «Будь дружелюбным, но строгим, формальным, но игривым, точным, но гибким» — модель сходит с ума и ловит галлюцинации.
-
Контекст в 10 000 токенов, в котором главное — на 9 000-й строке (lost in the middle помните?).
-
Запрос актуальных данных без подключенного поиска — модель, скорее всего, соврет правдоподобными цифрами.
Автор: tutova_tut


