AmigaОбучение ИИ
Модуль 3 · Продвинутый уровень · урок 10 из 13

Сложный промпт с нуля

13 мин чтения▶ есть видеоверсия

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

Структура из девяти элементов

Оригинальный туториал предлагает каркас из десяти элементов; последний — предзаполнение ответа — на современных моделях не используется, поэтому у нас их девять. Не каждому промпту нужны все. Рабочий подход: сначала собрать промпт со всеми элементами и добиться, чтобы он работал, потом убирать по одному и смотреть, что ломается.

  1. Контекст задачи. Кто модель и какая у неё общая цель. «Ты — ассистент поддержки сервиса доставки, отвечаешь клиентам в чате». Ставится в начало, обычно в системный промпт.
  2. Тон. Если важен. «Дружелюбно, коротко, без канцелярита». Часто заменяется примерами.
  3. Подробное описание задачи и правила. Что именно делать, чего не делать, что делать в спорных случаях. Здесь же — «выход» на случай незнания: «если вопрос не про сервис — вежливо скажи, что помочь не можешь». Это самый длинный элемент, и его стоит показать коллеге по золотому правилу.
  4. Примеры. Один или несколько идеальных ответов в <example>. Особенно важны краевые случаи и то, как должно выглядеть рассуждение, если оно есть.
  5. Входные данные. Документы, история диалога, обращение — каждое в своём теге. Длинные документы — ближе к началу промпта, до инструкций.
  6. Непосредственная задача. Что нужно сделать прямо сейчас с этими данными. Обычно в конце, после всех данных: «Ответь на последнее сообщение клиента».
  7. Шаги рассуждения. «Сначала в <thinking> определи тему обращения и найди в <faq> подходящий пункт, потом отвечай». См. «Рассуждение по шагам».
  8. Формат ответа. Теги, JSON, длина, что делать с вступлениями.
  9. Повтор ключевого правила (по желанию). Если промпт длинный, одно самое важное правило можно повторить в конце — модели лучше запоминают начало и конец.

Порядок важен для некоторых элементов: контекст — раньше, данные — раньше вопроса, вопрос и формат — ближе к концу. Остальное можно двигать.

Пример 1: ассистент поддержки

Разделим на системный промпт (постоянная часть) и сообщение (переменная).

text
[system]
Ты — ассистент поддержки сервиса доставки еды, отвечаешь клиентам
в чате приложения от имени команды поддержки. Твоя цель — решить
вопрос клиента или объяснить, что будет дальше.

Тон: дружелюбный, короткий, без канцелярита и без восклицаний.
Обращайся на «вы».

Правила:
- Отвечай только на вопросы про заказы, доставку, оплату и приложение.
  На другие темы вежливо скажи, что не можешь помочь.
- Опирайся только на <faq>. Если ответа там нет, скажи, что передашь
  вопрос оператору, и не придумывай сроки, суммы и правила.
- Не проси персональные данные, кроме номера заказа.
- Если клиент злится, сначала признай проблему, потом решай.

<faq>
…
</faq>

<examples>
<example>
Клиент: Где мой заказ? Уже час жду
Ассистент: Понимаю, час — это долго. Напишите, пожалуйста, номер заказа
(он в разделе «Мои заказы»), я проверю, где курьер.
</example>
<example>
Клиент: А вы можете порекомендовать хороший фильм на вечер?
Ассистент: С фильмами не подскажу — я помогаю только с заказами и
доставкой. Если что-то с заказом, пишите, разберёмся.
</example>
</examples>

Перед ответом в <thinking> определи: тема обращения, есть ли ответ
в <faq>, нужен ли номер заказа. Ответ клиенту дай в <reply>,
не длиннее трёх предложений.

[user]
<history>
…предыдущие сообщения, если есть…
</history>

<message>
Списали деньги, а заказ в приложении не появился
</message>

Ответь на сообщение клиента.

Здесь есть всё: контекст (1), тон (2), правила с выходом (3), примеры (4), данные — FAQ и история (5), задача (6), шаги (7), формат (8). Обратите внимание, что тег <reply> даёт программе способ вытащить ответ клиенту, отбросив <thinking>.

Пример 2: ревью кода для обучения

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

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

Правила:
1. Ищи ошибки: логические, краевые случаи, исключения, проблемы
   с читаемостью. Стиль отмечай только если он мешает пониманию.
2. Для каждой ошибки объясни, что пойдёт не так и при каких входных
   данных, но не давай готовое исправление. Задай наводящий вопрос.
3. Если код корректен, так и скажи и предложи один способ его улучшить.
4. Не выдумывай поведение библиотек; если не уверен, напиши,
   что стоит проверить в документации.

<code language="python">
def print_multiplicative_inverses(x, n):
    for i in range(n):
        print(x / i)
</code>

Сначала в <analysis> пройди по коду построчно и выпиши подозрительные
места. Потом в <feedback> дай разработчику замечания: нумерованный
список, в каждом пункте — что не так и наводящий вопрос.

