본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 22. 21:25

자신의 실수로부터 배우는 AI 에이전트 구축하기: Ledger 시스템

요약

AI 에이전트가 세션 간의 경험을 공유하지 못하는 문제를 해결하기 위해 마크다운 기반의 '교차 세션 학습 원장(Ledger)' 시스템을 제안합니다. 에이전트가 과거의 성공과 실패, 선호하는 프레임워크 등을 기록하고 쿼리함으로써 지속적으로 학습하는 피드백 루프를 구축합니다.

핵심 포인트

  • 기존 AI 에이전트의 세션 간 기억 상실 문제 해결
  • 마크다운 형식을 활용한 구조화된 학습 기록 저장
  • 모델 성능, 작업 실패 여부, 프레임워크 선호도 등 데이터 캡처
  • 과거 데이터를 쿼리하여 미래 세션의 의사결정 최적화

새로운 ChatGPT 또는 Copilot 세션을 시작할 때마다, 그것은 제로(zero) 상태에서 시작합니다. 어제 무엇이 효과적이었는지에 대한 기억도, 어떤 모델이 당신의 코드베이스(codebase)에서 가장 성능이 좋았는지에 대한 정보도, 어떤 작업이 왜 실패했는지에 대한 기록도 없습니다.

M31A의 교차 세션 학습 원장(cross-session learning ledger)은 이를 변화시킵니다. 모든 세션은 마크다운(markdown) 파일에 구조화된 기록을 작성합니다. 시간이 지남에 따라, 에이전트는 이 원장(ledger)을 쿼리(query)하여 과거 세션으로부터 학습합니다 — 어떤 프레임워크(framework)가 흔히 사용되는지, 어떤 유형의 작업이 실패하는지, 그리고 작업이 보통 얼마나 걸리는지 등을 학습합니다.

이 포스트에서 저는 원장(ledger)이 어떻게 작동하는지, 왜 마크다운(markdown)이 완벽한 저장 형식인지, 그리고 이 단순한 피드백 루프(feedback loop)가 어떻게 복리적인 가치를 창출하는지 보여드리겠습니다.

문제점: 기억상실증에 걸린 AI 에이전트

AI 코딩 도구들을 사용할 때 겪는 전형적인 경험은 다음과 같습니다:

  1. 프로젝트 구조를 설명하는 데 10분을 소비합니다.
  2. 에이전트가 당신의 패턴과 일치하지 않는 코드를 생성합니다.
  3. 당신이 이를 수정하면, 작동합니다.
  4. 다음 세션은요? 처음부터 똑같은 과정을 반복합니다.

에이전트는 다음 사항들을 결코 배우지 못합니다:

  • 당신이 클래스 컴포넌트(class components)보다 함수형 React 컴포넌트(functional React components)를 선호한다는 사실
  • 당신의 Go 서비스가 gorilla/mux가 아닌 chi를 라우팅(routing)에 사용한다는 사실
  • 데이터베이스 마이그레이션(database migrations)과 관련된 작업은 항상 추가 검증이 필요하다는 사실
  • 리팩터링(refactoring) 시 Claude가 GPT-4보다 당신의 코드베이스를 더 잘 다룬다는 사실

모든 세션은 새로운 시작입니다. 당신이 쌓아 올린 지식은 오직 당신의 머릿속에만 존재합니다.

해결책: 구조화된 학습 기록

M31A는 교차 세션 학습 원장(cross-session learning ledger) (pkg/ledger/)을 통해 이 문제를 해결합니다. 모든 세션이 끝난 후, 에이전트는 구조화된 기록을 작성합니다:

| Session    | Model              | Tasks | Failed | Cost  | Duration | Framework | Goal                    |
|------------|--------------------|-------|--------|-------|----------|-----------|-------------------------|
| a1b2c3d4   | claude-3.5-sonnet  | 5     | 1      | $0.12 | 8min     | react     | refactor auth middleware |
...

이것은 단순한 로깅(logging)이 아닙니다 — 이것은 **피드백 루프(feedback loop)**입니다. 에이전트는 미래의 세션에서 더 나은 결정을 내리기 위해 이 데이터를 쿼리(query)할 수 있습니다.

추적되는 항목들

Ledger는 세션당 7가지 핵심 차원을 캡처합니다:

