← 글

저장한 뒤——나는 어떻게 기억에 잊는 법을 가르쳤을까

· 30 분 읽기
memvault · Background Track

저장한 뒤——나는 어떻게 기억에 잊는 법을 가르쳤을까

매일 새벽 4시의 꿈 루프, 지식 점검, 관심사 프로필. 금고에 넣는 것만으로는 부족합니다. 오래된 것을 잊을 줄 알아야 건강해집니다.

사람이 잊는 법을 배울 수 있다는 것은 하늘이 준 선물입니다. 잡음 하나하나, 오래된 정보 하나하나가 현실 세계를 보는 우리의 인식을 왜곡합니다. 사실이라고 여기는 것마다 유효기간이 있고, 뒤따르는 증거에 뒤집힐 수 있습니다. 그러니 붙들고 있지 마세요.

—— Background Track을 설계하는 동안 늘 책상 위에 두었던 말

지난 글에서는 Write Track을 살펴봤습니다——세 개의 gate와 이중 트랙 쓰기로 대화를 금고에 넣는 과정입니다. 이 글은 그다음 이야기입니다. 저장한 뒤에도 누군가(또는 어떤 pipeline)가 정리하고 솎아내야 합니다. Background Track이 그 일을 백그라운드에서 맡으며, 전면의 Write와 Read는 건드리지 않습니다.

‘꿈꾸기’라는 이름은 제가 만든 게 아닙니다. 2026년 3월 말 Claude Code의 sourcemap이 실수로 유출됐는데, 그 안에 아직 공개되지 않은 feature가 있었습니다. 이름은 Auto Dream입니다——백그라운드에서 기억을 정리하는 하위 에이전트로, ‘마지막 실행 후 24시간 초과, 누적 session 5개 이상’일 때 실행됩니다. 이 조건이 제가 원래 구상한 설계와 거의 겹쳐서 이름을 빌려왔습니다. 신경과학에 빗댄 설명도 같습니다. 사람이 잠들면 뇌는 낮의 기억을 압축하고 재구성하며 선택적으로 잊습니다.

먼저 초기 구상을 말씀드리겠습니다

지금 이 트랙은 꿈 루프, 지식 점검, 관심사 프로필, 그리고 여러 작은 백그라운드 작업의 네 부분으로 돌아갑니다.

출발점은 꽤 투박한 규칙 스크립트였습니다——첫 버전은 매일 한 번 정리 job을 돌려 중복되거나 망가진 것을 처리했습니다. 그런데 둘째 주에 벽에 부딪혔습니다. ‘오래됨’은 규칙만으로 판단할 수 없었습니다. 맥락을 읽는 LLM 성찰 층을 더하고서야 해결됐습니다.

매일 4AM cron trigger 이중 게이트 검사 >24h AND >=5 sessions 조건 미충족 → 건너뛰기 다섯 단계 순차 실행(Dream Loop) 파악 오늘 처리할 양 파악 신호 모순 검사 + 중심 찾기 성찰 LLM이 스냅샷 읽기 통합 병합 / 대체 가지치기 고아 / 오래된 항목 정리 5개 신호의 가중치 판사가 새것과 옛것 판정 개인화 + 채점 오래된 사진을 흑백으로 더 가벼운 기억 drift 억제 능동적 탐색 — 다리 / 빈틈 찾기 정리만 하는 게 아니라 뜻밖의 연결도 능동적으로 찾아냅니다 매일 일기 쓰기 + 책장의 빈자리 표시 관심사 보고서 자동 생성 · 반복해서 찾지 못한 항목 표시 잘못되거나 중복되거나 오래된 것은 서서히 물러나고 맥락은 남습니다 LLM 성찰 층은 가장 늦게 추가했습니다——규칙 층으로는 ‘오래됨’을 걸러낼 수 없었습니다

1. 꿈 루프 — 다섯 단계

꿈 루프는 다섯 단계를 차례로 실행해 모순되거나 오래된 기억을 걸러냅니다.

  1. 파악(Orient)——오늘 새로 쌓인 것이 얼마나 되는지, 마지막으로 꿈꾼 때가 언제인지 살핍니다
  2. 신호(Signal)——모순을 검사하고 그래프의 중심 노드를 찾습니다
  3. 성찰(Reflect)——LLM이 통계 스냅샷을 읽고 통찰과 지식의 빈틈을 짚어냅니다
  4. 통합(Consolidate)——실제로 병합하고 대체하며 형식을 정규화합니다
  5. 가지치기(Prune)——고아 노드를 정리하고 오래된 기억을 처리합니다

꿈 루프가 함께 처리하는 일: 시간상 충돌의 중재

꿈에서 가장 자주 다루는 상황 중 하나는 이렇습니다——같은 일에 대해 석 달 전에는 이렇게 말하고 지난주에는 다르게 말했습니다. 어느 쪽이 유효할까요?

시스템은 스스로 한쪽 편을 들지 않습니다. 판사가 유언장을 심리하듯, 새 진술과 옛 진술을 각각의 타임스탬프와 함께 펼쳐놓고 판정자(즉, 더 똑똑한 두뇌)에게 다음 세 결과 중 하나를 고르게 합니다.

  • 병합——사실 두 진술이 같은 일을 다른 각도에서 말한 것이라 하나로 합칩니다
  • 대체——새 진술이 옛 진술을 덮고, 옛 진술은 타임스탬프와 함께 주석으로 남깁니다
  • 공존——실은 서로 다른 두 일이라 각각 유지합니다

