TL;DR
NOOA는 에이전트 인터페이스를 기존의 프롬프트·스키마·콜백 혼합에서 벗어나 파이썬 객체라는 하나의 일관된 프로그래밍 모델로 통합했다. 이 통합은 모델이 이미 학습한 파이썬 지식을 즉시 활용하게 하고 반복 직렬화와 과도한 토큰 사용을 줄여 비용과 대기시간 효율을 개선한다. 벤치마크 평가에서는 ARC-AGI-3 같은 상호작용 문제에서 메모리 통합과 코드 기반 행동이 성능과 비용-효율성에 실질적 이득을 가져온 것으로 나타났다.
왜 중요한가
NOOA는 에이전트 인터페이스를 기존의 프롬프트·스키마·콜백 혼합에서 벗어나 파이썬 객체라는 하나의 일관된 프로그래밍 모델로 통합했다. 이 통합은 모델이 이미 학습한 파이썬 지식을 즉시 활용하게 하고 반복 직렬화와 과도한 토큰 사용을 줄여 비용과 대기시간 효율을 개선한다. 벤치마크 평가에서는 ARC-AGI-3 같은 상호작용 문제에서 메모리 통합과 코드 기반 행동이 성능과 비용-효율성에 실질적 이득을 가져온 것으로 나타났다.
핵심 기여
에이전트를 파이썬 객체로 표현한 프로그래밍 모델
에이전트는 클래스, 능력은 메서드, 상태는 필드, 프롬프트는 도크스트링, 타입 주석은 계약으로 취급되어 개발자와 모델이 동일한 인터페이스로 코드를 읽고 테스트하고 리팩터링할 수 있게 했다. 이로 인해 복잡한 프레임워크별 문법 없이 기존 파이썬 추상화를 재사용할 수 있다.
여섯 가지 모델-대면 인터페이스 특성의 단일 표면 결합
NOOA는 typed I/O, pass-by-reference, code-as-action, programmable loop engineering, explicit object state, model-callable harness APIs를 하나의 런타임에서 노출해 모델이 타입-검증된 입력·출력을 주고 참조로 바인딩된 객체를 코드로 조작할 수 있게 했다. 이 조합은 기존 프레임워크에서 부분적으로만 제공되던 기능들을 통합한다.
CodeAct 기반 전략·컨텍스트 렌더러·REPL 실행의 구현
두 가지 기본 전략(PredictStrategy, CodeActStrategy)을 제공하고 각 턴마다 정적 블록·이벤트 이력·동적 블록을 렌더링해 KV 캐시 재사용을 유도했다. CodeAct는 모델이 생성한 파이썬 셀을 제한된 런타임에서 실행하고 stdout·예외·반환값을 구조화된 이벤트로 기록한다.
모델-호출 가능한 장기 메모리와 반영(consolidation) 파이프라인
agent가 스스로 기억을 쓰고 조회하도록 remember/recall/search/update_memory/forget/associate/deref 도구를 제공하며, ACT-R 활성화 기반 랭킹과 메모리 그래프 전파, 비동기 반영 과정으로 중복 병합·요약·우선순위 재평가·삭제를 수행한다. 전체 저장소는 사람 검사가 가능한 SQLite 파일로 유지된다.
핵심 아이디어 이해하기
대규모 언어 모델은 이미 수많은 파이썬 코드 예제를 통해 언어와 프로그래밍의 결합을 학습했기 때문에 에이전트 인터페이스를 특별한 DSL 대신 표준 파이썬 추상화로 드러내면 모델의 기존 지식이 바로 활용된다는 관찰에서 출발한다. NOOA는 이 관찰을 바탕으로 에이전트의 행동을 메서드 호출과 타입 계약으로 재구성해 모델이 자연스럽게 메서드를 호출하고 도우미 함수를 사용할 수 있게 한다. 이 접근은 개발자 학습 곡선을 낮추고 모델 준비도를 높여 에이전트가 즉시 실무 코드와 상호작용할 수 있도록 한다.
방법론
NOOA의 핵심 메커니즘은 메서드 레벨의 전략과 턴 단위 컨텍스트 렌더러, 그리고 제한된 REPL 실행기로 구성된다. 메서드가 ellipsis(...)를 포함하면 그 메서드는 에이전트 루프(예: CodeActStrategy)로 실행되며 각 턴은 정적 블록, 이벤트 로그, 동적 블록을 순차적으로 렌더링해 모델에 전달한다. 모델이 코드 액션을 선택하면 해당 셀을 런타임에서 안전 제약과 함께 실행하고 출력·로컬·예외를 구조화된 이벤트로 기록한 뒤 다음 턴을 렌더링한다.
주요 결과
NOOA는 능력 시험과 실전 벤치마크에서 현재 세대 모델들이 프레임워크의 추상화를 이해하고 활용할 수 있음을 보였다. 능력 시험 4,400회 기록에서 전반 통과율은 97.9%였고 스트레스 테스트에서는 대형 모델군이 93.9%를 기록해 장기 배치·오류 복구·REPL 탐색 같은 장황한 작업이 여전히 도전 과제임을 드러냈다. 실제 벤치마크에서 NOOA는 SWE-bench Verified에서 GPT-5.5 xhigh 설정으로 82.2%의 패스율을 기록했고 Terminal-Bench 2.0과 CyberGym L1, ARC-AGI-3에서도 기존 오픈 하니스와 비교해 높은 성능과 비용 효율을 보였다. 특히 ARC-AGI-3에서 world-model + memory 구성은 GPT-5.5에서 RHAE 50.2%를 기록해 베이스라인 41.7%를 앞섰고 GPT-5.6-sol에서는 RHAE 85.1%를 달성해 메모리·월드모델 통합이 상호작용적 추론에서 큰 성능 이득을 가져온 것으로 나타났다.
관련 Figure

