본문 바로가기

IT/AI

랄프루프(Ralph Wiggum Loop)와 /goal 명령어, 도대체 뭐가 다른 걸까?

728x90
반응형
728x170

AI 코딩 에이전트를 좀 써보신 분이라면 한 번쯤 들어봤을 만한 이름이 있습니다. 바로 "랄프 위검(Ralph Wiggum)". 심슨 가족에 나오는, 문틀에 머리를 박으면서 "I'm helping!"이라고 외치는 그 노란 꼬마 말입니다. 도대체 왜 진지한 개발 도구 이야기에 심슨 캐릭터 이름이 등장하는 걸까요?

 

그리고 최근에는 OpenAI Codex CLI에 /goal이라는 명령어가 추가되면서 또 비슷한 이야기가 나오고 있습니다. "이거 결국 랄프루프 아냐?"라고요. 결론부터 말씀드리자면, 맞기도 하고 아니기도 합니다. 이 글에서는 두 개념의 정확한 정체와 차이를 Claude Code와 Codex CLI 양쪽에서 깔끔하게 정리해보겠습니다.

랄프루프(Ralph Wiggum Loop)란 무엇인가

시작은 한 줄짜리 bash 스크립트였다

랄프루프는 호주의 개발자 Geoffrey Huntley가 2025년 7월 블로그 글에서 명명한 기법입니다. 핵심 아이디어는 정말 어이없을 정도로 단순합니다.

while :; do cat PROMPT.md | claude ; done

이게 끝입니다. 같은 프롬프트 파일을 무한 루프로 AI 에이전트에 계속 먹이는 것입니다. AI가 작업을 끝냈다고 종료하면, 셸 루프가 다시 같은 프롬프트로 호출하고, 또 호출하고, 또 호출합니다. 이전 작업의 결과물(수정된 코드, git 히스토리, TODO 파일 등)은 디스크에 남아있으니, 매 반복마다 AI는 이전 상태를 보고 다음 작업을 이어갑니다.

 

이름이 왜 랄프 위검이냐고요? 호프리 헌틀리의 설명에 따르면, 멍청해 보이지만 끈질긴 반복이 놀랍게도 잘 먹히기 때문이라고 합니다. "결정론적으로 나쁘다(deterministically bad)"는 표현을 쓰는데, 비결정적인 세상에서 예측 가능하게 실패하는 게 예측 불가능하게 성공하는 것보다 낫다는 철학입니다. 참고로 "ralph"라는 단어는 영어에서 "토하다"라는 속어로도 쓰이는데, 자율 코딩의 토큰 소모량이 너무 끔찍해서 토하고 싶다는 이중 의미도 담겨 있다고 합니다.

왜 이게 작동하는가: 신선한 컨텍스트

랄프루프의 핵심 작동 원리는 사실 반복 자체가 아니라 매 반복마다 컨텍스트 윈도우가 새것이라는 점입니다. LLM은 컨텍스트가 차오를수록 성능이 떨어집니다. 대략 100k~150k 토큰을 넘어가면 품질이 측정 가능한 수준으로 저하됩니다. 랄프루프는 이 문제를 정면돌파합니다. 매번 새로운 세션, 새로운 컨텍스트, 그러나 디스크에 남은 동일한 작업 결과물을 보고 작업을 이어가는 것입니다.

 

기억은 어디에 저장될까요? 대화 히스토리가 아니라 코드베이스 그 자체, TODO 마크다운 파일, git 커밋 로그에 저장됩니다. 파일 시스템이 곧 메모리입니다.

Claude Code의 공식 ralph-wiggum 플러그인

Anthropic은 2025년 12월에 ralph-wiggum이라는 공식 플러그인을 Claude Code 마켓플레이스에 추가했습니다. 사용법은 이렇습니다.

/ralph-loop "Migrate all tests from Jest to Vitest" --max-iterations 50 --completion-promise "All tests migrated"

이 플러그인은 Stop hook이라는 메커니즘을 활용합니다. Claude가 작업을 끝내고 종료하려고 할 때마다 exit code 2를 반환해서 종료를 막고, 같은 프롬프트를 다시 주입합니다. 다만 여기서 중요한 차이가 있습니다. 공식 플러그인은 한 세션 안에서 컨텍스트가 계속 누적된다는 점입니다. 원조 bash 루프 방식이 매번 새 컨텍스트로 시작하는 것과 정반대인 셈이죠.

 

