ksungz
Engineering

AI 에이전트를 위한 Self-Improving 메모리 설계

세션이 끝나면 모든 걸 잊는 AI 에이전트에게 학습과 기억을 부여하는 파일 기반 메모리 시스템 설계기

Memory SystemSelf-ImprovingObsidianOpenClawAgent Design

문제: 에이전트는 매번 처음부터 시작한다

AI 에이전트의 가장 큰 한계는 기억이 없다는 것이다.

세션이 끝나면 그동안의 대화, 교정, 학습이 전부 사라진다. 어제 "이렇게 하지 마"라고 말한 걸 오늘 또 똑같이 한다. 같은 프로젝트에 대해 같은 질문을 반복한다. 컨텍스트를 매번 처음부터 설명해야 한다.

이 문제를 구조적으로 해결하고 싶었다. 에이전트가 시간이 지날수록 나아지는 시스템을 만들 수 있을까?

설계 원칙

시작하기 전에 세 가지 원칙을 정했다.

  1. 파일 기반이어야 한다 — 외부 DB나 벡터스토어 없이, 마크다운 파일만으로 동작해야 한다. 에이전트가 직접 읽고 쓸 수 있어야 하니까.

  2. 전부 로딩하면 안 된다 — 메모리가 쌓일수록 매 세션 시작이 느려진다. 필요한 것만 필요한 시점에 로딩해야 한다.

  3. 사람의 확인 없이 핵심 기억을 바꾸면 안 된다 — 에이전트가 스스로 "이건 중요하니까 핵심에 넣자"고 판단하면 위험하다. 잘못된 학습이 영구 기억이 되면 되돌리기 어렵다.

3단계 메모리 티어

인간의 기억 구조에서 힌트를 얻었다. 모든 기억을 동일하게 취급하지 않고, 중요도와 사용 빈도에 따라 계층화했다.

HOT  (항상 로딩)     ← 핵심 규칙, 최근 교정 사항
WARM (조건부 로딩)    ← 프로젝트별 컨텍스트, 도메인 지식
COLD (요청 시 로딩)   ← 오래된 기록, 아카이브

HOT — 항상 기억하는 것

세션이 시작될 때 무조건 로딩되는 메모리. 100줄 이내로 제한한다.

여기에는 "어떤 프로젝트든, 어떤 상황이든 반드시 지켜야 하는 것"만 들어간다. 예를 들어:

  • Discord에 마크다운 표를 보내지 말 것 (이미지로 변환)
  • 긴 결과는 파일에 저장하고 경로만 공유할 것
  • 특정 형식에 대한 사용자의 선호

100줄 제한이 핵심이다. 제한이 없으면 시간이 지날수록 HOT 메모리가 비대해지고, 정작 중요한 규칙이 묻힌다.

WARM — 맥락에 따라 꺼내는 것

프로젝트별, 도메인별로 분리된 메모리. 해당 프로젝트 작업을 시작할 때만 로딩된다.

domains/
  ├── code.md       ← 코딩 컨벤션 (200줄 이내)
  ├── writing.md    ← 문서화 스타일
  └── comms.md      ← 커뮤니케이션 형식

projects/
  ├── project-a.md  ← 프로젝트 A 고유 규칙
  └── project-b.md  ← 프로젝트 B 고유 규칙

각 파일 200줄 이내로 제한한다. 프로젝트 채널에 들어가면 해당 프로젝트의 WARM 메모리가 자동으로 로딩되는 구조다.

COLD — 거의 안 쓰지만 버리지 않는 것

90일 이상 사용되지 않은 메모리. 월별로 아카이브된다.

archive/
  └── 2026-05.md    ← 2026년 5월 아카이브

보통은 로딩되지 않지만, "예전에 이런 작업 했었는데..."라는 질문에 답할 수 있다.

승격과 디모션: 기억의 생명주기

메모리는 고정이 아니다. 사용 빈도에 따라 티어 간 이동한다.

승격 (WARM → HOT)

사용자가 같은 교정을 3회 반복
  → 승격 후보로 태깅
    → 사람이 확인
      → HOT 메모리에 추가

핵심은 자동 승격이 아니라 후보 제안이라는 점이다. 에이전트는 "이 패턴이 3번 반복됐습니다. HOT에 올릴까요?"라고 물어보고, 사람이 확인한 후에만 승격된다.

왜 자동으로 안 하느냐? 에이전트가 잘못 학습한 내용이 핵심 메모리에 들어가면, 이후 모든 세션에 영향을 준다. 한번 잘못 들어간 규칙을 발견하고 수정하는 비용이 매번 확인하는 비용보다 훨씬 크다.

