Хороший промпт — это постановка задачи
Модель не читает мысли. Хороший промпт содержит то же, что хорошая задача для нового сотрудника: роль и контекст, конкретную задачу, ограничения, формат ответа и что делать, если данных не хватает («если ответа нет в документе — так и скажи»). Без последнего пункта модель охотно додумает.
Системный промпт задаёт правила на весь диалог, пользовательский — конкретный запрос.
Отделяйте инструкции от данных
Документ, письмо или ввод пользователя оборачивают в явные границы — теги вроде <document>…</document>. Так модель понимает, где инструкция, а где материал для обработки. Это повышает качество и немного снижает риск, что фраза из письма будет выполнена как команда.
Few-shot — несколько примеров «вход → выход» в промпте. Они показывают формат лучше любого описания. Примеры должны быть разнообразными и похожими на реальные входы, иначе модель начнёт копировать их содержание. Обычно хватает 2–5.
Строгий формат: JSON по схеме
Если результат читает программа, нужен структурированный вывод. Удобный путь в Python — описать результат классом Pydantic с типами, перечислениями и необязательными полями, передать его JSON-схему в API в режиме структурированного вывода и проверить ответ тем же классом. При ошибке валидации — повторить запрос с текстом ошибки.
Схема гарантирует форму, но не правильность значений: сумму или дату всё равно проверяют бизнес-правилами.
Один промпт или цепочка
Когда один промпт пытается делать много разного — классифицировать, извлекать, отвечать, проверять, — он начинает путаться. Тогда задачу разбивают на цепочку вызовов: каждый решает одну подзадачу и передаёт структурированный результат следующему, а между шагами код проверяет данные. Цена — больше вызовов и задержка, поэтому решение принимают сравнением на наборе примеров.
Промпт — это код
Промпты хранят в репозитории, версионируют и проверяют на наборе примеров после каждого изменения. Улучшать промпт под один неудачный пример — путь к поломке других сценариев.
Итог
- Роль, задача, ограничения, формат и поведение без данных.
- Явные границы для данных, несколько разнообразных примеров.
- JSON по схеме и обязательная валидация.
- Цепочка вызовов для сложных задач — по замеру.