← 글

memvault 전경: 세 트랙 × 세 겹의 설계 원칙

· 34 분 읽기
memvault · 개요

memvault 전경: 세 트랙 × 세 겹의 설계 원칙

3부작 총정리 — 기록, 정리, 회상을 하나의 지도로 엮고 CLT, Event Flows, Reactive라는 세 겹의 설계 원칙을 더합니다.

3부작을 마친 뒤, 세부 내용을 반복하는 대신 '기록, 정리, 회상'이라는 세 트랙을 한 화면에 나란히 놓은 지도가 필요했습니다.

하지만 제가 아직 이야기하지 않은 것이 있습니다. 이 세 트랙뒤에 있는 설계 맥락입니다. 전체를 관통하는 세 가지 원칙이 있고, 개발할 때 제 판단 기준이 되었습니다. 이 마무리 글에서 한 번에 풀어 보겠습니다.

아키텍처 개요

세 트랙을 담은 전체 지도입니다. 실선은 주 흐름, 트랙을 가로지르는 점선은 시스템이 스스로 돌아가게 하는 4개의 이벤트 흐름을 나타냅니다. 13개의 group bracket이 관련 구성 요소를 묶고, 각 group 뒤에는 구성 요소의 상세 설명이 이어집니다.

∥ 카드(항상 있음) 심층 경로 카드(느린 경로에서만 있음) — 백그라운드에서 계속 실행 — 기록 트랙 회상 트랙 백그라운드 트랙 대화 입력 새 대화의 시작점 잡음 걸러내기 의심스러움 → 격리 구역, 중복 제거 안 함 악의적인 유도 명령 방어 의심스러움 → 격리 구역, 중복 제거 안 함 중복 비교 건너뛰기 · 병합 · 대체 지문으로 압축 + 등록 고유한 디지털 지문 + 텍스트 인덱스 세 가지 요소로 분해 사람·사건·사물 추출 + 별칭 병합 벡터 저장소 유사도 비교 · 이중 경로 인덱스 커뮤니티 계층 / 요약 계층 그래프 군집화 + 자동 요약(야간 배치) 제가 질문합니다 질문 입력점 의도 유형 판별 표면적 의미 확인 ~0ms ∥ 의미 확인 ~5ms 융합표면적 의미 0.4 + 의미 0.6 LLM ~500ms확신이 없을 때만 LLM 사용 → 의도 여섯 가지 주요 유형 엔티티 조회 · 사실 찾기 · 개념 찾기 · 탐색 · 분야 간 연결 · 불명 빠른 검색 — 벡터 저장소로 ✓ 필수 실행 · 정렬과 재정렬을 검색에 내장 키워드와 의미 기반 검색 결과를 영리하게 결합 여러 기준을 종합한 11단계 순위 결정 질문에 따라 평가 기준을 동적으로 조정 1 최신일수록 가산점 2 신뢰도 가산점 3 신뢰할 만한 출처 4 사용자의 말이 우선 5 너무 길거나 짧으면 감점 6 유효 기간 반영 7 그래프 중심성 가산점 8 의미적 유사성 9 점수가 너무 낮으면 제외 10 내용이 없으면 제외 11 너무 비슷하면 가중치 하향 질문 유형에 따라 평가에서 중시하는 기준이 다릅니다 Attention Gate로 정밀 선별 생략 가능 · 정밀 선별 모델 Attention Gate 정밀 선별 점수 혼합 안전장치 생략: 후보가 너무 적음 / 1위가 압도적임 / 결과가 집중됨 → 빠른 경로 카드 기억은 시간이 지나면 흐려지지만, 자주 쓰면 수명이 자동으로 늘어납니다 느린 사고 경로를 거칠 때: 지식망 깊숙이 들어가 연결 관계 탐색 ⚡ 열린 질문일 때만 진행 요약 계층 커뮤니티 계층 조감 · 순위 없음 ∥ 사실 계층 지식망을 탐색하며 연결 관계 찾기 근접 검색 · 순위 없음 벡터 저장소로 복귀 ✓ 전체 정렬 자체 점검 빈도 기반 재정렬 선택 사항 경량 → 심층 경로 카드 질문 유형에 가장 알맞은 검색 경로 선택 정확한 질문은 깊게, 열린 질문은 넓게 검색 출력물 포장 세 가지 형식 · 진입점에 따른 차이 없음 응답 인터페이스 · 자동화 · 통합 Dream Loop — 기억 통합 매일 새벽 4시 · 이중 관문 · 다섯 단계 위치 파악이중 관문 + 통계 스냅샷 신호모순 탐지 + 중심 찾기 성찰LLM이 맥락을 읽고 빈틈 찾기 공고화병합 / 대체 / 공존 판정 가지치기상태 점검 + 오래된 정보 정리 백그라운드에서 미리 자료 준비 다음에 물을 법한 내용을 미리 검색해 답변 속도 높이기 관심사 프로필 7/30/90 일 관심 영역 피드백 순환 고리 사용자의 피드백 · 많이 쓸수록 강화

1. 기록 트랙 — 대화가 보관소로 들어갑니다

기억이 보관소로 들어가는 트랙

기록 트랙은 기억을 저장하는 일을 화물이 창고에 들어가는 과정에 비유합니다. 입구에는 세 관문이 있습니다. 첫째는 '음, 그래'처럼 정보가 없는 말을 걸러내고, 둘째는 의심스러운 명령을 막아 이상한 내용이 시스템을 망가뜨리지 못하게 하며, 셋째는 이미 있는 중복 정보를 걸러냅니다. 세 관문을 모두 통과해야 보관됩니다. 전부 받으면 잡음에 묻혀 정작 유용한 것을 찾기 어렵고, 받지 않으면 방금 나눈 이야기가 사라질까 봐 이 관문들을 만들었습니다.

