Как писать промпт для 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 варианта и описание идеи — не понял; пока объясняю, сам бы написал