Цикл Ральфа Виггума, от первых принципов

Опубликовано: от Ian Hernandez
Цикл Ральфа Виггума, от первых принципов thumbnail

Если ты использовал агента AI для кодирования более нескольких часов, ты знаешь о «стене»: агент делает видимый прогресс, затем застаивается — и тебе приходится доделывать и завершать работу самостоятельно.

Как часто бывает у инженеров по ИИ, возникла схема решения этой проблемы: просто запускайте агента с внешними проверками до тех пор, пока задача действительно не будет выполнена.

Подход настолько прижился, что получил имя — Ральф Виггум.

Сувенир для Искусственных Интеллектов
через dev.to

И мем прижился, потому что схема работает. К концу 2025 года Anthropic официально формализовала его в плагин Claude Code.

Ralph представляет собой изменение в том, как разработчики используют существующие инструменты. Вместо того чтобы рассматривать системы ИИ как интерактивных помощников, их запускают как долгосрочные процессы, управляемые тестами, линтерами и явными условиями остановки.

Итак, этот короткий гид — это практическая версия. Мы увидим, что такое Ralph на самом деле, почему это работает, как это распространилось, и что изменилось, когда это было превращено в продукт.

Что Такое «Ralph» На Самом Деле?

В своей основе Ральф представляет собой следующее: запуск агента в цикле, проверка вывода на предмет соответствия чему-то, что не может лгать, например, тесту, линтеру, проверке типов; и продолжение цикла, пока он не будет успешно пройден.

Вот и всё.

Оригинальный пример, который Джеффри Хантли поделился в июле 2025 года, был преднамеренно прямолинеен:

while :; do cat PROMPT.md | npx --yes @sourcegraph/amp ; done

Claude Варианты кода следуют той же схеме, только с большим количеством ограничений. Но принцип остаётся тем же: подавай закреплённый запрос агенту повторно, пока внешняя реальность не скажет, что всё готово.

Цикл Ральфа. Агент встречает внешнюю проверку.

Сам цикл почти не имеет значения, главное — это контракт:

  • Состояние хранится в репозитории: Файлы, различия, журналы, история git; все долговременное находится здесь.
  • Завершенность находится вне модели: Тесты, линтеры, проверки типов; агент не решает, когда он закончил; это определяет механизм.
  • Агент заменяем: Это работник, вызываемый повторно, пока не пройдет проверка; если он медленный или тупой сегодня, завтра замените его на что-то более быстрое.

С такой точки зрения, Ральф становится принципом дизайна: перестань требовать от модели знать, когда она завершена. Не ожидай от неё запоминания ограничений после сброса контекста.

Вместо этого создай систему так, чтобы модель не могла потерпеть неудачу в этих аспектах.

Получайте контент прямо в свой почтовый ящик

Подпишитесь сейчас, чтобы получать все последние обновления прямо в свой почтовый ящик.

Почему Цикл Задерживается?

Несколько причин:

1. Контекстные Окна Ведут Себя Как Буферы

Huntley часто формулирует контекст в терминах низкого уровня:

«Думай как инженер на C или C++. Контекстные окна — это массивы.»

У них фиксированный размер; они перемещаются; они перезаписывают; они забывают.

Длительные сессии предполагают непрерывность, которой не существует, поэтому обработка буфера как постоянной памяти приводит к смещению, пропускам ограничений и несогласованному поведению.

Ральф проникает в реальность системы. Вместо того чтобы считать, что контекстное окно стабильно, он относится к нему как к временному.

Пространство для временных данных агента сбрасывается между итерациями, в то время как постоянное состояние сохраняется на диске. Репозиторий накапливает данные с каждым запуском. Это делает перезапуск агента рутинным, а не бесполезным; каждый цикл начинается заново, но строится на том, что действительно сохранилось.

2. Внешние Проверки Превосходят Внутренние Рассуждения

Многие фреймворки агентов реагируют на сбои, вводя структуру внутри модели: планировщики, резюме, внутреннее состояние и циклы рефлексии.

Ральф хранит интеллект вне агента. Он полагается на:

  • Закреплённая спецификация, которая не изменяется
  • Конкретные доказательства из последнего запуска
  • Детерминированный механизм, оценивающий успех

Агент не решает, когда работа закончена — это делает снаряжение.

Традиционные агентские фреймворки. Интеллект внутри модели.

Вот почему Ральф отлично справляется с механической работой: рефакторинги, миграции, очистка, задачи по соответствию… Везде, где успех можно измерить скриптом, а не суждением, итерация становится надежной.

Модель не может уклониться от требований, потому что требования существуют вне её рассуждений.