보관에도 두 경로가 있습니다. 하나는 의미적 유사도에 따라 저장하고, 다른 하나는 사람·사건·사물의 관계를 풀어 별도로 기록합니다. 모든 기록에 출처를 표시해 나중에 원래 대화를 찾을 수 있도록 합니다.이 세 관문과 이중 경로 보관의 전체 흐름과 세부 내용은 이 글에 담았습니다.

누군가 말했습니다

대화가 기록되면 백그라운드 작업이 시작됩니다.

말이 입구로 들어옵니다
'한 단락의 말이 끝났고, 이를 남기고 싶습니다'
출처를 가리지 않음 · 모든 session 수집
백그라운드 작업 시작
'기록하는 순간 백엔드 파이프라인이 바로 시작되고, 프런트엔드는 기다리지 않습니다'
기록 직후 실행 · 차단하지 않음

보안 검사 관문 세 개

보관소에 들어가기 전 세 단계의 필터링입니다. 순서는 바꿀 수 없습니다.

군더더기 걸러내기
'인사말, 깨진 글자, 알맹이 없는 문자열을 먼저 버립니다'
G1 · 정보 밀도 부족 판정
노골적인 명령 주입 차단
'“앞의 모든 지시를 무시하라” 같은 몰래 끼워 넣기는 첫 관문에서 바로 거절합니다'
G2 · 5가지 주입 패턴
위장 차단
'신분 위장, 시간 순서 위장, 인코딩에 숨기기 — 다섯 유형의 위장을 따로 검사합니다'
G2의 짝 · 5가지 탐지 유형
중복 비교
'기존 내용과 너무 비슷한가요? 건너뛰기, 병합, 대체, 새로 추가 중 결정합니다'
G3 · 4-way 결정

문장 정리와 등록

표기를 통일한 다음 두 종류의 인덱스로 만들어 함께 등록합니다.

교정 담당
'“다음 주 목요일”“2026-04-30”“Apr 30”을 모두 같은 표기로 통일합니다'
4개 하위 모듈 · 중국어 전처리
지문으로 압축
'각 문장을 바코드처럼 숫자 지문으로 압축합니다'
1024차원 · 상주 하위 프로세스
문자열 인덱스
'문자 그대로 찾는 카드 목록으로, 지문을 보완합니다'
토큰 인덱스 · 서비스 수준 평균 길이
두 목록을 함께 검색
'책을 찾을 때 두 목록을 동시에 뒤져 결과를 합쳐 정렬합니다'
하이브리드 인덱스 · 역순위 융합

지식 그래프 만들기

각 문장을 관계로 분해하고 출처를 기록하며 주 흐름과 병렬로 실행합니다.

세 가지 요소로 분해
'누가 → 무엇을 → 누구에게, 세 요소를 뽑아냅니다'
20가지 관계 · 엔티티 정규화
동일인 알아보기
'ChatGPT와 GPT가 같은 대상을 가리키는지 세 단계의 비교로 확인합니다'
세 단계 · 정규화 + 지문 + LLM
출처 기록
'각 기록에 “누가, 언제 말했고 얼마나 믿을 만한가”라는 이력을 붙입니다'
출처 추적 · 신뢰 점수
병렬 파이프라인
'주 흐름이 진행되는 동안 그래프도 함께 만들어 서로 지연시키지 않습니다'
이벤트 기반 · 차단하지 않음

2. 백그라운드 트랙 — 잊는 법 배우기

잊는 법을 배우는 트랙

저는 백그라운드 트랙을 보관소에 '잊는 법'을 가르치는 야간 재고 담당자로 생각합니다. 정해진 밤 시간에 돌아다니며 다섯 단계를 밟습니다. 먼저 현재 재고를 살피고, 최근 주목받는 정보를 찾고, 중복되거나 모순될 만한 내용을 대조·통합하고, 확인된 핵심을 요약으로 압축한 뒤, 아무도 찾지 않는 오래된 자료를 처리 대상으로 표시합니다. 이 트랙이 없으면 창고에는 물건이 들어오기만 해서 반년 뒤에는 아무것도 찾기 어려울 만큼 어수선해집니다.

옆에는 두 조력자가 있습니다. 하나는 모순되는 기억을 찾아 흠을 잡고, 다른 하나는 제가 최근 관심을 보이는 주제를 조용히 기록합니다. 그래서 재고 담당자는 제가 관심 있는 분야를 먼저 처리할 수 있습니다.이 야간 작업의 전체 흐름과 무엇을 남기고 지울지 결정하는 논리는 이 글에 담았습니다.

한밤중에만 작동

새벽 4시가 되고 조건이 모두 맞아야 실행됩니다.

새벽 4시 알람
'낮에는 방해하지 않고 매일 4시에만 정리합니다'
일일 일정 · 프런트엔드에 영향 없음
이중 기준
'마지막 실행에서 24시간이 넘고 대화 5개가 쌓여야 시작합니다'
시간 + 누적량 두 조건

꿈의 다섯 단계

밤에 잠을 자듯 다섯 단계에 걸쳐 낮에 쌓인 일을 정리합니다.

전체 보기
'오늘과 어제의 차이를 먼저 보고 작업할지 결정합니다'
계층별 분포 스냅샷
중요한 것 찾기
'최근 반복해서 등장한 사람·사건·사물을 주인공으로 표시합니다'
다중 신호 에지 · 시드 계산
생각하기
'맥락을 읽고 소회를 만든 다음 세 주체의 판정으로 검증합니다'
3자 판정 + 시간적 충돌 탐지
서랍에 넣기
'같은 뜻은 합치고, 충돌하는 것은 풀고, 뒤엉킨 것은 제자리에 둡니다'
병합 / 대체 / 공존
퇴장
'더 이상 아무도 보지 않는 것은 퇴장 대상으로 표시해 창고가 넘치지 않게 합니다'
감쇠 점수 + 계층별 요약

