AI도 건망증이 있다 - Claude-Mem 리뷰
Claude Code를 사용한 지 일 년쯤 되어간다. 정말 잘 쓰고 있지만 한 가지 아쉬운 점이 있었다. 같은 프로젝트에서 오래 작업할수록 이전에 질문했던 내용을 점점 까먹는다는 것이다. 특히 compact라는 작업을 거치고 나면 망각이 더 심해지는 느낌이었다.
AI를 대하는 태도의 변화
LLM을 오랫동안 사용해오면서 주로 코드 리뷰나 아키텍처 질문, 현재 진행하는 프로젝트에 대해 물어보기만 급급했다. AI가 어떻게 돌아가는지 굳이 알 필요 없다고 생각했다. 천재 개발자들이 만들어준 거 잘 쓰면 된다는 느낌이었다.
그런데 요즘 일하는 환경이 처음 GPT가 나왔을 때와는 너무 달라졌다는 걸 자각하기 시작했다. AI 에이전트를 얼마나 효율적으로 쓸 수 있을지가 점점 하나의 관심사로 자리 잡게 되었다.
Claude Code의 기본 라이프사이클
Claude Code가 대화를 어떻게 관리하는지 먼저 이해할 필요가 있다.
세션 시작 → 대화 진행 → 컨텍스트 누적 → 한계 도달 → compact(요약) → 계속 진행
↓
정보 손실 발생
Claude Code는 대화가 길어지면 컨텍스트 윈도우 한계에 도달한다. 이때 자동으로 이전 대화를 요약해서 압축하는데, 이 과정에서 세부 정보가 손실된다. 요약은 결국 정보의 손실이다.
저장 위치
Claude Code는 프로젝트 경로를 폴더명으로 인코딩해서 ~/.claude/projects/에 저장한다.
~/.claude/projects/
├── C--Users-devgo-Projects-my-app/
│ ├── abc123.jsonl ← 세션 1
│ ├── def456.jsonl ← 세션 2
│ └── ...
예를 들어 C:\Users\devgo\Projects\my-app 경로는 C--Users-devgo-Projects-my-app이라는 폴더가 된다. 각 세션은 UUID.jsonl 파일로 기록된다.
문제점
- 세션 내에서 compact가 발생하면 이전 맥락이 요약되면서 세부 정보 손실
- 세션을 새로 시작하면 이전 세션의 내용을 전혀 모름
- 저장은 되지만 검색이 안 됨 — 그냥 로그 파일일 뿐
세션을 바꾸지 않고 계속 작업하면 괜찮을 줄 알았는데, 오히려 컨텍스트가 커질수록 응답이 느려지고 망각도 발생했다.
첫 번째 시도: mcp-knowledge-graph
이 문제를 해결하려고 처음 사용한 MCP가 mcp-knowledge-graph다.
이 도구는 AIM(AI Memory)이라는 저장 방식을 사용한다. 프로젝트 루트에 .aim 폴더를 만들고, 엔티티(entity)와 관계(relation)를 JSON 형태로 저장한다. 지식 그래프 구조로 정보를 연결하는 방식이다.
장점
- 이전보다는 필요한 내용을 더 잘 기억함
- 엔티티 단위로 정보를 구조화
단점
- 자동이 아님 — Claude에게 "이거 기억해"라고 명시적으로 말해야 저장됨
CLAUDE.md에 프롬프트를 넣어서 자동화를 시도했지만, 일관성이 떨어졌음- 프로젝트마다
.aim폴더를 만들어야 하는 번거로움 - 검색이 직관적이지 않음
아쉬운 대로 사용했지만, 내가 원하는 "알아서 기억하고 알아서 꺼내주는" 느낌은 아니었다.
Claude-Mem의 등장
그리고 결국 Claude-Mem이 등장했다.. 주말동안 사용하면서 느낀건데, 바로 체감이 될정도로 편하다는 것이다. 일부러 세션을 새로 시작하면서 의미없는 프로젝트를 몇번 갈아치웠는데, 너무 마음에 든다.
아키텍처
Claude-Mem은 6개 컴포넌트로 구성된다.
- Lifecycle Hooks: 5개의 훅(SessionStart, UserPromptSubmit, PostToolUse, Stop, SessionEnd)으로 세션 생명주기 감지
- Smart Install: 의존성 캐시 검증
- Worker Service: localhost:37777에서 HTTP API + 웹 UI 제공
- SQLite DB: 세션, 관찰(observation), 요약 저장
- Chroma Vector DB: 의미 기반 검색 지원
- mem-search Skill: 자연어로 메모리 검색
이 중에서 자동 캡처의 핵심은 PostToolUse 훅이다. Claude가 도구(파일 읽기, 검색, 코드 실행 등)를 사용할 때마다 이 훅이 트리거되어 결과를 자동으로 저장한다. 내가 "기억해"라고 말할 필요가 없다.
3-Layer 검색
검색할 때 모든 내용을 한 번에 가져오지 않는다. Progressive Disclosure 전략을 사용한다. 번역이 점진적인 폭로..? 라길래 찾아보니 점진적인 노출로 이해하면 될 것 같다.
[claude]
UI/UX 디자인 원칙 중 하나로, 사용자에게 필요한 정보나 기능을 한꺼번에 다 보여주지 않고, 단계적으로 드러내는 방식을 말해요.
핵심 아이디어는:
- 처음엔 가장 중요하고 자주 쓰는 것만 보여줌
- 사용자가 더 깊이 탐색하거나 특정 액션을 할 때 추가 옵션/정보를 노출
- 인터페이스의 복잡도를 줄여서 인지 부하를 낮춤
대략적인 알고리즘은 다음과 같다.
1. search(query) → 인덱스만 반환 (~50-100 토큰)
2. timeline(anchor=ID) → 시간순 맥락 확인
3. get_observations() → 필요한 것만 상세 조회 (~500-1000 토큰)
전체를 다 가져오는 것 대비 약 10배 토큰 절약 효과가 있다고 한다.
비교 정리
| 구분 | Claude Code 기본 | mcp-knowledge-graph | Claude-Mem |
|---|---|---|---|
| 저장 | jsonl 로그 | .aim 폴더 (JSON) | SQLite + Vector DB |
| 자동화 | X | △ (프롬프트 의존) | O (훅 기반) |
| 검색 | X | △ | O (시맨틱 검색) |
| 세션 간 공유 | X | O | O |
Hook과 Skill이란
Hook은 웹 개발에서 webhook을 다뤄봤다면 비슷한 개념이다. 특정 이벤트가 발생하면 자동으로 뭔가를 실행시키는 것. Skill은 플러그인이 제공하는 슬래시 명령어다. Claude Code의 기본 명령어(/clear, /resume 등)와 비슷하지만, 플러그인을 통해 추가되는 확장 명령어라고 보면 된다.
Hook (훅)
특정 이벤트가 발생할 때 자동으로 실행되는 코드다. 갈고리처럼 이벤트에 걸어두면, 그 이벤트가 발생할 때마다 실행된다.
- SessionStart: 세션이 시작될 때
- UserPromptSubmit: 사용자가 메시지를 보낼 때
- PostToolUse: Claude가 도구를 사용한 후
- Stop: 작업이 중단될 때
- SessionEnd: 세션이 종료될 때
Claude-Mem은 이 훅들을 활용해서 사용자가 별도로 명령하지 않아도 자동으로 컨텍스트를 캡처한다.
Skill (스킬)
Claude Code에서 특정 기능을 수행하는 명령어 모음이다. /mem-search처럼 슬래시 명령어로 실행할 수 있다. Claude-Mem의 mem-search Skill은 저장된 메모리를 자연어로 검색하는 기능을 제공한다.
웹 UI로 메모리 확인
Claude-Mem은 localhost:37777에서 웹 UI를 제공한다. 프로젝트별로 저장된 관찰(observation) 목록을 확인할 수 있고, Claude가 도구를 사용할 때마다 실시간으로 새로운 항목이 추가되는 걸 볼 수 있다.
핵심은 이 데이터가 SQLite 데이터베이스에 영구 저장된다는 점이다. Claude Code의 기본 세션 로그(jsonl)는 세션이 끝나면 그냥 파일로 남을 뿐이지만, Claude-Mem은 별도 DB에 구조화해서 저장하기 때문에 세션이 바뀌어도, 심지어 Claude Code를 재시작해도 이전 맥락을 검색해서 꺼내올 수 있다.
마치며
아직 Claude-Mem을 설치한 지 얼마 안 돼서 장기적인 평가는 어렵다. 하지만 "자동으로 캡처하고, 필요할 때 검색해서 꺼내준다"는 컨셉은 내가 원하던 방향과 맞다.
세션이 바뀌어도, compact가 되어도, 중요한 맥락은 별도로 저장되어 있으니까. 앞으로 좀 더 써보면서 실제로 얼마나 효과가 있는지 확인해볼 생각이다.
이 글은 Conversations with AI 시리즈의 일부입니다.