// From pkg/ledger/ledger.go
type LedgerEntry struct {
    SessionID   string
...

목표 키워드 (Stop-Word 필터링 포함)

에이전트는 목표 설명에서 키워드를 추출하며, 일반적인 불용어 (Stop words)를 필터링합니다:

// From pkg/ledger/keywords.go
var stopWords = map[string]bool{
    "the": true, "a": true, "an": true, "is": true, 
...

즉, "Refactor the authentication middleware to use JWT"라는 문장은 ["refactor", "authentication", "middleware", "jwt"]가 되며, 이는 의도의 의미론적 핵심 (semantic core)을 나타냅니다.

실패 추적 (Failure Tracking)

작업이 실패할 때, Ledger는 그 이유를 기록합니다:

type FailureReason string

const (
...

시간이 흐름에 따라 다음과 같은 패턴을 확인할 수 있습니다: "내 Python 실패의 40%는 테스트 실패이다" 또는 "Claude는 보안에 중요한 코드를 수정하기를 거부한다."

Ledger 쿼리하기 (Querying the Ledger)

진정한 힘은 과거 데이터를 쿼리하는 데서 나옵니다. M31A는 Ledger 통계 (statistics)를 노출합니다:

// From pkg/ledger/ledger.go
type LedgerStats struct {
    TotalSessions      int
...

TUI에서 /ledger stats를 실행하여 다음을 확인할 수 있습니다:

📊 Ledger Statistics (12 sessions)

Models Used:
...

인사이트 (Insight): Claude는 비용이 더 많이 들지만, 이 코드베이스에서는 실패율이 절반 수준입니다. 중요한 작업에는 Claude를 사용하세요. 빠른 리팩토링 (refactor)에는 GPT-4로도 충분합니다.

실행 중인 학습 루프 (The Learning Loop in Action)

Ledger가 시간이 지남에 따라 어떻게 가치를 창출하는지 보여주는 실제 시나리오는 다음과 같습니다:

세션 1: 첫 접촉

Goal: "Add rate limiting to the API gateway"
Model: gpt-4-turbo
Tasks: 3
...

Ledger는 GPT-4가 Go 프로젝트에서 테스트에 실패했음을 기록합니다.

세션 2: 에이전트의 적응

Goal: "Implement request validation middleware"
Model: claude-3.5-sonnet  ← 에이전트가 세션 1의 실패를 바탕으로 Claude를 선택함
Tasks: 4
...

에이전트는 다음과 같이 학습했습니다: "GPT-4는 Go 프로젝트에서 테스트 실패가 있었다. 대신 Claude를 시도하라."

세션 3: 패턴 인식

10번의 세션이 지난 후, Ledger는 다음과 같이 보여줍니다:

Go Projects:
  gpt-4-turbo:   3 sessions, 2 failures (test failures)
  claude-3.5:     7 sessions, 0 failures
...

이것은 하드코딩된 로직이 아닙니다. 구조화된 데이터 수집으로부터 나타나는 창발적 행동 (emergent behavior)입니다.

왜 마크다운 (Markdown)인가?

데이터베이스 대신 마크다운 테이블을 선택한 데에는 몇 가지 이유가 있습니다:

1. 인간의 가독성 (Human Readability)

어떤 에디터로든 ledger.md를 열어 데이터를 이해할 수 있습니다:

| Session | Model | Tasks | Failed | Cost | Duration |
|---------|-------|-------|--------|------|----------|
| a1b2c3  | claude | 5    | 1      | $0.12| 8min     |

SQL 지식이 필요 없습니다. 특별한 도구도 필요 없습니다. 그저 텍스트일 뿐입니다.

2. Git 친화적 (Git-Friendly)

Ledger는 .m31a/ledger.md에 저장되며 프로젝트와 함께 커밋됩니다:

$ git log --oneline -- .m31a/ledger.md
a1b2c3d Session: refactor auth middleware (claude-3.5, 5 tasks, $0.12)
e5f6g7h Session: add rate limiting (gpt-4, 3 tasks, $0.08)

프로젝트의 수명 주기 동안 AI 사용량이 어떻게 진화하는지 확인할 수 있습니다.

3. 차이점 비교 가능 (Diffable)

무언가 변경되었을 때, 정확히 무엇이 바뀌었는지 볼 수 있습니다:

-| a1b2c3 | claude-3.5-sonnet | 5 | 1 | $0.12 | 8min | react |
+| a1b2c3 | claude-3.5-sonnet | 5 | 0 | $0.12 | 7min | react |

실패 횟수가 줄어들었습니다. 에이전트가 학습하고 있습니다.

4. 의존성 없음 (Zero Dependencies)

SQLite, PostgreSQL, ORM이 필요 없습니다. 오직 bufio.Scanner와 문자열 분할 (string splitting)만 사용합니다:

// pkg/ledger/parser.go 에서 발췌
func ParseLedgerLine(line string) (*LedgerEntry, error) {
    fields := strings.Split(line, "|")
...

심화: 모델 성능 추적 (Model Performance Tracking)

Ledger는

// From pkg/ledger/writer.go
func (l *Ledger) WriteEntry(entry LedgerEntry) error {
    l.mu.Lock()
...

주요 설계 결정 사항 (Key design decisions):

  • Append-only (추가 전용): 과거의 항목을 절대 수정하지 않습니다. 히스토리는 불변(immutable)입니다.
  • Atomic writes (원자적 쓰기): 경합 조건 (race conditions)을 방지하기 위해 O_APPEND|O_CREATE로 엽니다.
  • No locking at file level (파일 수준의 잠금 없음): 동시 접근을 위해 메모리 내의 뮤텍스 (mutex)를 사용합니다.

개인정보 보호 고려 사항 (Privacy Considerations)

Ledger는 코드가 아닌 **메타데이터 (metadata)**를 저장합니다:

  • ✅ 모델 이름, 작업 횟수, 비용, 소요 시간
  • ✅ 프레임워크 유형 (react, go, python)
  • ✅ 목표 키워드 (전체 텍스트가 아닌 필터링된 형태)
  • ✅ 실패 카테고리 (스택 트레이스 (stack traces)가 아닌 형태)
  • ❌ 실제 코드 변경 사항
  • ❌ 전체 목표 설명
  • ❌ API 키 또는 토큰

여러분의 코드는 Ledger에 절대 직접 닿지 않습니다. 오직 운영 메타데이터만이 기록됩니다.

복리 효과 (The Compounding Effect)

50번의 세션이 지나면, Ledger는 하나의 **지식 베이스 (knowledge base)**가 됩니다:

📊 귀하의 M31A 사용 패턴

가장 생산적인 모델:
...

이 데이터는 귀하의 것입니다. 귀하의 리포지토리 (repo)에 존재하며, 코드와 함께 커밋되고, 시간이 지남에 따라 에이전트가 귀하를 더 잘 보조할 수 있도록 돕습니다.

시작하기 (Getting Started)

Ledger는 자동입니다. 모든 M31A 세션은 Ledger에 기록을 남깁니다:

# 세션 시작
$ m31a

...

Ledger 파일은 첫 세션에서 생성되며, 이후 모든 세션에서 내용이 추가됩니다.

향후 계획 (What's Next)

Ledger는 시작일 뿐입니다. 계획된 개선 사항은 다음과 같습니다:

  1. 목표 유사도 매칭 (Goal similarity matching): 현재의 결정을 돕기 위해 유사한 목표를 가진 과거 세션을 찾습니다.
  2. 비용 최적화 알림 (Cost optimization alerts): 세션 비용이 과거 평균을 초과할 때 경고를 보냅니다.
  3. 모델 추천 엔진 (Model recommendation engine): 작업 유형과 과거 성능을 기반으로 모델을 제안합니다.
  4. 분석 도구로 내보내기 (Export to analytics): Ledger 데이터를 외부 대시보드로 전달합니다.

교훈 (Lessons Learned)

Ledger를 구축하며 세 가지를 배웠습니다:

  1. 단순한 데이터가 복잡한 시스템보다 낫습니다. 마크다운 (Markdown) 테이블은 SQLite 데이터베이스보다 디버깅, 버전 관리 및 공유가 더 쉽습니다.

  2. 메타데이터 (Metadata)는 과소평가되어 있습니다. 학습을 위해 코드 변경 사항을 모두 저장할 필요는 없습니다. 작업 횟수, 실패율, 소요 시간만으로도 필요한 정보의 대부분을 알 수 있습니다.

  3. 학습은 복리로 작용합니다. 처음 10번의 세션은 노이즈에 불과합니다. 50번이 지나면 패턴이 나타나기 시작합니다. 100번이 지나면, 에이전트는 귀하의 특정 코드베이스를 지원하는 데 있어 예측 가능할 정도로 더 나아집니다.

결론 (Conclusion)

세션 간 학습 장부 (cross-session learning ledger)는 M31A의 비밀 병기입니다. 이는 모든 세션을 학습 데이터로 전환하여, 시간이 지남에 따라 에이전트를 더 날카롭게 만드는 피드백 루프 (feedback loop)를 생성합니다. 클라우드 동기화도, 분석 서버도, 개인정보 보호 문제도 없습니다. 그저 사용할수록 더 똑똑해지는 마크다운 (markdown) 파일 하나가 있을 뿐입니다.

AI 도구를 구축하고 있다면, 첫날부터 구조화된 로깅 (structured logging)을 추가하는 것을 고려해 보세요. 통찰력은 생각보다 빠르게 복리로 쌓입니다.

직접 시도해 보세요:

# M31A 설치
curl -fsSL https://raw.githubusercontent.com/eshanized/M31A/master/install.sh | bash

...

링크 (Links):

귀하의 AI 코딩 세션에서는 어떤 패턴을 추적하고 싶으신가요? 어떤 메타데이터가 귀하에게 가장 가치 있을지 듣고 싶습니다. 이슈 (issue)를 생성하거나 Twitter를 통해 연락해 주세요.

AI 자동 생성 콘텐츠

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

원문 바로가기
0

댓글

0