
AI 에이전트가 복잡한 작업을 수행하면서 점점 더 많은 정보를 처리해야 하는 시대가 되었습니다. 하지만 LLM의 컨텍스트 윈도우는 한정적이고, 긴 대화나 복잡한 작업 수행 시 토큰 비용이 급증하거나 성능이 저하되는 문제가 발생합니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 ‘컨텍스트 엔지니어링’입니다.
최근 LangChain에서 발표한 포괄적인 가이드를 바탕으로, AI 에이전트의 메모리 관리를 최적화하는 핵심 전략들을 살펴보겠습니다. 이 글에서는 실제 업계에서 사용되는 구체적인 기법들과 구현 방법을 중심으로 다루어, 실무에서 바로 적용할 수 있는 실용적인 가이드를 제공합니다.
컨텍스트 엔지니어링이란?
컨텍스트 엔지니어링은 Andrej Karpathy가 표현한 바와 같이, “다음 단계를 위해 컨텍스트 윈도우를 올바른 정보로 채우는 섬세한 예술이자 과학”입니다. LLM을 CPU에, 컨텍스트 윈도우를 RAM에 비유한다면, 컨텍스트 엔지니어링은 운영체제가 RAM을 관리하는 것과 같은 역할을 합니다.

에이전트가 관리해야 하는 컨텍스트는 크게 세 가지 유형으로 나뉩니다:
- Instructions: 프롬프트, 메모리, 몇 가지 예시, 도구 설명 등
- Knowledge: 사실 정보, 과거 메모리 등
- Tools: 도구 호출로부터 받은 피드백
에이전트에서 컨텍스트 관리의 중요성
AI 에이전트는 LLM 호출과 도구 호출을 번갈아 수행하며, 장기간 실행되는 작업에서는 이런 상호작용이 수백 번에 이를 수 있습니다. 이 과정에서 컨텍스트가 누적되면서 여러 문제가 발생할 수 있습니다.

Drew Breunig이 정리한 주요 컨텍스트 문제들을 살펴보면:
- Context Poisoning: 환각으로 생성된 잘못된 정보가 컨텍스트에 포함되는 경우
- Context Distraction: 과도한 컨텍스트가 모델의 훈련된 능력을 방해하는 경우
- Context Confusion: 불필요한 컨텍스트가 응답에 영향을 미치는 경우
- Context Clash: 컨텍스트 내 정보들이 서로 충돌하는 경우
Cognition은 “컨텍스트 엔지니어링이 AI 에이전트를 구축하는 엔지니어들의 가장 중요한 업무”라고 강조했으며, Anthropic도 “에이전트는 종종 수백 번의 턴에 걸친 대화를 진행하므로 신중한 컨텍스트 관리 전략이 필요하다”고 언급했습니다.
컨텍스트 엔지니어링의 4가지 핵심 전략

1. Write Context: 컨텍스트 저장 전략
스크래치패드 활용
인간이 복잡한 작업을 수행할 때 메모를 하듯이, AI 에이전트도 중요한 정보를 저장할 수 있는 “스크래치패드”가 필요합니다. Anthropic의 멀티에이전트 리서처는 이를 효과적으로 활용하는 예시를 보여줍니다:
“LeadResearcher는 접근법을 생각해보고 계획을 메모리에 저장하여 컨텍스트를 유지합니다. 컨텍스트 윈도우가 200,000 토큰을 초과하면 잘릴 수 있으므로 계획을 보존하는 것이 중요합니다.”
스크래치패드는 다음 두 가지 방식으로 구현할 수 있습니다:
- 도구 호출 방식: 파일에 정보를 저장하는 도구를 만들어 활용
- 상태 객체 방식: 런타임 상태 객체의 필드에 정보를 저장
장기 메모리 시스템
단일 세션을 넘어 여러 세션에 걸쳐 정보를 기억해야 하는 경우도 있습니다. 대표적인 예시들을 살펴보면:
- Reflexion: 각 에이전트 턴 후 반성을 통해 자체 생성한 메모리를 재사용
- Generative Agents: 과거 에이전트 피드백 모음에서 주기적으로 메모리를 합성
- 상용 제품: ChatGPT, Cursor, Windsurf 등이 사용자-에이전트 상호작용을 기반으로 장기 메모리를 자동 생성