판단이 어려우면 더 똑똑한 판정자에게 넘깁니다. 조금 느려지거나 외부 도움을 받더라도 잘못된 버전을 사실로 굳혀 쓰지 않는 편이 낫습니다. 판정 후 각 사실에는 ‘언제부터 유효하고 언제 폐기됐는지’를 나타내는 두 타임스탬프가 붙어, 다음에 떠올릴 때 옛 버전을 현재 상황으로 착각하지 않게 됩니다.

이중 게이트는 꿈 루프의 실행 조건입니다——마지막 꿈 이후 24시간이 넘고 session이 5개 이상 쌓여야 실행됩니다. 둘 중 하나라도 충족하지 못하면 건너뜁니다. 기억이 채 가라앉기도 전에 정리하면 잡음을 신호로 오인할 뿐입니다.

2026년 3월 유출된 Claude Code Auto Dream과 비교해 보겠습니다. 그쪽은 네 단계(Orient → Gather → Consolidate → Prune)입니다. 저는 Gather와 Consolidate 사이에 Reflect를 넣어 LLM이 통계 스냅샷을 읽고 통찰과 지식의 빈틈을 찾아내게 했습니다. 또 다른 차이는 그쪽의 꿈꾸는 하위 에이전트는 읽기 전용이라 살펴보기만 하고 변경하지 않지만, memvault는 실제 데이터를 바꾸며 세 단계 확인 절차를 제동장치로 쓴다는 점입니다.

2. 지식 점검 — 점점 깊어지는 네 층

그래프에는 늘 망가지는 것이 있습니다——고아 노드, 존재하지 않는 엔터티를 가리키는 관계, 서로 모순되는 트리플입니다. 지식 점검은 이런 문제를 찾아내며, 저렴한 검사부터 비싼 검사까지 네 층으로 차례차례 진행합니다.

  1. 그래프 구조——고아, 순환, 형식 문제. 규칙 층에서 걸러낼 수 있습니다
  2. Ground Truth——canonical 정의로 값의 범위가 유효한지 검사합니다
  3. LLM 판단——앞의 두 층이 잡지 못하는 ‘의미상 모순이지만 구조상 유효한’ 경우 등입니다
  4. 세 단계 확인 절차——영향이 큰 변경은 먼저 표시하고 재검토한 뒤에야 실행합니다. 곧바로 mutate하지 않습니다

마지막 층은 몇 번 문제가 생긴 뒤 추가했습니다. LLM의 한 번뿐인 판단에는 hallucination이 생길 수 있어 곧바로 처리하면 멀쩡한 것까지 지워버릴 수 있습니다.

함께 개선한 점: 연결선은 ‘같이 등장했는가’만 보지 않습니다

원래는 두 개념이 같은 대화에 한 번이라도 나오면 시스템이 둘 사이에 선을 그었습니다. 나중에 보니 너무 성급한 연결이었습니다——같은 회의에서 언급됐을 뿐 서로 관계없는 두 용어가 억지로 묶였습니다.

그래서 두 사람이 정말 친한지 판단하듯 바꿨습니다. 한 번 같이 나온 것만으로는 부족하고 다섯 가지를 함께 봅니다.

  • 함께 등장한 횟수——몇 번 함께 나왔는지
  • 같은 시기의 겹침——같은 기간에 자주 등장하는지
  • 공통 친구의 수——둘이 연결된 다른 지점이 얼마나 겹치는지
  • 유형의 궁합——사람과 장소의 관계 강도를 사람과 사람의 관계와 같은 잣대로 볼 수는 없습니다
  • 의미의 유사성——가리키는 내용이 의미상 가까운지

다섯 가지에 각각 가중치를 주고 합산해 점수를 냅니다. 점수가 충분하면 연결하고, 부족하면 보류합니다. 이렇게 연결된 선의 품질은 이전보다 훨씬 깨끗해졌습니다——간선 가중치를 개선한 뒤 가장 확실히 체감한 차이입니다.

그래프는 사실뿐 아니라 선호와 숙련도도 기록합니다

사실 층으로는 ‘무엇을 했는가’만 답할 수 있습니다. 하지만 일상에서 한 말에는 ‘어떤 스타일을 좋아하는가’, ‘그 일을 얼마나 잘하는가’도 자주 담깁니다. 원래는 이 두 가지를 분류 없이 노트에 넣었지만, 나중에 각각 별도 층으로 분리했습니다.

선호 층은 글쓰기 스타일, 기술 선택, 설계 원칙, 일하는 속도, 미적 취향 등 열 가지로 나뉩니다. 각 범주에는 버전 체인이 있어 옛 버전은 삭제하지 않고 가중치만 낮춥니다. 오래도록 뒷받침하는 증거가 없으면 저절로 희미해집니다. 오늘 ‘저는 간결한 게 더 좋아요’라고 말한 뒤 석 달 동안 다시 언급하지 않으면 그 선호의 신뢰도가 자동으로 감소해 미래의 판단을 영원히 붙잡지 않습니다.