그래프는 world-model + memory 구성(GPT-5.5, GPT-5.6-sol)이 시간 경과에 따라 다른 접근법보다 빠르게 RHAE를 높이며 GPT-5.6-sol 조합이 특히 높은 최종 성과(85.1%)를 달성했음을 보여준다. 그래프 상의 주석은 단위 비용 표시(예: $4, $8 등)를 포함해 성능 대비 비용 효율을 함께 전달하며 NOOA의 메모리 통합이 점진적 관찰·예측 루틴과 결합해 액션 효율성을 개선한 결과임을 시사한다.
ARC-AGI-3 실험에서 서로 다른 하니스·모델 조합의 벽시계 시간 대비 RHAE 성능 곡선을 나타낸 성능 그래프이다.
기술 상세
전체 아키텍처는 에이전트 객체, 전략 데코레이터, ContextManager와 EventManager, REPL 실행기, 그리고 선택적 MemoryManager로 구성된다. 에이전트는 일반 메서드와 에이전트적 메서드를 동시에 가질 수 있으며 ellipsis(...) 바디는 런타임에서 LLM 구동 루프로 대체된다. 런타임은 정적 프리픽스(약 1k 문자), 전략 지시문(예: CodeAct 약 2.5k 문자), 타입 도큐먼트, 그리고 동적 pprint(self) 렌더링을 결합해 KV 캐시 재사용을 최적화한다.
관련 Figure