이 때문에 커뮤니티에서는 "공식 플러그인은 랄프루프의 핵심을 놓쳤다"는 비판이 꽤 강합니다. 컨텍스트를 새로 리셋하지 않으면 본래 의도한 효과가 약해진다는 것입니다. 또한 보안 패치(CVE-2025-54795) 이후 멀티라인 bash 명령어가 차단되면서 공식 플러그인이 한동안 정상 작동하지 않는 이슈도 있었습니다.

OpenAI Codex의 /goal 명령어란

2026년 4월 30일, 1급 시민이 된 랄프루프

/goal은 2026년 4월 30일 OpenAI가 Codex CLI 0.128.0 릴리즈와 함께 공개한 실험적 기능입니다. Greg Brockman은 X에 이렇게 적었습니다. "codex now has a built in Ralph loop++". 즉, OpenAI가 공식적으로 랄프루프 패턴을 1급 시민(first-class primitive)으로 도입한 것입니다.

기본 사용법

# config.toml에서 활성화
# [features]
# goals = true

# 또는 /experimental 명령어로 활성화

/goal Migrate this project from Pydantic v1 to v2. Make sure all tests pass.

세부 제어 명령어도 제공됩니다.

/goal <objective> 새로운 목표 설정 및 시작
/goal 현재 목표 상태 확인
/goal pause 일시 정지
/goal resume 재개
/goal clear 목표 제거

/goal의 동작 사이클

/goal은 다음 5단계 사이클을 자율적으로 반복합니다.

  1. Plan: 상위 목표를 실행 가능한 하위 작업으로 분해하고 성공 기준을 정의
  2. Act: 계획에 따라 코드 수정, 의존성 설치, 셸 명령 실행
  3. Test: 단위 테스트, 린터, 빌드 명령을 실행해 실패 정보 수집
  4. Review: 결과를 평가하고 종료 조건 충족 여부 판단
  5. Iterate: 종료 조건이 충족되지 않으면 다음 사이클로

핵심은 별도의 평가자(validator) 모델이 매 반복마다 종료 조건을 확인한다는 점입니다. 보통 메인 모델보다 작고 저렴한 모델을 쓰며, 이 덕분에 "에이전트가 자기 멋대로 다 끝났다고 선언하는" 흔한 실패 모드를 막을 수 있습니다.

Codex만의 차별점: 영속성

/goal이 단순한 셸 랩퍼 이상인 이유는 영속성(persistence) 때문입니다. 목표 상태가 app-server에 저장되어서, 터미널을 끄거나 시스템을 재부팅해도 다음에 Codex를 켜면 같은 목표를 이어서 진행할 수 있습니다. Ctrl+C로 중간에 끊어도 상태가 자동 보존됩니다. 어떤 사용자는 디바이스 드라이버 프로젝트에서 14시간을 끊김 없이 돌렸다고 합니다.

랄프루프 vs /goal: 핵심 차이 정리

이제 두 개념을 한 눈에 비교해보겠습니다.

항목 랄프루프 (원조 bash)  Claude Code ralph-wiggum 플러그인  Codex /goal
분류 패턴/방법론 공식 플러그인 (Claude Code) 1급 CLI 명령어 (Codex)
구현 방식 외부 셸 루프 Stop hook으로 종료 차단 런타임 내장 사이클
컨텍스트 처리 매 반복 새 컨텍스트 단일 세션 컨텍스트 누적 런타임이 관리하며 필요시 리셋
종료 조건 프롬프트에 적힌 텍스트 매칭 --completion-promise 문자열 평가자 모델이 매 반복 판정
영속성 git과 디스크 파일 세션 종료 시 사라짐 app-server에 저장, 재부팅 후 재개
검증 메커니즘 사용자가 직접 설계 단순 문자열 매칭 별도 validator 모델
활성화 자유로움 (어디서나 가능) 플러그인 설치 config.toml의 goals = true
안전 가드 사용자가 직접 작성 --max-iterations 옵션 예산/토큰 한도, 일시정지 가능

 

요약하자면 이렇습니다.

랄프루프는 패턴이고 철학입니다. "에이전트를 신선한 컨텍스트로 반복 호출하라"는 아이디어 자체죠. 어떤 CLI 에이전트에서도 셸 한 줄로 구현 가능합니다.

 

Claude Code의 ralph-wiggum 플러그인은 그 패턴을 Stop hook으로 구현한 공식 도구이긴 한데, 매 반복마다 새 컨텍스트로 시작하지 않고 한 세션 안에서 계속 누적시킨다는 차이가 있습니다. 그래서 "이게 진짜 랄프루프 맞아?"라는 논쟁이 끊이지 않습니다.

 

