Prime Agent: A self-improving RLM agent
Prime Agent: 자기 개선형 RLM 에이전트
오늘 우리는 두 가지 추상화 개념인 재귀적 언어 모델 (Recursive Language Model, RLM) [citation]과 지속적 하네스 (Continual Harness) [citation]를 중심으로 설계된 자기 개선형 코딩 하네스(coding harness)인 Prime Agent를 출시합니다. 현대의 하네스 설계는 이전 세대 모델의 역량을 중심으로 구축되었으며, 오늘날의 프런티어 모델(frontier models)이 할 수 있는 일을 반영하지 못하고 있습니다. 고정된 도구 호출 스키마(tool-calling schemas)와 컨텍스트 압축(context compaction)은 모델이 자신의 스캐폴딩(scaffolding)을 활용하는 대신, 오히려 그것을 우회하여 작업하도록 강제합니다. 정적이고 수동으로 설계된 서브 에이전트(sub-agents), 프롬프트(prompts), 기술(skills), 그리고 메모리(memory)는 설계 시점에 한 번 설정되며, 에이전트가 실행 중에 학습하는 내용에 맞춰 결코 적응하지 않습니다. 우리는 하네스가 현재 모델의 역량을 추론 패턴의 다음 프런티어로 확장해야 한다고 믿습니다.
Prime Agent는 두 가지 주요 추상화를 통해 이 원칙을 바탕으로 구축되었습니다:
**재귀적 언어 모델 (Recursive Language Model, RLM)**은 컨텍스트(context)를 변수로, 서브 에이전트 위임(subagent delegation)을 REPL 내부의 함수 호출(function calls)로 취급합니다. 지속적인 REPL은 모델에게 자신의 이력, 서브 에이전트, 그리고 도구에 대한 프로그래밍 방식의 접근 권한을 부여하여, 모델이 자신의 컨텍스트에 대한 액션으로서 언어 모델 프로그램을 작성할 수 있게 합니다. 이 설계는 에이전트가 변수에 저장된 자신의 과거 정보에 대한 접근 권한을 잃지 않으면서 임의로 긴 세션을 처리할 수 있도록 합니다.
**지속적 하네스 (Continual Harness)**는 프롬프트, 기술, 메모리, 서브 에이전트로 추상화된 하네스 자체의 상태를 에이전트가 자신의 궤적(trajectory)으로부터 생성, 읽기, 업데이트, 삭제(CRUD)할 수 있는 대상으로 취급합니다. 에이전트 간 통신(agent-to-agent communication)과 결합될 때, 이 메커니즘은 서브 에이전트 간, 심지어 Prime Agent 세션 간의 오케스트레이션(orchestration)을 가능하게 합니다. 예를 들어, Prime Agent는 지속적인 서브 에이전트를 생성하고, 이후 궤적에서 그들에게 메시지를 보내며, 다른 Prime Agent 세션과 직접 통신할 수 있습니다.
이러한 추상화는 모델의 역량을 부트스트래핑 (Bootstrapping) 하는 데 매우 강력합니다. Prime Agent는 범용 코딩 어시스턴트 (Coding Assistant), 장기적 자율 평가 (Long-horizon autonomous evaluation)를 위한 기본 런타임 (Runtime), 그리고 연구 및 자동 연구 (Autoresearch)를 위한 협업 도구로서 효과적으로 작동하도록 구축되었습니다.
Prime Agent는 완전한 오픈 소스이며, 다음과 같이 설치할 수 있습니다:
curl -fsSL https://app.primeintellect.ai/prime-agent/install.sh | sh
Prime Agent onboarding splash screen
Prime Agent
에이전트 하네스 (Agent harnesses)의 성능은 하네스의 설계와 해당 하네스를 중심으로 학습된 모델의 역량 모두에 달려 있습니다. 우리는 Prime Agent를 현대적인 오픈 및 클로즈드 프런티어 모델 (Frontier models)에서 즉시 사용할 수 있도록 설계하는 동시에, 새로운 세대의 모델들이 이를 중심으로 학습됨에 따라 추가적인 성능 향상을 제공할 것으로 기대되는 기능 세트를 함께 제공하도록 설계했습니다.
Prime Agent의 핵심은 프로그래밍 방식의 도구 (Tool) 및 서브 에이전트 (Sub-agent) 호출을 중심으로 설계되었습니다. Prime Agent의 모델들은 유일한 도구로서 지속적인 IPython 커널 (Kernel)을 사용합니다. 서브 에이전트를 포함한 다른 표준 하네스 기능들은 커널 내에서 함수로 호출되며, 각 서브 에이전트는 또 다른 prime-agent 인스턴스로 구현됩니다.
Prime Agent의 아키텍처 (Architecture)
Prime Agent architecture diagram
백그라운드 데몬 (Background Daemon) 및 에이전트 뷰 (Agents View). 기본 뷰는 다른 코딩 에이전트 하네스와 유사한 텍스트 사용자 인터페이스 (TUI)입니다. 기본적으로 에이전트가 수행하는 IPython 작업은 간결함을 위해 압축되어 표시되지만, 하네스에 의해 수행된 작업을 보기 위해 확장할 수 있습니다. REPL에서 실행된 서브 에이전트 또한 사용자 채팅창 아래에서 확인할 수 있습니다.
Prime Agent text user interface
Prime Agent는 로컬 소켓 (Local socket)을 통해 모든 활성 에이전트 세션을 소유하는 백그라운드 데몬을 실행합니다. 하부의 에이전트 루프 (Agent loop)에 영향을 주지 않고 세션에 연결(Attach)하거나 분리(Detach)할 수 있습니다. 각 루트 세션 트리 (Root session tree)는 복구 가능한 워커 프로세스 (Worker process)에서 실행됩니다. 만약 워커가 충돌하면, 데몬은 세션 JSONL 파일과 커널 상태 스냅샷 (Kernel state snapshot)으로부터 이를 복구합니다.
**Agents View (에이전트 뷰)**를 통해 데몬(daemon)으로부터 다른 활성 세션들을 확인하고 선택할 수 있습니다. 빈 프롬프트에서 왼쪽 화살표 키(←)를 눌러 열 수 있으며, 현재 실행 중인 세션, 데몬은 여전히 활성 상태인 유휴(idle) 세션, 그리고 현재 메모리에 로드되지 않은 비활성(inactive) 세션 목록을 보여줍니다. 이러한 채팅 중 어떤 것이든 즉시 진입하여 상호작용할 수 있으며, 스페이스 바를 누르면 프롬프트 조향(steering) 및 /compact와 같은 명령의 대기(queuing)를 포함하여 어떤 상태에 있는 세션과도 채팅할 수 있습니다.
Agents View는 에이전트와 하위 에이전트(subagent) 사이를 재귀적으로 연결하는 중앙 연결 지점으로 구축됩니다. 모든 에이전트는 Agents View에서 발견될 수 있습니다. 사용자는 Agents View에서 에이전트의 채팅으로 이동한 다음, 해당 에이전트 하위 에이전트들의 Agents View로, 다시 하위 에이전트의 채팅으로 이동하는 방식으로 탐색합니다.
하위 에이전트들은 루트 에이전트와 동일한 Running-Idle-Inactive (실행-유휴-비활성) 상태 머신(state machine)을 공유하기 때문에, 30분 동안 활동이 없으면 메모리에서 제거될 수 있으며, 사용자나 에이전트가 이들 중 하나를 호출하는 즉시 디스크에서 다시 로드됩니다. 매우 중첩된(nested) 채팅 구조에서는 이를 통해 많은 메모리를 절약할 수 있습니다.
Prime Agent Agents View listing running, idle, and inactive sessions
세션 및 컨텍스트 관리 (Session and Context Management). 에이전트의 전체 세션 기록은 디스크에 추가 전용(append-only) JSONL 파일로 저장됩니다. 각 라인은 JSON 엔트리로, 메시지, 모델 전환, 압축 요약(compaction summaries) 또는 확장 엔트리(extension entries)를 포함할 수 있습니다. 브랜칭(Branching), 포킹(forking), 클로닝(cloning)은 모두 리프 포인터(leaf pointer)를 이동함으로써 동일한 파일 내에서 이루어집니다. 전체 기록은 /tree를 통해 항상 복구 가능합니다.
압축(Compaction)은 컨텍스트가 임계값에 도달했을 때 또는 REPL에서 에이전트가 compact.run()을 직접 실행하여 발생합니다. 압축은 주로 에이전트의 메인 컨텍스트를 정리하는 데 사용되지만, 과거의 압축 내용을 포함한 전체 기록은 필요할 때 IPython 커널에서 프로그래밍 방식으로 접근할 수 있습니다.
REPL의 도입은 IPython 상태를 관리하기 위한 추가적인 작업을 요구합니다. 우리는 가비지 컬렉터 (Garbage Collector) 역할을 수행할 별도의 에이전트를 생성하여, 커널을 비동기적으로 압축(compact) 및 정리(clean)합니다. 이는 각 에이전트마다 REPL 메모리가 쌓이는 것을 방지하기 위해 필요합니다.
Prime Agent는 세션 동안 유지되며 매 턴마다 호출할 수 있는 REPL로서 IPython 커널에 의존합니다. 초기화 시, 커널은 재귀적인 프로그래밍 방식의 서브 에이전트 호출을 위한 rlm을 포함하여 각 기술/도구 (skill / tool)를 모듈로서 미리 임포트 (import)합니다.
rlm은 비동기 함수이며, 이는 모델이 코드 내에서 서브 에이전트 호출을 자유롭게 호출하고 병렬화할 수 있음을 의미합니다. 서브 에이전트를 생성하는 것 (예: await rlm("sub-task"))은 자체적인 모델, IPython 커널, 세션 트리(session tree), 그리고 대화 기록을 가진 전체 세션을 시작합니다. 에이전트 간의 모든 후속 통신은 agent_message.send(...) 도구를 통해 이루어지기 때문에, 이 함수는 즉시 반환됩니다.
Prime Agent는 서브 에이전트를 병렬로 확장(fan out)하거나 백그라운드 작업을 실행하는 것과 같이, 이러한 방식으로 실행하도록 선택할 수 있는 몇 가지 유용한 프리미티브 (primitives)를 가지고 있습니다.
# 병렬 팬아웃 (Parallel fan-out) — rlm()은 자식 핸들(child handle)과 함께
# 작업 수락 시점에 반환되며, 자식의 답변을 반환하지는 않습니다.
# 결과는 agent_message 응답으로 도착합니다.
auth = await rlm("Summarize the authentication flow in auth/. Reply to me when done.", name="auth-expert")
...
모델이 계속 발전함에 따라, 도구 호출 및 서브 에이전트에 대한 새로운 호출 패턴이 등장할 것입니다. 우리는 미래 세대의 모델들이 수동적인 프롬프트 (hand-holding prompts)에 덜 의존하고, 이러한 종류의 직접적이고 프로그래밍적인 제어에 더 많이 의존하게 될 것이라고 예상합니다.
오케스트레이션 (Orchestration) 및 멀티 에이전트 통신
백그라운드 데몬(background daemon)은 모든 활성 Prime Agent 세션을 관리합니다. Prime Agent는 또한 데몬을 통해 에이전트 간 (Agent-to-Agent, A2A) 메시징을 지원하며, 이를 통해 어떤 Prime Agent 세션이든 영속적 서브 에이전트(persistent sub-agents) 메시징에 사용되는 것과 동일한 메커니즘을 사용하여 다른 Prime Agent 세션에 메시지를 보낼 수 있습니다. 이를 통해 서브 에이전트 스웜(sub-agent swarms)의 진행 상황을 관리하고, 영향을 받는 에이전트 간에 공유 리소스에 관한 통신을 직접 수행하는 용이한 오케스트레이션 (Orchestration)이 가능해집니다. 독립적인 세션 간의 원치 않는 통신을 방지하기 위해, Prime Agent의 멀티 에이전트 통신은 부모, 형제 또는 자식 프로세스를 의미하는 '핵가족 (nuclear family)'으로 제한됩니다.
# 이름이 지정된 자식을 생성합니다; 핸들은 승인 시 반환됩니다.
handle = await rlm("Find what's wrong in this auth-flow. Reply to me with your findings.", name="auth-reviewer")
# ... 자식의 조사 결과는 반환 값이 아니라 부모 역할의 답장으로 도착합니다 ...
...
Prime Agent는 RLM 네이티브 런타임(RLM-native runtime)을 통해 *영속적 서브 에이전트 (persistent sub-agents)*를 지원합니다. 즉, 서브 에이전트의 자체 세션 디렉토리, 컨텍스트 (context), IPython 커널 (kernel), 세션 히스토리 (session history)는 초기 서브 에이전트 호출이 완료된 후에도 유지됩니다. Prime Agent는 IPython 커널을 통해 서브 에이전트의 고유 세션 식별자 (session identifier)에 접근함으로써, 영속적 서브 에이전트에게 추가 메시지를 보내 작업을 계속할 수 있습니다.
지속적 하네스 (Continual Harness)를 통한 자기 개선
Prime Agent의 하네스 상태는 영속적인 IPython 커널 내에 rlm.harness로 존재하며, 에이전트가 작업 중간에 즉시 읽고 호출할 수 있습니다. 또한 모든 변경 사항은 디스크에 기록되므로 턴(turn)과 세션을 가로질러 유지됩니다. 지속적 하네스 (Continual Harness)는 이 상태를 프롬프트 (prompt), 서브 에이전트 (sub-agents), 기술 (skills), 메모리 (memory)로 공식화하며, 리셋 없이 에이전트 자신의 궤적 (trajectory)으로부터 온라인에서 정제됩니다.
네 가지 구성 요소 각각은 동일한 생성 (create), 읽기 (read), 업데이트 (update), 삭제 (delete) 인터페이스를 노출합니다. create_prompt_note(...), create_memory(...), create_skill(...), create_subagent(...)는 각각 해당 종류의 항목을 추가하며, update_X(...)와 delete_X(...)는 이를 미러링(mirror)하고, list(kind)는...
또는 get(kind, id)를 통해 이를 다시 읽어옵니다. 스킬 (Skills) 또한 동일한 표면 (surface)을 따릅니다. Python 기반의 스킬을 작성하는 것은 SKILL.md 참조를 포함하는 create_skill(...) 호출이며, 이는 메모리나 프롬프트 노트 (prompt note)를 추가하는 것과 동일한 작업입니다.
# 동일한 CRUD 표면을 통해 메모리와 스킬을 생성
rlm.harness.create_memory("flaky test pattern", "retry three times before failing")
rlm.harness.create_skill("retry helper", "...", reference={"type": "python", "import": "retry_helper"})
...
/refine은 이 CRUD 표면 위에 구축된 자기 개선형 (self-improving) 파이프라인입니다. 이는 에이전트 자신의 궤적 (trajectory), 즉 무엇을 시도했고 어떤 일이 일어났는지에 대한 기록을 읽고, 더 나은 결과를 향해 하네스 (harness)를 개선하는 가장 작고 관련성 있는 CRUD 편집을 적용합니다. 즉, 하네스 전체를 다시 쓰는 대신 프롬프트 노트, 메모리, 스킬 또는 서브 에이전트 명세 (sub-agent spec)를 업데이트합니다. 각 개선 (refinement)은 트리거와 그로 인해 발생한 결과를 기록하므로, 개선은 임의적인 것이 아니라 증거에 기반합니다. 개선은 두 단계로 실행됩니다. 편집을 제안하는 LLM 호출인 계획 (Planning) 단계는 백그라운드에서 실행되며 진행 중인 대화를 차단하지 않습니다. 편집을 적용하는 단계, 즉 디스크에 쓰고 시스템 프롬프트를 다시 구축하는 단계는 빠르며 다음 턴 경계에서만 잠시 차단됩니다. 에이전트는 고정된 일정뿐만 아니라, 반복되는 실패나 재사용 가능한 전술을 감지할 때마다 직접 refine.run()을 호출할 수 있습니다.
# 특정 관찰 사항에 집중하여 개선을 예약
await refine.run("promote the retry-on-flaky-test pattern to a skill")
# refine의 plan/apply 분리 방식에도 불구하고, 두 상태 호출은 동일한 형태를 따릅니다
...
기본 시스템 프롬프트는 불변 (immutable) 상태로 유지됩니다. /refine은 그 주변의 하네스 레이어 (harness layer)만을 편집합니다. 이전 개선 이력을 통한 롤백 (Rollback)이 지원되므로, 잘못된 하네스 업데이트를 ID를 통해 되돌릴 수 있습니다.
평가를 위한 자율 모드 (Autonomous Mode for Evals)
Prime Agent의 평가 모드(eval mode)는 세 가지 상호 보완적인 메커니즘을 결합합니다. 목표(Goal)는 전체적인 목적을 설정합니다. 이는 선택적인 토큰 예산(token budget)을 가진 지속적인 목표로, 하네스(harness)가 에이전트에게 여러 턴에 걸쳐 이를 추구하도록 지속적으로 재프롬프트(re-prompting)하며, 에이전트가 명시적으로 goal.complete()를 호출할 때까지 추적됩니다.
하트비트(Heartbeats)는 크론(cron) 스타일로 예약된 메시지로, 정해진 간격으로 세션에 주입됩니다. 이는 서브 에이전트(sub-agent)의 진행 상황을 모니터링하거나 훈련 업데이트를 폴링(polling)하는 것과 같은 정기적인 점검에 사용됩니다. 자율 모드(Autonomous mode)는 연속성 메커니즘 그 자체로, 한 턴에서 더 이상의 출력이 생성되지 않아 조기에 중단되는 대신 에이전트가 목표를 향해 계속 작업하도록 보장합니다. 이들을 통해 세션은 명시적인 예산 내에서 제한되면서도 Agents View를 통해 검사 가능한 상태로 장기간 관리 없이 실행될 수 있습니다.
자율 모드는 별도의 스크립팅 없이 CLI에서 --autonomous를 통해 직접 사용할 수 있습니다. 실행 시 동일한 명령 내에서 완료 목표(completion goal)와 턴 제한(turn limit)을 설정할 수 있습니다:
prime-agent \
--autonomous \
--autonomous-gate "npm run check" \
...