진위 검사관

꿈속에서 네 단계의 추가 검사를 거쳐 모순과 오류를 건져냅니다.

네 단계의 점진적 검사
'먼저 그래프를 보고, 사실을 확인한 뒤, LLM에 맡기고, 마지막으로 사람이 재검토합니다'
네 단계의 점진적 검사 · 변하기 쉬운 술어
다섯 가지 신호
'몇 번 함께 나왔는지만 보지 않고 다섯 가지 단서를 합쳐 판단합니다'
동시 등장 + 대화 + 이웃 + 유형 + 의미
새것과 옛것의 충돌
'두 사실이 충돌하면 세 주체의 판정으로 합칠지, 바꿀지, 함께 둘지 결정합니다'
병합 / 대체 / 공존 · 상위 판정으로 이관
사람에게 전달
'기계가 확신하지 못한 것은 대기열에 남겨 사람이 다시 검토하게 합니다'
자동 통과 + 사람의 지원

관심사와 탐색

사실만 기록하지 않고 선호도, 빈틈, 뜻밖의 발견과 오래된 사진을 어떻게 보관할지도 기록합니다.

세 겹의 주의력
'7일은 최근, 30일은 회고, 90일은 소멸 — 주의력을 세 층으로 나눕니다'
활성 / 이력 / 소멸
일일 일기
'매일 자동으로 일기를 써서 오늘 가장 많이 이야기한 사람과 일을 기록합니다'
일일 집계 · 주제와 엔티티
빈틈 표시
'반복해서 물었지만 찾지 못한 것은 “여기에 빈틈이 있다”고 표시합니다'
두 번 이상 틀렸다고 판정
놀라운 발견 찾기
'군집 사이의 다리, 간접적인 강한 연결, 지식의 빈틈이라는 세 경로에서 놀라운 발견을 찾습니다'
발견 파이프라인 · 가중치가 있는 커뮤니티 탐지
선호와 숙련도 기록
'사실뿐 아니라 무엇을 좋아하고 얼마나 잘하는지, 나아지고 있는지도 기록합니다'
10가지 선호 유형의 버전 체인 + 3단계 숙련도
옛 사진의 흑백 썸네일
'오래된 자료는 흑백 썸네일처럼 창고에 보관하고 요약만 남겨 복원하지 않습니다'
3단계 격하 · 단방향 요약

3. 회상 트랙 — 알맞은 기억이 떠오르게 하기

기억을 떠올리는 트랙

저는 회상 트랙을 식당의 홀에 비유합니다. 손님이 묻자마자 먼저 질문 유형(사실 조회, 관계 찾기, 잡담)을 파악합니다. 그러면 주방에서 여러 저장 구역의 재료를 동시에 가져오고, 품질 관리 담당자가 적합하지 않은 것을 걸러냅니다. 음식을 내기 전에는 내용에 문제가 없는지 다시 한번 검사합니다. 저장하고 정리해 둔 기억이 알맞은 순간에 저절로 떠오르는 것은 마지막으로 이 단계에 달려 있습니다. 매번 애써 뒤질 필요가 줄어듭니다.

더 놀라운 점은 주방의 준비조가 뒤에서 몰래 재료를 준비한다는 것입니다. 제가 다음에 무엇을 물을지 예측해 관련 기억을 미리 가져다 놓으므로, 제가 입을 열면 모든 절차를 다시 밟지 않고 바로 내놓을 수 있습니다.주문을 받고 음식을 내기까지의 회상 논리 전체는 이 글에 담았습니다.

손님에 맞춰 내기

손님이 들어오면 먼저 의도를 파악하고 어느 계층에서 찾을지 정합니다.

의도 파악
'사실을 찾나요, 관계를 찾나요, 아니면 폭넓게 탐색하나요? 여섯 가지 유형으로 나눠 응대합니다'
여섯 가지 의도 · 키워드와 의미 분석 병렬 처리
기억력 좋은 종업원
'종업원은 자주 주문하는 음식을 기억하고 그 음식부터 가져옵니다'
주의력 사전 확률 · 7/30/90 일
계층별 업무 배정
'질문에 따라 다른 계층에서 찾습니다. 전부 무작정 뒤지지 않습니다'
의도에 대응하는 4가지 검색 전략
답을 먼저 상상한 뒤 찾기
'머릿속에 이상적인 답변을 먼저 만들어 보고 그것과 대조합니다'
가상 문서 임베딩

빠른 검색

창고에서 먼저 대강 고른 뒤 11단계 가중치로 순위를 매깁니다. 자주 쓰는 지문은 캐시에 남습니다.

의미로 창고 검색
'창고에 들어가면 먼저 의미를 묻고 비슷한 것들을 찾습니다'
하이브리드 검색 · 역순위 융합
11단계 순위 결정
'새로운가, 중요한가, 믿을 만한가… 11가지 관점을 합쳐 점수를 매깁니다'
최신성 / 중요도 / 신뢰 / 피드백 / 감쇠 등
양념 비율
'질문의 맛에 따라 양념 비율도 달라집니다'
기본값 0.3/0.7 · 의도별 미세 조정
지문 캐시
'이미 계산한 지문은 주머니에 넣어 다음에 바로 꺼냅니다'
캐시 · 24시간 후 만료

두 번째 정밀 선별

대강 고른 후보를 정밀 선별 담당자에게 넘기지만, 이 단계는 생략하거나 중단할 수 있습니다.

