Lossless-Memory: 요약 없이 개인용 AI 장기 기억 계층
TL;DR
Lossless-Memory는 모든 AI-사용자 대화를 타임스탬프와 함께 원본 그대로 저장하고, 시간 기반으로 인덱싱한 후 모델 컨텍스트에 작은 "지금 어디에 있는가" 인덱스를 삽입하여, 단일 사용자와 단일 기계에서 손실 없는 재확인을 가능하게 합니다.
이 프로젝트는 무엇인가요
Lossless-Memory는 개인용 AI 어시스턴트를 위한 로컬이고 파일 기반의 장기 기억 계층입니다. 다음과 같은 구성 요소로 이루어져 있습니다:
- 원시 JSONL 로그 (하루당 하나) – 각 대화 단계마다 일곱 필드를 포함하며, 결코 요약되지 않습니다.
- SQLite 인덱스 – 정확한 일치 검색을 위한 FTS5 인덱스(시간과 함께 단어 저장)와 의미 검색을 위한 백업 벡터 인덱스(sqlite-vec).
- 시간적 뼈대(Temporal Backbone) – 상대적 일본어 표현(예: "昨日", "先週")이나 절대적 ISO 날짜를 이해하고, 순위 매기기 전에 검색 범위를 제한하는 쿼리 파서.
- LLL 인덱스 – 매번 대화 흐름이 바뀔 때 사람이 작성하는 짧은 주제 마커 목록으로, 모델 컨텍스트에 매번 삽입되어 현재 대화 흐름을 유지합니다.
이 시스템은 의도적으로 단일 사용자, 단일 기계에만 적용되며, 일반적인 벡터 데이터베이스 래퍼나 요약기로 작동하지 않습니다.
핵심 설계 원칙
1. 손실 없는 원시 로그
모든 대화 단계는 하루당 하나의 JSONL 파일에 다음 필드와 함께 추가됩니다:
ts ISO-8601 UTC 타임스탬프
actor 발화자 식별자
role user | assistant | system
type text | action | meta
text 원본 내용
model 모델 식별자 (옵션)
session 세션 ID
이 로그는 진실의 근원이며, 모든 인덱스는 이 로그에서 재구성할 수 있습니다.
2. 시간적 뼈대
시간은 단순한 메타데이터가 아니라 주축입니다:
- FTS5 인덱스는 각 행에 타임스탬프를 함께 저장합니다.
- 파서는 일본어 상대적 표현(예: "昨日", "先週")과 절대적 ISO 날짜를 이해하며, 순위 매기기 전에 구체적인 시간 범위로 변환합니다.
- 시간 표현이 포함된 경우 결과는 해당 범위로 제한되며, 시간 순서대로 반환됩니다. 정확한 인덱스에서 결과가 너무 적을 경우에만 의미 검색이 사용되며, 그 사용 여부는 명시적으로 보고됩니다.
이로 인해 "지난 화요일 밤에 우리는 무엇을 결정했는가?"와 같은 질의가 그 밤에 말한 정확한 문장을 순서대로 반환할 수 있습니다.
3. LLL – "지금 어디에 있는가" 인덱스
LLL은 주제 마커의 가벼운 인덱스로, 사용자가 대화 주제가 바뀔 때마다 작성하는 짧고 타임스탬프가 붙은 문장들입니다. 모델은 이 인덱스를 읽지만 수정하지 않으며, 컨텍스트 창 압축 후에도 AI가 현재 대화 흐름을 항상 인지할 수 있도록 보장합니다.
아키텍처 다이어그램
원시 대화 로그 (JSONL, 하루당 하나) ← 진실의 근원, 결코 요약되지 않음
│
▼
인게스트 ──► 7필드 기록
│
├──► index_exact SQLite FTS5 + 타임스탬프 (단어 + 시간)
├──► index_vector sqlite-vec 임베딩 (의미, 마지막 수단)
└──► state_index LLL 주제 마커 (지금 어디에 있는가)
│
▼
재확인 ── 하나의 진입점: 시간 표현 파싱 → 범위 제한 → 순위 매기기 → 원본 문장 반환
│
▼
모델 컨텍스트에 삽입 (요청 시 또는 매번 LLL용)
데몬은 10분마다 증분적으로 재인덱싱합니다. 수정된 일일 파일만 처리되므로 전체 재빌드는 필요하지 않습니다.
실제 성능 수치
| 지표 | 값 |
|---|---|
| 일일 운영 | 2026년 7월부터 운영 (2026년 6월 로그 포함) |
| 정확한 검색 인덱스 재빌드 (리디자인 전/후) | 40초 → 1.24초 |
| 벡터 인덱스 행 수 (최악의 경우) | 865,588행 (2026년 9월 4일) → 수정 후 124,174행 |
| 벡터 저장소 크기 | 2.54GB → 337MB |
| 재인덱싱 간격 | 10분 |
이 수치들은 저자의 단일 사용자 배포에서 얻은 것으로, 리디자인의 실질적 영향을 보여줍니다.
왜 손실 없는 접근인가요?
저자는 매일 AI 어시스턴트와 대화하는 사람을 위해 이 시스템을 만들었습니다. 요약은 정확한 표현, 어조, 타임스탬프를 버리며, 기억이 개인적인 느낌을 갖게 하는 요소들을 소실시킵니다. 요약을 거부함으로써, 시스템은 추가 디스크 공간과 강력한 시간 인덱스의 필요성이라는 비용을 치르지만, 전체 대화 텍스처를 보존합니다. 목표는 사용자가 인간처럼 기억하는 동반자이며, 소유한 하드웨어에서 완전히 동작하는 것입니다.
제한 사항과 열린 문제
- 단일 사용자, 단일 기계 – 다중 테넌트 지원 없음.
- 일본어 우선 시간 파싱 – 상대적 시간 표현은 일본어에서만 작동; 영어 사용자는 절대적 ISO 날짜를 제공해야 함.
- 로그 형식 – Claude Code의 JSONL에 최적화됨; 일반적인
{ts, role, text}임포터는 존재하지만, 검증은 덜 됨. - 공개된 벤치마크 없음 – 제공된 수치는 비교 성능 데이터가 아닌 운영 측정치임.
- 의미 검색은 로컬 임베딩 모델(sentence-transformers)에 의존함; GPU 가속은 선택 사항.
커뮤니티 피드백 (Hacker News 댓글)
"매우 흥미로운 정보 검색 접근법처럼 보입니다. 시간적/버전 기반의 연대기적 순서는 절대적으로 유용합니다." – alansaber
"이것이 https://github.com/obra/episodic-memory 와 어떻게 다릅니까?" – schainks
"상대적 시간 파서는 일본어에 하드코딩되어 있습니다; 영어 세션은 수동으로 ISO 날짜를 입력해야 합니다. dateparser나 duckling을 연결하는 데는 하루 정도면 충분하므로, 이 작업을 로드맵에 두는 것은 이상한 선택입니다." – TimByte
"처음에는 유용해 보일 수 있지만, 결국 이 시스템이 작동하지 않는 벽에 부딪히게 될 것입니다. 다른 기억 기법을 추가해야 하며, 결국 복잡한 다층 시스템이 되게 됩니다. 왜냐하면 사람들은 '기억'을 원할 때 실제로는 10가지 다른 것을 원하기 때문입니다. 각각은 별도의 해결책이 필요합니다." – 0xbadcafebee
"이 시스템은 캐시를 자주 깨뜨릴 것 같습니다. 이는 특정 제공자에서는 요금이 증가하고, 로컬 모델의 경우 긴 실행 시간의 에이전트 세션에서는 응답 생성에 오랜 시간이 걸릴 것입니다." – theresLand
이 댓글들은 시간 중심 접근에 대한 열정과 언어 지원, 확장성, 기존 캐시 또는 기억 프레임워크와의 통합에 대한 우려를 드러냅니다.
시작하기
git clone https://github.com/aru-labs/lossless-memory
cd lossless-memory
pip install -e .
cp config.example.json config.json # 이름과 경로를 필요에 따라 편집
examples/quickstart.md 가이드를 따라 샘플 대화를 인게스트하고, 인덱스를 구축하며, 시간 범위 쿼리를 실행하세요 (약 5분). pytest 라운드트립 테스트로 전체 파이프라인을 검증합니다.
문서 및 추가 읽기
| 문서 | 범위 |
|---|---|
docs/memory-system.md |
개념 및 사양 |
docs/temporal-backbone.md |
시간 우선 인덱싱 및 표현 파싱 |
docs/lll.md |
주제 마커 인덱스 및 인간/AI의 책임 |
docs/philosophy.md |
요약 회피의 논리 |
docs/lessons.md |
실패, 수정 및 성능 수치 |
docs/ja/ |
원본 일본어 텍스트 |
라이선스
MIT 라이선스 (c) 2026 Aru & Cece.
Sources
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트