왜 루프가 둘인가
GEODE 안에는 서로 맞물린 루프가 둘 있습니다. 둘을 구분하면 나머지 문서가 한결 읽기 쉬워집니다. 안쪽 루프는 작업 하나를 처리합니다. 바깥쪽 루프는 그 작업을 처리하는 시스템을 시간을 두고 다듬습니다.
안쪽 루프는 매 요청마다 돕니다. 바깥쪽 루프는 가끔, 운영자가 돌릴 때 돕니다. 둘은 코드를 공유하지 않습니다. 대신 두 가지를 주고받습니다. 안쪽 루프가 입는 스캐폴드, 그리고 안쪽 루프가 남기는 기록입니다.
안쪽: agentic 루프
안쪽 루프는 작업 하나를 실행하는 기본 단위입니다. core/agent/loop/agent_loop.py의 AgenticLoop가 그것입니다. 형태는 단순합니다. LLM을 호출하고, 모델이 요청한 도구를 실행하고, 결과를 관찰하고, 다시 호출합니다. 모델이 더 호출할 도구가 없거나 종료 신호를 보내면 멈춥니다.
call LLM -> tool calls? -> run tools -> observe -> call LLM ...
|
+-- no more tool calls -> answer이 한 번의 실행이 끝나면 두 가지가 남습니다. 사용자에게 줄 결과, 그리고 무슨 일이 있었는지 기록한 트랜스크립트입니다. 트랜스크립트는 버려지지 않습니다. 바깥쪽 루프가 읽을 재료가 됩니다.
한 턴이 실제로 어떻게 도는지, 어떤 경로로 끝나는지는 안쪽 agentic 루프에서 자세히 다룹니다.
바깥쪽: 자기개선 루프
바깥쪽 루프가 다루는 대상은 작업이 아니라 시스템 자체입니다. 정확히는 모델을 감싼 스캐폴드, 곧 시스템 프롬프트 섹션(WRAPPER_PROMPT_SECTIONS)과 behaviour kinds입니다. 모델 가중치와 파라미터는 일절 건드리지 않습니다. 메커니즘은 선택입니다. 후보를 만들고, 측정하고, 더 나은 쪽만 남깁니다.
- 변이(mutate). 스캐폴드의 한 섹션을 한 번에 한 군데만 바꿉니다 (
core/self_improving/loop/mutate). - 감사(audit). 변이된 스캐폴드를 입은 GEODE를 Petri 적대적 안전 감사가 차원별로 채점합니다.
- fitness. 차원 점수를 스칼라 하나로 접습니다 (
core/self_improving/fitness.py). - margin 게이트. 측정 불확실성을 넘는 개선만 통과시킵니다 (
core/self_improving/gate.py). - 승격 또는 되돌림. 통과하면 새 champion으로 승격하고, 아니면 변이 이전 상태로 되돌립니다. 계보는 git champion chain으로 보존됩니다.
루프 드라이버는 core/self_improving/train.py입니다. 파일명은 Karpathy autoresearch의 3-파일 관습을 빌린 것으로, 실제 training은 일어나지 않습니다. 전체 그림은 자기개선 루프에서, 측정에 쓰는 평가 프레임워크는 Petri × GEODE에서 다룹니다.
둘이 맞물리는 방식
핵심은 두 루프가 직접 호출하지 않는다는 점입니다. 둘은 데이터로 연결됩니다. 안쪽 루프는 스캐폴드를 입고 행동하며 트랜스크립트를 만들고, 바깥쪽 루프는 그것을 감사로 읽어 스캐폴드를 바꿉니다. 바뀐 스캐폴드는 다음 번 안쪽 루프가 행동하는 방식을 바꿉니다.
그래서 스캐폴드를 바꾸면 코드를 바꾸지 않아도 안쪽 루프의 행동이 달라집니다. 스캐폴드는 안쪽 루프가 입는 옷이고, 바깥쪽 루프는 그 옷을 고르는 쪽입니다. 한쪽은 입고 한쪽은 고릅니다. 둘은 그렇게 한 시스템으로 맞물립니다.