3. Уплотнение Разрушает Ограничения

Одна из повторяющихся критик от Хантли касается суммирования и уплотнения.

Когда система просит модель решить, что достаточно важно, чтобы сохранить, информация теряется — ограничения ослабевают, крайние случаи исчезают, и штифты выпадают.

Ральф избегает этого, сохраняя вводные данные буквальными:

  • Технические характеристики остаются дословными, вместо того чтобы быть суммированными, 
  • Вывод ошибок остаётся необработанным и нефильтрованным; и 
  • Курирование памяти никогда не переходит в модель.

Снаряд сохраняет точность; агент действует внутри него, ограниченный тем, что там действительно есть, а не тем, что модель думает, что должно быть.

Итак, Как Идея Распространилась?

Сроки довольно сжатые.

  • 19 июня 2025 года: На встрече в Сан-Франциско, где собрались около 15 инженеров, обсуждающих агентное программирование, Huntley демонстрирует Ralph, Cursed (язык программирования, созданный Ralph), и транслирует автономное программирование всю ночь, пока спит в Австралии. В комнате возникает тревожный разговор о том, насколько легко скопировать 80%-90% SaaS и как многие виды работ скоро полностью исчезнут.
  • Июль 2025 года: Huntley публикует оригинальный блог-пост с базовой структурой bash-цикла. В статье приводится простой пример запроса и просьба: «вы могли бы, вероятно, найти репозиторий cursed lang на github, если бы искали его, но пожалуйста, пока не делитесь им.»
  • Август 2025 года: Проходит хакатон агентов YC — команды запускают Claude Code в непрерывных циклах. Результатом становится 6 репозиториев, созданных за ночь. Dexter Horthy проводит экспериментальный цикл Ralph на рефакторинге кодовой базы React. За 6 часов он разрабатывает полный план рефакторинга и выполняет его.
  • Сентябрь 2025 года: Huntley официально запускает Cursed Lang, язык программирования, который разработал Ralph. Он существует в трех реализациях (C, Rust, Zig), имеет стандартную библиотеку и компилятор второй стадии, написанный на Cursed.
  • Октябрь 2025 года: Dexter представляет Ralph на встрече Claude Code Anonymous в Сан-Франциско. Вопрос от аудитории: «Так вы рекомендуете это?» Его ответ: «Глупые вещи могут работать удивительно хорошо. Чего мы можем ожидать от умной версии?»
  • Декабрь 2025 года: Anthropic выпускает официальный плагин Ralph Wiggum. Плагин берет bash-цикл Huntley и формализует его с помощью Stop Hooks и структурированных данных о сбоях.
  • Январь 2026 года: Huntley и Horthy проводят глубокое обсуждение на YouTube, сравнивая оригинальную реализацию bash-цикла Ralph с реализацией Anthropic с использованием Stop Hooks.

Bash-цикл Ральф против Плагина Ральфа

Оригинальный Ральф представляет собой 5-строчный bash-цикл. Ты выводишь файл запроса, отправляешь его в Клода, проверяешь, прошел ли вывод твой тест, и повторяешь это до тех пор, пока не произойдет успех. Все данные хранятся на диске, все видно. Если что-то ломается, ты можешь точно увидеть почему.

Плагин Anthropic инвертирует эту модель, так что вместо запуска цикла снаружи, он устанавливает крючок остановки прямо в твоей сессии Claude. Когда Claude пытается выйти, крючок перехватывает это, проверяет условия завершения работы и снова отправляет тот же запрос, если работа еще не завершена. Файлы, которые изменил Claude, все еще на месте.

История git все еще там, но механика управления теперь неочевидна — скрыта в файле состояния markdown, зависима от прав доступа, легко нарушаема, если ты не знаешь, что делаешь.

Это классический компромисс абстракции.

Плагин снижает стоимость внедрения. Тебе не нужно писать bash, и не нужно думать о циклах. Но поскольку механизм скрывается, первоначальное понимание становится легче упустить.

Версия с bash-loop заставляет тебя создавать каркас. Версия с плагином позволяет пропустить этот шаг, что нормально, пока ты не столкнешься с крайним случаем и не сможешь понять, что происходит на самом деле.

Dexter Horthy протестировал его и обнаружил, что он выходит из строя загадочным образом, если не использовать “—dangerously-skip-permissions”. Плагин устанавливает хуки в странных местах, использует непрозрачные файлы состояния, и если ты удалишь файл markdown до его остановки, ты сломаешь Claude в этом репозитории, пока не отключишь плагин полностью.