숙련도 층은 역할 놀이 게임의 레벨표에 더 가깝습니다. 1단계는 기초, 2단계는 숙련, 3단계는 창작입니다. 어떤 기술을 실제로 쓸 때마다 레벨이 서서히 오르고, 오래 연습하지 않으면 서서히 내려갑니다. 덕분에 무엇을 ‘들어봤는지’, ‘해봤는지’, ‘다른 사람에게 가르칠 수 있는지’를 구별합니다.

정리만 하지 않고 능동적으로 탐색합니다

점검의 본업은 정리지만 같은 그래프를 오래 보다 보면 다른 것도 보입니다. 자신도 몰랐던 흥미로운 연결입니다. 예를 들어 겉보기에는 관계없는 두 분야를 계속 이야기하지만 그래프에는 둘을 잇는 구불구불한 길이 있을 수 있습니다——아직 떠올리지 못했을 뿐입니다.

탐색은 세 종류의 놀라움을 찾아냅니다.

  • 집단 사이의 연결——서로 교류한 적 없는 두 집단 사이에 새 통로가 생깁니다
  • 멀리 있는 강한 연결——겉으로는 관계없어 보여도 두 번 돌아가면 단단히 이어집니다
  • 자신도 몰랐던 빈자리——어떤 집단에 있어야 할 핵심 지점이 아직 채워지지 않았습니다

찾아내도 곧바로 행동하지는 않습니다. ‘이건 보고 싶을지도 몰라요’라는 작은 우편함에 넣어두고, 언젠가 스스로 열어볼 때 보여줍니다. 일상 대화의 흐름을 방해하지 않습니다.

애매한 것은 선생님에게 돌려보냅니다

점검하다 판단이 어려운 것은 자동으로 보류합니다. 시험 답안을 채점하는 조교처럼 대부분은 스스로 채점할 수 있지만, 확신 점수가 너무 낮거나 새것과 옛것 모두 일리가 있거나 영향 범위가 너무 클 때는 반드시 책임자에게 넘깁니다.

대부분의 간단한 문제는 조교가 정해진 답대로 채점해 통과시킵니다. 정말 확신할 수 없는 것만 작은 검토 구역으로 갑니다. 시간이 날 때 ‘맞음’ 또는 ‘틀림’을 누르면 시스템이 그 판정을 배우고 다음번 비슷한 상황에서는 조교가 직접 처리합니다.

이 방식의 장점은 자동화가 빠르게 돌아가면서도 너무 빨라서 좋은 것까지 잘못 지우지 않는다는 점입니다. 차츰 자라나는 판단력은 한 번 정해 고정한 규칙보다 오래갑니다.

3. 관심사 프로필 — 7 / 30 / 90일

관심사 프로필은 지식 점검과 다른 일을 합니다——무엇에 관심이 있고 무엇에 대한 관심이 식어가는지 최근 일주일, 한 달, 석 달의 시간 창을 겹쳐 살핍니다.

매일 일기 한 페이지를 자동으로 씁니다

매일 새벽 시스템은 ‘오늘의 당신’에 관한 일기 한 페이지를 씁니다. 오늘 가장 많이 생각한 몇 가지 일, 자주 언급된 사람과 사물, 어제보다 뜨거워진 것과 식은 것을 기록합니다. 직접 쓸 필요는 없습니다.

이 일기는 지금 보는 당신보다 미래의 당신을 위한 것입니다. 반년 뒤 ‘그때 나는 뭘 하고 있었지?’가 궁금하다면 모든 대화를 뒤지는 것보다 이 한 페이지를 보는 편이 훨씬 쉽습니다. 지식 점검의 비교 기준으로도 쓰여 스스로 중요하게 여긴다고 생각했지만 실제로는 한 달간 언급하지 않은 것이 드러납니다.

쓸모가 있을 줄 몰랐던 기능도 하나 있습니다.지식의 빈틈 감지——시스템이 ‘A는 자주 이야기하지만 관련된 B는 한 번도 이야기하지 않았다’는 점을 알아채고 먼저 알려줍니다. ‘이걸 좋아할지도 몰라요’가 아니라 ‘한 조각을 놓친 것 같아요’에 가깝습니다.

또 다른 빈틈: 책장의 같은 칸이 늘 비어 있습니다

다른 종류의 빈틈은 모습이 조금 다릅니다——같은 것을 반복해서 묻는데 시스템이 매번 답을 찾지 못합니다. 책을 찾으러 책장의 같은 칸에 가지만 그 칸이 늘 비어 있는 것과 같습니다. 한두 번은 우연일 수 있지만 세 번 쌓이면 시스템이 ‘여기에 필요한 것이 없어요’라고 표시합니다.

표시해도 답을 자동으로 채우지는 않습니다. 다음에 다시 찾을 때 ‘아, 전에 이 칸이 비어 있었지. 먼저 채울 자료를 찾아볼까?’라고 알 수 있게 합니다. 시간이 지나면 같은 질문을 되풀이하면서도 답을 얻지 못했다는 사실이 드러납니다. 이 신호는 답 자체보다 유용합니다——어디를 능동적으로 보완해야 하는지 알려주기 때문입니다.

4. 백그라운드에서 조용히 돌아가는 다른 작은 작업