정밀 선별 담당자
'대강 고른 후보를 다시 하나씩 자세히 봅니다'
교차 인코더 · 0.6B
격차가 크면 생략
'1위가 압도적으로 앞서면 다시 고를 필요가 없습니다'
세 가지 생략 규칙
고장 나면 우회
'정밀 선별 담당자가 고장 나면 10분간 우회해 전체 흐름이 멈추지 않게 합니다'
세 번 실패 → 600초 우회

느린 사고의 다섯 방법

느린 사고 경로에서만 쓰는 다섯 가지 예비 방법입니다. 사실부터 전체 모습까지 살핀 뒤 자체 점검합니다.

사실 계층에서 이웃 찾기
'“누가 무엇을 누구에게” 계층에서 가까운 항목을 바로 가져옵니다'
세 요소 쿼리
커뮤니티 계층에서 관계 찾기
'같은 작은 집단에서 관련 사람·사건·사물을 찾습니다'
커뮤니티 탐지
요약 계층에서 전체 보기
'미리 작성한 요약부터 읽어 기다림 없이 큰 그림을 봅니다'
미리 생성한 요약 · 지연 시간 0
그래프를 따라 걷기
'시드 엔티티에서 출발해 그래프의 길을 따라 천천히 걷습니다'
개인화된 무작위 보행
답변 전 자체 점검
'음식을 내기 전 요리사가 한입 먹어 보고 잘못됐으면 돌려보냅니다'
네 가지 검증 모드 · 기본/심층/판정/끔

출력 직전

모양을 다듬고 한 번 더 소독합니다. 뒤에서는 다음 음식을 몰래 준비합니다.

접시에 담기
'글자 수 예산에 맞춰 고르고 답을 보기 좋게 정리합니다'
세 가지 형식 · 예산을 고려한 패키징
출력 전 재소독
'손님에게 내기 직전 수상한 것이 끼어 있지 않은지 다시 검사합니다'
출력 측 탐지 + 정화
다음 음식 몰래 준비
'손님이 아직 먹는 동안 주방은 벌써 다음 음식을 몰래 준비합니다'
5단계 파이프라인 · 입력 제어

4. 세 트랙을 관통하는 설계 계층

기록, 백그라운드, 회상의 세 트랙은 같은 원칙을 공유합니다. 군더더기를 덜고, 복잡한 것을 나누고, 예시를 검증합니다. 모든 세부 사항에 이 세 겹의 원칙이 반영되어 있습니다.

세 겹의 설계 원칙

군더더기를 덜고, 복잡한 것을 나누고, 예시를 검증해 집이 스스로 돌아가게 합니다.

부담을 줄이는 세 가지 방법
'군더더기 제거, 복잡성 분해, 예시 검증 — 세 트랙의 보안 검사, 분할, 자체 점검에 대응합니다'
인지 부하의 세 원칙
네 개의 파이프라인
'네 파이프라인이 제 역할을 맡아 집 전체가 스스로 돌아갑니다'
기억 / 수집 / 통찰 / 느린 사고
파이프라인 추상화
'자동화 공장에서 작업자마다 한 가지 일만 맡고, 이들을 연결하면 파이프라인이 됩니다'
Operator / Pipeline / Observable
---

여기까지가 지도의 전체 모습입니다. Write 트랙은 대화를 저장하고, Background 트랙은 정리하며 잊는 법을 배우고, Read 트랙은 알맞은 기억을 알맞은 때에 떠오르게 합니다.

세 트랙을 하나로 잇는 것은 군더더기를 덜고, 복잡한 것을 나누고, 예시를 검증한다는 원칙입니다. 이 원칙은 모든 트랙에서 볼 수 있습니다.

물론 어떤 도구도 모든 문제를 단번에 해결하지는 못합니다. 이론, 기술, 사용법은 계속 발전하고 memvault도 시간에 따라 성장할 것입니다. 이 글은 현재 진행 상황을 담은 한 장의 사진으로 봐 주세요. 나중에 크게 바뀌면 새 글로 이야기하겠습니다. memvault 3부작은 우선 여기서 마칩니다.

아키텍처 개요

13개의 group bracket은 이 entry-agnostic pipeline 전체 지도 아래의 구성 요소 cards에 대응하며, 트랙을 가로지르는 4개의 dashed event flows는 시스템이 스스로 돌아가는 뼈대를 표시합니다.

