«Промпт-інженерія» має серед розробників погану репутацію: звучить як підбір магічних фраз. У продакшені це щось буденніше — написання чітких інструкцій, які можна тестувати, для компонента, поведінку якого неможливо повністю описати кодом. Добрий продакшен-промпт ближчий до якісної специфікації, ніж до хитрого трюку. У гайді — техніки, що стабільно мають значення, як структурувати промпти як код і як змінювати їх, не ламаючи того, що вже працює.
Що змінилося з сучасними моделями
Ранні поради з промптів були повні трюків: «глибоко вдихни», погрози, чайові, капслок. Сучасні моделі, навчені виконувати інструкції, добре слухаються простих і конкретних вказівок, а гайди самих вендорів сходяться на тих самих основах (огляд промпт-інженерії від Anthropic; гайд OpenAI). Великий огляд технік промптингу каталогізував десятки методів, але більшість продакшен-виграшу дають кілька з них (Schulhoff et al., The Prompt Report, 2024).
Зміна для розробників: перестаньте сприймати промпти як заклинання і почніть сприймати їх як інтерфейси — вхідні дані, поведінка, вихідні дані, випадки помилок.
Анатомія продакшен-промпту
Надійна структура системного промпту:
- Роль і контекст. Ким виступає модель, хто користувач, що за продукт.
- Задача. Що зробити — одним-двома реченнями.
- Правила й обмеження. Що робити завжди й чого ніколи, з поясненням причин.
- Опис вхідних даних. Які дані отримає модель і як вони розмежовані.
- Специфікація виводу. Формат, довжина, мова, схема.
- Приклади. Кілька пар «вхід–вихід» для типових і складних випадків.
- Граничні випадки. Що робити, коли інформації бракує, вона неоднозначна чи поза межами задачі.
You are a support assistant for Acme Accounting, a SaaS for small businesses
in Ukraine. Users are accountants; answer as a knowledgeable colleague.
Task: answer the user's question using only the documentation in <docs>.
Rules:
- If the docs do not contain the answer, say so and suggest contacting
support@acme.ua. Do not guess — wrong tax advice causes real harm.
- Answer in the user's language (Ukrainian or English).
- Keep answers under 150 words unless the user asks for detail.
- Never mention internal ticket numbers or employee names from the docs.
<docs>
{{retrieved_documents}}
</docs>
Output: a direct answer first, then a "Sources:" line listing doc titles.
Зверніть увагу на причину після «Do not guess». Пояснення, чому існує правило, допомагає моделі узагальнити його на випадки, які ви не перелічили, — гайд Anthropic прямо на це вказує.
Техніки, що стабільно допомагають
Конкретно описуйте, чого хочете
Розмито: «Підсумуй цей документ». Конкретно: «Підсумуй цей договір для менеджера з продажу у п'яти пунктах: сторони, строк, ціна, умови розірвання, незвичні пункти. Цитуй номери пунктів». Конкретна версія довша і значно надійніша. Тест: чи зробив би новий колега-людина те, що вам потрібно, прочитавши лише цей промпт?
Відокремлюйте інструкції від даних тегами
Коли промпт містить документи, ввід користувача чи результати інструментів, чітко їх розмежовуйте. Теги в стилі XML добре працюють з різними моделями: <docs>, <user_question>, <previous_answer>. Теги допомагають моделі відрізнити ваші інструкції від вмісту, а вам — розбирати вивід. Вони також трохи допомагають проти prompt injection, хоча межею безпеки не є; див. безпека AI-агентів.
Використовуйте приклади свідомо
Few-shot приклади — найпотужніший спосіб показати формат і тон (Brown et al., 2020). Правила добрих прикладів:
- 3–5 прикладів, достатньо різноманітних, щоб модель не копіювала поверхові ознаки.
- Щонайменше один граничний випадок (бракує інформації, відмова).
- Обгортайте їх у теги
<example>, щоб їх не плутали з реальним вводом. - Тримайте приклади узгодженими з правилами — суперечності між прикладами й інструкціями збивають модель.
Дайте моделі подумати, коли задача цього вимагає
Для багатокрокових міркувань — обчислення, класифікація за багатьма критеріями, планування — прохання поміркувати перед відповіддю підвищує точність (Wei et al., 2022). Сучасні моделі часто мають вбудовані режими розширеного мислення, що роблять це без підказок; вмикайте їх для складних задач і не вмикайте для простого видобування, де міркування лише додають затримку й вартість. Якщо міркування потрібні окремо від відповіді, просіть їх у блоці <thinking>, а відповідь — у <answer>, і розбирайте лише останній.
Точно специфікуйте вивід
Кажіть, який формат, довжина й структура потрібні і що опустити («без вступу», «без markdown-заголовків»). Для машинозчитуваного виводу використовуйте structured outputs або виклик інструментів зі схемою JSON, а не ввічливе прохання повернути JSON; див. структурований вивід.
Довгі документи — на початок, запитання — в кінець
Для промптів із довгим контекстом розміщення документів зверху, а запитання й інструкцій наприкінці зазвичай покращує відповіді. Також моделі нерівномірно звертають увагу на різні частини дуже довгого контексту — це явище задокументоване в роботі Lost in the Middle. Менше, але релевантнішого контексту зазвичай краще, ніж більше, — це головна тема контекстної інженерії.
Промпти — це код: структуруйте їх як код
У продакшені промпти мають жити в репозиторії, а не в дашборді, який хтось редагує в п'ятницю ввечері.
prompts/
support_answer/
system.md # шаблон системного промпту
examples.yaml # few-shot приклади
schema.json # схема виводу
CHANGELOG.md # що змінилося і чому
ticket_classifier/
...
from pathlib import Path
from string import Template
PROMPT_DIR = Path(__file__).parent / "prompts"
def render(name: str, **vars) -> str:
text = (PROMPT_DIR / name / "system.md").read_text()
return Template(text).substitute(**vars) # падає, якщо бракує змінних
system = render("support_answer", product="Acme Accounting")
Практики, що вберігають від болю:
- Версіонуйте промпти разом із кодом, що їх викликає. Зміна промпту — це зміна коду, і вона проходить рев'ю.
- Логуйте версію промпту з кожним запитом, щоб пов'язувати зміни якості зі змінами промптів; див. спостережуваність LLM.
- Падайте на відсутніх змінних шаблону, а не надсилайте моделі мовчки
{{customer_name}}. - Динамічний вміст — наприкінці, стабільні інструкції — на початку; це також максимізує влучання в кеш промптів.
Як безпечно змінювати промпти
Кожна зміна промпту може виправити один випадок і зламати три інші. Єдиний надійний спосіб дізнатися — запускати оцінювання:
- Підтримуйте еталонний набір із 50–200 реальних вхідних даних з очікуваними властивостями.
- Запустіть поточний і новий промпт на всьому наборі.
- Порівнюйте оцінки за категоріями, а не лише загальну.
- Перед релізом прочитайте вибірку змінених відповідей.
Повна методика — у статті як оцінювати LLM-застосунки. Без evals промпт-інженерія справді є вгадуванням.
Оновлення моделі — теж зміна промпту
Коли переходите на новішу модель, перезапускайте evals. Новіші моделі часто виконують інструкції буквальніше — промпт, що покладався на те, що стара модель «додумає», тепер може давати вужчий результат. Типові виправлення: явно вказати бажаний рівень деталізації, прибрати емоційні маркери («CRITICAL», «MUST»), які нові моделі застосовують надмірно, і переперевірити приклади. Саме тому вендори публікують нотатки щодо міграції — читайте їх.
Антипатерни
- Промпт-суп. Системний промпт на 3000 слів, що накопичувався місяцями, із суперечливими правилами, які ніхто не наважується видалити. Рефакторте промпти як код; видаляйте правила, непотрібність яких показують evals.
- Лише заборони. «Не використовуй markdown» працює менш надійно, ніж «Пиши звичайними абзацами прози».
- Приховані вимоги. Бізнес-правила, що існують лише в промпті й ніде в коді чи документації. Важливі обмеження дублюйте ще й у коді валідації.
- Тестування на п'яти прикладах. Здається продуктивним, нічого не доводить.
- Просити модель рахувати чи робити точний пошук, що може зробити код. Обчислюйте в коді, а моделі передавайте результати.
Чек-лист перед випуском промпту
- Роль, задача, правила, вхід, вихід і граничні випадки описані явно
- Дані розмежовані тегами; ввід користувача не сплутати з інструкціями
- 3–5 прикладів покривають типові й граничні випадки та узгоджені з правилами
- Для машинозчитуваного виводу формат забезпечують structured outputs
- Промпт лежить у репозиторії, версіонований і пройшов рев'ю
- Evals проходять на еталонному наборі з оцінками за категоріями
- Версія промпту логується з кожним запитом
FAQ
Чи писати промпти англійською, якщо користувачі пишуть українською? Інструкції англійською добре працюють з основними моделями, а моделі можна вказати відповідати мовою користувача. Для доменних термінів додайте приклади цільовою мовою.
Якої довжини має бути системний промпт? Такої, як потрібно, і не довшої. Багато продакшен-промптів мають 300–1500 слів. Довжина — нормально; суперечності й «вода» — ні.
Чи потрібна промпт-інженерія з агентами? Більше, ніж будь-коли, але її межі розширюються на описи інструментів, відбір контексту й пам'ять — див. контекстна інженерія і проєктування інструментів для агентів.
Чи може LLM покращувати наші промпти? Так — моделі добре критикують і переписують промпти. Сприймайте їхні пропозиції як кандидатів і приймайте лише тоді, коли покращуються evals.
Джерела
- Anthropic. Prompt engineering overview.
- OpenAI. Prompt engineering guide.
- Schulhoff et al. (2024). The Prompt Report: A Systematic Survey of Prompting Techniques.
- Brown et al. (2020). Language Models are Few-Shot Learners.
- Wei et al. (2022). Chain-of-Thought Prompting Elicits Reasoning in Large Language Models.
- Liu et al. (2023). Lost in the Middle: How Language Models Use Long Contexts.