Ловушка вежливости: почему модель отвечает водой
Ты пишешь: «Пожалуйста, напиши функцию на Python, которая парсит JSON, если не сложно». Модель слышит: «Я добрый стажёр, который боится ошибиться». Она отвечает три абзаца вступления, обёрнутый в маркдаун код с комментариями «здесь мы парсим» и завершающим «надеюсь, это поможет».
Грубиян не спрашивает, он ставит задачу. Он знает: LLM — это не собеседник, а вероятностный двигатель. Чем меньше токенов тратишь на этикет, тем больше остаётся на логику. Вежливость в промте — это шум, снижающий signal-to-noise ratio.
Парадокс: чем более авторитарным и специфичным звучит промт, тем более «вежливым» и полезным получается ответ. Модель переключается в режим «исполнитель точного ТЗ», а не «собеседник».
Анатомия грубого промта: 5 блоков, которые не перебивают друг друга
Каждый блок решает свою задачу. Пропустил один — получил сюрприз. Порядок важен: от контекста к жестким ограничениям.
1. Роль (Who)
Не «ты эксперт», а «Senior Backend Engineer, 10 лет на Go/Postgres, пишешь production-ready код без объяснений основ»
2. Контекст (What & Why)
Входные данные, ограничения среды, цель бизнеса. «Есть 50Гб логов в ClickHouse, нужно найти аномалии за последние 15 минут, латенс запроса < 2с».
3. Ограничения (Constraints)
Самый важный блок. «Нет markdown, только raw code. Не используй regex. Память < 512Мб. Верни только SQL».
4. Формат вывода (Output Schema)
JSON с полями X, Y, Z. Таблица Markdown с колонками A, B. Один файл. Никакого прочего текста.
5. Примеры (Few-shot)
2-3 пары Input/Output. Это калибровка. Лучше 1 хороший пример, чем 5 плохих.
Versus: Вежливый промт vs Промт грубияна
Вежливый (Слабый)
Пожалуйста, напиши функцию на Python, которая читает CSV и считает сумму колонки amount. Если можешь, добавь обработку ошибок. Спасибо!
Результат: 50 строк кода, 10 строк комментариев, try/except на всё подряд, print(«Done!») в конце.
Грубиян (Сильный)
Role: Senior Python Dev.
Task: Read CSV from stdin, sum 'amount' col (float).
Constraints: No pandas. Stdlib only. Memory < 10MB. Handle missing/non-numeric silently (skip).
Output: Single float to stdout. No newline. No text.
Example: in: id,amount\n1,10.5\n2,abc -> out: 10.5
Результат: 12 строк, streaming reader, ноль аллокаций,.pipe-ready.