∥ cards (always) cascade_cards (slow only) — 백그라운드에서 계속 실행 — WRITE READ BG User Input 기억 입력점 Noise Filter quarantine → skip dedup Injection Guard quarantine → skip dedup Dedup (G3) SKIP · MERGE · SUPERSEDE Embedding + Qdrant 1024차원 Dense + BM25 Sparse KG L0 Triple 엔티티 추출 + Entity Resolution Qdrant 벡터 저장소 cosine similarity · hybrid index L1 Leiden / L2 Summary 커뮤니티 군집화 + LLM 요약(배치) Query Input 기억 회상 진입점 QueryClassifyOp — 의도 분류 Keyword ~0ms ∥ Semantic ~5ms Fusion0.4kw + 0.6sem LLM ~500ms신뢰도가 낮을 때만 실행 → intent 6 types entity_lookup · factual · conceptual · exploratory · cross_domain · unknown Fast Search — qdrant_search() ✓ 필수 실행 · Scoring + Reranking이 검색 함수 내부에 포함 · services.py:492 Qdrant Hybrid (Dense + BM25 RRF) 11-Stage Scoring Pipeline intent-dependent 가중치 · 각 stage 비활성화 가능 1 Recency 2 Import 3 Trust 4 Feedback 5 Length 6 Decay 7 PPR Boost 8 Semantic 9 MinScore 10 Noise 11 Dedup entity_lookup: semantic↑ trust↓ | factual: trust↑↑ | exploratory: recency↑↑ | Weibull 4-tier decay Attention-Gated Reranking 생략 가능 · Jina v3 MLX Attn Gate Jina v3 Score Blend Circuit Brk skip(≤2건 | 압도적 우위 | 촘촘한 군집) → fast_cards Weibull 4-tier: Core 180d · Hot 60d · Warm 30d · Cold 14d — access_count로 수명 연장 · PPR graph walk IF thinking_mode = slow : Cascade Recall — 심층 검색 ⚡ slow intent에서만 실행 · kg_services.py:991 L2 Summary L1 Community GLOBAL · scoring 없음 ∥ L0 Triple PPR Walk LOCAL · scoring 없음 Blocks (qdrant_search) ✓ scoring + reranking 있음 CRAG Eval Access Rerank 선택 사항 경량 → deep_cards mode=local → GLOBAL 건너뜀 · mode=global → LOCAL 건너뜀 · mode=hybrid → 전체 검색 entity_lookup/factual → local · conceptual/exploratory → global · cross_domain → hybrid Output Formatter format: text · json · cards(진입점 무관) 응답 Hook · UI · MCP Dream Loop — 기억 통합 Pipeline 매일 4AM · dual-gate trigger · 5-phase Orient이중 관문 검사 + 통계 스냅샷 Signal모순 탐지 + PPR 중심 ReflectLLM 성찰 + 지식의 빈틈 Consolidate병합/대체/공존 판정 Prunelint + stale 정리 Slow Thinker 다음 질문 예측 · 미리 가져오기 캐시 Interest Profile 7/30/90d 주의력 기간 Feedback Loop Feedback · Access Reinforce

1. Write Track

Write Track

기억 기록 경로는 SanitizeGate 가 총괄하며, 영구 저장 전에 세 가지 방어선을 거칩니다.

  • NoiseFilter: 정보량이 없는 잡담을 제거합니다.
  • InjectionGuard + PoisoningDetection: prompt injection과 콘텐츠 오염을 차단합니다.
  • DedupOp: embedding cosine으로 기존 자료와 비교해 충분히 비슷하면 바로 막습니다.

통과하면 Hybrid Indexing으로 들어갑니다. 벡터는 memvault.blocks(pgvector 768d)에 저장하고, 지식 그래프는 L0 Triple(subject/predicate/object)로 분해해 kg-ops에 기록합니다. 각 자료에는 Provenance(session_id / turn_index)가 있어 출처를 추적할 수 있고, 먼저 ContentNormalizer 로 형식을 통일해 잡음이 embedding 공간을 오염시키지 않도록 합니다.

이중 경로 기록의 이론적 기반은 논문 Don't Forget to Connect! Improving RAG with Graph-based Reranking(2405.18414)에서 가져왔습니다. 전체 pipeline, 세 방어선의 판단 기준과 KG 추출 전략은 memvault Write Track 상세편.

Trigger

대화가 기록되면 바로 실행하며, 백그라운드 파이프라인은 fire-and-forget 방식입니다.

Session Input
'entry-agnostic 진입점으로, 모든 session을 받습니다'
session boundary · 출처를 가리지 않음
after_create Hook
'기록하자마자 백그라운드 pipeline을 시작하며, 프런트엔드를 막지 않습니다'
asyncio.ensure_future() · fire-and-forget

Sanitize Gate

순서대로 거치는 세 관문으로, non-commutative입니다.

NoiseFilter (G1)
'인사말, 깨진 글자, 정보 밀도가 낮은 패턴 제거'
core.noise.NoiseFilter · low-info regex + density
InjectionGuard (G2)
'노골적인 prompt-injection 차단'
5 categories · instruction_override / role_tag / encoded / markdown / separator_flood
PoisoningDetection
'G2와 짝을 이루는 구성 요소로, 5가지 위장 유형을 막습니다'
memvault.security.poisoning · authority/role/markdown/temporal/base64 + Shannon entropy
DedupOp (G3)
'4-way decision, 유사도가 높으면 LLM arbitration으로 넘깁니다'
SKIP / MERGE / SUPERSEDE / CREATE · cosine + Contradiction

Normalize & Index

콘텐츠 정규화 + Hybrid 이중 인덱스 등록.

ContentNormalizer
'시간 표현, 통화, 단위, 중국어 전처리의 표기를 통일합니다'
libs/text-ops · 4개 하위 모듈 + preprocess_chinese
Qwen3 Embedding (MLX)
'각 기억을 1024차원 벡터 지문으로 압축합니다'
omlx_bridge.py · 1024d · persistent subprocess
BM25 Sparse
'문자열 인덱스로, dense를 보완합니다'
sparse_tokenizer · per-service avgdl
Hybrid Index → Qdrant
'Dense + BM25 RRF를 융합해 회상합니다'
qdrant_search · Reciprocal Rank Fusion

KG Construction

L0 트리플 추출 + provenance가 event-driven 방식으로 병렬 실행됩니다.

L0 Triple 추출
'(s, p, o) 세 요소를 추출합니다'
20 predicates · entity normalization
Entity Resolution
'3-tier alias 통합: 정규화 → 임베딩 → LLM'
3-tier · ChatGPT == GPT
Memory Provenance
'각 트리플에 source + trust_score를 붙입니다'
source_tracker · trust_score
Reactive KG Pipe
'event-driven으로 주 기록 흐름을 막지 않습니다'
fire-and-forget · 병렬 pipeline

2. Background Track

Background Track