디모션 (HOT → WARM → COLD)

30일 미사용 → 디모션 후보 리스트업
90일 미사용 → COLD 아카이브 이동 후보

이것도 자동 삭제가 아니라 후보 리스트업이다. "이 규칙 30일 동안 안 썼는데 내릴까요?"라고 보고하고, 사람이 판단한다.

Corrections: 교정이 학습이 되기까지

에이전트가 실수하고, 사용자가 교정하면 어떻게 될까?

기록

## 2026-05-28 — 표 전송 형식

- Context: Discord 보고서
- Correction: "표는 이미지로 전송해야 함"
- Lesson: 마크다운 표 → 이미지 변환 필수
- Count: 1/3 (승격까지 2회 남음)
- Status: 대기

한 번의 교정은 그냥 기록으로 남는다. 같은 패턴이 3번 반복되면 그때 승격 후보가 된다.

기록하지 않는 것

모든 피드백을 기록하면 노이즈가 쌓인다. 명확한 기준을 정해뒀다:

  • 기록함: 명시적 교정 ("이렇게 하지 마"), 명시적 선호 ("난 이 형식이 좋아"), 3회 이상 반복 패턴
  • 기록 안 함: 일회성 지시 ("이 파일만 수정해"), 침묵으로부터 유추 (반응 없음 ≠ 불만), 컨텍스트 종속 지시

이 구분이 없으면 corrections 파일이 금방 수백 줄이 되고, 진짜 중요한 교정이 묻힌다.

Self-Reflection: 에이전트의 자가 평가

교정은 "사용자가 알려준 것"이다. 그런데 사용자가 못 잡는 문제도 있다. 그래서 에이전트가 스스로 평가하는 구조도 만들었다.

복잡한 작업이 끝나면 에이전트가 자동으로 기록한다:

  • 의도한 결과 vs 실제 결과
  • 시간 효율성
  • 다음에 개선할 점
  • 이 문제가 이전에도 발생했는지 (패턴 감지)

이것도 바로 HOT에 올라가지 않는다. 반복 패턴이 감지되면 그때 corrections와 동일한 승격 프로세스를 탄다.

Heartbeat: 4시간마다 메모리 정리

메모리 시스템이 방치되면 쓸모없는 데이터가 쌓인다. 그래서 4시간 주기의 자동 점검 루프를 돌린다.

매 4시간마다:

  1. corrections 파일 스캔 → 3회 반복 패턴 탐지
  2. 프로젝트/도메인 메모리 중 30일 이상 미사용 항목 식별
  3. 파일 크기 제한 초과 여부 확인 (corrections 50줄, domains 200줄)
  4. 상태 파일 업데이트

점검 결과는 사람에게 보고되고, 실제 이동이나 삭제는 확인 후에만 실행된다.

실제로 달라진 것

이 시스템을 운영하면서 체감한 변화:

반복 교정이 줄었다. 이전에는 같은 말을 3~4번 해야 했는데, 이제는 한 번 교정하면 다음 세션부터 기록이 남아있다. 3번 반복되면 영구 기억이 된다.

프로젝트 전환이 빨라졌다. 5개 이상의 프로젝트를 동시에 관리하는데, 채널만 바꾸면 해당 프로젝트의 맥락이 자동으로 로딩된다. "이 프로젝트는 이런 규칙이 있어"를 매번 설명할 필요가 없다.

에이전트의 판단 품질이 올라갔다. HOT 메모리에 핵심 규칙이 축적되면서, 기본적인 실수가 줄었다. 특히 커뮤니케이션 형식 (Discord 보고 방식, 메시지 길이 등) 같은 반복 패턴에서 효과가 크다.

설계하면서 배운 것

  1. 제한이 곧 품질이다 — HOT 100줄, WARM 200줄 같은 하드캡이 없으면 메모리가 끝없이 비대해진다. "중요한 것만 남긴다"는 원칙을 강제하는 건 줄 수 제한이다.

  2. 자동화의 마지막 단계는 사람이어야 한다 — 승격, 디모션, 삭제 모두 자동 실행이 아니라 사람 확인을 거친다. 느리지만, 잘못된 학습이 시스템에 고착되는 것보다 낫다.

  3. 기록하지 않을 것을 정하는 게 더 중요하다 — 뭘 기록할지보다, 뭘 기록하지 않을지가 메모리 품질을 결정한다. 노이즈를 걸러내는 기준이 시스템의 핵심이다.