Workspace Memory v2 (오프라인): 리서치 메모
대상: Clawd 스타일 워크스페이스(agents.defaults.workspace, 기본값 ~/.openclaw/workspace)로, “메모리”는 하루당 하나의 Markdown 파일(memory/YYYY-MM-DD.md)과 소수의 안정적인 파일(예: memory.md, SOUL.md)에 저장된다.
이 문서는 Markdown 을 사람이 검토 가능한 정본 소스로 유지하면서도, 파생 인덱스를 통해 구조화된 회상(검색, 엔터티 요약, 신뢰도 갱신)을 더하는 오프라인 우선 메모리 아키텍처를 제안한다.
왜 바꾸는가?
현재 구성(하루에 한 파일)은 다음 용도에 매우 적합하다.- “append-only” 저널링
- 사람이 직접 편집
- git 기반 내구성 + 감사 가능성
- 마찰이 적은 기록 방식(“그냥 적어 두기”)
- 높은 재현율의 검색(“X 에 대해 우리가 무엇을 결정했지?”, “지난번에 Y 를 어떻게 시도했지?”)
- 엔터티 중심 답변(“Alice / The Castle / warelay 에 대해 말해 줘”)을 위해 많은 파일을 다시 읽어야 하는 점
- 의견/선호의 안정성과 그 변화에 대한 근거
- 시간 제약(“2025년 11월 동안 무엇이 사실이었나?”) 및 충돌 해결
설계 목표
- 오프라인: 네트워크 없이 동작하고, 노트북/Castle 에서 실행 가능하며, 클라우드 의존성이 없다.
- 설명 가능성: 검색 결과는 출처(파일 + 위치)를 가질 수 있어야 하며, 추론과 분리되어야 한다.
- 낮은 의식 비용: 일일 기록은 Markdown 으로 유지하고, 무거운 스키마 작업은 피한다.
- 점진적 확장: v1 은 FTS 만으로도 유용해야 하며, semantic/vector 와 그래프는 선택적 업그레이드여야 한다.
- 에이전트 친화적: “토큰 예산 안에서 회상” 이 쉽도록 작은 사실 묶음을 반환해야 한다.
북극성 모델(Hindsight × Letta)
섞어야 할 두 가지 요소:- Letta/MemGPT 스타일 제어 루프
- 항상 컨텍스트에 유지되는 작은 “코어”(persona + 핵심 사용자 사실)를 둔다.
- 나머지는 모두 컨텍스트 밖에 두고 도구를 통해 검색한다.
- 메모리 쓰기는 명시적 도구 호출(append/replace/insert)로 수행하고, 영속화한 뒤 다음 턴에 다시 주입한다.
- Hindsight 스타일 메모리 기반체
- 관찰된 것, 믿고 있는 것, 요약된 것을 분리한다.
- retain/recall/reflect 를 지원한다.
- 근거와 함께 진화하는 신뢰도 기반 의견을 지원한다.
- 완전한 지식 그래프가 없더라도 엔터티 중심 검색 + 시간 쿼리를 지원한다.
제안 아키텍처(Markdown 원본 + 파생 인덱스)
Canonical store (git 친화적)
~/.openclaw/workspace 를 사람이 읽을 수 있는 정본 메모리로 유지한다.
권장 워크스페이스 레이아웃:
- 일일 로그는 계속 일일 로그로 둔다. JSON 으로 바꿀 필요는 없다.
bank/파일은 큐레이션된 결과물 로, reflection 작업이 생성하며 여전히 수동 편집할 수 있다.memory.md는 “작고 core-ish” 한 상태를 유지한다. 즉, Clawd 가 매 세션마다 봐야 하는 내용만 담는다.
Derived store (기계 회상)
워크스페이스 아래에 파생 인덱스를 추가한다(git 추적 여부는 선택).- 사실 + 엔터티 링크 + 의견 메타데이터를 담는 SQLite 스키마
- 어휘 기반 회상용 SQLite FTS5(빠르고, 작고, 오프라인)
- 선택적 의미 검색용 embeddings 테이블(여전히 오프라인)
Retain / Recall / Reflect (운영 루프)
Retain: 일일 로그를 “사실” 로 정규화
여기서 중요한 Hindsight 의 통찰은 작은 조각이 아니라 서사적이고 완결된 사실 을 저장하라는 점이다.memory/YYYY-MM-DD.md 에 대한 실용 규칙:
- 하루가 끝날 때(또는 중간에도)
## Retain섹션에 다음 조건을 만족하는 2~5개 불릿을 추가한다.- 서사적이며(여러 턴에 걸친 맥락을 유지)
- 독립적이며(나중에 따로 봐도 의미가 통함)
- 타입 + 엔터티 언급으로 태그됨
- 타입 접두사:
W(world),B(experience/biographical),O(opinion),S(observation/summary; 보통 자동 생성) - 엔터티:
@Peter,@warelay등(slug 는bank/entities/*.md와 매핑) - 의견 신뢰도:
O(c=0.0..1.0)선택 사항
## Retain 섹션이 가장 쉬운 품질 레버다.
Recall: 파생 인덱스에 대한 쿼리
Recall 은 다음을 지원해야 한다.- lexical: “정확한 용어 / 이름 / 명령 찾기”(FTS5)
- entity: “X 에 대해 알려줘”(엔터티 페이지 + 엔터티와 연결된 사실)
- temporal: “11월 27일 전후에 무슨 일이 있었지?” / “지난주 이후로”
- opinion: “Peter 는 무엇을 선호하지?”(신뢰도 + 근거 포함)
kind(world|experience|opinion|observation)timestamp(소스 날짜 또는 추출된 시간 범위)entities(["Peter","warelay"])content(서사적 사실)source(memory/2025-11-27.md#L12등)
Reflect: 안정적인 페이지 생성 + 믿음 갱신
Reflection 은 일정에 따라 실행되는 작업(매일 또는 heartbeatultrathink)으로, 다음을 수행한다.
- 최근 사실로부터
bank/entities/*.md를 갱신한다(엔터티 요약). - 강화/모순에 따라
bank/opinions.md의 신뢰도를 갱신한다. - 선택적으로
memory.md편집을 제안한다(“core-ish” 한 지속 사실).
- 각 의견은 다음을 가진다.
- 진술
- 신뢰도
c ∈ [0,1] last_updated- 근거 링크(지지/반박 사실 ID)
- 새 사실이 도착하면:
- 엔터티 겹침 + 유사도를 기준으로 후보 의견을 찾는다(처음엔 FTS, 이후 embeddings)
- 작은 폭으로 신뢰도를 갱신한다. 큰 폭 변화는 강한 모순과 반복 근거가 필요하다.
CLI 통합: 독립형 vs 깊은 통합
권장안: OpenClaw 에 깊게 통합 하되, 분리 가능한 코어 라이브러리는 유지한다.왜 OpenClaw 에 통합하는가?
- OpenClaw 는 이미 다음을 알고 있다.
- 워크스페이스 경로(
agents.defaults.workspace) - 세션 모델 + heartbeat
- 로깅 + 문제 해결 패턴
- 워크스페이스 경로(
- 에이전트 자체가 다음 도구를 호출하길 원한다.
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
왜 여전히 라이브러리로 분리하는가?
- gateway/runtime 없이도 메모리 로직을 테스트 가능하게 유지하기 위해
- 다른 컨텍스트(로컬 스크립트, 미래의 데스크톱 앱 등)에서 재사용하기 위해
”S-Collide” / SuCo: 언제 써야 하나 (리서치)
만약 “S-Collide” 가 SuCo (Subspace Collision) 를 뜻한다면, 이는 구조화된 하위공간 충돌을 이용해 강한 재현율/지연시간 절충을 노리는 ANN 검색 방식이다(논문: arXiv 2411.14754, 2024).~/.openclaw/workspace 에 대한 실용적 판단:
- 처음부터 SuCo 로 시작하지 말 것
- 먼저 SQLite FTS + (선택적) 단순 임베딩으로 시작하면 대부분의 UX 개선을 바로 얻을 수 있다.
- 다음 조건이 충족될 때에만 SuCo/HNSW/ScaNN 류 해법을 고려한다.
- 코퍼스가 커졌을 때(수만~수십만 청크)
- brute-force 임베딩 검색이 너무 느려졌을 때
- 의미 기반 검색 품질이 어휘 검색의 병목이 되었을 때
- SQLite FTS5 + 메타데이터 필터(ML 불필요)
- 임베딩 + brute force(청크 수가 적다면 생각보다 오래 버틴다)
- HNSW 인덱스(흔하고 견고함. 라이브러리 바인딩 필요)
- SuCo(리서치 등급. 내장 가능한 견고한 구현이 있다면 매력적)
- 당신의 장비(노트북 + 데스크톱)에서 “개인 비서 메모리” 용으로 가장 좋은 오프라인 임베딩 모델은 무엇인가?
- 이미 Ollama 가 있다면 로컬 모델로 임베딩하고, 아니라면 도구 체인에 작은 임베딩 모델을 포함시킨다.
가장 작은 유용한 파일럿
최소하지만 여전히 유용한 버전을 원한다면:bank/엔터티 페이지와 일일 로그의## Retain섹션을 추가한다.- 인용(path + line numbers)이 포함된 SQLite FTS 기반 recall 을 사용한다.
- 검색 품질이나 규모가 실제로 요구할 때만 임베딩을 추가한다.
참고 자료
- Letta / MemGPT concepts: “core memory blocks” + “archival memory” + tool-driven self-editing memory.
- Hindsight Technical Report: “retain / recall / reflect”, four-network memory, narrative fact extraction, opinion confidence evolution.
- SuCo: arXiv 2411.14754 (2024): “Subspace Collision” approximate nearest neighbor retrieval.