스스로 고쳐 쓰는 재귀 언어모델(RLM) 코딩 에이전트pi 위에 구축) · v0.7.1(2026-08-07) · 최신 커밋 2026-08-07 a18809e · TrendShift Daily #2)
prime-agent는 터미널에서 실행하는 CLI 코딩·리서치 에이전트다. Claude Code·Codex·Cursor 같은 부류지만, 세계를 바라보는 방식이 다르다. 대부분의 에이전트는 모델에게 "파일 읽기, 파일 쓰기, 셸 실행" 같은 정해진 툴 목록을 JSON으로 던져주고 하나씩 고르게 한다. prime-agent는 그 대신 "살아 있는 파이썬 세션(IPython 커널) 하나"를 유일한 툴로 준다 — 모델은 파이썬 코드를 써서 파일을 편집하고, %%bash로 명령을 돌리고, 스킬을 import하고, 하위 에이전트를 함수처럼 호출한다.
이 설계에 붙은 이름이 RLM(Recursive Language Model, 재귀 언어모델)이다. 핵심 아이디어 둘: (1) 프롬프트를 변수처럼 다룬다(prompt-as-a-variable) — 긴 컨텍스트를 통째로 모델 창에 밀어넣는 대신 파이썬 변수에 담아두고 필요할 때 꺼낸다. (2) 툴·하위 에이전트를 함수 호출로 다룬다 — rlm("이 인증 흐름 검토해줘")처럼 코드 한 줄로 자식 에이전트를 띄운다. "언어모델이 언어모델을 호출한다"는 재귀 구조라 Recursive다.
두 번째 기둥은 Continual Harness(지속 하네스)다. 에이전트가 일하며 알게 된 것 — 유용한 보조 프롬프트, 기억해야 할 결정·실패·선호, 새로 만든 스킬, 재사용할 서브에이전트 설정 — 을 JSON 상태로 저장해두고 /refine 명령으로 스스로 다듬는다. 이게 "self-improving"의 실체다. 다시 강조하면, 모델 가중치를 학습하는 게 아니라 재사용 가능한 컨텍스트(프롬프트·기억·스킬)를 스스로 편집하는 것이다.
정해진 툴 버튼(신입)은 예측 가능하지만 조합이 빈약하다. prime-agent는 인터프리터(작업대)를 통째로 주고, 필요하면 조수(서브에이전트)를 호출하게 하며, 일이 끝나면 수첩(하네스)을 스스로 갱신하게 한다.
2026년 현재 코딩 에이전트 시장은 Claude Code·OpenAI Codex·Cursor·Gemini CLI가 각축을 벌인다. 이 판에서 prime-agent가 Daily #2까지 오른 이유는 단순한 "또 하나의 CLI 에이전트"가 아니라, 에이전트의 능력을 '툴 카탈로그'가 아니라 '프로그래밍 가능한 실행 환경'으로 정의하고, 거기에 자기개선 루프를 결합했기 때문이다. (TrendShift의 굵은 숫자는 별 수가 아니라 사회적 언급 모멘텀 점수라는 점도 기억해 두자.)
배경도 한몫한다. 개발사 Prime Intellect는 "전 세계에 흩어진 GPU로 대형 모델을 분산 학습한다"는 비전으로 유명한 회사다(verifiers, prime-rl, 환경 허브, 자체 추론 API 등을 운영). prime-agent는 그 생태계의 클라이언트 겸 실험 도구다 — 즉 "에이전트를 평가·훈련하는 회사가 직접 쓰는 에이전트"라는 서사가 관심을 끈다. 라이선스도 MIT로 완전 오픈이며, 오픈소스 에이전트 pi(Mario Zechner) 위에 세워졌다는 계보도 신뢰를 준다.
내장 툴이 사실상 ipython 하나뿐이라는 게 역설적 강점이다. 파일 검색·편집·셸·네트워크 요청을 각각 툴로 노출하는 대신, 모델이 파이썬으로 조합·반복·조건 분기를 직접 짠다. "파일 100개를 열어 특정 패턴을 고친 뒤 실패한 것만 다시"처럼 루프가 필요한 작업에서 툴 호출을 수십 번 왕복하지 않고 코드 한 덩어리로 끝낸다.
멀티에이전트를 별도 프레임워크로 짜는 대신, rlm(...) 한 줄이면 자식 에이전트가 태어난다. 게다가 v0.6.0부터 rlm()은 자식의 답을 기다리지 않고 즉시 핸들을 반환(admission)한다 — 부모는 계속 일하고, 자식은 끝나면 agent_message로 결과를 보낸다. 병렬 위임이 언어 문법처럼 자연스럽다.
대부분의 에이전트는 컨텍스트가 길어지면 요약(compaction)해서 버린다. prime-agent는 여기에 /refine을 더해, 요약 대신 "재사용할 프롬프트·기억·스킬·서브에이전트 설정"에 대한 정밀한 편집(create/update/delete)을 남긴다. 되돌리기(rollback)까지 지원해서, 자기개선이 폭주하지 않도록 안전장치를 뒀다.
백그라운드 데몬 세션, 목표(/goal), 하트비트·스케줄, 자율 모드(/autonomous), 에이전트 간 메시지까지 — "사람이 지켜보지 않아도 몇 시간씩 굴러가는" 워크로드를 1급 기능으로 삼았다. 여기에 ACP(Zed 에디터의 Agent Client Protocol)와 MCP도 지원한다.
스택을 이해하는 열쇠는 "본체는 전부 TypeScript(Node)이고, 파이썬은 모델이 코드를 실행하는 커널 한 곳에만 쓰인다"는 점이다. 저장소는 npm 워크스페이스 모노레포이며 소스 대부분이 .ts다(coding-agent 268 · ai 51 · tui 32 · agent 5). 파이썬은 prime-agent-runtime/의 4개 파일뿐이다.
패키지 이름이 전부 @earendil-works/pi-*이고 실행 바이너리도 pi인 이유는, prime-agent가 오픈소스 pi(github.com/badlogic/pi-mono)를 리브랜딩·확장했기 때문이다. 설정 폴더는 ~/.prime/agent/로 바꿔 달았다.
packages/ai (통합 프로바이더 추상화)25개 안팎의 프로바이더를 하나의 API로 감싼 계층이다. 구독형(OAuth: Claude Pro/Max, ChatGPT Plus/Pro, GitHub Copilot)과 API 키형(Anthropic, OpenAI, Google, DeepSeek, xAI, Mistral, Groq, Cerebras, OpenRouter, Bedrock, Azure, 그리고 자사 Prime Inference 등)을 모두 지원하고, Ollama·vLLM·LM Studio 같은 로컬 모델도 models.json으로 꽂는다.
| 영역 | 핵심 라이브러리 (버전) | 역할 |
|---|---|---|
| 런타임 | Node ≥ 22.8.0 · TypeScript 5.9 · ESM | 본체 언어·모듈 시스템 |
| LLM SDK | @anthropic-ai/sdk ^0.91 · openai 6.47 · @google/genai ^1.40 · @aws-sdk/client-bedrock-runtime · @mistralai/mistralai | 각 프로바이더 호출 |
| 커널 전송 | zeromq ^6.1 | IPython 커널과 Jupyter 프로토콜로 통신 |
| 프로토콜 | @agentclientprotocol/sdk ^1.3 | ACP 모드(Zed 등 에디터 연동) |
| 파싱·CLI | yaml · marked · diff · glob · uuid · proper-lockfile | 설정·마크다운·diff·세션 잠금 |
| 빌드·품질 | tsgo(네이티브 tsc) · Biome 2.3 · Vitest 4.1 · esbuild · Bun(바이너리 컴파일) | 빌드·린트·테스트·배포 |
prime-agent-runtime모델이 실행하는 코드가 도는 곳이다. requires-python ≥ 3.10이지만 실제 관리형 커널 venv는 파이썬 3.11을 uv로 자동 설치한다. 의존성은 단출하다: ipykernel(커널), nest-asyncio(중첩 이벤트 루프), tyro(CLI 파싱). 이 패키지의 rlm/__init__.py가 파이썬 쪽에서 rlm 객체와 host_request()를 노출해, 파이썬 → TypeScript 호스트로 신호를 보내는 다리를 놓는다.
~/.prime/agent/kernel-venv/에 깔아 커널을 준비한다(이때만 인터넷 필요).prime-agent는 단일 프로세스가 아니라 여러 프로세스로 쪼개져 있다. 워커와 커널을 별도 프로세스로 나눈 이유는 "장애 격리"이지 "보안 격리"가 아니다 — 이 구분은 뒤(7장)에서 중요해진다.
루프는 이렇게 돈다. ① 모델이 응답을 스트리밍한다. ② 그것이 ipython 툴 호출이면, AgentSession이 파이썬 코드를 커널로 보낸다. ③ 커널은 결과·표준출력·에러를 돌려주거나, 거꾸로 호스트에게 "요청(host request)"을 던진다 — 예: rlm.run(자식 스폰), goal.*, agent_message.*. ④ 호스트가 처리하고 커널에 응답한다. 사용자 입력뿐 아니라 하트비트·크론·목표 이어가기·자율 모드·다른 에이전트의 메시지도 전부 같은 경로로 프롬프트를 밀어넣는다.
execute_request가 rlm(...)을 기다리는 동안 shell 채널이 잠기므로, 호스트 요청의 응답은 일부러 control 채널로 보내 교착(deadlock)을 피한다.RLM의 R(재귀)이 드러나는 곳이다. 자식은 코드 한 줄로 태어난다.
handle = await rlm("인증 흐름을 검토해줘", name="auth-reviewer")
# v0.6.0부터: 자식의 '답'이 아니라 '핸들'을 즉시 반환(admission)한다.
# handle.rlm_child_id / name / session_dir / model ...
# 자식은 끝나면 부모에게 메시지로 보고한다:
await agent_message.send(result, receiver_role="parent")
부모는 자식을 기다리며 멈추지 않고 계속 일한다(비동기 위임). 기본 깊이는 RLM_MAX_DEPTH = 1이라 "부모 → 자식"까지만 허용되고, 손자 세대는 명시적으로 올려야 생긴다("핵가족" 제한). 자식이 쓴 토큰은 부모 턴에 합산되고(child_usage_attributed), 서브에이전트 레지스트리는 압축·재시작 후에도 살아남는다(rlm.list_subagents()).
가장 독창적인 부분이다. 하네스 상태는 4종류의 편집 가능한 항목으로 이뤄진다: prompt(보조 프롬프트) · memory(사실·결정·실패·선호) · skill(설치된 파이썬 스킬) · subagent(재사용 위임 설정). 이 상태는 harness/harness_state.json에 저장된다. /refine을 돌리면 별도의 LLM 리뷰가 지금까지의 작업 궤적을 읽고, 다음처럼 정밀한 편집 목록(JSON)을 뱉는다.
{
"summary": "인증 리팩터링에서 배운 것 정리",
"rationale": "...",
"expectedOutcome": "...",
"edits": [
{ "action": "create", "kind": "memory",
"title": "JWT 만료 검증 위치",
"content": "미들웨어가 아니라 게이트웨이에서 검증할 것" },
{ "action": "update", "kind": "skill", "id": "run-tests", "content": "..." }
]
}
안전장치가 촘촘하다. 기본 시스템 프롬프트는 불변이고 리파인은 "보조"만 추가한다. 모든 리파인은 before/after 스냅샷을 refinements.jsonl에 남겨 롤백이 된다. 자동 리파인(auto-refine)은 게이트가 "지금 다듬을 가치가 있나"를 먼저 판정해 일회성 잡음을 걸러내고, 기본 적용 범위는 세션 로컬이다(전역 반영은 명시 요청 필요). "컨텍스트 압축이 요약이라면, 리파인은 재사용 상태에 대한 정밀 편집"이라는 한 줄이 이 설계를 요약한다.
자동 압축(compaction), 데몬 기반 연속성, 목표(/goal), 하트비트·스케줄(prime-agent schedule), 자율 모드(/autonomous, 턴·토큰·시간 예산으로 제한 + 선택적 품질 게이트)까지. 세션 아티팩트에는 커널 상태(kernel-state.dill), 하네스 상태, 예약 작업, 중첩된 자식 세션 폴더가 함께 저장된다.
268개 소스가 든 packages/coding-agent/src가 사실상의 본체다. 파일 크기(괄호)가 곧 "무게 중심"을 알려준다 — 커널 관리와 리파인, 그리고 오케스트레이션에 코드가 몰려 있다.
스킬은 문서가 아니라 파이썬에서 import되는 실행 패키지다. 기본 제공: prime-intellect(생태계 조작) · skill-creator · websearch · refine · goal · compact · rlm-heartbeat · agent-message · agent-observe · edit · attach-image · linear · notion. 즉 자기개선(refine)·목표관리(goal)·에이전트 통신(agent-message)조차 "스킬"이라는 같은 단위로 구현돼 있다.
agent/(pi-agent-core)는 에이전트 루프·전송·상태의 최소 코어(5파일), ai/(pi-ai)는 프로바이더 51파일 + 자동 생성된 models.generated.ts 모델 목록, tui/(pi-tui)는 화면 깜빡임을 줄이는 차등 렌더링 터미널 UI다.
prime-agent는 GPU 없이도 돌릴 수 있어(9장 참고) "현대 코딩 에이전트의 내부 설계"를 통째로 읽어볼 수 있는 드문 오픈소스다. 아래 7가지가 알짜다.
"툴 목록 나열"과 "인터프리터 제공"의 트레이드오프를 체감하기 좋다. 실습: 같은 작업(파일 10개에서 TODO 주석 세기)을 (a) 툴 호출 방식과 (b) 파이썬 한 덩어리로 각각 시켜보고 왕복 횟수를 비교.
컨텍스트 관리의 새 패러다임. 실습: /refine 전후로 harness_state.json과 refinements.jsonl을 열어 어떤 memory/skill 편집이 생겼는지 diff.
ZeroMQ 3채널·HMAC 서명·control 채널 트릭은 그 자체로 좋은 시스템 프로그래밍 교재다. 실습: core/kernel/index.ts에서 execute_request가 어떻게 프레이밍되는지 따라가 보기.
"자식을 기다리지 않고 핸들만 받는" 설계가 왜 교착·지연에 강한지 배운다. 실습: 자식 2개를 병렬 스폰하고 agent_message로 결과를 모아 합치기.
25개 프로바이더를 한 인터페이스로 감싸는 방법(스트리밍·툴콜·인증·프록시)을 packages/ai/providers/에서 통째로 볼 수 있다. 실습: 로컬 Ollama 모델을 models.json으로 등록해 붙이기.
사람이 지켜보지 않아도 도는 에이전트의 프로세스 설계(슈퍼바이저·워커·복구). 실습: prime-agent agents로 세션 목록을 보고 attach로 재접속해 상태가 유지되는지 확인.
에디터 연동(ACP)과 외부 툴 연결(MCP)을 동시에 지원하는 실전 예. 실습: /mcp login으로 MCP 서버 하나를 붙여 툴이 파이썬 네임스페이스에 들어오는지 보기.
실행 환경은 가볍다. macOS 또는 Linux(윈도우는 WSL/Termux), Node ≥ 22.8.0, 첫 실행 때 커널 부트스트랩용 인터넷(uv + 파이썬 3.11)만 있으면 된다. 에이전트 본체는 로컬 학습을 하지 않으므로 GPU가 필요 없다 — GPU가 필요한 건 이 에이전트가 "조작"하는 생태계(자체 관리형 prime-rl 훈련 등)이지 에이전트 실행이 아니다.
| 항목 | 요구/비용 |
|---|---|
| OS | macOS · Linux (Windows는 WSL) |
| 런타임 | Node.js ≥ 22.8.0 · 소스 빌드 시 npm ci |
| 첫 실행 | 인터넷 필요(uv·파이썬 3.11·ipykernel 설치) → 이후 오프라인 가능 |
| GPU | 에이전트 실행엔 불필요 |
| 비용 | 토큰 종량제(선택한 프로바이더 요금). Claude Pro/Max로 붙여도 "서드파티 하네스"라 플랜 한도가 아닌 추가 사용량으로 과금됨에 주의 |
IPython 커널은 모델이 생성한 파이썬과 %%bash 명령을 당신의 사용자 권한으로 그대로 실행한다. 워커/커널을 프로세스로 나눈 건 장애 격리일 뿐 보안 격리가 아니다. 신뢰할 수 없는 저장소는 반드시 별도 샌드박스에서 열어야 한다.
선택적 OS 샌드박스 확장(examples/extensions/sandbox/)이 있다 — @anthropic-ai/sandbox-runtime 기반으로 macOS는 sandbox-exec, Linux는 bubblewrap으로 파일·네트워크를 제한한다. prime-agent -e ./sandbox로 켠다.
curl -fsSL https://app.primeintellect.ai/prime-agent/install.sh | sh로 깔고, 작은 프로젝트 폴더에서 prime-agent 실행 → /login. "이 폴더에 README 목차를 만들어줘" 같은 태스크를 주고, 모델이 파이썬 코드로 파일을 다루는 로그를 관찰한다.
/refine로 자기개선 관찰하기몇 번의 작업 뒤 /refine을 실행하고, ~/.prime/agent/ 아래 harness_state.json과 refinements.jsonl을 열어본다. 어떤 memory·skill 항목이 create/update 됐는지, 롤백 스냅샷은 어떻게 남는지 확인.
커널에서 rlm(...)로 자식 2개를 서로 다른 파일에 대해 동시에 스폰하고, 각각 agent_message.send(..., receiver_role="parent")로 보고하게 한 뒤 부모가 결과를 취합하게 만든다. rlm.list_subagents()로 레지스트리도 확인.
내장 skill-creator로 "특정 린터를 돌리고 결과를 요약"하는 스킬을 만들고, 파이썬 import로 호출되는지 확인. 세션 로컬 스킬과 전역(~/.prime/agent/) 스킬의 차이를 실험.
git clone && npm ci && ./prime-agent.sh로 소스 실행. core/kernel/index.ts에서 shell/iopub/control 채널과 HMAC 프레이밍을 따라가며, rlm() 대기 중 응답이 왜 control 채널로 오는지 코드로 확인한다. 여력이 되면 packages/ai/providers/에 커스텀 프로바이더를 하나 추가.
| 주차 | 주제 | 무엇을·어디서 |
|---|---|---|
| 1주차 | 에이전트 루프 기초 | ReAct·tool-use 패턴, Jupyter/IPython 커널 프로토콜(메시징·채널). core/kernel·tools/ipython.ts |
| 2주차 | RLM & Continual Harness | prompt-as-a-variable 개념, RLM 블로그, Continual Harness 논문(arXiv 2605.09998), refinement.ts·harness.py |
| 3주차 | LLM 프로바이더 추상화 | 스트리밍·툴콜·OAuth·프록시를 한 인터페이스로. packages/ai/providers, model-resolver.ts |
| 4주차 | 멀티에이전트 & 프로토콜 | admission 기반 서브에이전트, 에이전트 간 메시지, ACP(에디터)·MCP(툴). agent-session.ts·modes/acp |
| 5주차 | Prime Intellect 생태계 | verifiers(환경/평가 라이브러리)·환경 허브·prime-rl(분산 RL 훈련)·Prime Inference. 내장 prime-intellect 스킬의 references |
| 용어 | 뜻 |
|---|---|
| RLM | Recursive Language Model(재귀 언어모델). 프롬프트를 변수로, 툴·서브에이전트를 함수 호출로 다루는 지속 IPython 세션 기반 실행 모델. 강화학습 아님 |
| Continual Harness | 보조 프롬프트·기억·스킬·서브에이전트 설정을 durable 상태로 저장하고 스스로 다듬는 자기개선 얼개 |
| /refine | 작업 궤적을 리뷰해 하네스 상태에 대한 정밀 편집(JSON create/update/delete)을 생성하는 명령. 롤백 지원 |
| prompt-as-a-variable | 긴 컨텍스트를 모델 창에 밀어넣지 않고 파이썬 변수로 들고 다니는 기법 |
| IPython 커널 | 모델이 짠 파이썬이 실제로 도는 실행 환경. 유일한 내장 툴(ipython)의 실체 |
| ZeroMQ | 커널-호스트 간 Jupyter 메시징 전송(라이브러리). shell·iopub·control 3채널을 HMAC로 서명 |
| rlm() / 서브에이전트 | 자식 에이전트를 코드로 스폰하는 호출. v0.6.0부터 답이 아닌 핸들을 즉시 반환 |
| admission | 자식 완료를 기다리지 않고 "접수됨"만 즉시 돌려주는 비동기 스폰 방식 |
| RLM_MAX_DEPTH | 서브에이전트 중첩 깊이 상한(기본 1 = 부모→자식까지) |
| compaction | 길어진 컨텍스트를 요약해 줄이는 것. 리파인(편집)과 대비되는 개념 |
| ACP | Agent Client Protocol. Zed 등 에디터가 에이전트와 붙는 표준(--mode acp) |
| MCP | Model Context Protocol. 외부 툴·데이터 소스를 에이전트에 연결하는 표준 |
| daemon | 백그라운드에서 세션을 관리·복구하는 슈퍼바이저 프로세스 |
| Prime Inference | Prime Intellect의 OpenAI 호환 추론 API(90+ 모델). 1급 프로바이더로 내장 |
| verifiers / prime-rl | 환경·평가 라이브러리 / 분산 RL 훈련 프레임워크. prime-agent가 코드 의존은 없고 prime CLI로 "조작" |
| pi | prime-agent의 상류 오픈소스 에이전트(Mario Zechner). 패키지·바이너리 이름이 pi인 이유 |
| 구분 | 링크 |
|---|---|
| 저장소 | github.com/PrimeIntellect-ai/prime-agent |
| 설치(안정판) | curl -fsSL https://app.primeintellect.ai/prime-agent/install.sh | sh |
| 상류 pi | github.com/badlogic/pi-mono (aka earendil-works/pi) |
| RLM 소개 | primeintellect.ai/blog/rlm |
| Continual Harness 논문 | arxiv.org/abs/2605.09998 |
| 회사·생태계 | primeintellect.ai (verifiers · 환경 허브 · prime-rl · Prime Inference) |