Workspace Memory v2 (offline): 연구 노트
대상: Clawd 스타일 워크스페이스 (agents.defaults.workspace, 기본값 ~/.openclaw/workspace)로, “메모리”가 하루당 하나의 Markdown 파일 (memory/YYYY-MM-DD.md)과 소수의 안정적인 파일 집합 (예: memory.md, SOUL.md)으로 저장되는 구조입니다.
이 문서는 Markdown 을 검토 가능하고 정본(canonical)인 단일 소스 오브 트루스로 유지하면서, 파생 인덱스를 통해 구조화된 회상 (검색, 엔티티 요약, 신뢰도 업데이트)을 추가하는 오프라인 우선 메모리 아키텍처를 제안합니다.
왜 변경하는가?
현재 설정 (하루당 하나의 파일)은 다음에 매우 적합합니다:- “append-only” 저널링
- 사람에 의한 편집
- git 기반 내구성 + 감사 가능성
- 낮은 마찰의 기록 (“그냥 적기”)
- 높은 회상률의 검색 (“X 에 대해 무엇을 결정했지?”, “마지막으로 Y 를 시도한 게 언제였지?”)
- 여러 파일을 다시 읽지 않고는 어려운 엔티티 중심 답변 (“Alice / The Castle / warelay 에 대해 알려줘”)
- 의견/선호의 안정성 (그리고 변경 시의 근거)
- 시간 제약 (“2025년 11월에는 무엇이 사실이었나?”) 및 충돌 해결
설계 목표
- 오프라인: 네트워크 없이 동작하며, 노트북/Castle 에서 실행 가능; 클라우드 의존성 없음.
- 설명 가능성: 검색된 항목은 출처 (파일 + 위치)가 명확해야 하며, 추론과 분리 가능해야 함.
- 낮은 의식 비용: 일일 로깅은 Markdown 을 유지하고, 무거운 스키마 작업을 요구하지 않음.
- 점진성: v1 은 FTS 만으로도 유용해야 하며, 시맨틱/벡터 및 그래프는 선택적 업그레이드.
- 에이전트 친화적: “토큰 예산 내 회상”을 쉽게 함 (작은 사실 묶음을 반환).
노스 스타 모델 (Hindsight × Letta)
혼합할 두 가지 요소:- Letta/MemGPT 스타일 제어 루프
- 항상 컨텍스트에 유지되는 작은 “코어” (페르소나 + 핵심 사용자 사실)
- 나머지는 모두 컨텍스트 외부에 있으며 도구를 통해 검색
- 메모리 쓰기는 명시적 도구 호출 (append/replace/insert)로 수행되고, 영속화된 후 다음 턴에 재주입됨
- Hindsight 스타일 메모리 서브스트레이트
- 관측된 것 vs 믿는 것 vs 요약된 것을 분리
- retain/recall/reflect 지원
- 증거에 따라 진화할 수 있는 신뢰도 포함 의견
- 엔티티 인식 검색 + 시간적 질의 (완전한 지식 그래프 없이도)
제안 아키텍처 (Markdown 단일 소스 오브 트루스 + 파생 인덱스)
정본 저장소 (git 친화적)
~/.openclaw/workspace 을 사람이 읽을 수 있는 정본 메모리로 유지합니다.
권장 워크스페이스 레이아웃:
- 일일 로그는 일일 로그로 유지합니다. JSON 으로 바꿀 필요가 없습니다.
bank/파일은 성찰 작업에 의해 생성되는 큐레이션된 결과물이지만, 여전히 수동 편집이 가능합니다.memory.md은 “작고 + 코어에 가까운” 상태를 유지합니다. 즉, Clawd 가 매 세션마다 보기를 원하는 내용입니다.
파생 저장소 (머신 회상)
워크스페이스 하위에 파생 인덱스를 추가합니다 (반드시 git 추적일 필요는 없음):- 사실 + 엔티티 링크 + 의견 메타데이터를 위한 SQLite 스키마
- 어휘 기반 회상을 위한 SQLite FTS5 (빠르고, 작고, 오프라인)
- 시맨틱 회상을 위한 선택적 임베딩 테이블 (여전히 오프라인)
Retain / Recall / Reflect (운영 루프)
Retain: 일일 로그를 “사실”로 정규화
여기서 중요한 Hindsight 의 핵심 통찰: 아주 작은 스니펫이 아니라 서사적이고 자족적인 사실을 저장하라는 점입니다.memory/YYYY-MM-DD.md 을 위한 실용적 규칙:
- 하루가 끝날 때 (또는 중간에), 2–5 개의 불릿으로 구성된
## Retain섹션을 추가:- 서사적임 (턴 간 맥락 유지)
- 자족적임 (나중에 단독으로 읽어도 이해 가능)
- 타입 + 엔티티 언급 태그 포함
- 타입 접두사:
W(world),B(experience/biographical),O(opinion),S(observation/summary; 보통 생성됨) - 엔티티:
@Peter,@warelay등 (슬러그는bank/entities/*.md에 매핑) - 의견 신뢰도:
O(c=0.0..1.0)(선택)
## Retain 섹션을 두는 것이 가장 쉬운 “품질 레버”입니다.
Recall: 파생 인덱스에 대한 질의
Recall 은 다음을 지원해야 합니다:- 어휘 기반: “정확한 용어 / 이름 / 명령 찾기” (FTS5)
- 엔티티 기반: “X 에 대해 알려줘” (엔티티 페이지 + 엔티티 연결 사실)
- 시간 기반: “11월 27일 전후에 무슨 일이 있었지” / “지난주 이후”
- 의견 기반: “Peter 는 무엇을 선호하나?” (신뢰도 + 근거 포함)
kind(world|experience|opinion|observation)timestamp(출처 날짜, 또는 존재할 경우 추출된 시간 범위)entities(["Peter","warelay"])content(서사적 사실)source(memory/2025-11-27.md#L12등)
Reflect: 안정 페이지 생성 + 신념 업데이트
Reflection 은 스케줄된 작업 (일일 또는 하트비트ultrathink)으로, 다음을 수행합니다:
- 최근 사실로부터
bank/entities/*.md업데이트 (엔티티 요약) - 강화/모순에 따라
bank/opinions.md신뢰도 업데이트 - 선택적으로
memory.md(“코어에 가까운” 지속 사실)에 대한 편집 제안
- 각 의견은 다음을 가짐:
- 진술
- 신뢰도
c ∈ [0,1] - last_updated
- 증거 링크 (지지 + 반박 사실 ID)
- 새로운 사실이 도착하면:
- 엔티티 겹침 + 유사도로 후보 의견 탐색 (먼저 FTS, 이후 임베딩)
- 작은 델타로 신뢰도 업데이트; 큰 변화는 강한 모순 + 반복된 증거가 필요
CLI 통합: 독립형 vs 심층 통합
권장 사항: OpenClaw 에 심층 통합, 단 분리 가능한 코어 라이브러리는 유지.왜 OpenClaw 에 통합하는가?
- OpenClaw 는 이미 다음을 알고 있음:
- 워크스페이스 경로 (
agents.defaults.workspace) - 세션 모델 + 하트비트
- 로깅 + 문제 해결 패턴
- 워크스페이스 경로 (
- 에이전트 자체가 도구를 호출하길 원함:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
왜 라이브러리는 분리하는가?
- Gateway/런타임 없이도 메모리 로직을 테스트 가능하게 유지
- 다른 컨텍스트 (로컬 스크립트, 미래의 데스크톱 앱 등)에서 재사용
“S-Collide” / SuCo: 언제 사용할 것인가 (연구)
“S-Collide” 가 SuCo (Subspace Collision) 를 의미한다면, 이는 서브스페이스에서의 학습/구조화된 충돌을 사용해 강한 회상률/지연 시간 트레이드오프를 목표로 하는 ANN 검색 접근법입니다 (논문: arXiv 2411.14754, 2024).~/.openclaw/workspace 을 위한 실용적 관점:
- SuCo 로 시작하지 말 것.
- SQLite FTS + (선택적) 단순 임베딩으로 시작하면 대부분의 UX 이득을 즉시 얻을 수 있음.
- 다음 조건이 충족될 때만 SuCo/HNSW/ScaNN 계열 솔루션을 고려:
- 코퍼스가 큼(수만~수십만 개의 청크)
- 브루트포스 임베딩 검색이 너무 느려짐
- 회상 품질이 어휘 검색에 의해 의미 있게 병목됨
- SQLite FTS5 + 메타데이터 필터 (ML 없음)
- 임베딩 + 무차별 대입(청크 수가 적으면 놀랄 만큼 잘 작동함)
- HNSW 인덱스 (일반적이고 견고함; 라이브러리 바인딩 필요)
- SuCo (연구 등급; 임베드 가능한 견고한 구현이 있다면 매력적)
- 노트북 + 데스크톱 환경에서 “개인 비서 메모리”에 가장 적합한 오프라인 임베딩 모델은 무엇인가?
- 이미 Ollama 가 있다면 로컬 모델로 임베딩; 아니라면 도구체인에 작은 임베딩 모델을 포함.
가장 작은 유용한 파일럿
최소하지만 여전히 유용한 버전을 원한다면:bank/엔티티 페이지와 일일 로그에## Retain섹션을 추가.- 인용 (경로 + 라인 번호)과 함께 SQLite FTS 를 사용한 회상 구현.
- 회상 품질이나 규모가 요구할 때만 임베딩 추가.
참고 자료
- Letta / MemGPT 개념: “core memory blocks” + “archival memory” + 도구 기반 자기 편집 메모리.
- Hindsight Technical Report: “retain / recall / reflect”, 네트워크 4중 메모리, 서사적 사실 추출, 의견 신뢰도 진화.
- SuCo: arXiv 2411.14754 (2024): “Subspace Collision” 근사 최근접 이웃 검색.