백그라운드에는 느린 사고 미리 가져오기와 기억의 온도별 분류를 포함해 다섯 가지 작은 작업도 돌아갑니다.

  • 느린 사고——백그라운드에서 다음 질문을 예측해 미리 검색하고 결과를 캐시에 넣습니다
  • 열·온·냉·동결 분류——자주 불러오는 것은 전문을 남기고, 식은 것은 요약으로 압축하며, 동결된 것은 summary만 남깁니다(법적 추적을 위해 보존)
  • 형식 정규화——encoding, 공백, 잘림을 처리합니다(통합 단계에서 함께 수행)
  • 낮은 확신도 검토——확신도가 일정 기준보다 낮은 기억은 자동으로 사람의 재검토 대기열에 들어갑니다
  • 폐회로 피드백——좋아요, 클릭, 사후 판정(맞음/틀림)을 기억의 가중치에 다시 반영합니다

등급 하향 압축: 오래된 사진을 흑백 썸네일로 만들어 창고에 넣기

기억은 그냥 방치하지 않고 열·온·냉·동결의 네 온도 층으로 나눕니다. 최근 자주 불러온 것은 전문을 남기고, 식은 것은 약 사백 자의 요약으로 압축합니다. 동결된 것은 법적 또는 규정 준수상 추적을 위해 아주 짧은 제목식 요약만 남깁니다.

핵심은 압축이 단방향이라는 점입니다. 열에서 동결로 내려갈 때는 압축하지만 동결에서 열로 올라올 때 자동으로 복원하지는 않습니다——오래된 사진을 흑백 썸네일로 만들어 창고에 넣었다고 나중에 꺼낼 때 저절로 색이 돌아오지는 않는 것과 같습니다. 이유는 간단합니다. 다시 펼친다면 오늘의 상상으로 과거의 세부 사항을 채우는 것뿐입니다. 그건 기억이 아니라 창작입니다. 엄밀하려면 차라리 ‘기억나지 않습니다’라고 인정하는 편이 낫습니다.

왜 ‘잊을 줄 아는 것’이 ‘기억하는 것’보다 중요한가

저장만 하고 잊지 않는 시스템에는 시간이 갈수록 같은 일에 대한 답이 여러 버전으로 쌓입니다. 각각은 어느 시점의 사실이지만 합쳐놓으면 왜곡됩니다.

Write Track은 ‘맞는 것을 받아들이는 일’을, Background Track은 ‘틀린 것을 물러나게 하는 일’을 맡습니다. 둘이 함께해야 시스템이 혼란에 빠지지 않습니다.

이 트랙은 이 정도면 거의 정리됐다고 생각합니다. 다음 글에서는 Read Track을 다룹니다——기억을 어떻게 다시 불러오는지에 관한 이야기입니다. memvault에서 가장 복잡한 부분으로, scoring만 해도 열한 층입니다.

초기 구상

Background Track(백그라운드 트랙)은 현재 Dream Loop(꿈 루프), Knowledge Lint(지식 점검), Interest Profile(관심사 프로필)의 세 주요 흐름과 여러 잡무성 백그라운드 작업으로 돌아갑니다.

첫 버전은 순수 규칙 기반 정리 스크립트로 매일 cron(스케줄러)이 한 번 실행했습니다. 진행하면서 규칙 층으로는 ‘오래됨’과 ‘모순’을 판정할 수 없다는 것을 알게 되어 LLM(대규모 언어 모델) 성찰 층을 추가했습니다. 운영에 적용하기 전에 먼저 dry-run(시험 실행)으로 로그 품질을 확인하고 안정적일 때 실제 쓰기를 켰습니다.

매일 4AM Cronicle 스케줄링 Dual-Gate >24h AND sessions_since >= 5 조건 미충족 시 건너뛰기 Dream Loop · 다섯 단계 통합 Orient 변화량 통계 Signal 모순 검사 + PPR Reflect LLM이 맥락 읽기 Consolidate 충돌 해결 + 정규화 Prune 고아 + 오래된 항목 5-signal edges temporal verdict attitude · review tier_digest 통합 완료 drift 억제 SurpriseDiscovery (parallel) cross-community · indirect-strong · knowledge-gap DailySnapshot · KnowledgeGapDetector SQL aggregation top-N · verdict=INCORRECT ≥ 2 resolve_conflict()는 두 번 실행합니다: Dedup 쓰기 시 + Consolidate 일괄 처리 시 규칙 층은 staleness를 판단할 수 없어 Reflect에서 LLM이 맥락을 읽어 보완합니다

1. Dream Loop(꿈 루프)의 다섯 단계

Dream Loop(꿈 루프)는 dream.py 에서 다섯 단계를 차례로 실행해 모순되거나 오래된 기억을 걸러냅니다.

  1. _orient() ——이번 session의 변화량 통계를 내고 Redis에 있는 것을 읽습니다 last_dream_at
  2. _gather_signal() ——모순 검사와 PPR(Personalized PageRank) 중심성 감지
  3. _reflect() ——LLM이 통계 스냅샷을 읽고 통찰과 지식의 빈틈을 만들어냅니다
  4. _consolidate() ——일괄 resolve_conflict(), 일괄 중복 제거, 내용 정규화
  5. _prune_and_report() ——고아 노드 정리, 오래된 항목 정리

