AI 에이전트가 스스로 진화하는 구조를 만들었다 — 자기개선 루프 설계기

스킬 자동 생성, 메모리 압축, 세션 아카이브까지 — 에이전트가 경험에서 배우는 법


핵심 요약

  • AI 에이전트에게 "경험에서 배우는 구조"를 구현하면, 세션이 거듭될수록 품질이 올라간다
  • 복잡한 작업 후 자동으로 스킬 후보를 생성하고, 문제 발견 시 즉시 패치하는 자기개선 루프
  • 메모리를 구조화하고 압축하여 컨텍스트 낭비를 줄이는 방법
  • 삭제된 세션에서도 핵심 지식을 자동 추출하는 세션 아카이브

배경

AI 에이전트를 운영하다 보면 반복되는 구조적 문제가 있습니다. 같은 유형의 작업을 할 때마다 비슷한 시행착오가 발생하고, 이전 세션의 성과가 다음 세션으로 이어지지 않으며, 컨텍스트가 길어질수록 성능이 저하됩니다.

사람은 경험에서 배워 다음에 더 잘 수행합니다. 에이전트도 동일한 원리로 동작하게 만들 수 있을까?

오픈클로 프로젝트에서 이 문제를 정면으로 다뤘습니다. 오픈클로는 보안 강화와 자기개선 구조가 안정적으로 구축된 멀티에이전트 플랫폼입니다. 에이전트가 작업 경험에서 자동으로 패턴을 추출하고, 스킬로 전환하고, 메모리를 정리하는 구조를 설계했습니다.


본문

1. 스킬 자기개선 루프 — 에이전트가 스킬을 스스로 만든다

일반적으로 에이전트의 스킬은 사람이 직접 작성합니다. 스킬 파일을 만들고, 절차를 기술하고, 트리거를 설정합니다.

그런데 에이전트가 복잡한 작업을 수행하면서 자연스럽게 패턴이 형성됩니다. 다수의 도구를 조합하거나, 에러를 복구하면서 해결 경로를 찾았을 때 — 그 과정 자체가 스킬 후보가 될 수 있습니다.

자기개선 루프의 작동 방식:

복잡한 작업 수행 (5+ 도구 사용, 에러 복구 포함)
  ↓
작업 완료 후 자동 분석
  ↓
반복 가능한 패턴 발견 시 skill-candidates.json에 후보 등록
  ↓
다음 작업에서 후보 스킬 적용
  ↓
문제 발견 시 즉시 패치

핵심은 3회 이상 반복된 패턴만 스킬로 승격한다는 것입니다. 한 번 나온 패턴은 우연일 수 있습니다. 세 번 반복되면 구조입니다.

스킬 후보가 등록되면 바로 프로덕션에 투입하지 않습니다. 다음 작업에서 시험 적용하고, 문제가 발견되면 즉시 패치합니다. "이렇게 하면 될 것 같은데?" → "해봤더니 이 부분이 문제네" → "수정했다"의 루프입니다.


2. 메모리 압축 — 500토큰 안에 핵심을 담는다

에이전트의 컨텍스트 윈도우는 유한합니다. 세션이 길어지면 초반 지시를 덜 따르고, 성능이 저하됩니다.

이 문제를 해결하기 위해 메모리 플러시(memory flush)를 구조화했습니다.

기존 방식: 에이전트가 자유 형식으로 메모리를 저장. 길이 제한 없이 도구 출력 전체를 포함하기도 함. 결과적으로 메모리가 비대해지고 컨텍스트를 낭비.

구조화된 방식:

## Memory Flush
- Goal: [이번 작업의 목표]
- Progress: [완료된 것 / 남은 것]
- Decisions: [내린 결정과 이유]
- Changed Files: [변경된 파일 목록]
- Blockers: [막힌 것]
- Next Steps: [다음 행동]

규칙은 세 가지입니다: 1. 도구 출력은 50줄 이상이면 요약만 저장 — 원본이 필요하면 다시 실행하면 됩니다 2. 500토큰 압축 목표 — 핵심만 남기는 강제 제약 3. 6개 필드 고정 — 자유 형식을 허용하면 점점 늘어납니다

이렇게 하면 세션을 이어받을 때 메모리를 읽는 데 드는 토큰이 최소화되고, 핵심 맥락은 유지됩니다.


3. 세션 아카이브 — 삭제된 세션에서도 배운다

Claude Code에서 세션을 삭제하거나 리셋하면 대화 내용이 사라집니다. 그 세션에서 얻은 인사이트까지 사라지면 손실입니다.

세션 아카이브는 이 문제를 구조적으로 해결합니다.

작동 방식:

세션 종료/삭제 감지
  ↓