이 도식은 정적 컨텍스트·동적 컨텍스트·이벤트 이력의 세 영역이 각 턴마다 렌더링되어 모델에 전달되는 흐름을 시각화한다. 메모리 도구는 remember/recall/search 등 모델-호출 가능한 API로 노출되며 MemoryManager가 반영과 정리를 관장하고 SQLite 스토어가 영속화 계층으로 사용되는 구조를 보여준다. 이 그림은 NOOA가 컨텍스트 관리와 장기 메모리를 런타임 API로 통합해 모델의 정보 접근 경로를 명시적으로 제어하는 설계 의도를 보강한다.
NOOA의 컨텍스트 블록·에이전트 루프·메모리 관리자·저장소 간 상호작용을 도식화한 아키텍처 다이어그램이다.
한계점
NOOA는 모델이 생성한 코드를 호스트 프로세스에서 실행하는 설계를 취하기 때문에 프로세스 내부 보안에 대한 기본 가정이 존재한다. 논문은 격리 레이어(운영체제 레벨 샌드박스, seccomp, Landlock, 셀 타임아웃 등)를 권장하고 실험에서도 다층 샌드박싱과 레드팀 감사를 적용했으나 런타임 내 코드 실행의 위험은 여전히 주요 제약으로 남는다. 이 한계 때문에 배포 환경에서는 외부 격리·권한 제어가 필수이다.
실무 활용
NOOA는 실제 시스템에서 에이전트 개발 생산성을 높이고 실행 효율을 개선할 수 있는 실무적 프레임워크로 보인다. 단일 파이썬 클래스 형태로 에이전트를 구현하면 테스트·추적·리팩터링이 기존 소프트웨어 개발 흐름과 동일하게 가능해 배포·유지보수 관점에서 이점이 있다. 다만 런타임에서 모델이 생성한 코드를 실행하므로 적절한 샌드박스와 권한 경계가 필요하다.
- 코드베이스 탐색·버그 패치·자동 PR 생성 등 소프트웨어 엔지니어링 자동화 에이전트
- 터미널 조작·설치·디버깅을 자동화하는 운영형 에이전트
- 보안 취약점 탐지와 증명(Proof-of-Concept) 자동화 워크플로
- 환경 탐색과 상호작용적 추론이 필요한 게임·시뮬레이션 기반 연구 에이전트
코드 공개 여부: 비공개
키워드
용어 해설
- Pass-by-Reference
- — 메서드 호출 시 큰 데이터 구조를 텍스트로 직렬화해 프롬프트에 넣는 대신 이름과 제한된 미리보기만 노출하고 실제 객체는 런타임 환경의 참조로 바인딩해 모델이 코드로 직접 조작하게 하는 방식이다. 이 방식은 프롬프트 창 크기에 구애받지 않고 대용량 테이블이나 긴 문자열을 처리하게 하며 반복 직렬화 비용과 토큰 사용을 줄인다. NOOA 맥락에서는 CodeAct REPL 세션에 인수로 바인딩된 객체가 완전한 형태로 남아 모델 코드에서 인덱싱·반복·슬라이스가 가능하게 된다.
- Code as Action
- — 모델의 행동 수단을 구조화된 텍스트나 JSON 도구 호출이 아니라 실행 가능한 코드로 삼아 모델이 직접 파이썬 셀을 생성·수정·실행하는 접근법이다. 모델이 생성한 코드는 안전 제약 하에서 REPL에 의해 실행되며 출력·예외·로컬 변수는 구조화된 이벤트로 기록된다. NOOA는 이 패러다임을 전략(strategy)과 결합해 모델이 단계적으로 계산을 수행하고 중간 값을 재사용하게 한다.
- Typed I/O
- — 에이전트 메서드의 입력 인자와 반환값을 정적 타입 주석으로 정의하고 런타임에서 모델 출력이 그 타입 제약을 만족하는지 검증하는 기법이다. 이 검증은 실패 시 모델에 오류 원인을 전달하고 재시도를 유도해 비정형 텍스트 파싱 실패를 줄인다. NOOA는 Python 타입 주석을 계약으로 사용해 Predict와 CodeAct 전략에서 반환값을 검증한다.
- Context Rendering
- — LLM 호출 전 정적 블록, 이벤트 이력, 동적 블록의 세 영역으로 에이전트 상태를 구성하여 각 턴마다 모델에 전달할 메시지를 생성하는 과정이다. 정적 프리픽스는 KV 캐시 재사용을 유도하고 동적 블록은 턴마다 재평가되며 이벤트는 추가형 로그로 누적된다. NOOA는 이 구조를 통해 긴 대화에서도 불필요한 재계산을 피하고 모델에 명확한 변수·프리뷰 정보를 제공한다.
코드 예제
from nooa import Agent
TicketKind = Literal["refund", "damaged", "other"]
class Ticket(BaseModel):
kind: TicketKind
priority: int = Field(ge=1, le=5, description="Urgency from 1 (low) to 5 (high).")
summary: str = Field(description="Customer-visible summary of the issue.")
class SupportAgent(Agent):
"""You are a support agent for a customer service system."""
order_db: OrderDB
def is_refund_eligible(self, order: Order) -> bool:
"""Return whether an order is eligible for a refund."""
return order.delivered and order.days_since_delivery <= 30
@strategy(PredictStrategy())
async def classify(self, message: str) -> TicketKind:
"""Classify the customer message into the best ticket kind."""
...
@strategy(CodeActStrategy())
async def triage(self, message: str, photo: Image | None, order: Order | None) -> Ticket:
"""Triage a customer message and create a support ticket."""
...에이전트는 Python 클래스이며 메서드의 ellipsis(...)는 런타임에서 LLM 구동 루프(CodeAct 등)로 대체되어 모델이 코드를 생성·실행하게 만드는 예시 코드이다.
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.