Итак, какой урок? Оба метода работают, но по разным причинам. Цикл bash работает, потому что он простой и понятный. Плагин работает, когда абстракция не скрывает что-то критически важное.

Что Ты Узнаешь, Управляя Этим?

Ральф предполагает наличие расстояния между человеком и агентом. Ты не сидишь в сеансе и не направляешь его. Вместо этого, ты запускаешь его, уходишь, осматриваешь результаты после завершения и корректируешь ограничения для следующей итерации.

Взаимодействие происходит на уровне инструментария — подсказка, тесты, условия остановки — а не внутри разговора.

Со временем появляется закономерность: большинство неудач не связаны с моделью; это неудачи обвязки.

Спецификация была расплывчата, тест был слишком обширен, или условие завершения на самом деле не описывало, что значит «готово».

Как только ты несколько раз это видишь, твои инстинкты меняются. Ты перестаешь спрашивать «как сделать Клода умнее?» и начинаешь спрашивать «как сделать ограничения более строгими?»

Здесь характеристики становятся критически важными.

Характеристики Как Управляющие Поверхности

Huntley рассматривает спецификации не как документацию, а как фиксированные управляющие входные данные. Ты создаешь их в разговоре с Клодом, затем тщательно правишь, пока они не станут точными, и после этого закрепляешь. После закрепления они не изменяются в течение всего цикла.

Это важно, потому что характеристики выполняют сразу три функции:

  1. Они ограничивают, что может придумать агент: Без чётких спецификаций Клод добавит защитные слои, абстракции или функции, о которых ты не просил, расширяя объем работы с каждой итерацией. 
  2. Они являются опорой для поиска и извлечения: Так агент не придумывает новые требования.
  3. Они стабилизируют поведение в разных прогонах: Каждая итерация решает одну и ту же проблему, а не немного отличающуюся интерпретацию этой проблемы.

Если твои требования к тому, что значит «готово», нечеткие, агент будет интерпретировать это по-разному в каждом цикле. Ты столкнешься с отклонениями, неконтролируемым расширением задач и итерациями, которые противоречат друг другу.

Как Ответственно Управлять Циклом?

Минимальная конфигурация Ralph часто выглядит следующим образом:

MAX_ITERS=30
for i in $(seq 1 $MAX_ITERS); do
  cat PROMPT.md | claude
  if ./ci.sh; then exit 0; fi
done
exit 1

Механика цикла имеет гораздо меньшее значение, чем правила, которые его окружают:

  • Сохраняйте спецификацию неизменной; не корректируйте её в процессе на основе действий Клода. 
  • Кодируйте завершение как проверки исполнения.
  • Устанавливайте лимиты итераций и временные ограничения, чтобы цикл не мог работать вечно и истощать ваш бюджет на токены. 
  • Сохраняйте журналы и различия, чтобы вы могли изучить, что пошло не так, если это произойдет. 

Далее, практика эксплуатации выявила несколько эвристик, которые имеют значение:

  • Отдавай предпочтение маленьким, регулярным изменениям вместо крупных рефакторингов, потому что большие изменения увеличивают количество ошибок и их сложнее отлаживать.
  • Запускай повторно на текущей основной ветке вместо перебазирования, потому что конфликты слияния тратят время на итерации.
  • И избегай использования Ральфа для исследовательской работы, потому что если у тебя нет четких критериев приемки, ты просто получишь хаотичный цикл, который придумывает вещи, которых ты не просил.

Ограничение — это функция.

Цикл Это Урок

Когда Ральф начал набирать популярность, появились его вариации. Некоторые команды создали структурированные внешние циклы вокруг агентов, вызывающих инструменты. Другие добавили отдельные компоненты верификатора: другая модель, которая проверяет результаты работы исполнителя, прежде чем цикл решит завершиться. Эти расширения работают, да, но только если они уважают первоначальное видение.

Правило простое: проверка должна оставаться детерминированной, а резюме никогда не должны заменять основные данные.

  • Если ты добавляешь проверяющего, он должен проверять конкретные вещи: тесты проходят, линтер завершается без ошибок, git diff соответствует ожиданиям. 
  • Если ты добавляешь структурированные внешние циклы, они должны видеть исходный вывод и исходные журналы, а не очищенное резюме того, что пошло не так. 

Основной аргумент Хантли заключается в том, что профессия разработчика программного обеспечения фактически мертва, но программная инженерия — практика качественного создания систем — живее, чем когда-либо.

Получайте контент прямо в свой почтовый ящик

Подпишитесь сейчас, чтобы получать все последние обновления прямо в свой почтовый ящик.