/goal은 OpenAI가 같은 패턴을 Codex 런타임에 깊숙이 통합한 결과물입니다. 평가자 모델, 영속 상태, 일시정지/재개 같은 엔지니어링 디테일을 추가해서 "셸 랩퍼 시대"를 끝내려는 시도라고 볼 수 있습니다.

그래서 언제 뭘 써야 하나

작업 성격에 따라 선택이 갈립니다.

장시간 명확한 종료 조건이 있는 작업이라면 /goal이 가장 편합니다. 마이그레이션, 대규모 리팩토링, 테스트가 모두 통과할 때까지 반복해야 하는 작업들이죠. 영속성이 있으니 노트북을 닫고 자도 됩니다.

 

Claude Code를 메인으로 쓰고 있고 간단히 자율 루프를 돌리고 싶다면 ralph-wiggum 플러그인이 진입 장벽이 가장 낮습니다. 다만 컨텍스트 누적 이슈와 멀티라인 bash 차단 이슈는 알고 쓰는 게 좋습니다.

 

정말 컨텍스트를 매 반복마다 깨끗하게 리셋하고 싶다면 원조 bash 방식이 여전히 가장 강력합니다. CLI 에이전트가 무엇이든(Claude Code, Codex CLI, Gemini CLI, OpenCode 등) 적용 가능하다는 장점도 있습니다. 다음과 같이 한 줄이면 됩니다.

while :; do cat PROMPT.md | claude -p --dangerously-skip-permissions ; done

Codex는 이렇게 응용할 수 있습니다.

MAX_ITERS=20
for i in $(seq 1 $MAX_ITERS); do
  cat PROMPT.md | codex exec --full-auto
done

안전 수칙: 토큰 청구서와 신뢰

자율 루프는 강력한 만큼 위험합니다. 몇 가지 안전 수칙을 꼭 기억하세요.

 

첫째, 격리된 환경에서 돌리세요. Docker 컨테이너, devcontainer, git worktree, 원격 VM 중 하나입니다. 메인 작업 디렉토리에서 --dangerously-skip-permissions를 켜고 돌리는 건 자살 행위입니다.

 

둘째, 반복 횟수 한도와 토큰 예산을 반드시 설정하세요. Claude Code 구독이든 OpenAI API든, 50회 반복으로 대형 코드베이스를 돌리면 $50~$100는 우습게 나갑니다. Sonnet 4.5를 bash 루프로 자율 도구 사용까지 켜면 시간당 약 $10 정도가 든다는 보고도 있습니다.

 

셋째, 종료 조건은 검증 가능한 형태로 작성하세요. "잘 동작할 때까지"가 아니라 "모든 테스트가 통과하고, 린터 경고가 0이며, README의 API 문서가 갱신될 때까지"처럼 명확하게 적어야 합니다. validator든 단순 문자열 매칭이든, 측정 가능한 기준이 있어야 멈춥니다.

 

넷째, 작은 목표로 먼저 시험하세요. 14시간짜리 작업에 처음부터 모든 칩을 거는 게 아니라, 30분짜리 작업으로 프롬프트와 가드레일을 다듬은 다음 스케일을 키우는 게 정석입니다.

마무리하며

랄프루프와 /goal은 결국 같은 통찰에서 출발합니다. "AI 에이전트는 한 번에 모든 걸 끝내지 못한다. 그럼 끝낼 때까지 계속 시키자." 차이가 있다면 그것을 얼마나 표준화하고 런타임에 녹여냈는가입니다.

 

원조 bash 랄프루프는 자유롭고 단순합니다. Claude Code 플러그인은 진입 장벽을 낮춘 공식 구현이지만 컨텍스트 처리에서 호불호가 갈립니다. Codex의 /goal은 평가자 모델과 영속성으로 엔지니어링 수준을 한 단계 끌어올렸습니다.

 

bash 랩퍼의 시대는 저물고 있고, 런타임 네이티브 랄프루프의 시대가 열리고 있습니다. 다만 이게 끝이라는 뜻은 아닙니다. 멀티 에이전트 검토 루프, 목표 템플릿, 목표 간 의존성 같은 다음 단계가 이미 논의되고 있죠. 지금 이 글을 읽는 동안에도 누군가는 잠든 사이에 코드베이스를 마이그레이션하고 있을 겁니다. 무서운 시대이자 재미있는 시대입니다.


참고 자료

728x90
반응형
그리드형