당신의 AI 에이전트는 모든 것을 잊어버립니다 — 이를 고치는 데몬
Source: Dev.to
Introduction
당신은 AI 에이전트에게 프로젝트 구조, 코딩 선호도, 그리고 지난 화요일에 디버깅한 이상한 Bedrock 타임아웃 문제에 대해 한 시간을 들여 가르칩니다. 다음 세션에서는 그 맥락이 사라지고, 모든 것을 다시 설명해야 합니다. 일부 프레임워크는 메모리 플러그인을 제공하지만, 이들은 종종 단일 프레임워크에만 묶여 있고, 잡동사니가 쌓이며, 몇 주 전의 모순을 절대 정리하지 못합니다.
agent‑memory‑daemon
agent-memory-daemon은 어떤 AI 에이전트와도 함께 실행될 수 있는 백그라운드 데몬입니다. 세션 파일이 저장된 디렉터리를 감시하면서 두 가지 주요 작업을 수행합니다:
- 추출 – 새로운 세션 전사본을 스캔하여 사실, 결정, 선호도, 오류 수정 등을 추출하고, 각각을 YAML 프론트‑머터가 포함된 구조화된 마크다운 파일로 저장합니다.
- 통합 – 주기적으로 전체 메모리 디렉터리를 검토하여 중복을 병합하고, 상대 날짜를 절대 날짜로 변환하며, 모순된 사실을 제거하고, 오래된 내용을 정리하고, 크기 제한 내에서 간결한
MEMORY.md인덱스를 유지합니다.
파일 시스템이 인터페이스입니다: 에이전트가 디렉터리에 마크다운 파일을 쓰면, 데몬이 이를 읽고, 사고하고, 정리된 메모리를 다시 씁니다. SDK, API, 서버가 전혀 필요하지 않습니다.
왜 중요한가
- 내가 운영하던 에이전트는 몇 주 동안 40개 이상의 메모리 파일을 축적했습니다.
- 그 중 절반은 약간씩 다른 문구로 중복되었습니다.
- 세 파일은 사용 중인 AWS 리전이 서로 다르게 기술되어 서로 모순되었습니다.
MEMORY.md인덱스는 800줄까지 늘어나 에이전트의 컨텍스트 창 절반을 차지했습니다.
이 데몬은 단순히 메모리를 저장하는 것이 아니라, 적극적으로 메모리를 정리하는 청소부 역할을 합니다.
워크플로우
flowchart TD
A[Session file modified] --> B[Cursor check: is this new content?]
B --> C[Build prompt: memory manifest + session content]
C --> D[LLM identifies facts, decisions, preferences]
D --> E[Write structured memory files]
E --> F[Advance cursor]
추출 커서
.extraction-cursor 파일은 세션별 오프셋 맵을 추적하여 실제로 새로운 내용만 처리되도록 보장합니다. 세션 파일에 내용이 추가되면, 데몬은 전체 파일을 다시 처리하지 않고 이전에 중단된 지점부터 이어서 작업합니다.
통합 트리거
flowchart TD
G[Three‑gate trigger: time elapsed + session count + lock] --> H[Four‑phase pass: orient → gather → consolidate → prune]
H --> I[Merge duplicates, resolve contradictions]
I --> J[Update MEMORY.md index (200 lines / 25 KB budget)]
J --> K[Release lock]
추출과 통합은 모두 PID 기반 잠금을 공유하며 동시에 실행되지 않습니다. 두 트리거가 같은 시점에 발생하면 통합이 우선 순위를 가집니다.
설치 및 빠른 시작
npx agent-memory-daemon init # generates memconsolidate.toml
npx agent-memory-daemon start # starts the daemon
구성
memconsolidate.toml (TOML)
memory_directory = "./memory"
session_directory = "./sessions"
extraction_enabled = true
extraction_interval_ms = 60000
[llm_backend]
name = "bedrock"
region = "us-east-1"
model = "us.anthropic.claude-sonnet-4-20250514-v1:0"
# Or use OpenAI:
# [llm_backend]
# name = "openai"
# api_key = "${OPENAI_API_KEY}"
# model = "gpt-4o"
참조 스니펫 (YAML 프론트‑머터)
---
name: "Bedrock timeout configuration"
description: "Default SDK timeout is too short for large prompts"
type: reference
---
The AWS SDK's default request timeout causes ECONNABORTED errors on prompts over 30K characters. Set `requestTimeout` to `300000` (5 min) via `NodeHttpHandler` when using `BedrockRuntimeClient`.
메모리 파일 유형
| Type | Purpose |
|---|---|
user | 선호도 (예: 작은 따옴표) |
feedback | 교훈 / 오류 수정 |
project | 아키텍처 결정 |
reference | 기술적 사실 (예: SDK 설정) |
통합 패턴
- Strands / LangChain – 각 에이전트 실행 후, 세션 요약을
sessions디렉터리에 덤프합니다. 시작 시,MEMORY.md를 시스템 프롬프트에 읽어들입니다. - OpenClaw –
session_directory를 워크스페이스의 트랜스크립트 디렉터리로 지정합니다. - Custom agents – 동일한 패턴: 파일을 쓰고, 인덱스를 읽습니다.
플러그인 시스템이나 어댑터 레이어가 필요하지 않습니다; 파일 시스템이 바로 API입니다.
가드레일
추출 작업을 방치하면 지수적으로 폭발할 수 있습니다. 데몬은 여러 제한을 적용합니다(구성 가능):
| 설정 | 기본값 |
|---|---|
max_memory_files | 50 |
max_files_per_batch | 10 |
max_prompt_chars | (점진적 잘림을 통한 예산 적용) |
per-session cursor | 이미 추출된 콘텐츠의 재처리를 방지 |
Structured Logging
각 작업은 JSON 로그를 출력합니다:
{
"timestamp": "2026-04-07T14:23:01.234Z",
"level": "info",
"event": "extraction:complete",
"data": {
"created": 3,
"updated": 1,
"durationMs": 4521,
"promptLength": 39102,
"operationsRequested": 5,
"operationsApplied": 4,
"operationsSkipped": 1
}
}
이 로그들을 CloudWatch, Datadog에 파이프하거나, 혹은 jq로 간단히 처리할 수 있습니다.
향후 방향
- 메모리 회상을 위한 벡터 유사도 검색 (현재는 매니페스트 기반)
- 공유 메모리 디렉터리와 충돌 해결을 포함한 다중 에이전트 지원
- 메모리를 탐색하고 편집하기 위한 웹 UI
라이선스 및 출처
The project is MIT‑licensed and available on GitHub. Issues, PRs, and feedback are welcome.
npm install agent-memory-daemon
If your agent keeps forgetting things, give it a daemon with a good memory.