「어제 했던 이야기, 기억해?」가 성립하지 않는 것이 계속 불만이었다
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