당신의 AI 에이전트는 모든 것을 잊어버립니다 — 이를 고치는 데몬

발행: (2026년 4월 8일 AM 01:08 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

Introduction

당신은 AI 에이전트에게 프로젝트 구조, 코딩 선호도, 그리고 지난 화요일에 디버깅한 이상한 Bedrock 타임아웃 문제에 대해 한 시간을 들여 가르칩니다. 다음 세션에서는 그 맥락이 사라지고, 모든 것을 다시 설명해야 합니다. 일부 프레임워크는 메모리 플러그인을 제공하지만, 이들은 종종 단일 프레임워크에만 묶여 있고, 잡동사니가 쌓이며, 몇 주 전의 모순을 절대 정리하지 못합니다.

agent‑memory‑daemon

agent-memory-daemon어떤 AI 에이전트와도 함께 실행될 수 있는 백그라운드 데몬입니다. 세션 파일이 저장된 디렉터리를 감시하면서 두 가지 주요 작업을 수행합니다:

  1. 추출 – 새로운 세션 전사본을 스캔하여 사실, 결정, 선호도, 오류 수정 등을 추출하고, 각각을 YAML 프론트‑머터가 포함된 구조화된 마크다운 파일로 저장합니다.
  2. 통합 – 주기적으로 전체 메모리 디렉터리를 검토하여 중복을 병합하고, 상대 날짜를 절대 날짜로 변환하며, 모순된 사실을 제거하고, 오래된 내용을 정리하고, 크기 제한 내에서 간결한 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`.

메모리 파일 유형

TypePurpose
user선호도 (예: 작은 따옴표)
feedback교훈 / 오류 수정
project아키텍처 결정
reference기술적 사실 (예: SDK 설정)

통합 패턴

  • Strands / LangChain – 각 에이전트 실행 후, 세션 요약을 sessions 디렉터리에 덤프합니다. 시작 시, MEMORY.md를 시스템 프롬프트에 읽어들입니다.
  • OpenClawsession_directory를 워크스페이스의 트랜스크립트 디렉터리로 지정합니다.
  • Custom agents – 동일한 패턴: 파일을 쓰고, 인덱스를 읽습니다.

플러그인 시스템이나 어댑터 레이어가 필요하지 않습니다; 파일 시스템이 바로 API입니다.

가드레일

추출 작업을 방치하면 지수적으로 폭발할 수 있습니다. 데몬은 여러 제한을 적용합니다(구성 가능):

설정기본값
max_memory_files50
max_files_per_batch10
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.

0 조회
Back to Blog

관련 글

더 보기 »