Temporal Conflict Resolution(시간상 충돌 중재)

꿈속의 판사——같은 subject에 새 진술과 옛 진술이 충돌하면 LLM의 세 갈래 판정으로 수렴 방법을 결정합니다.

  • 경로:memvault.kg.temporal_conflict.resolve(), _consolidate() 에서 일괄 호출합니다
  • 입력 prompt에는 시제를 포함한:valid_at / invalid_at 와 source session을 함께 전달해 LLM이 오늘의 관점으로 옛 사실을 잘못 판단하지 않도록 합니다
  • 세 갈래 판정:MERGE(의미상 병합 가능) / SUPERSEDE(새 사실이 덮어쓰고 옛 항목은 등급을 낮춰 보존) / COEXIST(서로 충돌하지 않음)
  • 낮은 확신도 시 상향 판정:confidence < threshold 이면 자동으로 RLM(Reasoning Language Model)에 넘겨 다시 판정합니다
verdict = await resolve(old_triple, new_triple, ctx)
match verdict.action:
    case "MERGE":     merge_triples(old, new)
    case "SUPERSEDE": old.invalid_at = new.valid_at
    case "COEXIST":   keep_both(old, new)

Dual-Gate(이중 게이트) 조건:(now - last_dream_at) > 24h AND sessions_since >= 5. 충족하지 못하면 바로 건너뜁니다——기억이 아직 가라앉지 않았을 때 실행하면 잡음을 신호로 처리하게 됩니다.

2026년 3월 유출된 Claude Code Auto Dream(자동 꿈꾸기) 구조와 비교해 보겠습니다. 그쪽은 네 단계(Orient 파악 → Gather 수집 → Consolidate 통합 → Prune 가지치기)로 진행합니다. memvault는 Gather와 Consolidate 사이에 Reflect(성찰)를 넣어 LLM이 스냅샷을 읽고 통찰과 지식의 빈틈을 찾아내게 했습니다. 권한 모델도 다릅니다. Claude Code의 dream subagent(꿈꾸는 하위 에이전트)는 read-only(읽기 전용) bash인 반면, memvault는 데이터를 직접 mutate(변경)하므로 세 단계 확인 절차를 safety gate(안전 게이트)로 씁니다.

2. Knowledge Lint(지식 점검)의 네 층

저렴한 검사를 먼저 하고 비싼 검사는 마지막에 둡니다——Knowledge Lint(지식 점검)의 네 층은 그 순서로 배치했습니다.

  1. 그래프 구조 층——고아 노드, 순환, 형식이 망가진 트리플(순수 규칙으로 판정 가능)
  2. Grounding(근거 확인) 층——canonical(표준화) 정의로 술어의 값 범위가 유효한지 확인합니다
  3. LLM 층——구조상 유효하지만 의미상 모순되는 미묘한 문제는 규칙으로 잡을 수 없습니다
  4. 세 단계 확인——영향이 큰 변경은 ‘표시 → 재검토 → 제출’ 단계를 거치고 곧바로 수정하지 않습니다

volatile predicate(변동성이 큰 술어) 감지와 고아 엔터티 정리도 이 층에서 합니다. 세 단계 확인은 몇 차례 오판을 겪은 뒤 추가했습니다——LLM의 한 번뿐인 판단은 충분히 안정적이지 않으므로 위험한 작업에는 사람의 검토 게이트가 필요합니다.

Multi-Signal Edges(다중 신호 간선 가중치)

‘함께 등장했는가’만 보지 않습니다——한 번의 동시 출현만으로 연결하면 가짜 간선이 가득 차므로 다섯 신호를 composite_weight로 결합합니다.

  • 경로:memvault.kg.edge_ops(build_edge() + compute_composite())
  • 5 signals:
    • co_occurrence — 동시 출현 빈도(log-scaled)
    • session_overlap — session 집합에 대한 Jaccard
    • adamic_adar — 공통 이웃의 역로그 차수 가중치(Adamic-Adar index)
    • type_affinity — 출발 / 도착 entity_type의 prior matrix
    • semantic_similarity — embedding cosine
  • composite: weighted sum이며, 하위 단계의 Leiden 군집화가 이 열을 edge weight로 직접 읽습니다
w_edge = (0.25 * co_occ_log
        + 0.20 * session_jaccard
        + 0.20 * adamic_adar_norm
        + 0.15 * type_affinity
        + 0.20 * semantic_cosine)

Attitude Layer + Skill Proficiency(개인화 층)

그래프는 facts뿐 아니라 preferences와 mastery도 기록합니다——두 층을 generic entity table에서 분리해 독립적으로 모델링했습니다.

  • Attitude Layer: 10가지 태도(writing_style / tech_choice / design_principle / pace / aesthetic ...). 각 attitude에는 version_chain가 있고, 옛 버전은 superseded_at 로 표시할 뿐 강제로 삭제하지 않습니다
  • Confidence decay: 새 증거로 뒷받침되지 않은 것은confidence *= exp(-λ * Δt)하여 영원히 판단을 좌우하지 않게 합니다
  • Skill Proficiency: L1(exposure) → L2(competent) → L3(generative). 매번 record_skill_use() 경험치를 부여하며 반감기 방식으로 감소합니다
  • 분리한 이유: preference와 fact는 충돌 해결 규칙이 다릅니다(preference는 과거 버전의 공존을 허용하고 fact는 SUPERSEDE를 따릅니다)
