Workspace Memory v2 (offline): notatki badawcze
Cel: obszar roboczy w stylu Clawd (agents.defaults.workspace, domyślnie ~/.openclaw/workspace), w którym „pamięć” jest przechowywana jako jeden plik Markdown na dzień (memory/YYYY-MM-DD.md) oraz niewielki zestaw plików stabilnych (np. memory.md, SOUL.md).
Ten dokument proponuje architekturę pamięci offline-first, która zachowuje Markdown jako kanoniczne, możliwe do przeglądu źródło prawdy, a jednocześnie dodaje ustrukturyzowane przywoływanie (wyszukiwanie, podsumowania encji, aktualizacje pewności) za pomocą indeksu pochodnego.
Dlaczego zmiana?
Obecna konfiguracja (jeden plik na dzień) świetnie sprawdza się w:- dziennikowaniu „append-only”
- edycji przez człowieka
- trwałość zabezpieczona gitem + możliwość kontroli
- niskim progu zapisu („po prostu to zapisz”)
- wyszukiwaniu o wysokiej kompletności („co ustaliliśmy w sprawie X?”, „kiedy ostatnio próbowaliśmy Y?”)
- odpowiedziach zorientowanych na encje („opowiedz mi o Alice / The Castle / warelay”) bez ponownego czytania wielu plików
- stabilności opinii/preferencji (oraz dowodach, gdy się zmieniają)
- ograniczeniach czasowych („co było prawdą w listopadzie 2025?”) i rozwiązywaniu konfliktów
Cele projektowe
- Offline: działa bez sieci; może działać na laptopie/Castle; brak zależności od chmury.
- Wyjaśnialność: odzyskane elementy powinny mieć atrybucję (plik + lokalizacja) i być oddzielne od wnioskowania.
- Niska ceremonialność: dzienne logowanie pozostaje w Markdown, bez ciężkich schematów.
- Inkrementalność: v1 jest użyteczne już z samym FTS; semantyka/wektory i grafy to opcjonalne rozszerzenia.
- Przyjazność dla agentów: ułatwia „przywoływanie w ramach budżetów tokenów” (zwracanie małych pakietów faktów).
Model północnej gwiazdy (Hindsight × Letta)
Dwa elementy do połączenia:- Pętla kontrolna w stylu Letta/MemGPT
- utrzymuj mały „rdzeń” zawsze w kontekście (persona + kluczowe fakty o użytkowniku)
- cała reszta jest poza kontekstem i pobierana przez narzędzia
- zapisy pamięci są jawnymi wywołaniami narzędzi (append/replace/insert), utrwalane, a następnie ponownie wstrzykiwane w następnej turze
- Podłoże pamięci w stylu Hindsight
- rozdzielenie tego, co zaobserwowane, od tego, w co się wierzy, i od tego, co jest podsumowane
- wsparcie dla retain/recall/reflect
- opinie z nośnikiem pewności, które mogą ewoluować wraz z dowodami
- przywoływanie świadome encji + zapytania temporalne (nawet bez pełnych grafów wiedzy)
Proponowana architektura (Markdown jako źródło prawdy + indeks pochodny)
Sklep kanoniczny (przyjazny dla gita)
Zachowaj~/.openclaw/workspace jako kanoniczną, czytelną dla człowieka pamięć.
Sugerowany układ obszaru roboczego:
- Dzienny log pozostaje dziennym logiem. Nie ma potrzeby zamiany na JSON.
- Pliki
bank/są kuratorowane, tworzone przez zadania refleksji i nadal mogą być edytowane ręcznie. memory.mdpozostaje „małe + rdzeniowe”: rzeczy, które chcesz, aby Clawd widział w każdej sesji.
Sklep pochodny (przywoływanie maszynowe)
Dodaj indeks pochodny pod obszarem roboczym (niekoniecznie śledzony przez git):- schemacie SQLite dla faktów + powiązań encji + metadanych opinii
- SQLite FTS5 do przywoływania leksykalnego (szybkie, małe, offline)
- opcjonalnej tabeli embeddingów do przywoływania semantycznego (również offline)
Retain / Recall / Reflect (pętla operacyjna)
Retain: normalizacja dziennych logów do „faktów”
Kluczowy wgląd Hindsight, który ma tu znaczenie: przechowuj narracyjne, samodzielne fakty, a nie drobne fragmenty. Praktyczna zasada dlamemory/YYYY-MM-DD.md:
- na koniec dnia (lub w trakcie) dodaj sekcję
## Retainz 2–5 punktami, które są:- narracyjne (zachowany kontekst wieloturnowy)
- samodzielne (mają sens później w oderwaniu)
- oznaczone typem + wzmiankami o encjach
- Prefiks typu:
W(świat),B(doświadczenie/biograficzne),O(opinia),S(obserwacja/podsumowanie; zwykle generowane) - Encje:
@Peter,@warelayitd. (slug mapuje dobank/entities/*.md) - Pewność opinii:
O(c=0.0..1.0)opcjonalnie
## Retain jest najprostszą „dźwignią jakości”.
Recall: zapytania nad indeksem pochodnym
Przywoływanie powinno wspierać:- leksykalne: „znajdź dokładne terminy / nazwy / polecenia” (FTS5)
- encje: „opowiedz mi o X” (strony encji + fakty powiązane z encjami)
- temporalne: „co wydarzyło się około 27 listopada” / „od zeszłego tygodnia”
- opinie: „co preferuje Peter?” (z pewnością + dowodami)
kind(world|experience|opinion|observation)timestamp(dzień źródłowy lub wyekstrahowany zakres czasu, jeśli obecny)entities(["Peter","warelay"])content(fakt narracyjny)source(memory/2025-11-27.md#L12itd.)
Reflect: tworzenie stabilnych stron + aktualizacja przekonań
Refleksja to zaplanowane zadanie (codziennie lub heartbeatultrathink), które:
- aktualizuje
bank/entities/*.mdna podstawie ostatnich faktów (podsumowania encji) - aktualizuje pewność
bank/opinions.mdna podstawie wzmocnień/sprzeczności - opcjonalnie proponuje edycje
memory.md(„rdzeniowe” trwałe fakty)
- każda opinia ma:
- stwierdzenie
- pewność
c ∈ [0,1] - last_updated
- linki do dowodów (wspierające + sprzeczne identyfikatory faktów)
- gdy pojawiają się nowe fakty:
- znajdź kandydackie opinie według nakładania encji + podobieństwa (najpierw FTS, później embeddingi)
- aktualizuj pewność małymi deltami; duże skoki wymagają silnej sprzeczności + powtarzalnych dowodów
Integracja CLI: samodzielna vs głęboka integracja
Rekomendacja: głęboka integracja z OpenClaw, przy jednoczesnym zachowaniu wydzielonej biblioteki rdzeniowej.Dlaczego integrować z OpenClaw?
- OpenClaw już zna:
- ścieżkę obszaru roboczego (
agents.defaults.workspace) - model sesji + heartbeat
- wzorce logowania i rozwiązywania problemów
- ścieżkę obszaru roboczego (
- Chcesz, aby sam agent wywoływał narzędzia:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
Dlaczego mimo to wydzielić bibliotekę?
- utrzymać logikę pamięci testowalną bez gateway/runtime
- ponowne użycie w innych kontekstach (skrypty lokalne, przyszła aplikacja desktopowa itd.)
„S-Collide” / SuCo: kiedy używać (badania)
Jeśli „S-Collide” odnosi się do SuCo (Subspace Collision): jest to podejście do wyszukiwania ANN, które celuje w korzystne kompromisy między kompletnością a opóźnieniami, wykorzystując wyuczone/ustrukturyzowane kolizje w podprzestrzeniach (artykuł: arXiv 2411.14754, 2024). Pragmatyczne podejście dla~/.openclaw/workspace:
- nie zaczynaj od SuCo.
- zacznij od SQLite FTS + (opcjonalnie) prostych embeddingów; natychmiast uzyskasz większość korzyści UX.
- rozważ rozwiązania klasy SuCo/HNSW/ScaNN dopiero wtedy, gdy:
- korpus jest duży (dziesiątki/setki tysięcy fragmentów)
- brutalne przeszukiwanie embeddingów staje się zbyt wolne
- jakość przywoływania jest realnie ograniczana przez wyszukiwanie leksykalne
- SQLite FTS5 + filtry metadanych (zero ML)
- Embeddingi + brute force (działa zaskakująco daleko przy małej liczbie fragmentów)
- Indeks HNSW (powszechny, solidny; wymaga powiązania biblioteki)
- SuCo (badawczy; atrakcyjny, jeśli istnieje solidna implementacja możliwa do osadzenia)
- jaki jest najlepszy model embeddingów offline dla „pamięci osobistego asystenta” na Twoich maszynach (laptop + desktop)?
- jeśli masz już Ollama: twórz embeddingi lokalnym modelem; w przeciwnym razie dołącz mały model embeddingów do toolchainu.
Najmniejszy użyteczny pilot
Jeśli chcesz minimalną, a nadal użyteczną wersję:- Dodaj strony encji
bank/oraz sekcję## Retainw dziennych logach. - Użyj SQLite FTS do przywoływania z cytowaniami (ścieżka + numery linii).
- Dodaj embeddingi tylko wtedy, gdy jakość przywoływania lub skala tego wymagają.
Odniesienia
- Koncepcje Letta / MemGPT: „core memory blocks” + „archival memory” + pamięć samoredagująca sterowana narzędziami.
- Raport techniczny Hindsight: „retain / recall / reflect”, pamięć czterosieciowa, ekstrakcja faktów narracyjnych, ewolucja pewności opinii.
- SuCo: arXiv 2411.14754 (2024): „Subspace Collision” – przybliżone wyszukiwanie najbliższych sąsiadów.