2. Select Context: 컨텍스트 선택 전략
메모리 선택 기법
에이전트가 메모리를 저장할 수 있다면, 작업에 관련된 메모리를 선택하는 능력도 필요합니다. 메모리 선택이 필요한 이유는 다음과 같습니다:
- Episodic memories: 원하는 행동의 예시로 활용
- Procedural memories: 행동을 안내하는 지침으로 활용
- Semantic memories: 작업 관련 사실 정보로 활용

실제 코드 에이전트들이 사용하는 방식을 보면:
- Claude Code:
CLAUDE.md
파일 활용 - Cursor와 Windsurf: 규칙 파일 시스템 사용
- ChatGPT: 대규모 사용자별 메모리 컬렉션에서 임베딩 기반 선택
도구 선택 최적화
에이전트에게 너무 많은 도구를 제공하면 도구 설명이 겹치면서 모델이 혼란을 겪을 수 있습니다. 이를 해결하기 위해 도구 설명에 RAG(Retrieval Augmented Generation)를 적용하여 가장 관련성 높은 도구만 선택하는 기법이 사용됩니다. 최근 연구에 따르면 이 방법으로 도구 선택 정확도를 3배 향상시킬 수 있습니다.
3. Compress Context: 컨텍스트 압축 전략
컨텍스트 요약
에이전트 상호작용이 수백 번의 턴에 걸쳐 진행되고 토큰 집약적인 도구 호출이 포함될 때, 요약은 필수적인 기법입니다. Claude Code의 “auto-compact” 기능이 좋은 예시입니다. 컨텍스트 윈도우의 95%를 초과하면 자동으로 전체 사용자-에이전트 상호작용 궤적을 요약합니다.

요약은 다음과 같은 지점에서 적용할 수 있습니다:
- 에이전트 궤적 전체: 재귀적 또는 계층적 요약 활용
- 특정 도구 호출: 토큰 집약적인 검색 도구 결과 후처리
- 에이전트 간 경계: 멀티에이전트 시스템에서 지식 전달 시 토큰 감소
컨텍스트 트리밍
요약이 LLM을 사용해 관련성 높은 정보를 추출하는 반면, 트리밍은 하드코딩된 휴리스틱을 사용해 컨텍스트를 필터링합니다. 예를 들어, 메시지 목록에서 오래된 메시지를 제거하거나 Provence와 같은 훈련된 컨텍스트 프루너를 사용하는 방식입니다.
4. Isolate Context: 컨텍스트 격리 전략
멀티에이전트 아키텍처
컨텍스트를 격리하는 가장 인기 있는 방법 중 하나는 서브 에이전트들로 분산하는 것입니다. OpenAI Swarm 라이브러리의 동기 중 하나도 ‘관심사 분리’였습니다. 각 에이전트는 특정 도구 세트, 지침, 자체 컨텍스트 윈도우를 가집니다.

Anthropic의 멀티에이전트 리서처는 이런 접근법의 효과를 보여줍니다:
“서브에이전트들은 각자의 컨텍스트 윈도우를 가지고 병렬로 작동하며, 질문의 다양한 측면을 동시에 탐색합니다.”
많은 에이전트와 격리된 컨텍스트가 단일 에이전트보다 뛰어난 성능을 보였는데, 이는 각 서브에이전트의 컨텍스트 윈도우가 더 좁은 서브 태스크에 할당될 수 있기 때문입니다.
환경을 통한 컨텍스트 격리
HuggingFace의 Deep Researcher는 흥미로운 컨텍스트 격리 사례를 보여줍니다. 대부분의 에이전트가 JSON 객체를 반환하는 도구 호출 API를 사용하는 반면, HuggingFace는 원하는 도구 호출이 포함된 코드를 출력하는 CodeAgent를 사용합니다. 이 코드는 샌드박스에서 실행되고, 선택된 컨텍스트만 LLM에 다시 전달됩니다.