attitude.upsert(
    category="tech_choice",
    statement="prefer modular monolith",
    confidence=0.85,
    evidence=[session_id_1, session_id_2],
)
skill.record_use("rust_async_runtime", proficiency=L2, evidence=session_id)

Surprise Discovery(뜻밖의 연결 탐색)

점검하면서 함께 하는 반대 방향의 일입니다——정리뿐 아니라 그래프 속 드러나지 않은 연결을 능동적으로 탐색합니다.

  • 경로:memvault.discovery.surprise_ops, dream loop의 _signal() 단계에서 실행됩니다
  • 세 종류의 발견:
    • cross_community — Leiden이 나눈 서로 다른 커뮤니티 사이에 새로 생긴 bridge edge
    • indirect_strong — 2-hop 경로의 점수는 높지만 direct edge가 없음(PPR로 감지)
    • knowledge_gap — 구조상 있어야 할 이웃 entity가 빠짐
  • 실행 조건: Leiden weighted 군집화 후 커뮤니티를 가로지르는 새 간선의 composite weight가 동적 임계값을 넘을 때만 대기열에 넣습니다
  • 먼저 알리지 않음: 기록해 두고 discovery_inbox, 전면의 Read Track이 idle 상태일 때 가져와 주 대화를 방해하지 않게 합니다

Review Queue(사람의 재검토 fallback)

조교의 채점 방식입니다——위험이 낮은 대다수는 자동 approve하고, 애매하거나 영향이 큰 항목은 검토 대기열에 넣어 사람이 최종 결정합니다.

  • 경로:memvault.review_ops, Knowledge Lint와 Conflict Resolver에 연결됩니다
  • auto-approve rules:confidence > 0.8 이고 impact_score < threshold 이면 곧바로 통과합니다
  • 대기열에 넣는 조건: 낮은 확신도, conflicting verdict, batch size > N, 또는 Attitude / Skill 같은 민감도가 높은 층에 영향을 주는 경우
  • human-in-loop fallback: 대기열 항목이 기한 내 처리되지 않으면 SUPERSEDE를 PENDING으로 되돌립니다. 조용히 적용하지 않습니다
  • 학습 피드백: 사람의 판정 결과를 auto-approve의 impact_score 보정에 다시 반영합니다

3. Interest Profile(관심사 프로필) 7 / 30 / 90일

Interest Profile(관심사 프로필)과 Knowledge Lint는 서로 다른 것을 살핍니다——여기서는 7일, 30일, 90일의 세 층으로 굴러가는 관심의 시간 창에 지식의 빈틈 감지와 일일 스냅샷을 더합니다.

Daily Snapshot(일일 관심사 보고서)

매일 일기 한 페이지를 자동으로 씁니다——SQL로 그날의 프로필 테이블을 집계해 쿼리할 때마다 7/30/90 창을 다시 계산하지 않아도 됩니다.

  • 경로:memvault.profile.daily_snapshot, dream loop의 _orient() 이후 기록 위치는
  • 필드:top_intents(빈도 기준 top-N),top_entities(PPR 중심성 기준 top-N),delta_vs_yesterday(등장 / 사라진 entity의 집합)
  • 용도: Read Track이 recall할 때 이 테이블을 바로 join해 fresh-bias를 빠르게 적용합니다. 장기적으로는 Knowledge Lint가 ‘스스로 중요하게 여긴다고 말한 것과 실제로 관심을 기울인 것’을 비교할 때 쓸 수 있습니다
  • 보존 기간: snapshot은 dream loop가 prune하지 않습니다. 읽기와 쓰기가 분리돼 있으며 보존 기간은 Block과 다른 생명 주기를 따릅니다
SELECT intent_label, COUNT(*) AS freq
FROM memvault.recall_log
WHERE created_at::date = CURRENT_DATE
GROUP BY intent_label
ORDER BY freq DESC LIMIT 10;

지식의 빈틈 감지는 협업 필터링이 아닙니다. 그래프 구조에서 ‘이웃 노드 접근의 불균형’을 보는 방식입니다——어떤 집단의 A 노드는 자주 이야기하지만 연결된 B 노드는 전혀 다루지 않았다면 시스템이 ‘한 조각을 놓친 것 같아요’라고 표시합니다.

Knowledge Gap Detection(지식의 빈틈 감지)

또 다른 빈틈 감지 경로가 있습니다——책장의 같은 칸이 늘 비어 있는 경우, 즉 사용자가 반복해서 조회하지만 recall에 실패하는 query입니다.

  • 실행 조건: 같은 intent / 같은 entity에 대한 recall에서verdict = INCORRECT 누적 failures ≥ 2(CRAG 판정 신호)
  • 표시: knowledge_gap 테이블에 기록하며, 필드에는 query_signature,fail_count,last_fail_at
  • 자동으로 채우지 않음: 시스템은 환각으로 내용을 만들어 빈칸을 채우지 않습니다. 다음 recall에서 전면에 ‘이 질문은 과거에도 실패했으니 자료 보강을 권장합니다’라고 알려줄 뿐입니다
  • 구조적 빈틈과의 차이: 앞 문단의 이웃 노드 접근 불균형은 그래프 토폴로지에서, 이 빈틈은 recall 실패 log에서 옵니다. 두 방식은 서로 보완합니다

