에이전트 시리즈 (22): 컨텍스트 엔지니어링 심층 분석 — 세 가지 컨텍스트 관리 전략의 정량적 비교
요약
에이전트 운영 시 발생하는 선형적 토큰 비용 문제를 해결하기 위한 세 가지 컨텍스트 관리 전략을 정량적으로 비교 분석합니다. Naive, Sliding Window, Rolling Summary 방식의 비용과 정확도(Recall) 간의 트레이드오프를 실제 벤치마크 수치로 검증합니다.
핵심 포인트
- 에이전트 대화가 길어질수록 토큰 사용량이 선형적으로 증가하여 비용 부담이 커짐
- Naive 방식은 정확하지만 비용이 높고, Sliding Window는 비용은 낮으나 정보 손실 위험이 있음
- Rolling Summary는 요약을 통해 비용과 컨텍스트 유지 사이의 균형을 맞추는 전략임
- 초기 결정 사항에 대한 Recall(재현율)을 통해 각 전략의 성능을 객관적으로 측정
선형적 비용 문제 (The Linear Cost Problem)
에이전트(Agents)는 상태가 없는 (stateless) API 호출이 아닙니다. 대화 기록을 기억해야 합니다. 매 턴(turn)마다 컨텍스트 윈도우 (context window)에 데이터가 쌓이며, 결국 두 가지 문제가 발생합니다:
Turn 1: ~1K tokens ← 저렴함
Turn 10: ~5K tokens ← 관리 가능
Turn 50: ~25K tokens ← 비용 상승 중
...
이는 이론적인 이야기가 아닙니다. 30턴의 프로젝트 논의는 전체 기록에 약 2,500 토큰이 소요되며, 100턴이 지나면 그 숫자는 약 8,000으로 늘어납니다. 즉, 모든 교환마다 선형적으로 증가합니다.
이 문제에 대한 세 가지 일반적인 대응 방식은 다음과 같습니다:
| 전략 (Strategy) | 접근 방식 (Approach) | 직관적인 트레이드오프 (Intuitive trade-off) |
|---|---|---|
| Naive (단순 방식) | 매번 전체 기록을 전달 | 비용이 많이 들지만, 정확함 |
| ... |
이 기사에서는 직관적인 트레이드오프가 실제로 유효한지 테스트하기 위해 실제 수치를 사용하여 세 가지 전략 모두를 벤치마킹합니다.
데모 설계 (Demo Design)
대화 구성 (Conversation Construction)
데이터베이스 선택, 캐시 설정 (cache config), 마이그레이션 소유권, 배포 플랫폼, CI/CD, 인증 및 기타 24가지 기술적 결정을 다루는 30턴의 프로젝트 논의를 구성했습니다. 핵심 설계 선택: 중요한 결정 사항들을 가장 초기인 1~4턴에 배치하고, 최근 턴에는 덜 중요한 내용을 포함했습니다. 이는 컨텍스트 손실 (context-loss)로 인한 실패가 드러나도록 강제하기 위함입니다.
세 가지 전략 구현 (Three Strategy Implementations)
전략 1: Naive (기준점/baseline)
def run_naive(history: list, query: str, keywords: list[str]) -> StrategyResult:
msgs = [SystemMessage(content=SYSTEM_PROMPT)] + history + [HumanMessage(content=query)]
tokens = count_messages_tokens(msgs)
...
전략 2: Sliding Window (슬라이딩 윈도우/truncation)
def run_sliding_window(
history: list, query: str, keywords: list[str], window: int = 12
) -> StrategyResult:
...
**전략 3: Rolling Summary (롤링 요약)
def summarize(messages: list) -> str:
"""대화 블록을 불렛 포인트 형태의 결정 목록으로 압축합니다."""
text = "\n".join(
...
핵심 설계: cached_summary 파라미터를 통해 요약을 한 번만 생성하고 4개의 테스트 쿼리 전체에서 재사용할 수 있도록 했습니다. 따라서 38.2초의 생성 비용은 단 한 번만 지불됩니다.
테스트 쿼리 (모두 초기 결정 사항을 대상으로 함)
Query 1: 어떤 데이터베이스를 선택했나요? 소유자는 누구이며, 이유는 무엇인가요?
Keywords: postgresql / timescaledb / david / acid / time-series
...
Recall (재현율) = 응답에서 발견된 키워드 수 / 전체 키워드 수. 단순하지만 결정론적(deterministic)입니다 — 추가적인 LLM 판사(judge) 호출이 필요하지 않습니다.
결과
History (대화 기록): 30 turns | Full context (전체 컨텍스트): 약 2,485 추정 토큰
Rolling summary (롤링 요약) 생성 시간: 38.2s (단 한 번 실행, 모든 쿼리에 대해 캐싱됨)
쿼리별 Recall (재현율)
Query Naive (단순) Sliding (슬라이딩) Rolling (롤링)
─────────────────────────────────────────────────────────
DB decision (turn 1) 100% 0% 0%
...
집계 지표 (Aggregate Metrics)
Strategy Avg Tokens Avg Latency Avg Recall
─────────────────────────────────────────────────────────────────
Naive (full history) 2,513 9.6s 80%
...
세 가지 직관에 반하는 발견 사항
발견 1: 절단(Truncation)의 비용은 직관을 훨씬 초과합니다
Sliding Window (슬라이딩 윈도우) 방식은 토큰의 76%를 절약하지만, Recall (재현율)을 80%에서 20%로 떨어뜨립니다.
원리적으로는 놀라운 일이 아닙니다 — 12개 메시지 윈도우를 넘어서면 1~4번째 턴은 이미 한참 전에 사라졌기 때문입니다 — 하지만 그 **규모(magnitude)**가 매우 놀랍습니다. Query 1 (데이터베이스 결정)의 점수는 0%입니다. 5개의 키워드 중 발견된 것이 하나도 없습니다. 모델이
이는 숨겨진 Naive(나이브) 방식의 실패 모드를 드러냅니다: 컨텍스트가 길어질수록 = 신호가 희소해지며 = 모델이 바로 눈앞에 있는 정보를 놓칠 수 있습니다. 토큰을 추가한다고 해서 항상 정확도가 높아지는 것은 아닙니다.
발견 3: 압축 손실은 노이즈가 아니라 실제 버그입니다
Rolling Summary (롤링 요약)를 사용한 Query 1의 점수는 0%이지만, 요약본에는 다음과 같은 내용이 명시적으로 포함되어 있습니다:
- Database: PostgreSQL with TimescaleDB extension (David, DB Lead)
키워드인 postgresql, timescaledb, david가 요약본에 있음에도 불구하고, 모델의 응답에는 단 하나도 나타나지 않았습니다. 조사 결과, 모델은 데이터베이스 선택에 관한 질문에는 답했지만, 해당 선택의 기술적 _이유(reasons)_인 ACID 준수(ACID compliance)나 시계열(time-series)에 대해서는 언급하지 않았습니다. 요약본이 결정 사항은 보존했지만, 그 근거(rationale)는 놓친 것입니다.
이것이 압축의 근본적인 비용입니다: 요약본은 "무엇이 결정되었는가"는 유지하지만, "왜 결정되었는가"는 잃어버립니다. 단순한 사실 회상이 아닌 근거에 대한 추론(reasoning)을 요구하는 쿼리는 이 격차로 인해 큰 타격을 입습니다.
각 전략의 사용 시점
작업 유형 권장 전략
─────────────────────────────────────────────────────────────────────
짧고, 상태가 없으며(stateless), 각 턴이 독립적인 경우 Naive (어차피 히스토리가 짧음)
...
Rolling Summary (롤링 요약) 생성 최적화:
- 요약 세분화(Summarization granularity): 메시지마다 수행하는 것이 아니라 20~30턴마다 한 번씩 트리거하십시오. 빈번한 압축은 목적을 저해합니다.
- 프롬프트에 구체성 요구:
보존할 것: 모든 결정 사항, 담당자 이름, 정확한 숫자는 타협할 수 없는 필수 사항입니다. - 2계층 구조(Two-layer structure):
요약(과거) + 최근 내용(최근 N개)구조를 사용하십시오. 요약본을 최근 메시지와 다시 섞어서 재압축하지 마십시오. - 지연 생성(Lazy build): 요약이 처음 필요할 때 생성한 후 캐싱하십시오. 모든 쿼리마다 다시 생성하지 마십시오.
실제 Rolling Summary 출력 결과
다음은 22턴의 대화로부터 데모가 생성한 결과물이며, 압축률과 정보 보존력을 보여줍니다:
- 데이터베이스 (Database): TimescaleDB 확장이 포함된 PostgreSQL (David, DB Lead)
- 캐싱 (Caching): Redis Cluster, TTL: 세션 1시간, 대시보드 5분, 노드당 최대 16GB
- 데이터베이스 마이그레이션 (Database Migrations): Sarah (Backend Lead), Flyway, 시니어 엔지니어 2인의 승인 필요
...
디자인 체크리스트 (Design Checklist)
전략 선택 (Strategy selection)
- 작업이 얼마나 이전의 내용을 회상해야 하는지 식별
- 슬라이딩 윈도우 (Sliding Window): 최근 컨텍스트만으로 충분할 때만 사용
- 롤링 서머리 (Rolling Summary): 초기 결정 사항이 중요하지만, 원문 그대로의 기록은 필요하지 않을 때 사용
- 네이이브 (Naive): 히스토리가 본질적으로 짧거나, 근거에 대한 추론이 필요할 때 사용
롤링 서머리 구현 (Rolling Summary implementation)
- 프롬프트에 결정 사항, 담당자, 숫자, 기술적 선택 사항을 명시적으로 요구하는가
- 요약본이 메시지 목록에 섞이지 않고 시스템 프롬프트 (System Prompt)에 주입되는가
- 요약본이 쿼리마다 재구축되지 않고, 한 번 구축되어 캐싱 (Cached)되는가
- 트리거 임계값 (Trigger threshold): 메시지가 N턴을 초과할 때 요약하도록 설정했는가 (20~30턴 권장)
회상 검증 (Recall validation)
- 테스트 쿼리는 최근 내용뿐만 아니라 초기 턴을 대상으로 해야 함
- 키워드에는 단순한 결론뿐만 아니라 기술적 이유가 포함되어야 함 (예: 단순히 "postgresql"이 아니라 "acid")
- 프로덕션 전략을 선택하기 전에 키워드 회상 (Keyword-recall) 벤치마크를 실행할 것
요약 (Summary)
세 가지 결론:
- 측정 없는 절단 (Truncation)은 함정이다: 슬라이딩 윈도우 (Sliding Window)는 토큰의 76%를 절약하지만, 초기 턴의 회상률 (Recall)을 0%로 떨어뜨립니다. 벤치마크가 없다면 이 절벽은 보이지 않습니다. 즉, 제품을 출시하면 에이전트가 컨텍스트의 절반을 조용히 잊어버리게 됩니다.
- 요약 압축은 "무엇(what)"이 아니라 "왜(why)"를 잃는다: 결정 사항은 압축 과정에서 살아남지만, 그 근거 (Rationale)는 사라지는 경우가 많습니다. 추론 체인 (Reasoning chain)이 필요한 쿼리에는 네이이브 (Naive) 방식이나, 이유를 명시적으로 보존하도록 요구하는 요약 프롬프트가 더 적합합니다.
- 롤링 서머리 (Rolling Summary)의 구축 비용은 일회성 지불이다: 38초라는 시간은 놀라워 보일 수 있지만, 이는 오프라인에서 수행되는 캐싱 (Cached) 작업입니다. 쿼리 시점에는 각 요청에 2,500개의 토큰 대신 약 600개의 토큰만 추가하면 되므로, 이후 모든 호출에서 4배의 토큰 절감 효과를 얻을 수 있습니다.
참고 자료
- LangChain Message History 문서
- Anthropic Context Caching 문서
- Article 8: Context Engineering — Context is the Most Important Input
- 전체 데모 코드: agent-21-context-engineering-deep
실제 엔터프라이즈급 워크플로우에서 검증된 AI 에이전트 및 스킬의 큐레이션 마켓플레이스인 PrimeSkills를 확인해 보세요. 불필요한 내용은 없고, 실제로 작동하는 것만 있습니다.
저의 홈페이지에서 더 유용한 지식과 흥미로운 제품을 찾아보세요
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기