오프라인 정리는 DreamLoop 가 매일 4AM에 시작하며, core/src/modules/memvault/dream/ 의 5단계 pipeline을 실행합니다.

  • orient: 기억 계층의 현재 스냅샷을 가져옵니다.
  • signal: MultiSignalEdges(access / cite / co-occur)를 집계합니다.
  • reflect: TemporalConflict을 실행해 이중 시간축(bi-temporal)의 모순을 탐지합니다.
  • consolidate: 계층별 요약(TierDigest)을 만들고 의미가 같은 기억을 병합합니다.
  • prune: 감쇠 점수에 따라 제거 후보를 표시합니다.

별도의 경로에서는 KnowledgeLint 가 네 단계의 점진적 검토(그래프 구조 → grounding → LLM → 3단계 확인)로 오류를 바로잡습니다. 또 InterestProfile 가 제 주제별 관심도를 추적해 SurpriseDiscovery에 피드백하고, 상호작용은 적지만 잠재력이 큰 기억을 선제적으로 찾습니다.

이 백그라운드 정리 설계는 부분적으로 HippoRAG: Neurobiologically Inspired Long-Term Memory for LLMs(2405.14831)의 통합 개념과 맞닿아 있습니다. Dream Loop의 다섯 단계 기준값, 충돌 해결 전략과 KnowledgeLint v2의 세부 내용은 memvault Background Track 상세편.

Trigger

Cronicle 일정 + 이중 조건 관문입니다.

Cronicle 4AM
'매일 04:00에 실행해 프런트엔드의 사용량이 몰리는 시간을 피합니다'
Cronicle 4105 · daily schedule
Dual-Gate
'시간과 누적량 두 조건을 모두 만족해야 실행합니다'
(now - last) > 24h ∧ sessions_since ≥ 5

Dream Loop

OODA-like 5단계: Orient → Signal → Reflect → Consolidate → Prune.

Orient
'tier 분포의 스냅샷으로 차이의 규모를 봅니다'
tier distribution snapshot
Signal
'PPR seed를 계산해 신호의 중심을 찾습니다'
MultiSignalEdges · PPR seed
Reflect
'LLM 3자 판정 + 시간적 충돌 탐지'
3-way judge + Temporal Conflict
Consolidate
'merge / supersede / coexist 중 하나를 선택합니다'
merge / supersede / coexist
Prune
'decay score를 기준으로 tier digest와 함께 처리합니다'
decay score + tier digest

Knowledge Lint

네 단계의 점진적 감사: 그래프 구조 → 사실성 → LLM → 사람의 재검토.

네 단계의 점진적 검사
'graph → grounding → LLM → human'
lint v2 · volatile predicate
MultiSignalEdges
'단순 동시 등장을 5 signals fusion으로 대체합니다'
co-occurrence + session + Adamic-Adar + type + semantic
Temporal Conflict
'LLM 3-way judge, 필요하면 RLM으로 이관합니다'
MERGE / SUPERSEDE / COEXIST · escalate to RLM
Review Queue
'auto-approve + human-in-loop fallback'
low-confidence → human queue

Interest & Discovery

주의력 계층화 + 관심사/빈틈/뜻밖의 발견 탐색 + tier 격하.

Attention Windows
'7/30/90 일, 세 겹의 주의력'
active / historical / fading
Daily Snapshot
'매일 top intents/entities를 집계합니다'
SQL aggregation · top intents/entities
Knowledge Gap
'verdict=INCORRECT가 누적되면 빈틈으로 표시합니다'
verdict=INCORRECT ≥ 2
Surprise Discovery
'cross-community 다리 / indirect-strong / knowledge-gap'
surprise_ops · Leiden weighted triggers
Attitude + Skill Layer
'10가지 attitude 유형의 버전 체인 + L1/L2/L3 skill'
attitude version chain + skill levels
Tier Digest
'warm→cold→frozen 단방향 LLM 요약'
summary ≤ 400 chars · 되돌릴 수 없음

3. Read Track

Read Track

읽기 경로의 진입점은 QueryClassify입니다. 질문 유형에 따라 다른 전략을 고르지만, 주된 흐름은 동일한 11단계 평가 pipeline입니다.

  • QueryRouter: 질문을 사실, 관계, 잡담의 세 경로로 나눕니다.
  • ScoringPipeline: BM25, dense retrieval, 지식 그래프 탐색을 결합해 병렬로 점수를 매기고, AttnRes intent-dependent 가중치로 합칩니다.
  • CascadeRecall: 벡터 검색에서 결과를 찾지 못하면 자동으로 지식 그래프에 깊이 들어가 여러 단계로 추론합니다.
  • Reranker: Jina Reranker v3 MLX로 재정렬합니다.
  • OutputFormatter + ReadTimeSanitize: 출력 전 injection 검사를 한 번 더 수행합니다.

백그라운드에는 SlowThinker도 있습니다. 대화의 SSE 스트림을 듣고 다음 query를 예측해 후보 block을 미리 가져옵니다. 예측이 맞으면 pipeline 전체를 한 번 실행하는 비용을 아낄 수 있습니다.

이 intent-dependent 가중치 결합의 이론적 근거는 논문 Attention as a Hint: Detecting Irrelevant Contexts via Attention Weight(2603.15031)에서 가져왔습니다. 세 경로의 분류 기준, 11단계 평가 함수, SlowThinker 예측 모델은 memvault Read Track 상세편 에 기록했습니다.

Query Routing

의도 분류 + attention prior + layer routing + HyDE.

QueryClassify
'6 intent, kw ∥ sem 병렬 처리, 신뢰도가 낮으면 LLM으로 전달'
6 intent · kw ∥ sem → LLM (low conf)
Personalized Router
'attention prior로 자주 다루는 주제를 우선합니다'
attention prior · 7/30/90
Layer Routing Matrix
'intent에 따라 4가지 검색 전략을 적용합니다'
intent → SEMANTIC / HYBRID / ILIKE / SKIP
HyDE Expansion
'가상의 답변을 먼저 만들고 embed하여 비교합니다'
Hypothetical Document Embeddings

