"Memory Systems — 컨텍스트 밖에서 정보를 보존하는 법 (하네스 시리즈 3/6)"
Part 2에서 컨텍스트 윈도우는 작게 쓰는 게 답이라고 했다. 그럼 옛 정보는 어디로 가는가? 답은 외부 메모리 시스템. 2026년 들어 메모리 자체가 별도 인프라 영역이 됐다.
이 글은 LLM 에이전트의 메모리를 다룬다. 단기·장기·세 종류, 벡터 vs 그래프, Mem0/Zep 같은 솔루션, 그리고 직접 구축할 때 SQLite+FTS5와 Pinecone 사이 어디가 실용적 출발점인지.
시리즈 (6편)
- 하네스 엔지니어링이란
- Context Engineering
- Memory Systems ← 이 글
- Tools & Sandboxing
- Multi-Provider Routing
- Evaluation & Ops
1. 메모리 = 컨텍스트 윈도우의 연장이 아니다
흔한 오해: "컨텍스트가 메모리다."
정확한 구분: - 컨텍스트 = 현재 turn의 모델 입력 (휘발성, 비용 발생) - 메모리 = 세션을 넘어 보존하는 외부 저장 (영속, 검색 가능)
컨텍스트는 매 turn 새로 채워진다. 메모리는 매 turn 어떤 부분만 골라 컨텍스트에 주입된다.
2026년 합의: "메모리는 first-class 아키텍처 컴포넌트다." 자체 벤치마크(LoCoMo, LongMemEval), 자체 연구 문헌, 측정 가능한 성능 격차, 전용 도구 생태계가 형성됨.
2. 세 가지 메모리 유형
2-1. Episodic (일화 기억)
무엇이 일어났는가. 시간 순서가 있는 사건들. - "사용자가 어제 X 함수를 만들었다" - "지난 세션에서 인증 모듈을 리팩터했다"
2-2. Semantic (의미 기억)
무엇을 알고 있는가. 시점 무관 사실. - "사용자는 Python 개발자" - "프로젝트는 PostgreSQL을 쓴다"
2-3. Procedural (절차 기억) — 2026년 새로 도입
어떻게 하는가. 반복되는 절차를 저장. - "이 프로젝트의 PR 절차: lint → test → review → merge" - "이 사용자는 commit 전에 conventional commits 형식 검증"
Mem0 v1.0.0 API에서 명시적으로 추가됨 (2026). 이전에는 episodic + semantic만 있었음.
3. 벡터 vs 그래프 vs SQL/FTS5
벡터 메모리 (semantic search)
- 질문을 임베딩 → 가장 유사한 메모리 N개 회수
- 장점: 의미적 근접, fuzzy 매칭
- 단점: 정확한 관계 표현 약함
예: 사용자가 "Python 언급함"을 검색하면 잘 찾음.
그래프 메모리 (relational reasoning)
- 사건·엔티티·관계를 그래프로 저장
- 장점: 다단계 추론 ("X가 Y의 무엇이고, Y는 Z의 일부")
- 단점: 구축·유지 비용 ↑
예: "사용자는 Python 개발, 데이터 파이프라인 담당, pandas 사용, 회사는 dbt 사용, Spark에서 마이그레이션 중" — 이런 연결된 사실을 회수.
SQL + FTS5 (키워드 + 구조화)
- SQLite의 FTS5 모듈은 빠르고 가벼운 키워드 검색
- 장점: 인프라 zero (단일 파일), 4,300 메모리 검색 1ms 미만
- 단점: fuzzy 검색 약함, 임베딩 의미 검색 없음
Pinecone p95 지연 25~50ms. SQLite+FTS5는 같은 규모에서 1ms 미만. 단순 키워드 매칭이면 SQL이 압승.
하이브리드 (RRF — Reciprocal Rank Fusion)
- 벡터 검색 결과 top-N + FTS5 결과 top-N → RRF로 결합
- 의미 + 키워드 양쪽 강점 활용
- OpenClaw memcore와 wikycore가 이 패턴 사용
4. 솔루션 비교 (2026-04 기준)
Mem0 (managed)
- 포지션: 사용자 personalization + 비용 효율 최적화
- 핵심 기술: Memory Compression Engine — chat history를 고밀도 표현으로 압축
- 효과: prompt 토큰 80% 절감 주장
- 가격: 관리형 SaaS. 자체 호스팅도 가능 (open source).
Zep (graph)
- 포지션: 시간 인식 지식 그래프
- 핵심 기술: Temporal Knowledge Graph — 사실의 시점까지 저장
- 장점: "X가 과거에는 Python을 썼지만 현재는 Rust" 같은 시간 의존 질의 가능
- 지연: 서브초
Memanto (학술)
- arXiv 2604.22085
- "Typed Semantic Memory with Information-Theoretic Retrieval for Long-Horizon Agents"
- 정보이론 기반 회수 — 메모리 항목을 불확실성 감소로 정렬
MemMachine (학술)
- arXiv 2604.04853
- "Ground-Truth-Preserving Memory System for Personalized AI Agents"
- 원본 정보 보존을 우선하는 압축 정책
memcore (OpenClaw)
- SQLite + 벡터 + RRF + memory layers (3-tier)
- Plan / Lessons / Sessions 패턴
- v0.5에서 MemPalace 기법 도입 (위치 기반 회상)
5. 실전 패턴
5-1. 3-Layer Memory (CLAUDE.md 표준)
Layer 1: Project Knowledge (docs/) — 영구, 키워드 인덱스
Layer 2: Behavioral Rules (lessons.md) — 무엇을 할/말 것인가
Layer 3: Session Restore (sessions/) — 휘발성 스냅샷
CLAUDE.md 패턴은 이 3계층을 권장. Claude Code, OpenClaw, Hermes 모두 이 골조 사용.
5-2. Auto-Harvesting
세션 종료 시 자동으로 새 학습을 적절한 레이어에 저장: - 에러 해결 → lessons.md - 새 도메인 지식 → docs/{category}/ - 진행 상태 → sessions/
CLAUDE.md "Automatic Memory Harvesting (Instinct Pattern)" 섹션이 이 흐름.
5-3. Dedup + Cascade Update
- 같은 패턴 2회 → 규칙 승격 (lessons.md count 증가)
- 새 정보가 기존 메모리와 충돌 → 충돌 표시 + 사용자 확인
- 한 사실 변경 → memory-map.md로 연결된 다른 파일까지 검토
5-4. Eviction 정책
무한 누적은 노이즈만 늘림. 정책 예: - Time-based: 90일 이상 미사용 → archive - Use-based: count < 2이고 30일 미사용 → 제거 - LRU: 컨텍스트 압박 시 가장 오래된 것부터
6. SQL vs Vector — 어느 것부터?
시작 단계 (개인 프로젝트, 사용자 1명)
SQL + FTS5 단독 - SQLite 파일 1개로 시작 - 100~10,000 메모리 규모는 충분 - 인프라 zero, 백업 = 파일 복사 - OpenClaw memcore 초기 버전이 이렇게 시작했음
중간 단계 (다중 사용자, 1만 메모리 이상)
SQL + FTS5 + 벡터 (하이브리드) - Chroma 또는 Qdrant 추가 - bge-m3 임베딩 (oMLX에서 무료 로컬 가능) - RRF로 결과 결합
대규모 (수백만 메모리)
Mem0 / Zep / 자체 인프라 - Mem0: 사용자 인격 추출 자동화 - Zep: 시간 그래프 + 복잡 관계 - 자체 구축: ElastiCache + Neptune Analytics (AWS) 패턴
7. Anti-patterns
7-1. "벡터 DB 안 쓰면 후진"
4,300 메모리에서 SQLite+FTS5는 1ms, Pinecone p95는 25~50ms. 인프라 비용도 SQLite가 zero. 시작은 SQL.
7-2. "다 넣자, 어차피 검색하면 됨"
무한 누적 → 노이즈 폭발. eviction 정책 없으면 1년 후 검색 정확도 떨어짐.
7-3. "메모리는 한 번 쓰고 끝"
메모리는 살아있는 시스템. 갱신·충돌 해결·archive 흐름 없으면 stale 메모리가 잘못된 답으로 이끔.
CLAUDE.md 인용: "memory records can become stale over time. Verify before using."
7-4. "임베딩 모델 한번 정하고 끝"
임베딩 모델이 바뀌면 기존 벡터 무용지물. 마이그레이션 비용 막대. 처음에 잘 골라야 함 (bge-m3, voyage-3 같은 검증된 것).
8. Knowledge Graph (KG) 관점
2026년 들어 그래프 메모리가 부상. 이유: - LLM이 multi-hop reasoning을 잘 못함 (벡터 단독 회수의 한계) - 사실 간 관계가 단순 유사도로 잡히지 않음 - 시간 차원 (X 사실이 언제 진실이었는가) 표현
KG 메모리 구축 흐름
- 입력 (대화·문서) → entity 추출
- entity 간 관계 추출 (LLM이 직접 추출하거나 NER + 관계 분류기)
- 그래프 저장 (Neo4j, Neptune, 자체 SQLite)
- 질의 시 starting node → graph traversal → 관련 사실 회수
비용 vs 가치
- 구축: 매 입력마다 LLM 호출 → 비용 ↑
- 검색: graph traversal은 빠름
- 가치: multi-hop 질의에서 질적 차이
권장: 사용자별 personal assistant라면 Zep 같은 KG 메모리 권장. 단일 작업 에이전트(예: 코딩)라면 hybrid (SQL+벡터)로 충분.
정리
| 메모리 결정 | 권장 |
|---|---|
| 시작점 | SQLite + FTS5 |
| 의미 검색 추가 | + 벡터 (Chroma/Qdrant) + bge-m3 |
| 관계 추론 필요 | KG (Zep) |
| 사용자 personalization | Mem0 |
| 학술적 최첨단 | Memanto / MemMachine |
핵심 한 문장: "메모리는 컨텍스트의 연장이 아니라 별도 시스템이다."
다음 편(4/6)은 에이전트가 실제로 행동하는 영역 — Tools & Sandboxing.
참고 자료 (1차 출처)
- Mem0 State of AI Agent Memory 2026: mem0.ai/blog/state-of-ai-agent-memory-2026
- Memanto 논문: arxiv.org/abs/2604.22085
- MemMachine 논문: arxiv.org/abs/2604.04853
- AWS Mem0 + Neptune 통합: aws.amazon.com/blogs/database/build-persistent-memory-for-agentic-ai
- Zep Temporal Knowledge Graph: getzep.com
댓글
댓글 쓰기