OpenClaw이 당신을 계속 잊어버리는 이유(그리고 버그가 아닌 이유)
당신이 경험하는 망각은 OpenClaw의 메모리 시스템이 설계된 방식의 직접적인 결과입니다. memory lives as plain Markdown files on disk, 데이터베이스도 아니고, RAM도 아니고, 모델 내부도 아닙니다. 파일은 진실의 원천입니다.
압축 중에 해당 파일이 누락되거나 잘못 구성되거나 자동으로 덮어쓰여지면 에이전트는 컨텍스트를 잃게 되며 이러한 일이 발생했음을 사용자에게 알릴 방법이 없습니다.
수정 사항은 뒤집는 설정이 아닙니다. 무엇이 어디로 가는지에 대해 신중한 결정을 내릴 수 있을 만큼 3계층 아키텍처를 잘 이해하고 있는 것입니다.
완전한 OpenClaw 메모리 아키텍처(3개 레이어 설명)
OpenClaw 메모리는 세 가지 개별 계층에서 작동하며 각 계층은 지속성 특성과 오류 모드가 다릅니다.
전체 메모리 수명주기:
Write → Embed/Index → Search → Compact → Recover ↓ ↓ ↓ ↓ ↓ .md file sqlite-vec semantic summary MEMORY.md created indexes it query replaces re-read at on save returns context session start chunks window
이 체인의 모든 단계는 독립적으로 실패할 수 있습니다. 대부분의 망각 문제는 정확히 하나의 깨진 단계로 추적됩니다.
Layer 1 — 활성 컨텍스트 창
이것이 모델의 작업 메모리입니다. 활성 대화를 위해 현재 컨텍스트 창에 로드된 모든 것입니다. 여기에는 시스템 프롬프트, 대화 기록 및 검색 도구에서 검색한 모든 메모리 청크가 포함됩니다.
그것을 채우는 것:
- 시스템 프롬프트(종종 대형)
- 회수된 기억 발췌
- 도구 통화 내역
- 대화 차례
오버플로 시 어떤 일이 발생합니까? 컨텍스트 창이 토큰 제한에 도달하면 OpenClaw은 압축을 트리거합니다. 즉, 기존 컨텍스트를 압축된 표현으로 요약하고 계속됩니다. 내구성 있는 메모리 파일에 고정되지 않고 대화에 인라인으로 포함된 지침은 이 요약 중에 자주 삭제됩니다.
실제 한계: 시스템 프롬프트 및 메모리 오버헤드 이후 실제 대화에 사용할 수 있는 모델의 알려진 컨텍스트 창의 대략 60~70%가 있다고 가정합니다.
Layer 2 — 일일 메모(롤링 2일 기간)
일일 메모는 memory/ 디렉터리에 저장된 YYYY-MM-DD 형식으로 명명된 추가 전용 마크다운 파일입니다. OpenClaw 로드 오늘과 어제 각 세션이 시작될 때 자동으로 파일을 생성합니다.
- 오늘의 작업, 내린 결정, 활성 작업에 대한 사실이 여기에 추가됩니다.
- 편집할 의도가 없습니다. 로그로 취급하세요.
- 이틀 후에는 자동 로드 창에서 벗어나 의미 검색을 통해서만 검색 가능해집니다.
중요한 문제: OpenClaw은 memory/ 디렉터리를 생성하지 않습니다. 디렉터리가 없으면 일일 메모가 자동으로 삭제되고 오류가 발생하지 않으며 에이전트는 세션 사이의 모든 내용을 잊어버립니다. 이 한 번의 누락으로 인해 "왜 나를 계속 잊어버리는가" 보고서가 대부분 발생합니다.
Layer 3 — 내구성 있는 메모리(MEMORY.md 및 memory-wiki)
이름, 프로젝트 컨텍스트, 코딩 기본 설정, 아키텍처 결정 등 세션 전반에 걸쳐 유지되어야 하는 장기적인 사실은 MEMORY.md 또는 구조화된 memory-wiki 플러그인 저장소에 속합니다.
메모리.md
자유 형식 Markdown 파일입니다. 에이전트는 세션 시작 시 이를 읽습니다. 여기에 항상 담고 싶은 사실을 적어보세요. 간단하고 구성이 필요하지 않습니다.
메모리 위키
페이지 수준 구성, 주장 및 증거 추적, 모순 감지 및 최신 메타데이터를 갖춘 구조화된 플러그인입니다. 크고 발전하는 지식 기반을 갖춘 프로덕션 에이전트에 가장 적합합니다.
압축 문제 - 작업 중에 지침이 사라지는 이유
압축은 OpenClaw에서 가장 잘 문서화되지 않은 실패 모드입니다. 대부분의 기사는 세션 후 망각에 대해 다루고 있습니다. 주소가 거의 없음 장기 실행 자율 워크플로우의 중간 작업 압축 — 에이전트가 다단계 작업을 실행하는 경우 12단계 중 7단계에서 압축이 자동으로 실행되고 1단계의 동작 지침이 사라집니다.
압축의 역할:
- 용량에 가까워지는 컨텍스트 창을 감지합니다.
- 현재 대화를 압축된 블록으로 요약합니다.
- 원래 컨텍스트를 요약으로 대체합니다.
- 계속 실행
문제: 요약은 행동 지침이 아닌 사실과 작업 상태에 맞춰 최적화됩니다. "구현 전에 항상 테스트를 작성하십시오" 또는 "확인 없이 파일을 덮어쓰지 마십시오"와 같은 시스템 명령은 첫 번째 압축 주기에서 살아남고 두 번째 압축 주기에는 사라질 수 있습니다.
트리거되는 경우: 기본 memory-core 플러그인에는 구성 가능한 임계값이 없습니다. 작업 단계가 아닌 토큰 수를 기준으로 실행됩니다. 2시간 자율 실행에서는 3~5회의 압축 주기를 예상할 수 있습니다.
압축 방지 파일 아키텍처를 구축하는 방법
대화가 아닌 MEMORY.md에 행동 지침을 고정하세요. 여러 압축 주기를 거쳐야 하는 모든 항목은 각 압축 후에 다시 읽히는 내구성 있는 파일에 있어야 합니다.
권장 고정 패턴:
## Agent Behavioral Rules (always active) - Never overwrite files without showing a diff first - Write tests before implementation (TDD mode: on) - Use TypeScript strict mode in all new files ## Project Context - Stack: Node.js 22, Fastify, PostgreSQL 16 - Repo root: /home/user/project - Active sprint goal: migrate auth to Clerk
압축 후에도 유지되는 명명 규칙:
- 중요 섹션 앞에
## [PINNED]을 붙입니다. 요약자는 대문자 헤더를 높은 우선순위로 처리합니다. - 가능한 한 각 고정된 사실을 한 줄로 유지하십시오. 조밀한 단락은 요약되고 한 줄의 사실은 그대로 유지되는 경향이 있습니다.
MEMORY.md과 오늘의 일일 메모에서 가장 중요한 행동 규칙 3~5개를 반복합니다. 중복성은 압축 방지책입니다.
10분 만에 제로-메모리 설정(완전한 파일 스캐폴드)
다른 곳에는 없는 설정 가이드입니다. 이 구조를 복사하고 컨텍스트를 입력하면 실행됩니다.
디렉토리 트리:
memory/ ├── MEMORY.md ├── 2026-04-27.md ← today's daily note (create manually) └── wiki/ ← only if using memory-wiki plugin ├── index.md ├── project-context.md └── decisions.md
스타터 MEMORY.md:
# Persistent Memory ## Identity & Preferences - Name: [your name] - Role: [your role] - Preferred response style: concise, no preamble ## Project: [Project Name] - Stack: [your stack] - Key constraints: [e.g., no external APIs, TypeScript only] - Current focus: [active task or sprint goal] ## Behavioral Rules - [Rule 1] - [Rule 2] ## Decisions Made - [YYYY-MM-DD] Decided to use X because Y
시작 일일 메모(2026-04-27.md):
# 2026-04-27 ## Session Goals - [ ] Task 1 - [ ] Task 2 ## Notes
플러그인 슬롯 구성(2026 구문):
{ "plugins": { "slots": { "memory": "memory-core" } } } 메모리를 완전히 비활성화하려면:
{ "plugins": { "slots": { "memory": false } } } 확인 단계:
- 세션을 실행하고 에이전트에게 이전 세션에서 말한 내용을 기억해 달라고 요청하세요.
memory/YYYY-MM-DD.md이 작성되었는지 확인하세요(새 콘텐츠가 있어야 함).- 상담원에게 직접 물어보세요. "나에 대해 무엇을 알고 있나요?" —
MEMORY.md에서 가져와야 합니다.
생산 기술 자료를 위한 Configuring memory-wiki
플러그인 슬롯을 교체하여 활성화하십시오.
{ "plugins": { "slots": { "memory": "memory-wiki" } } } memory-wiki는 memory/wiki/ 아래에 구조화된 저장소를 생성합니다. 각 주제에는 자체 페이지가 있습니다. 플러그인은 세션 시작 시 에이전트가 로드할 수 있도록 신뢰도가 높고 모순되지 않는 사실을 집계하는 digest.md을 컴파일합니다.
프로덕션 에이전트를 위한 실용적인 저장소 구조:
memory/wiki/ ├── index.md ← vault table of contents ├── digest.md ← auto-generated; agent reads this ├── project-context.md ← stack, goals, constraints ├── decisions.md ← architectural decisions log ├── team.md ← stakeholders, contacts └── domain-knowledge.md ← business rules, glossary
다음과 같은 경우에 memory-wiki를 사용하세요.
- 지식 기반이 ~50개 사실을 초과합니다.
- 모순 탐지가 필요합니다
- 여러 에이전트가 동일한 저장소에 쓰기
다음과 같은 경우 원시 MEMORY.md를 사용하세요.
- 당신은 솔로 개발자입니다
- 귀하의 컨텍스트가 안정적입니다
- 유지 관리 오버헤드가 전혀 필요하지 않습니다.
Semantic Search and Embeddings — SQLite, sqlite-vec 및 JS 대체
OpenClaw은 다음을 사용하여 메모리 파일을 색인화합니다. SQLite with the sqlite-vec extension 벡터 유사성 검색을 위한 것입니다. 귀하 또는 에이전트가 메모리 검색을 실행하면 쿼리가 포함되고 의미상 가장 관련성이 높은 청크가 검색됩니다.
벡터 저장소가 정상인지 확인하십시오.
# Check that the memory index exists ls memory/.index/ # Reset a corrupted index (safe to run — it rebuilds from .md files) rm -rf memory/.index/ && openclaw reindex
sqlite-vec를 사용할 수 없는 경우(ARM Linux 및 일부 Windows 구성에서 일반적) OpenClaw은 순수 JS 벡터 확장으로 대체됩니다. 명시적으로 대체를 강제합니다.
{ "memory": { "vectorBackend": "js" } } Segment-Specific Memory Strategies
Solo Developer — 최소 오버헤드, 최대 리콜
권장 설정: memory-core 플러그인, MEMORY.md + 일일 메모만, Wiki Vault 없음.
MEMORY.md을 200줄 미만으로 유지합니다. 파일이 길어지면 세션 시작이 느려집니다.- 일일 메모에 적극적으로 추가하세요. 깨끗하게 유지하려고 하지 마세요
- 매주
MEMORY.md을 검토하고 정리합니다. 오래된 사실로 인해 검색 품질이 저하됩니다.
다중 에이전트 파이프라인 — 에이전트 간 공유 메모리
여러 에이전트가 동일한 memory/ 디렉터리를 읽고 쓰는 경우 명시적인 소유권 규칙이 필요합니다.
- One agent owns writes to each file — 동일한
.md파일에 동시 쓰기를 하면 충돌이 발생합니다. - 에이전트당 하위 디렉터리 사용:
memory/agent-a/,memory/agent-b/, 공유memory/shared/MEMORY.md - 공유 볼트에 memory-wiki를 사용하세요. 다이제스트 컴파일은 원시 파일보다 여러 작성자의 최신성을 더 잘 처리합니다.
Long-Running Autonomous Tasks — 생존 실행 시간
시간 단위로 측정되는 작업을 실행하는 에이전트의 경우:
- Force memory writes at checkpoints — 각 주요 작업 단계 후에 에이전트에게 현재 상태를 오늘의 일일 메모에 추가하도록 지시합니다.
- Pre-load compaction-resistant context — 초기 메시지뿐만 아니라 실행이 시작되기 전에 전체 작업 사양을
MEMORY.md에 넣습니다. - Set explicit continuation markers 일일 메모:
<!-- RESUME POINT: completed steps 1-4, next: step 5 -->에이전트가 압축 주기 후에 자체 방향을 지정할 수 있도록 합니다.
EasyClaw이 장기 실행 메모리 작업에서 승리하는 이유
EasyClaw은 데스크톱 기반으로 구축되었습니다. 즉, 메모리 파일, 벡터 인덱스 및 일일 메모가 시간 초과 시 컨텍스트를 제거하는 클라우드 세션이 아닌 로컬 디스크의 프로젝트와 함께 존재한다는 의미입니다. 구성이 아닌 기본적으로 압축 방지 메모리가 제공됩니다.
- ✅ 다시 시작해도 유지되는 영구 메모리 — 클라우드 세션 제한 없음
- ✅ 네트워크 대기 시간이 없는 로컬 sqlite-vec 인덱싱
- ✅ 구조화된 메모리 위키 내장 — 구성할 추가 플러그인이 없음
- ✅ 모든 주요 작업 단계에서 자동 체크포인트 쓰기
- ✅ 압축 인식 고정 — 동작 규칙은 절대로 요약되지 않습니다.
Troubleshooting OpenClaw Memory — 잊어버린 문제를 2분 안에 진단합니다
다음 단계를 순서대로 수행하세요.
Step 1 — memory/ 디렉터리가 존재합니까?
- No → 만들어 보세요. 이는 모든 잊어버린 보고서의 ~40%를 수정합니다.
- Yes → 2단계로 진행합니다.
Step 2 — 일일 메모가 작성되고 있습니까?
memory/에서 오늘 날짜라는 파일을 확인하세요.- No file → 플러그인 슬롯이 잘못 구성되었을 수 있습니다.
plugins.slots.memory이 설정되어 있고false이 설정되어 있지 않은지 확인하세요. - File exists but이 비어 있습니다. → 에이전트가 메모리를 로드하고 있지만 쓰고 있지 않습니다. 디렉토리에 대한 쓰기 권한을 확인하십시오.
Step 3 — 압축이 실행되어 지침이 제거되었습니까?
- Symptom: 상담원은 사실을 기억하지만 세션 중에 행동 규칙을 무시합니다.
- Fix: 모든 행동 규칙을
## [PINNED]섹션 아래의MEMORY.md로 이동합니다.
Step 4 — 압축 전에 컨텍스트 창이 오버플로됩니까?
- Symptom: 상담원이 긴 대화의 이전 부분을 무시하기 시작합니다.
- Fix: 시스템 프롬프트 크기 줄이기,
MEMORY.md자르기 또는 명시적인 체크포인트 메모를 사용하여 작업을 더 짧은 세션으로 분할
Step 5 — SQLite 벡터 인덱스가 손상되었습니까?
- Symptom: 메모리 검색은 결과를 반환하지 않거나 분명히 관련 없는 결과를 반환합니다.
- Fix:
rm -rf memory/.index/ && openclaw reindex - 로그에 sqlite-vec 오류가 나타나는 경우:
"vectorBackend": "js"를 통해 JS 백엔드로 전환하세요.
Frequently Asked Questions
Q: 터미널을 닫은 후 OpenClaw이 모든 것을 잊어버리는 이유는 무엇입니까?
A: 가장 일반적인 원인은 memory/ 디렉터리가 존재하지 않기 때문입니다. OpenClaw은 디렉터리가 누락된 경우 자동으로 일일 메모를 삭제합니다. 오류나 경고는 없습니다. 프로젝트 루트에 디렉터리를 만들고 다음 세션 후에 날짜가 지정된 파일이 나타나는지 확인하세요.
Q: 내 에이전트는 처음에는 지침을 따르지만 나중에 긴 작업에서는 지침을 무시합니다. 왜?
A: 그건 압축이에요. 컨텍스트 창이 가득 차면 OpenClaw은 공간을 확보하기 위해 이전 콘텐츠를 요약합니다. 요약은 행동 지침이 아닌 사실을 보존합니다. 규칙을 ## [PINNED] 섹션 아래의 MEMORY.md로 이동하면 각 압축 주기 후에 규칙을 다시 읽을 수 있습니다.
Q: memory-core 또는 memory-wiki를 사용해야 합니까?
A: memory-core로 시작하세요. 구성이 필요 없으며 대부분의 개인 개발자 작업 부하를 잘 처리합니다. 기술 자료가 최대 50개 사실을 초과하거나, 모순 감지가 필요하거나, 여러 에이전트가 동일한 메모리 저장소에 쓰고 있는 경우에만 memory-wiki로 업그레이드하세요.
Q: 2시간 자율 실행에서 몇 번의 다짐 주기를 예상할 수 있습니까?
A: 3~5회의 압축 주기가 예상됩니다. 임계값은 경과 시간이나 작업 단계가 아닌 토큰 수를 기반으로 하며 기본 memory-core 플러그인에서 사용자가 구성할 수 없습니다. 이것이 MEMORY.md의 압축 방지 고정이 장기 실행 작업에 필수적인 이유입니다.
Q: 메모리 검색에서 관련 없는 결과가 반환됩니다. 어떻게 해결하나요?
A: SQLite 벡터 인덱스가 손상되었거나 오래되었을 수 있습니다. rm -rf memory/.index/ && openclaw reindex을 실행하여 .md 파일에서 다시 빌드하세요. 언제든지 실행해도 안전합니다. sqlite-vec 오류가 지속되면(ARM Linux 및 일부 Windows 설정에서 일반적임) JS 대체 백엔드로 전환하세요.
Q: 동일한 메모리 디렉터리에 대해 여러 에이전트를 실행할 수 있습니까?
A: Yes. 하지만 명시적인 소유권 규칙이 필요합니다. 동일한 .md 파일에 동시 쓰기를 수행하면 충돌이 발생합니다. 공유 memory/shared/MEMORY.md과 함께 에이전트당 하위 디렉터리(memory/agent-a/, memory/agent-b/)를 사용하고 공유 볼트에는 memory-wiki를 사용합니다.
Q: 일일 메모는 자동 로드 창에 얼마나 오래 유지되나요?
A: 세션 시작 시 오늘과 어제의 일일 메모만 자동으로 로드됩니다. 이전 노트는 자동 로드 창 외부에 있으며 의미 검색을 통해서만 액세스할 수 있습니다. 이는 의도적으로 설계된 것입니다. 모든 기록 노트를 로드하면 상황 예산이 너무 많이 소비됩니다.
최종 평결 - 실제로 유지되는 메모리 설정
대부분의 사용자를 위한 Recommended baseline: memory-core 플러그인, 첫 번째 세션 전에 생성된 memory/ 디렉터리, 명확하게 라벨이 지정된 고정 섹션의 행동 규칙이 있는 MEMORY.md, 각 세션 전체에 일일 메모가 추가됩니다.
망각 문제의 80% 뒤에 숨어 있는 한 가지 실수는 다음과 같습니다. MEMORY.md에 압축 방지 고정이 없는 결합된 memory/ 디렉터리를 생성하지 않습니다. 에이전트는 첫 번째 압축 주기에서 컨텍스트를 삭제하고 다시 쓸 곳이 없습니다.
귀하의 행동 체크리스트:
- 프로젝트 루트에
memory/디렉터리를 만듭니다. - 위의 스타터
MEMORY.md템플릿을 복사하고 컨텍스트를 입력하세요. plugins.slots.memory이"memory-core"(또는 선택한 플러그인)으로 설정되어 있는지 확인하세요.MEMORY.md의## [PINNED]에 가장 중요한 행동 규칙 3~5개를 추가하세요.- 첫 번째 세션 후 날짜가 적힌 일일 메모가 작성되었는지 확인하세요.
- 의미 검색이 기분이 좋지 않으면
openclaw reindex을 실행하여 벡터 인덱스를 다시 작성하십시오.
아키텍처는 일단 이해하면 건전합니다. 대부분의 잊어버리는 문제는 이 체크리스트를 따른 후 10분 이내에 해결됩니다.