Промпт-инжиниринг — это не магия и не «просто хорошо попросить модель». Это инженерная дисциплина: вы собираете промпт из компонентов, каждый из которых отвечает за конкретное свойство результата. Пропустили один слой — модель додумает сама (читай: сгаллюцинирует). Добавили лишний — потеряли точность. Разберёмся, как это работает в контексте системного анализа: требования, ТЗ, документация.
Если вы ещё не пробовали применять LLM в повседневной работе аналитика — начните с общего обзора AI в системном анализе: как собирать и формализовать требования. Там — pipeline целиком. Здесь — только про промпты: как их конструировать, чтобы результат был не «вроде нормально», а ровно то, что нужно для ТЗ.
Что такое промпт-инжиниринг (на самом деле)
Промпт-инжиниринг — дисциплина проектирования инструкций для LLM, нацеленная на получение предсказуемых, структурированных и свободных от галлюцинаций результатов.
Промпт — текстовый запрос к языковой модели, содержащий инструкцию, контекст и ограничения. В контексте системного анализа промпт — это мини-ТЗ для модели: что анализировать, в каком формате выдать и чего не делать ни под каким видом.
Аналогия прямая. Вы даёте разработчику мутное описание задачи — получаете реализацию, которая решает не ту проблему. LLM ведёт себя точно так же, только она не переспросит (обычно). Всё, что вы не сказали явно, модель заполнит наиболее вероятным — и не обязательно правильным — вариантом.
Промпт-инжиниринг для аналитика — это не отдельная профессия. Это навык, который превращает «ну, что-то сгенерировалось» в инструмент, выдающий требования, пригодные для вставки в Confluence без получасовой правки.
Анатомия промпта аналитика
Хороший промпт собирается из семи слоёв. Пропускать можно, но каждый пропущенный слой — это степень свободы, которую вы отдаёте модели. А модель, напомню, не аналитик. Она — вероятностный автомат, который предсказывает следующее слово.
Схема — конвейер. На входе роль (фиолетовый) задаёт точку зрения модели: аналитик из финтеха будет мыслить категориями compliance и аудит-логов, аналитик из e-commerce — категориями корзины и промокодов. Контекст (синий) сужает пространство: не «спроектируй систему», а «мы делаем платёжный шлюз к существующему core-banking». Задача (жёлтый) формулирует конкретное действие. Формат (зелёный) фиксирует структуру выдачи. Примеры (синий) калибруют стиль и глубину. Ограничения (жёлтый) — страховка от галлюцинаций. Вывод (зелёный) — то, что вы получаете.
Семь слоёв не означают, что каждый промпт должен быть на три страницы. Для простых задач (вроде «переведи этот список требований в Gherkin») хватит трёх. Но если вы генерируете ТЗ на модуль — семь слоёв окупаются: модель не додумывает то, о чём вы забыли.
Паттерн #1: Zero-shot — когда модель уже знает
Zero-shot — это промпт без примеров. Вы просто говорите, что нужно сделать, и модель делает. Работает для задач, паттерн которых хорошо представлен в обучающих данных: перевод в Gherkin, рерайт текста, выделение сущностей.
Ниже — описание функции на естественном языке. Переведиего в формат Gherkin (Given / When / Then). Сгенерируйровно столько сценариев, сколько логически вытекаетиз описания. Не добавляй сценарии, не упомянутые в тексте.
Описание:Кнопка «Оформить заказ» доступна, только если корзинане пуста и пользователь авторизован. Если корзина пуста —кнопка заблокирована и отображается подсказка.Если пользователь не авторизован — кнопка ведёт на страницулогина.Модель выдаст 2–3 сценария Given/When/Then. Без примеров. Потому что Gherkin — это стандартный формат, и LLM «видела» его миллионы раз.
Zero-shot — ваш вариант по умолчанию. Начинайте всегда с него. Если результат кривой — подключайте примеры (Few-shot).
Паттерн #2: Few-shot — показываем, как надо
Few-shot добавляет в промпт 2–3 примера того, что вы хотите получить. Это самый мощный и, как ни странно, самый недооценённый паттерн в работе аналитика.
Пример: превращаем сырые заметки со встречи в структурированные User Story.
Преврати заметки со встречи в User Story по шаблону:«Как <роль>, я хочу <действие>, чтобы <ценность>».
Пример 1:Заметка: «Менеджер должен видеть отчёт по продажам за период»→ Как менеджер по продажам, я хочу видеть отчёт по продажамза выбранный период, чтобы оценивать эффективность командыи корректировать план.
Пример 2:Заметка: «Клиент хочет сохранять товары в избранное»→ Как авторизованный покупатель, я хочу добавлять товарыв избранное, чтобы вернуться к ним позже без повторного поиска.
Важно:— Ценность формулируй с точки зрения роли, а не системы.— Если заметка не содержит явной роли — определи её по контексту и укажи в скобках «(предположительно)».— Не придумывай действия, которых нет в заметке.
Заметки:1. Админ должен мочь менять цену товара без удаления и пересоздания карточки.2. После оформления заказа клиенту должно приходить письмо с составом заказа и трек-номером.3. Поддержка хочет видеть историю заказов клиента, когда тот обращается.Два примера калибруют модель: она понимает и уровень детализации (лаконично, но с конкретной ценностью), и стиль (инфинитив «видеть», а не «просматривать»). Третий промпт в том же стиле она напишет сама — потому что вы задали паттерн.
Примечательно, что few-shot «лечит» многие проблемы с форматом выдачи. Без примеров модель может выдать JSON вместо таблицы, или наоборот. С двумя примерами — формат фиксирован.
Паттерн #3: Role-prompting — назначаем роль и доменный контекст
Role-prompting задаёт точку зрения, с которой модель «думает». Для аналитика это критично, потому что требования из одного и того же текста в e-commerce и в банкинге выглядят по-разному.
Ты — ведущий системный аналитик в финтех-компании.Твой проект — платёжный шлюз для интернет-эквайринга.Ты работаешь в домене, где действуют:— Стандарт PCI DSS (безопасность платёжных данных).— Регуляторные требования ЦБ (отчётность, аудит).— Соглашение об уровне обслуживания (SLA): доступность 99.95%, время ответа API ≤ 200 мс для 95-го перцентиля.
На основе технического описания ниже выделинефункциональные требования. Особое внимание обратина безопасность транзакций, отказоустойчивостьи аудит-логи.Роль делает две вещи. Во-первых, подключает доменную терминологию: модель будет говорить «эквайринг» и «3-D Secure», а не «оплата» и «дополнительная проверка». Во-вторых, задаёт приоритеты: аналитик из финтеха обратит внимание на compliance, аналитик из e-commerce — на воронку конверсии.
Комбинируйте role-prompting с few-shot — это даёт самый стабильный результат. Роль задаёт контекст, примеры — формат.
Паттерн #4: Chain-of-Thought — рассуждаем по шагам
Chain-of-Thought (CoT) заставляет модель проговаривать промежуточные шаги, прежде чем дать финальный ответ. Для аналитика это полезно в двух сценариях: анализ trade-off архитектурных решений и проверка требований на полноту.
Без CoT модель выдаёт вывод. С CoT — вывод вместе с обоснованием. И часто само обоснование ценнее вывода: вы видите логику, по которой модель пришла к заключению, и можете её оспорить.
Ты — системный аналитик. Оцени компромисс между двумяархитектурными вариантами для сервиса нотификаций.
Вариант A: Синхронная отправка — запрос к внешнему сервисуSMS/Email во время обработки заказа.Вариант B: Асинхронная отправка через очередь сообщений(Kafka).
Рассуждай по шагам:
Шаг 1. Опиши, что происходит в каждом варианте при пиковойнагрузке (100 заказов/сек).Шаг 2. Опиши, что происходит при отказе внешнего сервисаSMS/Email в каждом варианте.Шаг 3. Сравни задержку, которую ощущает пользователь.Шаг 4. Сравни сложность разработки и эксплуатации.Шаг 5. На основе шагов 1–4 дай рекомендацию и укажи,при каком сценарии твоя рекомендация меняется напротивоположную.Важный нюанс: CoT работает только если вы явно перечислили шаги. Просто добавить «подумай шаг за шагом» в конце промпта — работает хуже, чем явная нумерация. Исключение — модели с нативной поддержкой reasoning (Claude 3.5+ с extended thinking, o1), где внутренняя цепочка рассуждений происходит автоматически.
Паттерн #5: Structured Output — получаем JSON или таблицу по схеме
Самый практичный паттерн для аналитика. Вы описываете схему вывода — модель заполняет её. Если вам нужны требования для импорта в Jira через API — просите JSON. Если вам нужна таблица для Confluence — просите Markdown-таблицу.
На основе описания фичи ниже составь спецификацию APIв формате JSON по следующей схеме:
{ "endpoint": "строка, метод и путь", "method": "GET | POST | PUT | PATCH | DELETE", "description": "строка, что делает ручка", "request": { "headers": [{"name": "...", "required": true/false, "description": "..."}], "path_params": [{"name": "...", "type": "...", "required": true/false, "description": "..."}], "query_params": [{"name": "...", "type": "...", "required": true/false, "description": "..."}], "body": "JSON-схема или null" }, "response": { "200": "описание успешного ответа", "4xx": ["перечень возможных ошибок"], "5xx": ["перечень возможных ошибок"] }}
Опиши все эндпоинты, которые вытекают из описания.Ошибки 4xx/5xx указывай только те, что специфичныдля этой ручки (не пиши «500 Internal Server Error»для каждой).
Описание фичи:[текст]Structured Output решает главную боль: вы тратите ноль времени на переформатирование. Модель выдала JSON — вы скормили его скрипту, который создаёт задачи в Jira. Или вставили Markdown-таблицу в Confluence и пошли пить кофе. А не «сейчас я полчаса буду перебивать это в нормальный вид».
Кстати, если вы пишете ТЗ — загляните в разбор структуры ТЗ: шаблоны и частые ошибки. Structured Output отлично ложится на заполнение разделов ТЗ по шаблону: модель заполняет секции, вы верифицируете.
Дерево решений: какой паттерн когда применять
Аналитику не нужны все пять паттернов одновременно. Нужен situational awareness — понимание, что включить в промпт под конкретную задачу.
Диаграмма — шпаргалка. Стартуете с серого узла «Задача». Первый вопрос — знает ли модель паттерн? Если задача типовая (вроде «переведи в Gherkin») — идите по левой ветке: Zero-shot, и если нужна структура — добавляйте Structured Output. Если задача специфична для вашего домена — правая ветка: задаёте роль, добавляете примеры (если есть), подключаете CoT для сложного анализа.
Двигайтесь сверху вниз — и к концу цепочки у вас будет не «просто промпт», а собранная по слоям инструкция.
Борьба с галлюцинациями: как заставить модель признаваться в незнании
Главная боль LLM для аналитика — модель склонна выдумывать требования. Не со зла. Просто её архитектурная задача — предсказать наиболее вероятное продолжение, а не сказать «я не знаю». Три приёма, которые снижают галлюцинации радикально:
Приём 1. Явный запрет на выдумывание. Не «будь аккуратнее» — модель не понимает намёков. Пишите прямо:
Если в тексте недостаточно информации для какого-либопункта — напиши «[ТРЕБУЕТ УТОЧНЕНИЯ]».Не придумывай недостающие данные.Работает. Модель начинает ставить маркер неопределённости в 60–70% случаев, где раньше додумывала.
Приём 2. Тернарный статус. Делите вывод на три категории: «Явно указано», «Выведено из контекста», «Требует уточнения». Модель лучше классифицирует собственную неуверенность, когда ей дают формальные категории, а не просят «быть честной».
Для каждого требования укажи статус:— ЯВНОЕ: требование прямо сформулировано в тексте.— КОСВЕННОЕ: выведено из контекста [ТРЕБУЕТ ПОДТВЕРЖДЕНИЯ].— ПРОБЕЛ: данных недостаточно [ТРЕБУЕТ УТОЧНЕНИЯ].Приём 3. Перекрёстная проверка. Прогоните один и тот же текст через два разных промпта (или две разные модели) и сравните списки требований. Всё, что совпало, — с высокой вероятностью действительно есть в тексте. Всё, что различается, — кандидат на галлюцинацию. Звучит как перестраховка? Возможно. Но когда вы генерируете требования для системы с бюджетом разработки в несколько миллионов — 20 минут на перекрёстную проверку дешевле, чем переписывание модуля из-за выдуманного требования.
Таблица: шпаргалка по паттернам
| Паттерн | Что делает | Когда применять | Пример задачи аналитика |
|---|---|---|---|
| Zero-shot | Промпт без примеров | Типовые форматы (Gherkin, рерайт, перевод терминов) | «Переведи требования в формат Given/When/Then» |
| Few-shot | 2–3 примера в промпте | Специфичный формат или стиль, нестандартный шаблон | «Сгенерируй User Story как в примере» |
| Role-prompting | Назначение роли и домена | Нужна доменная терминология и приоритеты | «Ты — аналитик в страховании, выдели НФТ» |
| Chain-of-Thought | Пошаговое рассуждение | Анализ trade-off, поиск противоречий, сложный вывод | «Сравни два архитектурных варианта по шагам» |
| Structured Output | Фиксированная схема вывода | Результат нужен для импорта в Jira, Confluence, API | «Выдай спецификацию эндпоинта в JSON по схеме» |
Каждый следующий паттерн не заменяет предыдущий, а накладывается. Самые стабильные результаты — когда в одном промпте собраны роль, few-shot-примеры и structured output. Да, промпт получается длинным. Но он работает с первого раза, а не с пятого.
Что НЕ работает (или работает хуже, чем обещают)
Огромный системный промпт на 5 страниц. Звучит солидно. На практике модель «забывает» середину длинного промпта (эффект lost-in-the-middle). Правило: системный промпт — до 500 слов. Всё, что длиннее, лучше разбить на цепочку последовательных промптов.
«Ты — эксперт мирового уровня». Пафосные роли не улучшают качество. Модель не становится умнее от того, что вы назвали её «экспертом мирового уровня». А вот «Ты — системный аналитик в финтехе, знаешь PCI DSS и 115-ФЗ» — работает, потому что задаёт конкретный контекст.
«Будь креативным». Креативность LLM в контексте требований — это галлюцинации. Вам не нужна креативность. Вам нужна точность. Поэтому «не выдумывай» должно быть в каждом промпте к требованиям.
Один универсальный промпт для всего. Не работает по определению. Промпт для извлечения ФТ из переписки не подходит для генерации ТЗ, и наоборот. Коллекция из 5–7 отлаженных промптов под конкретные задачи даст больше, чем попытка написать один «супер-промпт».
Заключение
Промпт-инжиниринг не делает из аналитика промпт-инженера. Он делает из аналитика — более эффективного аналитика. Разница в том, что вы перестаёте гадать, почему модель выдала ерунду, и начинаете собирать промпт как спецификацию: слой за слоем, от роли до формата вывода.
Пять паттернов покрывают 90% задач системного аналитика. Zero-shot для типовых операций, few-shot для калибровки формата, role-prompting для доменного контекста, CoT для анализа и structured output для машиночитаемого результата. Комбинируйте — и промпт перестанет быть лотереей.
И да: первый промпт почти всегда сырой. Это нормально. Вы запускаете, смотрите на выдачу, правите один слой — и со второго-третьего раза получаете инструмент. Промпт-инжиниринг — это не «написал и забыл». Это итеративная сборка. Как и любая другая инженерная работа.
P.S. Если вы дочитали до этого места и подумали «ну, zero-shot’ом я и так пользуюсь» — попробуйте на следующей задаче собрать промпт из четырёх слоёв: роль + контекст + few-shot + structured output. Разница в качестве выдачи вас удивит. А потом вы удивитесь, что раньше писали промпты в одну строку и называли это «работой с AI».