session-archive.py 실행
  ↓
.deleted/.reset 세션에서 핵심 내용 자동 추출
  ↓
staging/session-archive.json에 저장

추출하는 것: - 해결한 문제와 해결 방법 - 내린 결정과 그 이유 - 발견한 패턴이나 주의사항

추출하지 않는 것: - 코드 전문 (코드는 git에 있음) - 도구 출력 원본 (재실행 가능) - 일시적 디버깅 과정

세션은 사라져도 그 세션에서 배운 것은 남습니다.


4. 관찰에서 검증까지 — 변증법 모델링

에이전트가 사용자 행동 패턴을 학습할 때, 관찰한 경향을 어떻게 검증할까요?

한 번의 관찰로 결론을 내리면 위험합니다. 사용자 태그(U-tag)에 변증법 모델을 적용했습니다.

3단계 검증:

단계 조건 의미
observation (관찰) 1회 관찰 "이런 경향이 보인다"
hypothesis (가설) 2회 이상 반복 "이런 패턴일 가능성이 높다"
verified (검증) 일정 기간 유지, 반증 없음 "확인된 패턴이다"

추가로 contradictions 필드로 반증을 추적합니다. "이 사용자는 데이터 기반 판단을 선호한다"가 verified 상태인데, 직감으로 결정한 사례가 나오면 contradiction으로 기록하고 상태를 재검토합니다.

행동 패턴에 대한 판단도 데이터처럼 검증이 필요합니다. 확인 편향을 방지하는 구조입니다.


5. 자동 코드 리뷰 — 3단계 분리

에이전트가 작성한 코드를 에이전트가 리뷰하는 구조도 개선했습니다.

기존: 한 번에 스캔 + 분석 + 수정을 동시에 수행. 과탐(false positive)이 많고, 수정 범위가 불확실.

개선: 3단계로 분리.

scan (스캔)
  ↓ 문제 후보 목록 생성
apply (분석 + 큐)
  ↓ 실제 문제만 필터링, 수정 큐에 등록
fix (배치 수정)
  → 한 번에 2파일, 10분 제한

생성과 검증을 분리하는 원칙입니다. 한 패스에서 코드를 만들면서 동시에 검증하면 둘 다 품질이 떨어집니다. 나눠야 각각 제대로 작동합니다.

배치 수정에 2파일/10분 제한을 둔 이유는 한 번에 많이 바꾸면 문제가 생겼을 때 원인 추적이 어렵기 때문입니다.


측정 결과 및 주의사항

  • 스킬 자동 생성의 함정: 초기 설계에서는 2회 반복으로 스킬 후보를 등록했습니다. 우연의 일치로 생긴 패턴이 스킬이 되는 문제가 발생했습니다. 임계값을 3회로 높인 뒤 품질이 안정됐습니다.

  • 메모리 압축이 너무 공격적이면 맥락을 잃습니다. 300토큰을 시도했을 때 "왜 이 결정을 내렸는지"가 누락되는 경우가 생겼습니다. 500토큰이 현재 균형점입니다.

  • 자기개선은 무한 루프가 될 수 있습니다. "스킬을 개선하는 스킬을 개선하는..." 같은 메타 루프를 방지해야 합니다. 자기개선은 실제 작업 후에만 트리거되도록 제한을 걸었습니다.

  • 헤르메스(Hermes) 전환 과정에서의 교훈: 오픈클로에서 헤르메스로의 전환 초기에 토큰 폭주 현상이 발생했습니다. 자기개선 루프가 충분히 검증되지 않은 상태에서 프로덕션에 투입된 것이 원인이었습니다. 현재는 오픈클로로 복귀 후 헤르메스를 재검증 중입니다. 이 경험에서 얻은 원칙: 자기개선 구조는 스테이징에서 충분히 검증한 뒤 프로덕션에 적용해야 합니다.


마무리

에이전트에게 자기개선 구조를 구현하면, 사용할수록 나아지는 시스템이 됩니다. 매번 같은 실수를 반복하지 않고, 경험에서 패턴을 추출하고, 메모리를 효율적으로 관리합니다.

핵심 원칙은 세 가지입니다: - 반복되면 자동화한다 (3회 → 스킬 승격) - 생성과 검증을 분리한다 (스캔/분석/수정 3단계) - 핵심만 남기고 나머지는 버린다 (500토큰 압축, 세션 아카이브)

완전한 자율 진화까지는 갈 길이 멀지만, 에이전트가 경험에서 배우는 첫걸음은 생각보다 간단합니다. 반복 패턴을 감지하고, 기록하고, 다음에 적용하는 것. 사람이 배우는 방식과 다르지 않습니다.

댓글

이 블로그의 인기 게시물

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

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

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