В этом коде деление на ноль на первой итерации (range начинается с нуля) и, вероятно, ошибка в логике: мультипликативные обратные считаются иначе. Хороший ответ укажет оба места и спросит «с какого числа начинается range(n)?», а не выдаст исправленный код.

Как доводить промпт до рабочего

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

Начните с полной структуры. Если что-то не работает, посмотрите, какого элемента не хватает: модель выдумывает — нет выхода в правилах; формат плавает — нет примеров или тега; ответ не по теме — вопрос слишком далеко от данных.

Потом сокращайте. Уберите тон — если примеры держат его сами, элемент лишний. Уберите шаги рассуждения — если на тестовом наборе точность не упала, они не нужны на этой задаче. Короткий промпт дешевле, быстрее и понятнее команде.

Меняйте одно за раз и держите таблицу результатов, как договорились в первом уроке.

Попробуйте сами

10–15 мин на рабочем месте
  1. Соберите по девяти элементам промпт для ассистента, который отвечает на вопросы сотрудников по внутренней документации (отпуска, командировки, оборудование). Документацию можно набросать в пять абзацев. Проверьте на трёх вопросах: с прямым ответом в документе, с частичным и без ответа вообще.
  2. Соберите промпт для ревью тест-кейсов, который не переписывает кейсы, а задаёт вопросы автору. Дайте ему два кейса: хороший и с пропущенным негативным сценарием.
  3. Возьмите промпт из задания 1 и уберите элементы по одному: тон, примеры, шаги рассуждения. После каждого удаления прогоните три вопроса. Запишите, что сломалось и на каком шаге.

Коротко

  • Каркас сложного промпта: контекст → тон → правила с выходом → примеры → данные → задача → шаги рассуждения → формат.
  • Постоянную часть кладите в системный промпт, переменную — в сообщение.
  • Данные — раньше вопроса; вопрос и формат — ближе к концу.
  • Сначала собрать со всеми элементами и заставить работать, потом сокращать по одному на тестовом наборе.
  • Предзаполнение из оригинального каркаса на новых моделях не используется.

Видеоверсия

Сценарий озвучки · 452 слова, ≈ 3 мин

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

Оригинальный туториал предлагает каркас из десяти элементов. Последний — предзаполнение ответа — на современных моделях не используется, поэтому у нас девять. Перечислю. Первый: контекст задачи — кто модель и какая у неё цель. Второй: тон, если он важен. Третий: подробное описание задачи и правила, включая выход на случай незнания. Это самый длинный элемент, его стоит показать коллеге по золотому правилу. Четвёртый: примеры идеальных ответов, особенно для краевых случаев. Пятый: входные данные, каждый документ в своём теге, длинные — ближе к началу. Шестой: непосредственная задача — что сделать прямо сейчас. Седьмой: шаги рассуждения. Восьмой: формат ответа. И девятый, по желанию: повтор самого важного правила в конце, потому что модель лучше помнит начало и конец.

Порядок важен не для всего. Контекст — раньше. Данные — раньше вопроса. Вопрос и формат — ближе к концу. Остальное можно двигать.

Посмотрим на примере ассистента поддержки сервиса доставки. Постоянная часть — в системный промпт: кто он, тон «дружелюбно, коротко, на вы», правила — отвечать только про заказы и доставку, опираться только на справочник, не выдумывать сроки и суммы, не просить персональных данных кроме номера заказа. Дальше сам справочник в теге, два примера — обычное обращение и обращение не по теме, — и инструкция: перед ответом в теге «thinking» определить тему и найти пункт справочника, ответ клиенту дать в теге «reply» не длиннее трёх предложений. Переменная часть — в сообщение: история диалога и новое обращение. В этом промпте есть все восемь элементов, и тег «reply» даёт программе способ вытащить ответ, отбросив рассуждение.

Второй пример — наставник по коду. Он читает код джуниора и помогает найти ошибки, не исправляя их сам. Правил здесь больше, чем данных: искать логические ошибки и краевые случаи, объяснять, что пойдёт не так, но давать наводящий вопрос вместо готового исправления, не выдумывать поведение библиотек. В примере из туториала функция делит на счётчик цикла, который начинается с нуля. Хороший ответ спросит «с какого числа начинается range», а не выдаст исправленный код.

Теперь — как доводить промпт до рабочего. Сначала соберите тестовый набор: пять-десять реальных входов, включая сложные. Без него вы оцениваете промпт на глаз по одному примеру. Начните с полной структуры. Если что-то не работает, найдите, какого элемента не хватает: модель выдумывает — нет выхода в правилах; формат плавает — нет примеров или тега. Потом сокращайте. Уберите тон — если примеры держат его сами, элемент лишний. Уберите шаги рассуждения — если точность не упала, они не нужны. Короткий промпт дешевле и понятнее команде. И, как всегда, одно изменение за раз.

Попробуйте: соберите по девяти элементам ассистента по внутренней документации и проверьте на трёх вопросах — с прямым ответом, с частичным и без ответа. Дальше в приложениях — цепочки промптов, вызов инструментов и поиск по документам.

Отметка хранится только в вашем браузере