작업 공간 메모리 v2 (오프라인): 연구 노트
대상: Clawd 스타일 작업 공간(agents.defaults.workspace, 기본값 ~/.openclaw/workspace). 여기서 "메모리"는 하루 하나의 Markdown 파일(memory/YYYY-MM-DD.md)과 소수의 안정적인 파일(예: memory.md, SOUL.md)로 저장됩니다.
이 문서는 Markdown을 정규적이고 검토 가능한 진실의 원천으로 유지하면서 파생 인덱스를 통해 구조화된 회상(검색, 엔티티 요약, 신뢰도 업데이트)을 추가하는 오프라인 우선 메모리 아키텍처를 제안합니다.
왜 변경해야 하는가?
현재 설정(하루 하나의 파일)은 다음에 뛰어납니다:
- "추가 전용" 저널링
- 사람의 편집
- git 기반 내구성 + 감사 가능성
- 낮은 마찰 캡처("그냥 적어라")
약점:
- 높은 회상 검색("X에 대해 무엇을 결정했는가?", "마지막으로 Y를 시도했을 때?")
- 엔티티 중심 답변("Alice / The Castle / warelay에 대해 알려줘")을 많은 파일을 다시 읽지 않고
- 의견/선호도 안정성(그리고 그것이 변경될 때의 증거)
- 시간 제약("2025년 11월 동안 무엇이 사실이었는가?") 및 충돌 해결
설계 목표
- 오프라인: 네트워크 없이 작동; 노트북/Castle에서 실행 가능; 클라우드 의존성 없음
- 설명 가능: 검색된 항목은 귀속 가능(파일 + 위치)하며 추론과 분리 가능해야 함
- 낮은 의식: 일일 로깅은 Markdown 유지, 무거운 스키마 작업 없음
- 증분: v1은 FTS만으로 유용함; 시맨틱/벡터 및 그래프는 선택적 업그레이드
- 에이전트 친화적: "토큰 예산 내 회상"을 쉽게 만듦(작은 사실 묶음 반환)
북극성 모델 (Hindsight × Letta)
융합할 두 부분:
Letta/MemGPT 스타일 제어 루프
- 항상 컨텍스트에 작은 "core" 유지(페르소나 + 주요 사용자 사실)
- 그 외 모든 것은 컨텍스트 밖에 있으며 도구를 통해 검색
- 메모리 쓰기는 명시적 도구 호출(append/replace/insert), 지속되고 다음 턴에 재주입
Hindsight 스타일 메모리 기반
- 관찰된 것 vs 믿어지는 것 vs 요약된 것을 분리
- retain/recall/reflect 지원
- 증거와 함께 진화할 수 있는 신뢰도를 가진 의견
- 엔티티 인식 검색 + 시간 쿼리(전체 지식 그래프 없이도)
제안된 아키텍처 (Markdown 진실의 원천 + 파생 인덱스)
정규 저장소 (git 친화적)
~/.openclaw/workspace를 정규적이고 사람이 읽을 수 있는 메모리로 유지합니다.
권장 작업 공간 레이아웃:
~/.openclaw/workspace/
memory.md # 작음: 내구성 있는 사실 + 선호도 (core-ish)
memory/
YYYY-MM-DD.md # 일일 로그 (추가; 서사적)
bank/ # "유형화된" 메모리 페이지 (안정적, 검토 가능)
world.md # 세계에 대한 객관적 사실
experience.md # 에이전트가 한 일 (1인칭)
opinions.md # 주관적 선호도/판단 + 신뢰도 + 증거 포인터
entities/
Peter.md
The-Castle.md
warelay.md
...
참고:
- 일일 로그는 일일 로그로 유지. JSON으로 전환할 필요 없음
- bank/ 파일은 큐레이션되고 리플렉션 작업에 의해 생성되며 여전히 수동으로 편집 가능
- memory.md는 "small + core-ish" 유지: 모든 세션에서 Clawd가 보기를 원하는 것
파생 저장소 (기계 회상)
작업 공간 아래에 파생 인덱스 추가(반드시 git 추적되지 않음):
~/.openclaw/workspace/.memory/index.sqlite
지원:
- 사실 + 엔티티 링크 + 의견 메타데이터를 위한 SQLite 스키마
- 어휘 회상을 위한 SQLite FTS5(빠르고 작고 오프라인)
- 시맨틱 회상을 위한 선택적 임베딩 테이블(여전히 오프라인)
인덱스는 항상 Markdown에서 재구축 가능.
Retain / Recall / Reflect (운영 루프)
Retain: 일일 로그를 "사실"로 정규화
여기서 중요한 Hindsight의 핵심 통찰: 서사적이고 자기 완결적인 사실을 저장하고, 작은 스니펫이 아님.
memory/YYYY-MM-DD.md의 실용적 규칙:
- 하루가 끝날 때(또는 도중에), 다음과 같은 2-5개의 글머리 기호가 있는 ## Retain 섹션 추가:
- 서사적(교차 턴 컨텍스트 보존)
- 자기 완결적(나중에 독립적으로 이해됨)
- 유형 + 엔티티 언급으로 태그
예제:
## Retain
- W @Peter: 현재 마라케시(2025년 11월 27일~12월 1일)에 Andy의 생일을 위해 있음.
- B @warelay: connection.update 핸들러를 try/catch로 감싸서 Baileys WS 충돌 수정(memory/2025-11-27.md 참조).
- O(c=0.95) @Peter: WhatsApp에서 간결한 답변(<1500자)을 선호; 긴 콘텐츠는 파일로.
최소 파싱:
- 유형 접두사: W(세계), B(경험/전기), O(의견), S(관찰/요약; 일반적으로 생성됨)
- 엔티티: @Peter, @warelay 등(slug는 bank/entities/*.md에 매핑)
- 의견 신뢰도: O(c=0.0..1.0) 선택 사항
작성자가 생각하지 않기를 원하는 경우: 리플렉트 작업이 로그의 나머지 부분에서 이러한 글머리 기호를 추론할 수 있지만 명시적인 ## Retain 섹션을 갖는 것이 가장 쉬운 "품질 레버"입니다.
Recall: 파생 인덱스에 대한 쿼리
회상은 다음을 지원해야 합니다:
- 어휘: "정확한 용어/이름/명령 찾기"(FTS5)
- 엔티티: "X에 대해 알려줘"(엔티티 페이지 + 엔티티 링크된 사실)
- 시간: "11월 27일경 무슨 일이 있었는가" / "지난 주 이후"
- 의견: "Peter는 무엇을 선호하는가?"(신뢰도 + 증거 포함)
반환 형식은 에이전트 친화적이어야 하며 출처를 인용해야 합니다:
- kind(world|experience|opinion|observation)
- timestamp(소스 날짜 또는 존재하는 경우 추출된 시간 범위)
- entities(["Peter","warelay"])
- content(서사적 사실)
- source(memory/2025-11-27.md#L12 등)
Reflect: 안정적인 페이지 생성 + 신념 업데이트
리플렉션은 예약된 작업(매일 또는 heartbeat ultrathink)으로:
- 최근 사실에서 bank/entities/*.md 업데이트(엔티티 요약)
- 강화/모순에 기반하여 bank/opinions.md 신뢰도 업데이트
- 선택적으로 memory.md("core-ish" 내구성 있는 사실)에 대한 편집 제안
의견 진화(간단하고 설명 가능):
-
각 의견에는 다음이 있음:
- 진술
- 신뢰도 c ∈ [0,1]
- last_updated
- 증거 링크(지지 + 모순되는 사실 ID)
-
새로운 사실이 도착할 때:
- 엔티티 중복 + 유사성으로 후보 의견 찾기(FTS 먼저, 나중에 임베딩)
- 작은 델타로 신뢰도 업데이트; 큰 점프는 강한 모순 + 반복된 증거 필요
CLI 통합: 독립형 vs 깊은 통합
권장 사항: OpenClaw에 깊이 통합하되 분리 가능한 코어 라이브러리 유지.
왜 OpenClaw에 통합하는가?
-
OpenClaw는 이미 다음을 알고 있음:
- 작업 공간 경로(agents.defaults.workspace)
- 세션 모델 + 하트비트
- 로깅 + 문제 해결 패턴
-
에이전트 자체가 도구를 호출하기를 원함:
- openclaw memory recall "…" --k 25 --since 30d
- openclaw memory reflect --since 7d
왜 여전히 라이브러리를 분리하는가?
- gateway/runtime 없이 메모리 로직을 테스트 가능하게 유지
- 다른 컨텍스트에서 재사용(로컬 스크립트, 미래의 데스크톱 앱 등)
형태: 메모리 도구는 작은 CLI + 라이브러리 레이어가 되도록 의도되지만 이것은 탐색적입니다.
"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 개념: "코어 메모리 블록" + "보관 메모리" + 도구 기반 자체 편집 메모리
- Hindsight 기술 보고서: "retain / recall / reflect", 4-네트워크 메모리, 서사적 사실 추출, 의견 신뢰도 진화
- SuCo: arXiv 2411.14754(2024): "Subspace Collision" 근사 최근접 이웃 검색