Как я промптю Fable
@ai_longreadsМэтт Шумер рассказывает о своём подходе к работе с Fable — моделью нового поколения: давать ей цель, а не шаги, огораживать её жёсткими правилами и планкой «готово», гонять по циклу и позволять строить на уже сделанном.
Это AI-перевод статьи, сделанный каналом Про AI: Лучшие Статьи и Исследования.
Как я промптю Fable
How I Prompt Fable Автор: mattshumer Оригинальный текст:
Каждый раз, когда я показываю что-то, что собрал с Fable, мне задают одни и те же вопросы. «У меня так не получается». «Как ты это сделал?» «Это точно не по-настоящему».
И люди думают, что за каждым таким результатом стоит какой-то безумно сложный промпт или что на это ушло куда больше труда, чем на самом деле. Обычно всё наоборот. Демо проще, чем кажутся. Просто я использую модель не так, как большинство.
Fable — это по-настоящему модель нового поколения. Промпти её так, как ты промптишь нынешние модели, — и получишь результаты уровня нынешних. Измени то, как ты её промптишь и как думаешь о том, что ей по силам, — и дверь действительно открывается.
Вот как я это делаю на самом деле.
Давай ей цель, а не шаги
Самое большое изменение — я перестал расписывать, как именно что-то делать. Со старыми моделями приходилось указывать, как выполнить задачу, иначе они часто уходили в сторону. Fable — полная противоположность. Чем больше свободы ты ей даёшь, тем лучше она справляется.
Поэтому я отдаю ей крупную, размашистую, недоспецифицированную работу — так, как ты поставил бы цель блестящему человеку, которому доверяешь, и позволил бы ему самому найти лучший путь. Только Fable часто лучше меня понимает, «как». Каждый шаг, который я ей диктую, — это всего лишь я, подменяющий её суждение своим, а моё обычно хуже.
Поначалу это кажется рискованным, когда ты привык контролировать детали. Безопасным это делает следующая часть.
Задай базовые правила, чтобы ей можно было доверять
Недоспецифицированная цель работает, когда ты огораживаешь её несколькими правилами, которые нельзя переступать. Базовые правила — это те несколько вещей, которые всегда должны оставаться истинными, каким бы путём Fable ни шла к цели.
Например, когда я собираю агента, модели обожают переусложнять. Они хватаются за regex-фильтр, чтобы отловить какой-то конкретный случай, тогда как на самом деле мне нужен промпт, который описывает поведение и позволяет модели самой с ним разобраться. Поэтому одно из моих постоянных правил примерно такое: не хардкодь особые случаи — опиши, чего ты хочешь, в системном промпте агента и дай агенту рассуждать.
А для дополнительной защиты можно всегда поручать Fable отдавать субагенту одну задачу: проверить работу на соответствие базовым правилам, прежде чем что-либо будет отправлено. Теперь можно отпустить Fable нестись к цели на полном ходу и всё равно быть уверенным, что она не выкатит что-то, что ломает важные для тебя вещи.
Задай настоящую планку «готово»
Если сказать Fable сделать что-то «высокого качества», она остановится на собственном представлении о «достаточно хорошо», которое обычно ниже твоего. Поэтому я не использую прилагательные. Я даю ей планку, по которой она может проверять сама себя, и делаю эту планку жёсткой.
Иногда я пишу тест сам — что-то конкретное, например: «посторонний не отличит наш рендер от настоящей фотографии». В других случаях я даже не знаю, как измерить то, чего хочу, — и тогда я передаю эту задачу тоже Fable.
Например, один мой друг пытался клонировать библиотеку компонентов и никуда не продвигался. Было две проблемы. Во-первых, он строил поверх ShadCN и пытался клонировать компоненты, оставаясь на ShadCN, так что Fable боролась со всеми соглашениями ShadCN вместо того, чтобы просто собирать компоненты. А во-вторых, у него не было способа сказать, когда работа закончена. Он просто говорил ей: «клонируй это».
Поэтому мы сделали две вещи. Мы выбросили ShadCN и начали с нуля, потому что библиотеку компонентов вполне можно собрать на пустом месте, а существующий код был просто балластом. Затем, поскольку ни один из нас не знал, как измерить «совпадает ли это с оригиналом», мы попросили Fable придумать это самой. Она взяла запись экрана с реальными компонентами в действии, превратила её в тепловую карту того, где всё двигалось, и продолжала работать, пока её версия не совпала. Мы никогда не говорили ей, как это сделать. Мы сказали ей, что значит «готово», и позволили самой изобрести измерительную линейку.
Одно правило, которое я здесь никогда не нарушаю: тот, кто что-то собирает, никогда не оценивает результат сам (агент-сборщик часто предвзят, и у него есть целая траектория «почему я принял эти решения», которой он может оправдывать то, что справился с задачей). Я всегда прошу его запустить отдельный субагент Fable со свежим контекстным окном (context window), направить его на реальный результат (настоящие пиксели, реально работающее приложение и т. д.) и заставить его попытаться доказать, что штука не проходит проверку.
Гоняй её по циклу, пока она не достигнет планки (особенно для творческих задач)
Как только планка есть, я ставлю Fable в цикл против неё и отпускаю. Она собирает, проверяет себя, находит самый большой разрыв, закрывает его и заходит снова — часами, иногда днями. Я постоянно использую для этого /loop, особенно в творческой работе, где всегда есть что-то конкретное, с чем можно сверяться, пока результат по-настоящему не будет достигнут.
Весь смысл цикла в том, что Fable никогда сама не решает, что закончила. Всегда есть следующий разрыв. Она останавливается, когда я говорю, что готово, или когда она действительно не может найти, что ещё исправить (что бывает редко, если ты всё правильно настроил).
Один приём, который я использую в каждом долгом прогоне: я прошу Fable собрать маленькую HTML-страницу, задеплоить её куда-нибудь и обновлять по ходу работы — скриншоты, заметки, всё, что показывает текущее положение дел. Тогда я могу глянуть в телефон и точно увидеть, насколько далеко она продвинулась, ничего не трогая.
Позволь ей строить на том, что уже сделано
Fable становится лучше в чём-то по мере того, как этого уже сделано больше, — так что твоя старая работа становится топливом для новой.
Первое серьёзное, что я собрал, когда вышла Fable, — фотореалистичный 3D-лес. Тот промпт я писал тщательнее, чем почти что-либо с тех пор, потому что у меня не было точки отсчёта — ни примера качества, которого я хотел, ни понимания, как к нему прийти. Чтобы довести исходный промпт до ума, потребовался настоящий труд.
Но как только у меня появилась одна отличная 3D-сцена, всё последующее стало легче. Когда я собирал демо с Хогвартсом, я мог просто указать Fable на лес: вот код, вот планка качества, соответствуй этому и превзойди. Мне не пришлось ничего заново объяснять.
Это идёт дальше, чем просто повторное использование кода. Fable может читать трейсы (traces, следы выполнения) моих старых сессий Claude Code — что она на самом деле пробовала, собирая лес, что сработало, а что нет. Так что вместо того, чтобы говорить ей «используй отдельный субагент для каждого объекта в сцене», я могу просто сказать «прочитай трейсы леса и пойми, что сработало». Она сама подхватывает подход. Хогвартс сложился куда быстрее, чем лес, — во многом благодаря этому.
Не мешай ей
Каждый раз, когда Fable приходится остановиться и что-то у тебя спросить, ты теряешь время. Поэтому я убираю препятствия заранее. Например, если я подключаю её к реальному сервису, который стоит денег, я даю ей бюджет вместо того, чтобы заставлять просить разрешение на каждое использование. Я говорю ей, где лежат ключи и учётные данные. И я говорю ей, в письменном виде, принимать решения самой и возвращаться ко мне, только если она по-настоящему заблокирована или упирается в то, что могу решить только я.
Единственное исключение — планирование (но только для огромных, чрезвычайно ответственных вещей). В по-настоящему большой сборке я хочу видеть план до всякого кода и хочу, чтобы она заранее спросила меня обо всём, в чём не уверена. Как только план утверждён, она работает без остановок.
Два способа, как я это веду
Всё сказанное выше одинаково, что бы я ни делал — выпускал фичи или строил целый мир (или что-то ещё творческое). Меняется лишь обвязка вокруг.
Для инженерии я запускаю команду. Несколько сессий Fable работают одновременно, вытягивая задачи откуда угодно — из списка, с доски Linear, или я просто раздаю их сам. Каждая делает свою задачу, трижды перепроверяет собственную работу субагентами и открывает PR с теми самыми доказательствами, о которых я говорил. Затем ещё одна Fable не делает ничего, кроме интеграции: она мёржит PR-ы, всё запускает, тестирует как реальный пользователь и держит весь проект «зелёным». Когда две фичи пересекаются, я говорю одной Fable следить за трейсами другой по мере её сборки и сохранять совместимость — они работают параллельно, так что одна приглядывает за другой и интегрирует по мере готовности.
Для творческой работы я опираюсь на импульс и детали. Тот же цикл, та же жёсткая планка, но я обычно распараллеливаю субагентов, чтобы довести до совершенства отдельные куски, вместо того чтобы заставлять одну Fable делать всё целиком, — скажем, отдельный субагент доводит каждый вид деревьев в лесу. Иногда я запускаю сразу несколько совершенно отдельных попыток, оставляю лучшую и переношу то, что сработало, в следующий раунд.
Их можно смешивать как угодно. Всё зависит от того, что ты строишь.
Когда стоит тратиться на ultracode
Есть более тяжёлый режим под названием ultracode, который стоит намного дороже. Я почти никогда его не использую. Хороший цикл с достаточно амбициозной целью приводит меня туда и без него.
Где он оправдывает свою цену — так это в фундаментах. Если я строю с нуля новую систему, над которой буду работать месяцами (например, что-то, что становится ядром бизнеса или кодовой базы), я хочу, чтобы основа была правильной с первого дня. По той же причине мы выбросили ShadCN: хороший фундамент делает всё, что ты строишь поверх, легче, а плохой — навсегда усложняет всё. Для такой работы — и практически только для такой — дополнительная цена оправданна.
И ещё одно
Если всё это трудно удержать в голове — не нужно. Отдай всю эту статью своей Fable и скажи ей помогать тебе писать промпты с этого момента. Она сама разберётся, что с этим делать.
Ничего из этого не сложно. Это та же самая модель, что есть у всех. Мои результаты выглядят иначе, потому что я не разжёвываю ей всё, держу её у планки, от которой она не может отговориться, и позволяю ей строить на всём, что она уже создала. Начни с этого.
Подпишитесь на канал и каждый день читайте лучшие материалы про AI переведенные на русский!
Нашли интересную статью для перевода? Пришлите нашему боту: @ailongreadsbot