Hybrid 회상 + 11단계 가중치 + intent-tuned blending + Redis cache.

qdrant_search
'hybrid Dense + BM25 RRF'
qdrant_search · hybrid + RRF
11-Stage Scoring
'11단계의 가중치를 합쳐 최종 점수를 냅니다'
recency / import / trust / feedback / length / decay / PPR / semantic / minscore / noise / dedup
Score Blending
'intent-tuned 비율'
default 0.3/0.7 · intent-tuned
Embedding Cache
'Redis에 쿼리 임베딩을 캐시합니다'
Redis · 24h TTL

Reranking

Cross-encoder 2단계 정밀 정렬 + skip + circuit breaker.

Jina Reranker v3
'MLX cross-encoder로 정밀 정렬합니다'
MLX · 0.6B · cross-encoder
Attention Gate
'3 skip rules, TurboQuant+에서 영감을 받았습니다'
3 skip rules · TurboQuant+ inspired
Circuit Breaker
'3 failures 후 600s recovery를 시작합니다'
3 failures → 600s recovery

Cascade Recall

Slow-only의 다섯 방법: L0 → L1 → L2 → PPR → CRAG.

L0 Triple
'세 요소의 직접 이웃 조회'
(s, p, o) lookup
L1 Community
'Leiden community detection'
Leiden detect
L2 Summary
'LLM이 미리 생성한 요약으로 지연 시간이 없습니다'
pre-generated · zero-latency
PPR Walk
'igraph PPR, HippoRAG에서 영감을 받았습니다'
HippoRAG-inspired igraph PPR
CRAG Verification
'네 가지 자체 점검 모드: default / deep / rlm / none'
evaluate=default/deep/rlm/none

Output

Budget-aware 출력 정리 + 출력 측 sanitize + Slow Thinker 보조 경로.

Output Formatter
'token 예산 안에서 packing합니다'
format=text/json/cards · budget-aware packing
Read-Time Sanitize
'출력 측에서 한 번 더 소독합니다'
is_unsafe_for_injection + sanitize_for_injection
Slow Thinker (보조 경로)
'5-op pipeline으로 다음 차례를 준비합니다'
5-op pipeline · Admission Control · VoiceAgentRAG-inspired

4. 세 트랙을 관통하는 설계 계층

세 트랙이 공유하는 설계 계층 — CLT는 철학적 frame, 4 Event Flows는 자율 작동의 뼈대, Reactive 추상화는 함수 합성의 기반입니다.

Cross-cutting

CLT의 세 원칙 + 4 event flows + Reactive 추상화.

CLT의 세 원칙
'군더더기 제거 / 복잡성 분해 / 예시 검증은 sanitize / segment / verify에 대응합니다'
Sweller 1988 · 인지 부하 이론
4 Event Flows
'네 개의 event-driven pipeline이 각자 역할을 맡습니다'
Memory→KG / Capture→KG / Intelligence→Block / Query→SlowThinker
Reactive 추상화
'Operator / Pipeline / Observable / Subject 네 가지 요소'
libs/ops-core · RxJS-inspired

세 트랙에 관한 deep dive는 3부작에 나뉘어 있습니다. 이 글은 이를 하나의 전체 지도로 모으고 전체를 관통하는 설계 계층을 끌어냅니다. CLT는 제 설계 철학이고, 4 Event Flows는 자율 작동의 뼈대이며, Reactive 추상화는 함수 합성의 기반입니다.

여기에 적지 않은 것은 대부분 장기적으로 조정해야 하는 매개변수입니다. 평가 가중치, 미리 가져오기 적중률, 단계별 회상 경계, 지식 그래프 추출의 신뢰도 기준 등이 그렇습니다. 이 값들은 데이터 분포에 맞춰 매달 조금씩 조정하며, 새로운 구성 요소는 아닙니다.

물론 어떤 도구도 모든 문제를 단번에 해결하지는 못합니다. 이론, 기술, 도구는 계속 발전하고 memvault도 함께 개선될 것입니다. 이 blog는 현재 진행 상황을 점검한 기록으로 봐 주세요. 나중에 크게 바뀌면 새 글로 설명하겠습니다. memvault 3부작은 우선 여기서 마칩니다.

도구

실제로 겪은 증상을 체크하고 어느 트랙부터 보완할지 확인하십시오

이 글의 주장은 '대부분의 자작 기억 시스템에는 기록과 회상 두 트랙만 있고 백그라운드 트랙이 빠져 있어 쓸수록 어수선해진다'는 것입니다.아래 여덟 가지 증상에 나오는 구성 요소의 이름은 몰라도 됩니다. 실제로 겪은 것만 체크하면 이 글에서 설명한 원인에 따라 어느 트랙부터 살펴볼지 순서를 매깁니다. 모든 처리는 브라우저 안에서 이루어지며 데이터는 외부로 전송되지 않습니다.

이는 이 글의 설명을 비교표로 만든 것이며,측정 결과가 아닙니다. 이 도구는 사용자의 데이터를 읽거나 쿼리를 실행할 수 없습니다. 같은 증상도 이 글에서 다루지 않는 이유(애초에 자료가 적음, embedding 모델이 맞지 않음, 쿼리가 지나치게 모호함)로 자주 생깁니다. 도구는 이를 구별하지 못하고 이 글의 원인 분석에 따라 방향을 제시할 뿐입니다. 또한 이 글에는 '보완이 필요할 만큼 심각한' 기준이 없으므로 순서만 매기고 점수는 주지 않습니다.

