Вы написали промпт. LLM выдала ерунду. Вы дописали «пожалуйста, будь точнее». Стало чуть лучше. Потом вы потратили полчаса на перебор формулировок и получили сносный результат. Знакомо?
Базовый промпт-инжиниринг — это умение спросить так, чтобы тебя поняли. Об этом мы уже говорили подробно. А продвинутый — это когда вы не спрашиваете, а управляете когнитивным процессом модели. Вы говорите ей не «что сделать», а «как думать над ответом». Разница примерно как между «нарисуй кота» и «нарисуй кота: начни с контура головы, потом уши, потом глаза с учётом перспективы — и объясняй каждый шаг». Результат во втором случае будет на порядок точнее.
В этой статье разберём три техники, которые превращают LLM из гадалки в надёжный инструмент аналитика: chain-of-thought, few-shot prompting и структурные паттерны промптов. Всё с примерами под наши задачи, без абстрактных «напиши стихотворение».
Анатомия продвинутого промпта
Продвинутый промпт — не просто инструкция. Это многослойная конструкция, каждый слой которой управляет определённым аспектом поведения модели. Давайте посмотрим на неё целиком, а потом разберём каждый компонент.
На диаграмме — полная структура промпта. Системный промпт задаёт роль и общий контекст, основной запрос формулирует задачу. Few-shot примеры демонстрируют ожидаемый результат на образцах, а chain-of-thought заставляет модель рассуждать по шагам. Ограничения отсекают нежелательное поведение. Входные данные — это контекст задачи. Всё вместе поступает в LLM и даёт структурированный ответ. Теперь — подробно по каждому слою.
Chain-of-Thought: заставляем модель рассуждать
Chain-of-Thought (CoT) — это техника, при которой вы просите модель показать ход рассуждений перед тем, как дать финальный ответ. Не «дай ответ», а «подумай вслух шаг за шагом, потом дай ответ».
Почему это работает? LLM — это не база данных, которая ищет ответ по индексу. Это генератор наиболее вероятного продолжения текста. Если вы просите ответ сразу — модель «стреляет» одним наиболее вероятным токеном. Если вы просите рассуждение — модель генерирует цепочку промежуточных выводов, и каждый следующий опирается на предыдущий. Финальный ответ получается более обоснованным просто потому, что модель «прошла» через логические шаги, а не прыгнула сразу к выводу.
Базовый CoT: «давай подумаем шаг за шагом»
Простейшая форма — добавить в промпт фразу Давай подумаем шаг за шагом (или Let's think step by step — на английских моделях работает стабильнее). Пример для задачи аналитика:
Задача: определить, какие REST-эндпоинты нужны для функции «корзина покупок» в интернет-магазине.
Промпт без CoT: «Перечисли REST-эндпоинты для корзины покупок интернет-магазина»
Промпт с CoT: «Мне нужно спроектировать REST API для корзины покупок интернет-магазина. Давай подумаем шаг за шагом: какие операции пользователь может совершать с корзиной? Для каждой операции определи HTTP-метод, URL и пример тела запроса/ответа. Сначала перечисли все операции, потом для каждой дай спецификацию».
Разница в качестве ответа колоссальная. Без CoT модель может выдать 3 эндпоинта. С CoT — 5–7, с обоснованием каждого и учётом граничных случаев вроде «объединить корзины после логина».
Zero-shot CoT vs Manual CoT
Есть два подхода к CoT:
| Подход | Суть | Когда применять |
|---|---|---|
| Zero-shot CoT | Просто добавляем «давай подумаем шаг за шагом» в промпт | Простые задачи, быстрый прототип |
| Manual CoT | Пишем пошаговую инструкцию рассуждения вручную | Сложные задачи, где важен контроль над логикой |
Для серьёзной аналитической работы почти всегда нужен Manual CoT. Вы как аналитик знаете предметную область и можете направить рассуждение модели в нужное русло, минуя типичные ловушки.
Практический пример CoT для аналитики требований
Допустим, нужно выявить нефункциональные требования к платёжному шлюзу. Вот как может выглядеть Manual CoT-промпт:
Ты — системный аналитик. Проанализируй описание платёжного шлюзаи выяви нефункциональные требования.
Рассуждай по следующему плану:1. Определи, с какими внешними системами взаимодействует шлюз2. Для каждого взаимодействия определи требования к производительности (таймауты, пропускная способность)3. Выяви требования к безопасности для каждого канала связи4. Определи требования к отказоустойчивости (что делать при недоступности платёжного провайдера)5. Сформулируй требования к аудиту и логированию6. На основе шагов 1–5 составь итоговый список НФТ в формате: ID | Категория | Требование | Критерий проверки
Описание платёжного шлюза:[текст описания]Обратите внимание: план рассуждения написан за модель. Вы не говорите «придумай, как анализировать» — вы даёте готовый мыслительный каркас, а модель наполняет его содержанием. Это и есть суть Manual CoT.
Few-shot prompting: показываем, а не объясняем
Few-shot prompting — это включение в промпт нескольких примеров того, какой результат вы ожидаете. Модель учится на лету: она видит паттерн в примерах и продолжает его для вашего нового входа.
Это не про «объясни на словах, что мне нужно» — это про «покажи 3 раза, что мне нужно, а теперь сделай так же для вот этого».
Сколько примеров нужно?
Для большинства аналитических задач достаточно 2–3 примеров. Один пример — это скорее подсказка, чем демонстрация паттерна. Пять и больше — риск перегрузить промпт и выйти за эффективную длину контекста (модель начинает «забывать» начало промпта). Оптимум — 2–3 качественных примера, покрывающих разные грани задачи.
Пример: форматирование пользовательских историй
Без few-shot:
«Напиши user story для функции восстановления пароля»
С few-shot:
Напиши user story для функции восстановления пароля по тому же шаблону,что и примеры ниже.
Пример 1:**Заголовок:** Просмотр баланса счёта**Как:** клиент банка**Я хочу:** видеть текущий баланс своего счёта в мобильном приложении**Чтобы:** контролировать расходы без звонка в поддержку**Критерии приёмки:**- Баланс обновляется не позже чем через 5 секунд после входа- Отображается валюта счёта- При недоступности сервиса показывается последний известный баланс с пометкой «данные могут быть неактуальны»
Пример 2:**Заголовок:** Фильтр заказов по статусу**Как:** менеджер интернет-магазина**Я хочу:** фильтровать список заказов по статусу (новый/в обработке/отправлен)**Чтобы:** быстро находить заказы, требующие внимания**Критерии приёмки:**- Фильтр поддерживает множественный выбор статусов- Список обновляется без перезагрузки страницы- Выбранные фильтры сохраняются в URL для возможности поделиться ссылкойМодель усваивает структуру, уровень детализации, стиль формулировок и даже подход к критериям приёмки. Важно: примеры должны быть релевантны вашей доменной области. Не показывайте пример из медицины, если работаете с финтехом — модель может утащить нерелевантные паттерны.
Few-shot + CoT: комбо
Самое мощное — это объединение обеих техник. Вы даёте примеры, в которых показан ход рассуждения, а потом просите модель повторить тот же мыслительный процесс для новой задачи:
Вот два примера анализа интеграционных точек между системами.Обрати внимание на структуру рассуждения: сначала определяемнаправление потока данных, потом протокол, потом требованияк надёжности.
Пример 1:[полный пример с рассуждением и итоговой таблицей]
Пример 2:[полный пример с рассуждением и итоговой таблицей]
Теперь проанализируй интеграцию между CRM и биллингом по той же схеме.Это работает в разы лучше, чем любой из методов по отдельности. По моему опыту, комбинация CoT + 2–3 примера даёт стабильно высокое качество там, где одиночные техники мажут.
Паттерны промптов для типовых задач аналитика
Теперь соберём конкретные шаблоны под наши рабочие ситуации. Каждый паттерн — это готовая структура промпта, которую можно копировать и адаптировать.
Паттерн 1: «Декомпозиция требования»
Задача: разложить крупное функциональное требование на атомарные.
Структура промпта:
Роль: ты — системный аналитик, который специализируется на декомпозиции функциональных требований.
Задача: разложи требование ниже на атомарные составляющие.
План рассуждения (CoT):1. Выдели ключевые сущности, которые фигурируют в требовании2. Определи действия пользователя для каждой сущности3. Выяви предусловия и постусловия для каждого действия4. Определи возможные состояния и переходы между ними5. Сгруппируй атомарные требования по функциональным блокам
Формат ответа: для каждого атомарного требования укажи- ID (ФТ-XX)- Заголовок- Действующее лицо- Предусловие- Основной поток- Альтернативные потоки (если есть)
Требование для анализа:[текст требования]Паттерн 2: «Выявление противоречий»
Задача: найти логические нестыковки в спецификации.
Структура промпта:
Роль: ты — ревьюер требований с фокусом на выявление противоречий.
Задача: проанализируй спецификацию и найди противоречия.
План рассуждения (CoT):1. Составь список всех утверждений из спецификации2. Для каждой пары утверждений проверь, могут ли они быть истинны одновременно3. Проверь согласованность терминологии: используется ли один и тот же термин в одном значении во всём документе4. Проверь числовые значения: не противоречат ли они друг другу (например, таймаут A < таймаут B, но A зависит от B)5. Для каждого противоречия сформулируй вопрос к автору
Формат ответа: таблица| # | Утверждение 1 | Утверждение 2 | Суть противоречия | Вопрос |
Ограничения:- Не указывай стилистические замечания — только логические противоречия- Если противоречий нет, так и напиши — не выдумывай
Спецификация:[текст спецификации]Паттерн 3: «API-контракт из сценария»
Задача: превратить текстовый сценарий использования в черновик OpenAPI-спецификации.
Эту задачу мы разбирали и в контексте проектирования REST API через LLM, но сейчас посмотрим на неё через призму продвинутого промптинга.
Структура промпта:
Роль: ты — системный аналитик, проектирующий REST API.
Задача: на основе пользовательского сценария составь спецификациюэндпоинтов в формате OpenAPI-совместимой таблицы.
Пример (few-shot):
Сценарий: «Менеджер просматривает список заказов за период,фильтрует по статусу и экспортирует в CSV»
Результат:| Метод | URL | Описание | Параметры | Ответ 200 | Ошибки || GET | /orders | Список заказов | ?date_from, date_to, status | Order[] | 400, 401 || GET | /orders/export | Экспорт в CSV | ?date_from, date_to, status | file(CSV) | 400, 401 |
Теперь сделай то же самое для сценария ниже.
План рассуждения (CoT):1. Выдели все действия пользователя из сценария2. Для каждого действия определи HTTP-метод3. Спроектируй URL согласно REST-принципам4. Определи query-параметры для фильтрации5. Определи коды ответов для успешного и ошибочных сценариев
Сценарий:[текст сценария]Паттерн 4: «Граничные случаи и негативные сценарии»
Задача: дополнить спецификацию граничными и негативными кейсами.
Роль: ты — системный аналитик, специализирующийся на тест-дизайне.
Задача: для каждого функционального требования ниже предложиграничные случаи и негативные сценарии.
План рассуждения (CoT):1. Для каждого входного параметра определи граничные значения (пустое, нуль, максимальное, на единицу больше максимума)2. Для каждого действия определи, что происходит при: - Отсутствии обязательного поля - Некорректном формате данных - Истечении таймаута зависимого сервиса - Повторном выполнении действия (идемпотентность)3. Проверь состояния гонки: что будет при двух одновременных запросах4. Для каждого сценария предложи ожидаемое поведение системы
Формат ответа: таблица| ID ФТ | Тип сценария | Входные данные | Ожидаемое поведение |
Требования:[текст требований]Когда промпт-инжиниринг не спасает
Примечательно, что есть класс задач, где даже самый изощрённый промпт не поможет. Это не серебряная пуля, и вот когда честнее выбрать другой подход:
- Задача требует точных вычислений. LLM не калькулятор. Если нужно посчитать налоги с точностью до копейки для 10 000 транзакций — используйте код, а не промпт.
- Контекст превышает окно модели. Можно разбить на части и скормить через RAG, но если нужен целостный анализ 500-страничного документа — промпт-инжиниринг бессилен. Тут нужен контекст-инжиниринг и правильный чанкинг.
- Задача требует гарантированной детерминированности. LLM вероятностна по природе. Один и тот же промпт может дать чуть разный результат. Для жёстко детерминированных операций используйте код.
Сравнение техник: шпаргалка
| Техника | Что делает | Когда брать | Ограничение |
|---|---|---|---|
| Zero-shot | Прямой запрос без примеров и инструкций | Простые вопросы, первый прототип | Низкое качество на сложных задачах |
| Few-shot | 2–3 примера ожидаемого результата | Когда важны формат и стиль вывода | Примеры должны быть релевантны домену |
| Chain-of-Thought | Пошаговая инструкция рассуждения | Сложный анализ, где важен ход мысли | Требует ручного проектирования плана |
| CoT + Few-shot | Примеры с демонстрацией рассуждения + новый вход | Самый надёжный вариант для ответственных задач | Самый затратный по токенам |
Стоит отметить: выбор модели тоже влияет на эффективность техник. Подробно о разных моделях и о том, какую выбрать под задачу аналитика, я рассказывал в отдельной статье.
Заключение
Продвинутый промпт-инжиниринг — это не магия и не подбор «правильных слов». Это инженерия: вы проектируете мыслительный процесс модели и подкрепляете его примерами. Инвестиция в качественный промпт окупается: 15 минут на написание Manual CoT + 2–3 few-shot примера экономят час ручной доработки ответа.
Начните с малого. Возьмите одну повторяющуюся задачу — например, декомпозицию требований — и напишите под неё один CoT-промпт с парой примеров. Отладьте на 3–4 реальных кейсах. А когда увидите результат — масштабируйте на остальные рабочие сценарии.
P.S. Модели становятся умнее, но принцип «что посеешь в промпте, то и пожнёшь в ответе» пока никто не отменял.