Как писать промпт для LLM
Качество кода от LLM пропорционально качеству промпта. Однострочник даёт «сопли», полноценное ТЗ — нормальный результат. Но иногда писать ТЗ дольше, чем писать код самому.
Суть
Три стратегии работы с AI-кодгеном: однострочный промпт, диалог step-by-step, полное ТЗ. У каждой свой trade-off между временем подготовки и качеством результата.
Стратегия 1: однострочный промпт
«Сгенерируй уникальные ID, эффективно, как альтернатива UUID v4.»
- 1-5 строк, никаких технических деталей
- Так пишут с Cursor/ChatGPT/Claude по умолчанию
- Результат: типовой код из обучающего корпуса
- AI добывает энтропию из timestamp, processID, machineID
- Качество: «сопли», но что-то рабочее
Стратегия 2: диалог step-by-step
- Старт с типового решения
- Уточняющие сообщения: «не это, а вот это»
- «Don't change monads», «без объекта move(-5, 10)»
- AI правит, но часто ломает уже сделанное
- Streaming-генерация: код меняется быстрее, чем ты успеваешь читать
- Может потерять контекст и сделать заново
Стратегия 3: полное ТЗ
- Пишем спецификацию на страницу
- Указываем подсказки по оптимизации
- Описываем именно то поведение, которое нужно
- ТЗ может занять 30 минут — 2 часа
- Результат заметно лучше промпта
Что включать в ТЗ
- Цель — что делает код
- Сигнатуры функций — какие параметры и в каком виде
- Подсказки по производительности:
- избегать процента и деления
- не копировать память без необходимости
- использовать prefetcher / батчинг
- не транскодировать буферы/строки/массивы
- Структуры данных — какие использовать (Uint8Array, Buffer)
- Ограничения — что нельзя менять (
don't change monads) - Примеры входа/выхода
Что говорить про оптимизации
crypto.randomFillSync— наполнить буфер пачкойBuffer.allocUnsafe— быстрее обычной аллокации- Битовая маска
& 0x3fвместо% 64 - Запись char-кодов поверх буфера (in-place)
- Конкатенация
+=строк быстрая в V8
Антипаттерны промпта
- «Сделай эффективно» — не указывает, что измеряем
- «Сделай идиоматично» — у JS свои идиомы, у AI Java
- Просить рефакторить без указания целей рефакторинга
- Не давать существующий код контекстом
- Не дать примеров I/O
Когда писать самому быстрее
- Нестандартные структуры данных (unrolled list с тремя указателями)
- ФП на JS с замыканиями (мало корпуса)
- Очень специфичная оптимизация под V8
- Идеи, требующие концептуального понимания
Когда AI выгоднее
- Boilerplate, CRUD
- Типовые алгоритмы (Дейкстра, сортировки)
- Доки и комментарии к коду
- Поиск имён для переменных/функций
- Объяснение чужого кода
- Tab-комплит — экономия времени
🎓 Источники
- 🎓 [🧑💻 Программирование на JavaScript с использованием AI — Cursor] · 2025-08-11 · YouTube
- Тезисы: 3 стратегии (промпт/диалог/ТЗ); ТЗ писали ~2 часа; подсказки по оптимизации в ТЗ; randomFillSync пачкой
- 🎓 [🧐 AI Заставляем Cursor рефакторить код на монадах] · 2025-12-07 · YouTube
- Тезисы: «don't change monads» как явная инструкция; не успеваю читать стриминг; на Haskell справился бы лучше
- 🎓 [💡 Зачем GoF, SOLID, GRASP, если есть AI] · 2025-12-15 · YouTube
- Тезисы: скормил AI 3 варианта и описание идеи — не понял; пока объясняю, сам бы написал