HuggingFace는 이 방식의 장점을 다음과 같이 설명합니다:
“코드 에이전트는 상태를 더 잘 처리할 수 있습니다… 이미지/오디오/기타 데이터를 나중에 사용하기 위해 저장해야 하나요? 문제없습니다. 상태의 변수로 할당하면 나중에 사용할 수 있습니다.”
LangGraph를 활용한 실전 구현

LangGraph는 이러한 컨텍스트 엔지니어링 전략들을 구현하기 위해 설계된 저수준 오케스트레이션 프레임워크입니다. 각 전략별 구현 방법을 살펴보겠습니다.
Write Context 구현
단기 메모리 (스크래치패드)
# 체크포인팅을 통한 에이전트 상태 지속
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
graph = graph.compile(checkpointer=memory)
장기 메모리
# 세션 간 컨텍스트 지속
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
# 사용자 프로필이나 규칙 파일 저장
# 대규모 메모리 컬렉션 관리
Select Context 구현
상태 기반 선택
def agent_node(state):
# 각 노드에서 상태 가져오기
current_context = state.get("relevant_context")
# LLM에 제공할 컨텍스트 세밀 제어
return updated_state
도구 선택 최적화
# LangGraph Bigtool 라이브러리 활용
from langgraph_bigtool import select_relevant_tools
relevant_tools = select_relevant_tools(
task_description=task,
available_tools=all_tools,
max_tools=5
)
Compress Context 구현
주기적 요약
def summarize_messages(messages):
# 메시지 목록 요약 또는 트리밍
if len(messages) > MAX_MESSAGES:
return summarize_with_llm(messages)
return messages
# 특정 지점에서 요약 노드 추가
def summarization_node(state):
state["messages"] = summarize_messages(state["messages"])
return state
Isolate Context 구현
멀티에이전트 구조
# LangGraph Supervisor 패턴
from langgraph_supervisor import create_supervisor_graph
supervisor_graph = create_supervisor_graph(
agents=[research_agent, writing_agent, review_agent],
supervisor_prompt=supervisor_instructions
)
샌드박스 격리
# E2B 샌드박스 활용
from e2b import Sandbox
def isolated_execution_node(state):
with Sandbox() as sandbox:
result = sandbox.run_code(state["code"])
# 필요한 결과만 상태에 저장
return {"execution_result": result.summary}
성능 모니터링과 최적화
컨텍스트 엔지니어링을 성공적으로 적용하려면 다음 두 가지 기반 요소가 필요합니다:
데이터 관찰 및 토큰 사용량 추적
LangSmith를 활용하여 에이전트의 토큰 사용량을 모니터링하고 최적화가 필요한 지점을 식별할 수 있습니다.
성능 평가 시스템
컨텍스트 엔지니어링이 에이전트 성능을 향상시키는지 저하시키는지 테스트할 수 있는 평가 시스템을 구축해야 합니다.
실무 적용 시 고려사항
전략 선택 기준
- 작업 복잡도: 단순한 작업에는 기본적인 트리밍, 복잡한 작업에는 멀티에이전트 격리
- 토큰 비용: 비용이 중요한 경우 압축 전략 우선 적용
- 응답 속도: 실시간 응답이 필요한 경우 선택적 컨텍스트 로딩
- 정확도 요구사항: 높은 정확도가 필요한 경우 메모리 시스템 활용
구현 우선순위
- 모니터링 시스템 구축: 토큰 사용량과 성능 추적
- 기본 압축 전략: 메시지 트리밍과 요약
- 메모리 시스템: 스크래치패드와 장기 메모리
- 고급 격리 전략: 멀티에이전트와 샌드박스 활용
AI 에이전트의 성능을 극대화하기 위해서는 이러한 컨텍스트 엔지니어링 전략들을 상황에 맞게 조합하여 사용하는 것이 중요합니다. LangGraph와 LangSmith를 함께 활용하면 컨텍스트 엔지니어링 기회를 식별하고, 구현하고, 테스트하는 선순환 구조를 만들 수 있습니다.
컨텍스트 엔지니어링은 AI 에이전트 개발자들이 반드시 습득해야 할 핵심 기술입니다. 이 가이드에서 제시한 전략들을 통해 더 효율적이고 성능이 뛰어난 AI 에이전트를 구축할 수 있을 것입니다.
Comments