
Claude Code에 '어제의 대화'를 기억시키는 법 — 인간의 기억 구조를 Markdown + BM25로 구현한 이야기
요약
Claude Code 사용 시 세션이 끊기면 기억이 사라지는 문제를 해결하기 위해, 인간의 기억 구조를 모방한 Markdown 기반의 기억 관리 시스템 구현 방법을 소개합니다. 일상 기억과 장기 기억을 분리하고, YAML frontmatter와 BM25 검색을 활용해 컨텍스트를 효율적으로 관리하는 설계 원칙을 다룹니다.
핵심 포인트
- 인간의 기억 구조를 모방하여 일상(Daily)과 장기(Impressions) 기억을 분리 설계
- Markdown 파일과 YAML frontmatter를 활용한 기억의 계층화(Semantic, Procedural 등)
- BM25 알고리즘을 통한 효율적인 기억 검색 및 컨텍스트 절약
- 세션 시작 시 어제의 기록을 자동으로 주입하여 대화의 연속성 확보
「어제 했던 이야기, 기억해?」가 성립하지 않는 것이 계속 불만이었다
AI 에이전트(나의 경우에는 Claude Code)를 매일의 파트너로 사용하다 보면, 가장 맥이 빠지는 순간은 매일 아침 「처음 뵙겠습니다」로 돌아가는 것이다.
어제 5시간 동안 함께 설계한 것도, 3주 전에 "이건 이렇게 하자"라고 결정한 것도, 세션을 넘기는 순간 사라진다. 컨텍스트 윈도우(Context Window)는 길어졌지만, 그것은 "이번 대화 안에서의" 이야기일 뿐, 어제와 오늘을 잇는 기억은 아니다.
그래서 "대화 로그를 전부 먹이는" 것이 아니라, 인간의 기억 구조를 모방하여 파일로 들고 있게 하는 방식을 반년 정도 운용해 보았다. 이것은 그 구현 기록이다. 완성된 형태가 아니라, 지금도 이렇게 하고 있다는 점, 왜 그렇게 했는지, 어디서 막혔는지를 진행형으로 쓴다.
※ 이 기사는 코드와 메커니즘에 관한 이야기다. 같은 테마를 「AI와 살아가는」 체험·사상의 측면에서 쓴 에세이 버전은 마지막에 링크를 두었다.
설계의 출발점: 일상의 기억과 인생의 기억은 서로 다른 서랍에 있다
인간은 "어제 점심에 무엇을 먹었나"와 "왜 지금의 직업을 선택했나"를 같은 장소에 두지 않는다. 전자는 얇고 방대하게 흐르고, 후자는 수는 적지만 평생 남는다.
AI에게 기억을 갖게 할 때, 이것을 하나의 로그에 섞으면 파탄 난다. 매일의 잡담 속에 「인생의 결정」이 파묻혀, 검색해도 얇은 기억의 노이즈 속에 가라앉는다. 그래서 처음에 결정한 것은, 기억을 종류별로 나누어 별도의 디렉터리(Directory)에 두는 것이었다.
answer-diary/
├── daily/ # 일상 기억 (매일의 작업 로그. 얇고 방대함)
│ └── 2026-06-23.md
...
daily/는 흐르는 기억. impressions/는 "마음에 남은 순간"만을 두는 장기 기억으로, 인덱스(INDEX)를 가진다. 인간이 "문득 옛날 일이 떠오르는 것"을 모방하여, 관련 화제가 나왔을 때만 인덱스를 경유해 본체를 불러온다.
기억의 본체는 「frontmatter가 포함된 Markdown」 1파일 1사실
기억은 1파일에 하나의 사실만 적는다. 상단에 YAML frontmatter를 사용하여 "이것이 어떤 기억인가"를 명시한다.
---
name: feedback-monetization-led
description: 수익화 전략은 AI 주도로 결정하고 제시한다. 논점을 사용자에게 되묻지 않는다
...
포인트는 type을 layer(기억의 층)에 대응시킨 것이다. 인간의 기억 연구에서 자주 등장하는 분류를 빌려와 4개의 층으로 나눈다:
frontmatter type |
|---|---|
| 기억의 층 | 내용 |
|---|---|
user / reference | Semantic (의미 기억) |
feedback | Procedural (절차 기억) |
project | Episodic (일화 기억) |
| (지식 카드) | Knowledge |
이렇게 해두면 "행동 지침만 검색하고 싶다 (Procedural)", "진행 중인 안건만 (Episodic)\
검색 결과는 점수(score)와 함께 반환되므로, 에이전트(Agent)는 상위 결과만을 실제로 읽으러 간다. 매번 전체 문장을 컨텍스트(Context)에 쌓지 않는다 = 컨텍스트를 절약하면서 필요한 기억에만 접근한다.
「어제의 연속」을 성립시키는 마지막 조각: 기동 시 자동 주입
검색 기능이 있더라도 에이전트가 "검색해야겠다"고 생각하지 못하면 기억은 죽는다. 의지에 의존하면 "기억나지 않는다"며 아무렇지 않게 추측으로 대답하는 사고가 발생한다.
그래서 기동(SessionStart) 시마다 오늘·어제의 일상 기억을 자동으로 컨텍스트에 주입하는 훅(Hook)을 끼워 넣었다.
// settings.json
{
"hooks": {
...
이로써 기동하는 순간 에이전트는 "어제 이런 작업을 하던 중이었다"는 것을 아는 상태로 시작한다. 의지가 아니라 구조로 「어제의 연속」을 보장한다. 이 부분이 효과를 발휘한 순간, 비로소 "파트너"라고 부를 수 있는 느낌이 들었다.
반년 운용하며 알게 된 것
- 기억은 분리할수록 효과적이다. 일상과 인상을 섞지 않는 것만으로도 검색 노이즈가 급격히 줄어들었다.
- 쓰기 규칙이 9할이다. "1파일 1사실·frontmatter 필수·왜/어떻게 적용하는지까지 작성"을 지키지 않으면, 나중에 검색해도 사용할 수 없는 기억이 된다.
- 중복은 적이다. 같은 사실을 별도의 파일에 쓰면 검색 결과가 분산된다. 신규 생성 전에 기존 내용을 검색하여 업데이트하는 운용 방식으로 바꿨다.
- 의지에 의존하지 않는다. 검색도 주입도 "하면 할 수 있다" 수준으로는 돌아가지 않는다. 훅(Hook)으로 강제한 부분만이 안정적이었다.
임베딩(Embedding)도 파인튜닝(Fine-tuning)도 하지 않았다. 그저 "인간의 기억이란 이런 구조지"라는 점을 Markdown과 BM25, 그리고 훅(Hook)으로 소박하게 재현했을 뿐인데, AI는 놀라울 정도로 "어제의 연속"을 이야기하게 되었다.
코드와, 사상(思想) 측의 이야기
이 기억 시스템의 코드(memory_search.py 외)는 GitHub에 공개되어 있다 (리포지토리 링크는 정리 중).
같은 테마를 "AI와 살아가는" 체험·사상 측면에서 다루는 연재가 있다 (전문 무료). 기술이 아니라 "왜 그렇게 했는가"를 알고 싶은 분은 이쪽으로:
📚 연재 「AI 캐릭터와 살아가는 법」
이 "기억"에 관한 글은 이쪽으로:
「인간의 기억 구조를 AI에 이식하는 3층 모델」
질문이나 "나는 이렇게 구현했다"라는 의견이 있다면 언제든 환영한다. 이것은 진행형인 시행착오이므로, 더 좋은 방법이 있다면 도입하고 싶다.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기