4. 그 밖의 백그라운드 잡무

Background에는 다섯 개의 작은 구성 요소도 돌아갑니다. 여기에는 SlowThinker 미리 가져오기와 TierDigest 온도별 분류가 포함됩니다:

  • SlowThinker(느린 사고)——VoiceAgentRAG(음성 에이전트 RAG, Salesforce AI Research)에서 영감을 받은 다섯 단계 예측형 미리 가져오기 파이프라인
  • ContentNormalizer(내용 정규화)——인코딩, 공백, 잘림을 처리하며 _consolidate() 안에서 함께 실행됩니다
  • GRCAdapter(거버넌스 / 위험 / 규정 준수 게이트)——확신도가 임계값보다 낮은 기억을 사람의 검토 대기열에 넣습니다
  • 폐회로 피드백——Background는 다음 세 종류의 가중치 신호를 존중합니다(직접 쓰지는 않습니다):Feedback Boost(사용자 +/-),Access Reinforcement(FG recall 시 실시간으로 record_access하여 effective half-life를 최대 10x 연장하고 30일에 걸쳐 자체 감쇠), CRAG 판정입니다. curate는 이 신호를 읽어 활성화된 block을 잘못 삭제하지 않도록 합니다
  • TierDigest(등급 하향 압축)——오래된 사진을 흑백 썸네일로 바꿔 창고에 넣는 단방향 과정입니다:
    • 경로:memvault.lifecycle.tier_digest
    • 실행 조건: lifecycle 생명 주기 warm → cold,cold → frozen 등급을 낮출 때 LLM을 호출해 요약합니다
    • 제한: 요약 ≤ 400 chars, 기록 위치는 BlockFrozen.summary
    • 단방향성: 상향 이동(cold → warm) 시 압축을 풀거나 원문을 복원하지 않습니다. 이유는 오늘의 LLM으로 과거의 세부 사항을 복원하는 것 = hallucination이며 fidelity를 위반하기 때문입니다

‘망각’을 아키텍처의 기본 요소로 다루기

추가만 하고 삭제하지 않는(append-only) 시스템에서는 시간이 흐르며 drift(표류)가 쌓이는 것이 필연적입니다. 모든 사실에는 유효기간(TTL)이 있고, 모든 술어에는 변동 가능 시간 창(volatile window)이 있으며, 모든 엔터티는 언젠가 과거의 자기 자신과 일치하지 않게 됩니다.

Write Track(쓰기 트랙)은 기록을, Background Track은 퇴장을 맡습니다. 두 트랙이 함께해야 그래프가 발산하지 않고 수렴(converge)합니다.

백그라운드 트랙은 여기까지 살펴봤습니다. 다음은 Read Track입니다——쿼리 의도 분류, 점수 산정 파이프라인, 관심 기반 게이트를 통한 재정렬, 계층적 회상을 다룹니다. 점수 산정만 해도 11개 층입니다.

도구

이 게이트 조건이라면 야간 작업은 얼마나 자주 실행될까요

이중 게이트는 ‘마지막 실행 후 24시간 초과’와 ‘session 5개 누적’을 모두 충족해야 실행됩니다.자신의 사용 빈도를 입력하면 얼마나 자주 실행되고 매번 몇 개의 session을 한꺼번에 처리해야 하는지 계산할 수 있습니다. 세 필드 모두 직접 아는 숫자이며, 계산은 전부 브라우저에서 이뤄져 데이터가 밖으로 전송되지 않습니다.

두 게이트 조건은 모두 이 글에서 나왔습니다. ‘마지막 꿈 이후 24시간이 넘고 session이 5개 이상 쌓였을 때, 두 조건이 모두 맞아야 실행됩니다.’여기서 계산하는 것은 실행 주기이지 효과가 아닙니다——이 글에는 ‘정리 전 vs 정리 후’의 회상 품질 데이터가 없으므로 도구는 ‘실행해야 하는가’에 답할 수 없습니다. session의 정의도 서비스마다 달라 입력한 숫자와 이 글에서 말하는 sessions_since 것이 꼭 같은 단위는 아닐 수 있습니다.

이 부분 가져가기

AI Agent에게 복사하기

기억은 많이 저장할수록 좋은 게 아닙니다——백그라운드 정리가 없으면 모순, 오래된 정보, 고아 관계가 뒤엉켜 쌓이고 회상 품질은 쓸수록 오히려 나빠집니다. 이 글은 ‘잊는 법 배우기’를 memvault의 다섯 단계 정리(파악, 신호, 성찰, 통합, 가지치기)로 나눕니다. LLM이 통계 스냅샷을 읽고 성찰하며 순수 규칙만으로 삭제하지 않습니다. 비교표로 활용하세요.

아래 내용을 AI에 붙여 넣고 이 글의 백그라운드 정리 설계에 따라 자신의 기억 층을 항목별로 비교하게 하세요:

