k
korAI
고급 전체
🔥 고급2026-05-107~9분

계층형 메모리 스토리지로 에이전트 장기 컨텍스트 비용 80% 줄이기

에이전트의 장기 메모리를 핫·웜·콜드 3계층으로 분리해 토큰 비용을 통제하면서 관련 기억을 정확히 주입하는 아키텍처와 실패 모드를 정리한다.

long-term-memoryRAGagent

장기 메모리의 비용 함정

단순하게 대화 히스토리를 통째로 시스템 프롬프트에 누적하면, 100턴 대화에서 컨텍스트가 60K 토큰을 넘어 턴당 입력 비용이 선형 증가한다. Claude claude-opus-4-5 기준 입력 $15/MTok이므로 60K 토큰 컨텍스트 1회 호출 = $0.0009, 하루 10,000 세션이면 월 $270이 컨텍스트 비용만으로 발생한다. 계층형 메모리는 이 문제를 관련 메모리만 선택 주입하는 방식으로 해결한다.

3계층 메모리 아키텍처

핫(Hot) — 현재 컨텍스트 윈도우: 최근 10턴만 유지. 토큰 예산 4K.

웜(Warm) — 요약 레이어: 11~50턴을 LLM으로 압축한 요약본. 원본 대비 토큰 90% 절감. 에이전트 재시작 시 즉시 로드.

콜드(Cold) — 벡터 DB: 51턴 이후 전체 히스토리를 임베딩 저장. 쿼리 관련도 상위 K개만 런타임에 주입.

import anthropic
from dataclasses import dataclass
from typing import List

client = anthropic.Anthropic()

@dataclass
class MemoryLayer:
    hot: List[dict]          # 최근 10턴
    warm_summary: str        # 압축 요약
    cold_snippets: List[str] # 벡터 검색 결과

def build_context(memory: MemoryLayer, user_input: str) -> List[dict]:
    system_parts = []
    if memory.warm_summary:
        system_parts.append(f"## 이전 대화 요약\n{memory.warm_summary}")
    if memory.cold_snippets:
        snippets = "\n".join(f"- {s}" for s in memory.cold_snippets[:3])
        system_parts.append(f"## 관련 기억\n{snippets}")

    messages = memory.hot + [{"role": "user", "content": user_input}]
    return system_parts, messages

def compress_to_warm(turns: List[dict]) -> str:
    """11~50턴 → 요약. 실제로는 비동기 배치로 처리."""
    content = "\n".join(
        f"{m['role']}: {m['content']}" for m in turns
    )
    resp = client.messages.create(
        model="claude-haiku-4-5",  # 요약은 저비용 모델 사용
        max_tokens=512,
        messages=[{
            "role": "user",
            "content": f"다음 대화를 핵심 사실 위주로 200자 이내 요약:\n{content}"
        }]
    )
    return resp.content[0].text

핵심 트레이드오프: 콜드 레이어 검색 품질이 낮으면 관련 메모리를 놓쳐 에이전트가 같은 질문을 반복한다. 임베딩 모델 선택과 청크 크기(권장 200~400토큰)가 리콜 정확도에 직결된다.

실패 모드와 운영 대응

메모리 부패(Memory Decay): 요약 과정에서 수치·날짜 등 팩트가 손실된다. 대응: 요약 전 엔티티(날짜, 금액, 고유명사)를 별도 구조화 필드로 추출해 보존.

콜드 레이어 지연: 벡터 검색 p99 ≥ 200ms면 스트리밍 TTFT에 영향. 대응: 검색을 사용자 입력 수신과 동시에 비동기 시작.

요약 비용 과소 산정: claude-haiku-4-5로 50턴 압축 시 입력 ~8K 토큰 = $0.00064/회. 세션당 5회 압축 기준 월 10,000 세션 = $32. 무시할 수 없으므로 웜 레이어 압축 트리거를 15턴이 아닌 50턴으로 조정해 빈도를 줄인다.

운영 체크리스트

  • [ ] 핫 레이어 최대 토큰(4K) 초과 시 자동 압축 트리거 설정
  • [ ] 요약 결과에 대한 팩트 보존율 평가 (수치 포함 여부 자동 검사)
  • [ ] 벡터 검색 p95 latency ≤ 150ms 모니터링
  • [ ] 콜드 레이어 TTL(90일) 설정으로 스토리지 비용 통제
  • [ ] 메모리 주입 토큰 수를 매 호출마다 로깅 → 월별 절감율 추적