중요할 때 기억하라: Long-Horizon 에이전트를 위한 Proactive Memory Agent
Remember When It Matters: Proactive Memory Agent for Long-Horizon Agents
TL;DR Highlight
LLM 에이전트가 긴 작업 중 중요한 정보를 잊어버리는 문제를 별도의 메모리 에이전트가 '적절한 타이밍에' 끼어들어 해결하는 방법
Who Should Read
LLM 에이전트가 긴 작업 도중 이전에 발견한 오류나 요구사항을 잊고 반복 실수하는 문제를 겪고 있는 AI 에이전트 개발자. Claude, Qwen 등 프론티어 모델 기반 자율 에이전트를 운영하는 팀에 특히 유용.
Core Mechanics
- 'Behavioral state decay(행동 상태 소멸)'라는 실패 패턴을 정의: 에이전트가 초반에 파악한 요구사항, 실패한 시도, 진단 결과 등이 나중에 의사결정에 영향을 주지 못하는 현상.
- 액션 에이전트(실제 작업 수행)를 건드리지 않고, 별도의 메모리 에이전트를 옆에서 돌리는 플러그앤플레이 방식 — 기존 에이전트 코드 수정 불필요.
- 메모리 에이전트는 2단계로 작동: Phase 1에서 structured memory bank(지식/절차/상태 3종 구조화 메모리)를 업데이트하고, Phase 2에서 '지금 이 정보를 알려줄지 말지' 선택적으로 개입.
- 항상 주입(always-on injection)보다 선택적 침묵(selective silence)이 더 효과적 — 불필요한 reminder는 오히려 에이전트 방해.
- Mem0 같은 일반 메모리 레이어와 달리, 단순 검색·노출이 아니라 '언제 개입할지' 결정하는 정책(policy)이 핵심.
- Qwen3.5-27B를 메모리 에이전트로 SFT→GRPO 순서로 학습시키면 오픈 웨이트 모델도 이 개입 정책을 학습할 수 있음을 초기 증거로 확인.
Evidence
- Terminal-Bench 2.0에서 Claude Sonnet 4.5 기준 37.6% → 45.9%로 +8.3pp 향상, Claude Opus 4.6도 43.5% → 45.9%로 +2.4pp 향상.
- τ²-Bench에서 Sonnet 4.5 기준 task-weighted 평균 55.0% → 61.8%로 +6.8pp 향상, airline 도메인은 68.0% → 78.0%로 +10.0pp.
- Ablation에서 full memory agent(macro avg 64.3%) > always inject(63.5%) > full-bank context 노출(61.5%) > Mem0(62.1%) 순으로, 선택적 개입이 가장 균형 잡힌 성능.
- Qwen3.5-27B 메모리 에이전트: 미학습 base 모델은 성능을 0.693으로 오히려 낮췄지만, SFT 후 0.720, GRPO 후 0.734로 회복·향상. Terminal-Bench 전이 시 37.6% → 41.1% (+3.5pp).
How to Apply
- 기존 Claude/GPT 기반 에이전트 코드를 수정하지 않고, N 스텝마다 메모리 에이전트를 별도 호출하는 래퍼를 추가하면 된다. 메모리 에이전트가 reminder를 반환하면 다음 액션 에이전트 호출에 transient context로 주입, null이면 그냥 진행.
- 메모리 뱅크를 knowledge(안정적 사실: 요구사항, 파일 경로, API 제약), procedural(시도 결과: 실패한 커맨드, 성공한 픽스), status(현재 진행 상황) 3가지로 나눠 구조화하면, 에이전트가 같은 실수를 반복하는 디버깅 루프를 방지할 수 있다.
- 비용이 걱정된다면 Qwen3.5-27B를 SETA 데이터셋으로 SFT+GRPO 파인튜닝해 저렴한 오픈 웨이트 메모리 에이전트로 대체하는 것을 검토할 수 있다 — 프론티어 모델 없이도 +3.5pp 수준의 개선이 가능.
Code Example
# 메모리 에이전트 통합 예시 (의사코드)
memory_bank = {
"status": "", # 메모리 에이전트만 보는 진행 상황
"knowledge": [], # 안정적 사실 (요구사항, 경로, 제약)
"procedural": [] # 시도 결과 (실패/성공 커맨드, 진단)
}
def memory_agent_step(task, recent_window, memory_bank):
"""
Phase 1: memory bank 업데이트
Phase 2: 개입 여부 결정
"""
# Phase 1: 최근 k=8 스텝 윈도우를 보고 메모리 뱅크 업데이트
updates = llm_call(
system="You are a memory agent. Manage the memory bank.",
messages=[
{"role": "user", "content": f"""
Task: {task}
Recent trajectory (last 8 steps): {recent_window}
Current memory bank: {memory_bank}
Call memory tools as needed:
- memory_update_status(content)
- memory_save_knowledge(id, content, tags)
- memory_save_procedural(id, content, outcome)
- memory_delete(id)
"""}
]
)
apply_memory_tool_calls(memory_bank, updates)
# Phase 2: 개입 여부 결정 (선택적 침묵이 핵심!)
intervention = llm_call(
system="You are a memory agent. Decide whether to intervene.",
messages=[
{"role": "user", "content": f"""
Updated memory bank: {memory_bank}
Recent trajectory: {recent_window}
Should you remind the action agent of something?
- If YES: output <context_for_action>specific, grounded reminder</context_for_action>
- If NO: output <no_intervention/>
Only intervene if a remembered item will affect the NEXT decision.
Do NOT give general advice or repeat already-visible info.
"""}
]
)
return parse_intervention(intervention) # None 또는 reminder 텍스트
# 메인 루프
for step in range(max_steps):
# N 스텝마다 메모리 에이전트 실행
if step % MEMORY_INTERVAL == 0:
reminder = memory_agent_step(task, trajectory[-8:], memory_bank)
else:
reminder = None
# 액션 에이전트 호출 (reminder가 있으면 주입)
action_context = base_context
if reminder:
action_context += f"\n[MEMORY REMINDER]\n{reminder}"
action = action_agent(task, trajectory, action_context) # 액션 에이전트 무수정
observation = env.step(action)
trajectory.append((action, observation))Terminology
관련 논문
WebSwarm: 깊고 넓은 웹 검색을 위한 재귀적 Multi-Agent Orchestration
복잡한 웹 검색을 재귀적으로 분해하고 각 노드에 적합한 검색 모드를 동적으로 할당하는 멀티에이전트 프레임워크
웹 앱을 리버스 엔지니어링해서 AI Agent 도구로 자동 변환하기
로그인된 웹 앱의 API 호출을 브라우저에서 감시해 자동으로 MCP 도구로 변환하는 에이전트를 만들었다. 소스 코드나 공식 API 문서 없이도 Jira, Spotify 같은 서비스에 AI 어시스턴트를 붙일 수 있다.
FableCut – AI 에이전트가 조작할 수 있는 브라우저 기반 비디오 에디터 (zero deps)
타임라인 전체를 JSON 파일 하나로 표현하고 MCP/REST로 AI 에이전트가 직접 편집할 수 있는 브라우저 비디오 에디터로, Claude 같은 AI가 프롬프트 하나로 영상을 자동 컷편집하고 결과를 실시간으로 UI에 반영해준다.
노이즈 가득한 실행 로그에서 근본 원인 찾기: Agent 최적화를 위한 구조적 Trajectory 분석과 인과 추출
Agent 실패 로그를 인과 그래프로 분석해 진짜 근본 원인만 골라내고, 해당 모듈 프롬프트만 정밀하게 수정하는 자동 최적화 프레임워크
Microsoft, AI 에이전트를 위한 시각화 언어 Flint 공개
Microsoft가 LLM/AI 에이전트가 차트를 쉽게 생성할 수 있도록 설계된 고수준 시각화 DSL(도메인 특화 언어) Flint를 오픈소스로 공개했다. 에이전트가 복잡한 시각적 세부사항 대신 의미론적 명세만 다루면 되도록 추상화 계층을 제공하는 게 핵심이다.
크게 생각하고, 작게 검색하라: Hierarchical Search Agent에서 모델 용량은 어디에 집중해야 하는가?
멀티에이전트 검색 시스템에서 큰 모델은 질문 분해에, 작은 모델은 실제 검색 실행에 쓰는 게 정답이다.
GeoSQL: Claude/Codex를 지리공간 데이터 분석 에이전트로 만들어주는 Skill
Related Resources
Original Abstract (Expand)
In long-horizon tasks, decision-relevant state is often scattered across an expanding trajectory, while the action agent must surface it and act. As trajectories grow, task requirements, environment facts, prior attempts, diagnoses, and open subgoals can be buried in the context window or pushed beyond it, failing to influence decisions when needed. We call this failure mode "behavioral state decay". We study memory as an active intervention mechanism rather than passive retrieval. A separate memory agent runs alongside an unmodified action agent, updating a structured memory bank from the recent trajectory and deciding whether to inject a memory-grounded reminder or remain silent. The module is plug-and-play with frontier action agents and existing agent harnesses. Across Terminal-Bench 2.0 and $τ^2$-Bench, it improves pass@1 for both weaker and stronger action agents, with gains of +8.3 pp on Terminal-Bench and +6.8 pp on $τ^2$-Bench. Ablations show that selective intervention outperforms passive bank exposure, always-on injection, advisor-only guidance, and general retrieval. As an early step toward open-weight memory policies, we train Qwen3.5-27B on SETA using SFT and GRPO, improving validation reward and achieving partial transfer to Terminal-Bench.