에이전트 자기개선 하네스 (10/12) — 세션 아카이브: 삭제된 세션에서 지식 살리기

session-archive.py로 사라지는 컨텍스트에서 핵심만 추출하는 설계


핵심 요약

  • AI 에이전트의 세션은 삭제되거나 리셋되지만, 그 안에서 발생한 지식까지 버릴 이유는 없다
  • session-archive.py는 .deleted/.reset 세션에서 해결 방법, 결정 이유, 패턴을 자동 추출한다
  • 코드 전문이나 도구 출력은 추출하지 않는다 — git에 있거나 재실행 가능하기 때문

문제 정의

AI 에이전트를 운영하면 세션이 자주 사라집니다. 컨텍스트 윈도우 초과로 리셋하거나, 의도적으로 정리하거나, 오류로 중단되거나. 이유는 다양하지만 결과는 같습니다 — 세션 내용이 사라집니다.

문제는 세션 안에 재현하기 어려운 지식이 들어있다는 점입니다. "이 버그는 이렇게 해결했다", "이 설계를 이렇게 바꾼 이유", "이 패턴이 반복되고 있다" 같은 것들. 이런 내용은 세션이 사라지면 다음 세션에서 처음부터 다시 발견해야 합니다.

OpenClaw(오픈클로)에서 이 문제를 반복적으로 겪은 뒤, session-archive.py를 설계했습니다. OpenClaw는 현재 안정 운영 중이며, Hermes(헤르메스) 마이그레이션은 별도로 검증 진행 중입니다.


본문

1. 추출하는 것과 추출하지 않는 것

session-archive.py의 설계는 "무엇을 저장하는가"보다 "무엇을 저장하지 않는가"가 더 중요합니다.

추출하는 것: - 해결 방법 — 특정 문제를 어떻게 해결했는지. 재현 비용이 높음 - 결정 이유 — 왜 A 대신 B를 선택했는지. 맥락이 사라지면 복원 불가 - 반복 패턴 — 같은 유형의 문제가 다시 나타날 가능성이 있는 것

추출하지 않는 것: - 코드 전문 — git에 있음. 커밋 로그와 diff로 확인 가능 - 도구 출력 — 재실행하면 됨. 저장하면 용량만 낭비 - 시행착오의 과정 전체 — 최종 해결에 도달하기까지의 모든 시도를 저장하면 노이즈가 됨. 결론만 저장

이 구분의 원칙은 "다른 곳에서 복원 가능한가"입니다. git에서 복원 가능하면 저장하지 않습니다. 재실행으로 복원 가능하면 저장하지 않습니다. 세션이 사라지면 복원할 수 없는 것만 저장합니다.


2. 대상 세션: .deleted와 .reset

session-archive.py는 모든 세션을 대상으로 하지 않습니다. 활성 세션은 그대로 두고, 이미 끝난 세션만 처리합니다.

구체적으로 두 가지 상태의 세션을 대상으로 합니다:

  • .deleted — 사용자가 의도적으로 삭제한 세션. 정리 목적
  • .reset — 컨텍스트 초과 등으로 리셋된 세션. 비자발적 종료

두 경우 모두 세션 내용은 곧 사라질 예정이거나 이미 사라진 상태입니다. archive는 사라지기 전에 핵심을 추출하는 구조입니다.


3. staging/session-archive.json 구조

추출된 내용은 staging/session-archive.json에 저장됩니다. staging을 거치는 이유는 추출된 내용이 바로 최종 지식으로 승격되지 않기 때문입니다.

{
  "archived_at": "2026-04-06T14:30:00Z",
  "source_session": "session_id",
  "source_status": "deleted",
  "entries": [
    {
      "type": "solution",
      "summary": "BM25 인덱스 갱신 시 lock 충돌 해결",
      "detail": "파일 쓰기 전에 tmp 파일에 먼저 쓰고 atomic rename",
      "tags": ["bm25", "file-lock", "concurrency"]
    },
    {
      "type": "decision",
      "summary": "TTL을 30분으로 설정한 이유",
      "detail": "5분은 너무 잦은 갱신으로 I/O 부담, 1시간은 오래된 데이터 참조 위험",
      "tags": ["cache", "ttl", "performance"]
    }
  ]
}