이 부분 가져가기

AI Agent를 위한 전체 점검 프롬프트

대부분의 자작 기억 시스템에는 '기록'과 '회상' 두 트랙만 있고 백그라운드 트랙이 빠져 있어 쓸수록 어수선해집니다. 이 글은 스스로 정리하는 기억 시스템을 세 트랙 × 세 겹의 설계 원칙으로 펼쳐 보여 주므로 비교표로 쓰기 좋습니다.

아래 내용을 AI에 붙여 넣어 이 글의 설계와 자신의 시스템을 하나씩 비교하고 어떤 트랙과 계층이 빠졌는지 찾게 하십시오.

저는 〈memvault 개요: 세 가지 트랙 × 세 겹의 설계 원칙〉이라는 글을 읽고 있는데 (https://blog.joneshong.com/zh/blog/memvault-overview), 저자는 스스로 정리하는 개인 기억 시스템을 세 트랙 × 세 겹의 설계 원칙으로 나눕니다. 이 글을 비교표로 삼아 제 시스템에 무엇이 빠졌는지 항목별로 살펴봐 주세요. 일반적인 조언은 하지 마세요. 제 시스템의 현재 상태: - 기록 방식: [기억에 들어가기 전 처리 과정을 간단히 설명] - 백그라운드 정리: [주기적으로 정리하나요? 무엇을 잊을지 어떻게 결정하나요?] - 회상 경로: [질문에서 답변까지 어떻게 이어지나요?] 다음 세 측면에서 진단해 주세요. A. 세 트랙의 완성도 1. 기록 트랙: 잡음 필터링 / 위장한 주입 차단 / 중복 제거의 세 관문이 있나요? 기억을 벡터 + 지식 그래프의 이중 경로로 나누나요? 2. 백그라운드 트랙: 비동기 정리 pipeline이 있나요? 오래되거나 모순되거나 고립된 정보를 어떻게 알아보나요? 시스템이 '잊는 법'을 배울 수 있나요? 3. 회상 트랙: 의도 분류가 있나요? 여러 신호를 융합해 순위를 매기나요? 예측 기반 미리 가져오기(사용자가 묻기 전에 준비하기)가 있나요? B. 트랙을 가로지르는 세 겹의 설계 원칙 4. 인지 부하: 각 처리 단계가 다음 단계의 부담을 줄이고 있나요? '군더더기 제거 / 복잡성 분해 / 예시 검증'이라는 세 원칙이 있나요? 5. 이벤트 흐름: 시스템이 사람이 버튼을 눌러 움직이는 대신 이벤트로 구동되나요? 네 가지 대표적인 이벤트 흐름(기억에서 지식 그래프로, 외부 수집에서 그래프로, 인텔리전스에서 기억 블록으로, 쿼리에서 미리 가져오기로)이 구현되어 있나요? 6. 반응형 추상화: pipeline은 최소 단위 변환기(Operator)의 조합으로 이루어져 있나요? 이벤트 뼈대는 pub-sub 모델을 사용하나요? 이는 앞으로의 확장에 얼마나 영향을 미치나요? C. 통합 측면 7. 세 트랙은 서로 어떻게 통신하나요? 직접 import하나요, 아니면 이벤트로 분리되어 있나요? 8. 기록 단계에서 붙인 메타데이터(confidence / provenance / valid_at)는 백그라운드 정리와 회상 순위 결정에 사용되나요? 9. 어떤 세부 사항이 새 구성 요소가 아니라 장기적인 매개변수 조정인가요? 이를 핵심 설계와 분리하면 유지 관리가 더 쉬워질까요? 먼저 제 시스템에 현재 빠진 것을 나열한 뒤 가장 먼저 보완할 세 가지와 우선순위를 알려 주세요. 제가 단지 몇 개의 메모를 저장하려 하고 양도 많지 않다면 세 트랙 전체는 필요하지 않다고 분명히 말해 주세요. 완성도를 위해 억지로 추가하지 마세요.

더 읽을거리

3부작 심층편 + 트랙 간 설계 원칙의 이론적 뿌리.

자료 중요한 이유
memvault Write Track — 대화가 끝난 뒤 3부작 첫 편의 심층판입니다. 세 개의 gate(잡음 / 주입 + 위장 / 중복 제거) + 이중 경로 기록(벡터 + KG) + Provenance + Content Normalizer의 4개 하위 모듈을 다룹니다
memvault Background Track — 저장한 뒤 3부작 둘째 편의 심층판입니다. Dream Loop 5단계, Knowledge Lint 4계층, Multi-Signal Edges, Temporal Conflict, Tier Digest, Surprise Discovery 등 12개 구성 요소를 다룹니다
memvault Read Track — 기억해 낸 뒤 3부작 셋째 편의 심층판입니다. 의도 분류 + Personalized Router + 11-stage scoring + Cascade Recall + Read-Time Sanitize + Slow Thinker 미리 가져오기를 다룹니다
Cognitive Load Theory(Sweller, 1988) 세 트랙의 sanitize / segment / verify 관문에 깔린 설계 철학의 뿌리 — 쓰는 사람이 조금 더 애써야 읽는 사람이 덜 힘듭니다
Enterprise Integration Patterns(Hohpe & Woolf, 2003) 4 Event Flows의 pub-sub / pipe-and-filter 설계 패턴의 출처입니다. memvault는 이 패턴을 바탕으로 EventBus와 Subject 추상화를 만들었습니다
RxJS Reactive Extensions Operator / Pipeline / Observable / Subject 네 추상화의 구체적인 구현 참고 자료입니다. memvault는 RxJS를 직접 사용하지 않지만 추상화 수준은 이에 맞춥니다
✦ 프롬프트 복사