ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI 에이전트의 자기 객관화: memento '메타 메모리' 구현기
    MEMENTO 2026. 1. 14. 22:11
    반응형

    Intro: AI가 자신의 기억력을 평가할 수 있다면?

    "AI 에이전트가 단순히 정보를 꺼내오는(Recall) 것을 넘어, '내가 이 정보를 얼마나 자주, 얼마나 확실하게 기억해냈는지'를 알 수 있다면 어떨까요?"

    memento(GitHub) 프로젝트를 개발하며 항상 고민했던 것은 '기억의 품질'이었습니다. 단순히 저장된 텍스트를 벡터 검색으로 가져오는 것만으로는 부족했습니다. 어떤 기억은 매우 유용해서 자주 쓰이고(High Recall), 어떤 기억은 모호해서 신뢰도가 낮을 수(Low Confidence) 있습니다.

    이번 PR #77 은 바로 이 '메타 메모리(Meta-Memory)'를 구현하여, 에이전트에게 일종의 '메타인지(Meta-cognition)' 능력을 부여하는 작업이었습니다.

    The Challenge: 통계 수집과 성능의 딜레마

    메타 메모리의 핵심은 통계 수집입니다. 에이전트가 Recall Tool을 사용할 때마다 성공 여부, 신뢰도 점수(Confidence Score), 타임스탬프를 기록해야 합니다.

    하지만 곧바로 기술적 난관에 봉착했습니다.

    • 빈번한 I/O: AI 에이전트가 복잡한 추론을 할 때 기억 검색(Recall)은 매우 빈번하게 일어납니다.
    • 성능 저하: 검색이 일어날 때마다 DB에 UPDATE 쿼리를 날린다면, I/O 병목으로 인해 에이전트의 전체 응답 속도가 느려질 위험이 큽니다.

    "통계는 정확해야 하지만, 그 때문에 본질적인 '기억 검색' 속도가 느려져선 안 된다."

    이것이 이번 구현의 핵심 요구사항이었습니다.

    The Solution: WriteCoalescingManager를 통한 최적화

    이 문제를 해결하기 위해 WriteCoalescingManager를 설계했습니다. 핵심 아이디어는 '모아서 처리하기(Coalescing & Debouncing)'입니다.

    1. Recall 이벤트가 발생하면 즉시 DB에 가지 않고 메모리 버퍼에 기록합니다.
    2. 동일한 메모리 ID에 대한 요청은 메모리 상에서 통계를 합산합니다.
    3. 설정된 짧은 시간(100ms) 동안 대기했다가, 모인 데이터를 한 번의 쿼리로 처리합니다.

    다음은 실제 구현체에서 핵심 로직만 간추린 TypeScript 코드입니다.

    // types/meta-memory.ts
    interface StatUpdate {
      recallCount: number;
      confidenceSum: number;
      lastRecalledAt: number;
    }
    
    // services/WriteCoalescingManager.ts
    export class WriteCoalescingManager {
      // 메모리 내에서 통계를 임시 저장할 버퍼
      private buffer = new Map<string, StatUpdate>();
      private flushTimeout: NodeJS.Timeout | null = null;
      private readonly FLUSH_DELAY_MS = 100; // 0.1초 대기
    
      constructor(private readonly repository: MetaMemoryRepository) {}
    
      /**
       * 외부에서 호출하는 메서드.
       * DB를 직접 호출하지 않고 버퍼에 상태를 병합(Merge)합니다.
       */
      public track(memoryId: string, confidence: number): void {
        const now = Date.now();
        const existing = this.buffer.get(memoryId);
    
        if (existing) {
          // 이미 버퍼에 있다면, 카운트와 점수를 누적합니다 (Coalescing)
          existing.recallCount += 1;
          existing.confidenceSum += confidence;
          existing.lastRecalledAt = now;
        } else {
          // 버퍼에 없다면 새로 등록합니다
          this.buffer.set(memoryId, {
            recallCount: 1,
            confidenceSum: confidence,
            lastRecalledAt: now,
          });
        }
    
        this.scheduleFlush();
      }
    
      /**
       * 디바운싱(Debouncing)을 적용하여 배치를 스케줄링합니다.
       */
      private scheduleFlush(): void {
        if (this.flushTimeout) return;
    
        this.flushTimeout = setTimeout(() => {
          this.flush();
        }, this.FLUSH_DELAY_MS);
      }
    
      /**
       * 버퍼의 내용을 DB에 일괄 반영하고 비웁니다.
       */
      private async flush(): Promise<void> {
        // 1. 버퍼 스냅샷 생성 및 초기화
        const updates = Array.from(this.buffer.entries());
        this.buffer.clear();
        this.flushTimeout = null;
    
        if (updates.length === 0) return;
    
        try {
          // 2. Repository를 통해 Batch Update 실행 (단 1회의 DB 트랜잭션)
          // 실제로는 SQL의 'INSERT ... ON CONFLICT UPDATE' 등을 활용하여 처리
          await this.repository.batchUpdateStats(updates);
        } catch (error) {
          console.error('Failed to flush meta memory stats:', error);
        }
      }
    }
    

    이 구조 덕분에 에이전트가 0.1초 동안 100번의 기억을 조회하더라도, DB 쓰기 작업은 단 1번만 발생하게 되어 성능과 데이터 정합성 두 마리 토끼를 잡을 수 있었습니다.

    Key Features: 무엇이 달라졌나?

    이번 업데이트(PR #77)로 memento는 다음과 같은 새로운 기능을 제공합니다.

    1. 정밀한 통계 추적

    단순히 조회 횟수만 세는 것이 아니라, 평균 신뢰도(Average Confidence)를 계산하여 기억의 '확실성'을 판단할 수 있는 지표를 제공합니다.

    2. 새로운 눈, get_meta_memory_stats MCP Tool

    이제 에이전트가 스스로 도구를 호출하여 자신의 상태를 점검할 수 있습니다.

    Agent: "내가 'React 서버 컴포넌트'에 대해 얼마나 잘 기억하고 있지?"
    memento: "해당 주제는 50번 조회되었으며, 평균 신뢰도는 0.95입니다."

    이를 통해 에이전트는 자주 실패하는 기억을 재학습하거나, 신뢰도가 낮은 정보를 사용자에게 재확인하는 등의 능동적인 행동 패턴을 가질 수 있게 됩니다.

    Outro: 살아있는 기억 저장소를 향해

    이번 PR은 코드 라인 수만 3,000줄이 넘는 꽤 큰 작업이었습니다. 하지만 단순히 기능을 추가한 것이 아니라, 에이전트가 스스로의 상태를 진단할 수 있는 기반 시스템을 구축했다는 점에서 큰 의미가 있습니다.

    이제 memento는 단순한 저장소가 아닙니다. 스스로 학습하고 성장하는 에이전트를 위한 '살아있는 기억 저장소'로 진화하고 있습니다.

    AI 에이전트의 기억 시스템 구축에 관심이 있으시다면, memento 프로젝트를 확인해 보세요.

    👉 GitHub PR: feat: Meta-Memory 통계 수집 기능 구현 (#77)
    👉 Repository: https://github.com/jee1/memento

    반응형
Designed by Tistory.