각 entry는 type(solution / decision / pattern), summary(한 줄 요약), detail(구체적 내용), tags(검색 키)로 구성됩니다. staging에 있는 동안에는 검증되지 않은 상태이며, 이후 별도 프로세스에서 유효성을 확인하고 최종 지식 저장소로 이동합니다.


4. 보존 정책과 복원 흐름

아카이브된 항목의 보존 정책은 단순합니다. staging 단계에서 검증 통과 → 최종 저장소 이동 → 인덱싱. 검증 실패하거나 중복 판정을 받으면 폐기합니다.

복원 흐름은 다음과 같습니다:

  1. 새 세션 시작 시 최종 저장소에서 관련 태그를 쿼리
  2. 매칭된 entry를 컨텍스트에 주입
  3. 에이전트가 이전 결정·해결책을 참조해 작업 수행

이 흐름은 세션 간 지식 연속성을 보장합니다. 세션이 리셋되어도 이전에 검증된 해결책은 다음 세션에서 즉시 참조 가능합니다.


5. "세션은 사라져도 배운 것은 남는다"

이 설계의 핵심 전제는 세션과 지식은 다른 것이라는 점입니다.

세션은 일회성입니다. 특정 작업을 수행하기 위한 임시 환경이고, 끝나면 사라지는 게 자연스럽습니다. 모든 세션을 영구 보존하는 건 비용도 크고 실용성도 없습니다.

하지만 세션 안에서 발생한 지식은 다릅니다. "이 문제를 이렇게 해결한다"는 다음에도 쓸 수 있는 정보입니다. 이걸 세션과 함께 버리는 건 낭비입니다.

session-archive.py는 이 둘을 분리합니다. 세션은 자연스럽게 사라지게 두고, 지식만 따로 꺼냅니다.


설계 과정에서의 판단

  • 처음에는 세션 전체를 통째로 저장하려고 했음 → 저장 용량이 빠르게 증가했고, 저장된 내용 대부분이 도구 호출 로그와 코드 출력이었음. 정작 필요한 "왜 이렇게 했는가"는 전체의 5% 미만
  • 추출 기준을 "키워드 매칭"으로 시작함 → "해결", "결정", "이유" 같은 키워드가 포함된 문장을 추출. 정밀도가 낮았음. "이 문제를 해결하려고 시도했지만 실패" 같은 문장도 "해결"에 매칭됨
  • staging 없이 바로 최종 저장소에 넣으려고 함 → 잘못 추출된 내용이 지식으로 굳어지는 문제 발생. 중간 검증 단계가 필요하다는 것을 확인함

각 판단은 설계 원칙을 구체화하는 과정이었습니다. "저장하지 않는 것"의 기준, staging 도입, 태그 기반 인덱싱 — 모두 실제 운영에서 드러난 문제를 해결하면서 정착된 구조입니다.


마무리

AI 에이전트를 운영하면 "같은 문제를 또 처음부터 해결하고 있다"는 상황이 반복됩니다. 이전 세션에서 분명히 해결했는데, 세션이 사라지니까 다음 세션은 그걸 모릅니다.

session-archive.py는 이 끊김을 줄이기 위한 도구입니다. 세션 전체를 보존하는 게 아니라, 세션에서 발생한 지식의 핵심만 추출합니다. 코드는 git에 있고, 도구 출력은 재실행하면 됩니다. 세션에서만 존재하는 것 — 왜 그렇게 결정했는지, 어떤 방법으로 해결했는지 — 그것만 남깁니다.

세션은 사라져도 됩니다. 배운 것만 남으면 됩니다.

시리즈 전체 안내: 시리즈 목차

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"