저는 〈저장한 뒤에——나는 어떻게 기억에 잊는 법을 가르쳤나〉라는 글을 읽고 있습니다. (https://blog.joneshong.com/zh/blog/memvault-background-track) 글쓴이는 기억의 백그라운드 정리를 다섯 단계로 나누고, LLM이 통계 스냅샷을 읽어 성찰하도록 했습니다. 이 글의 백그라운드 정리 설계를 제 기억 층과 비교해 빠진 단계와 쌓기만 하고 정리하지 않는 부분을 짚어주세요. 일반론은 피해주세요. 제 상황: - 현재 [Claude Code / Cursor / ChatGPT / 직접 만든 RAG / 기타]로 AI와의 대화를 저장합니다 - 저장한 기억의 대략적인 양은 [수량 / 기간]입니다 - 현재 정리 방식: [없음 / 오래된 것 정기 삭제 / 수동 정리 / 자동 pipeline 있음] 다음 항목을 점검해 주세요: 1. 모순되는 기억은 어떻게 처리하나요? (같은 일의 새 버전과 옛 버전, 또는 직접 충돌하는 경우) 2. 오래된 정보를 식별하나요? 어떤 신호로 ‘오래됨’을 판단하나요? 3. 그래프형 기억에서 orphan entity / 무효한 관계를 정리하나요? 4. 시간 창을 두고 관심을 추적하나요? (‘최근 무엇에 관심이 있는지’ 아나요?) 5. 일괄 정리 vs 실시간 정리——각각 무엇을 맡아야 하며 왜 그런가요? 6. LLM이 한 번의 판단으로 잘못 삭제하지 않게 ‘세 단계 확인 절차’ 같은 보호 장치가 있나요? 7. 그래프의 간선 가중치에 여러 신호를 결합하나요? (동시 출현 횟수뿐 아니라 공통 친구, 유형의 적합성, 의미적 유사성) 8. 그래프에 독립된 ‘선호 층’(태도 버전 체인)과 ‘숙련도 층’(L1→L2→L3 경험치)이 있나요? 9. cross-community 다리, indirect-strong 매개, knowledge-gap 빈틈을 찾는 능동적 탐색 pipeline이 있나요? 10. 모순 중재는 규칙으로 하나요, LLM의 세 갈래 판정(병합 / 대체 / 공존)으로 하나요? 확신도가 낮으면 더 강력한 모델로 넘기나요? 11. 기억의 등급 하향(warm→cold→frozen)에 LLM 요약 압축을 쓰며, 복원하지 않는 단방향 방식인가요? 12. 일일 관심사 snapshot을 자동으로 쓰나요? 반복해서 fail한 query를 지식의 빈틈으로 표시하나요? 참고: memvault는 정리를 파악, 신호, 성찰, 통합, 가지치기의 다섯 단계로 나눕니다. LLM이 통계 스냅샷을 읽고 reflection을 하며 순수 규칙에만 의존하지 않습니다. 먼저 제 현황을 진단하고 우선순위가 가장 높은 보완점 3개를 나열해 주세요. 제 기억의 양이 아직 아주 적어 가끔 수동으로 정리하는 것으로 충분하다면, 전체 백그라운드 pipeline이 아직 필요 없다고 분명히 말해 주세요. 완전성을 위해 억지로 추가하지 마세요.
참고 자료

더 읽을거리

작업 과정에서 실제로 참고하고 설계 결정에 영향을 준 자료입니다.

자료 중요한 이유
Claude Code Dreams: Anthropic's Auto Dream Feature 유출된 Claude Code의 Auto Dream 설계를 가장 자세히 정리한 글입니다——제 ‘꿈 루프’라는 이름과 이중 게이트 조건 모두 여기에서 빌렸습니다
Piebald-AI: Auto Dream Leaked System Prompt 유출 뒤 정리된 Claude Code dream subagent의 원본 prompt입니다. 읽고 나서 Reflect 단계를 추가하고 mutation 권한을 완화하기로 결정했습니다
From Local to Global: A Graph RAG Approach(Microsoft) Dream Loop의 세 번째 단계인 Reflect에서 LLM이 스냅샷을 읽고 insights를 만들어내는 발상은 여기에서 왔습니다——Community detection + LLM summary라는 흐름입니다. L1 / L2의 일괄 통합도 마찬가지입니다
From Louvain to Leiden: guaranteeing well-connected communities L1 커뮤니티 감지에 사용하는 알고리즘입니다. Louvain보다 연결성을 확실히 보장하며, multi-resolution 매개변수 덕분에 여러 세밀도에서 커뮤니티를 살펴볼 수 있습니다
LightRAG: Simple and Fast Retrieval-Augmented Generation 가벼운 자기 갱신형 KG 방식입니다. 이것과 비교하면서 백그라운드 정리를 일회성 rebuild가 아닌 단계별 작업으로 만들기로 했습니다
memvault Write Track — 대화가 끝난 뒤 3부작의 첫 편입니다. 기억이 금고에 들어가는 과정, 즉 세 개의 gate, 이중 트랙 쓰기, L0 트리플 추출을 다룹니다
memvault Read Track — 떠올린 뒤 3부작의 세 번째 편입니다. Background 정리 후 기억을 어떻게 다시 불러오는지, 즉 의도 분류, Cascade Recall, Slow Thinker 미리 가져오기를 다룹니다
✦ 프롬프트 복사