| [Glossary] 컨텍스트 엔지니어링 완벽 정리 | Context Engineering을 쉽게 이해하는 법 |
한 줄 요약: 컨텍스트 엔지니어링(Context Engineering)이란, LLM의 컨텍스트 윈도우에 들어가는 모든 정보(시스템 프롬프트, 도구 설명, 메모리, 검색 결과 등)를 AI가 최적의 결과를 내도록 전략적으로 설계하고 구성하는 기술이다.
1. 컨텍스트 엔지니어링이란 무엇인가?
프롬프트 엔지니어링이 “무엇을 말할까”에 집중한다면, 컨텍스트 엔지니어링은 “AI에게 어떤 환경을 만들어줄까”에 집중합니다.
요리 비유로 설명하면, 프롬프트 엔지니어링은 레시피 작성이고, 컨텍스트 엔지니어링은 주방 전체 세팅입니다. 좋은 주방에는 신선한 재료(관련 데이터), 필요한 도구(함수/API), 조리법(시스템 프롬프트), 보조 요리사(메모리)가 모두 갖춰져 있습니다.
2025년 Andrej Karpathy는 트위터에서 다음과 같이 언급했습니다:
“The hottest new skill is ‘context engineering’ — the delicate art and science of filling the context window with just the right information.”
2. 핵심 개념 이해하기
컨텍스트 윈도우의 구성 요소
┌─────────────────────────────────────────────┐
│ 컨텍스트 윈도우 (200K 토큰) │
│ │
│ 1. 시스템 프롬프트 (역할, 규칙, 스타일) │
│ ↳ 전체의 5~15% 권장 │
│ │
│ 2. 도구/함수 설명 │
│ ↳ 필요한 도구만 포함 (동적 로딩) │
│ │
│ 3. 장기 메모리 (관련 과거 정보) │
│ ↳ 벡터 DB 검색으로 선택적 주입 │
│ │
│ 4. 단기 메모리 (현재 세션 히스토리) │
│ ↳ 요약/압축으로 관리 │
│ │
│ 5. 검색 결과/RAG 컨텍스트 │
│ ↳ 관련도 높은 청크만 선택 │
│ │
│ 6. 현재 사용자 메시지 │
└─────────────────────────────────────────────┘
컨텍스트 품질의 4원칙
| 원칙 | 설명 | 예시 |
|---|---|---|
| 관련성 | 현재 작업에 직접 관련된 정보만 | RAG로 관련 문서만 선택 |
| 신선도 | 최신 정보 우선 포함 | 시간순 정렬, 오래된 메시지 요약 |
| 충분성 | 작업 완료에 필요한 정보 확보 | 누락된 컨텍스트 감지 및 요청 |
| 효율성 | 중복·불필요한 내용 최소화 | 대화 히스토리 요약 압축 |
컨텍스트 오염(Context Pollution) 방지
# ❌ 나쁜 예: 관련 없는 정보 누적
context = [
"2주 전 마케팅 기획 논의...", # 현재 작업과 무관
"지난주 버그 수정 히스토리...", # 현재 작업과 무관
"지난달 인사이동 공지...", # 완전 무관
"현재 질문: 코드 리뷰해줘"
]
# ✅ 좋은 예: 관련 정보만 선택
context = [
"코드 리뷰 지침: ...", # 현재 작업 직접 관련
"이전 리뷰에서 발견된 패턴: ...", # 현재 작업 관련
"현재 질문: 코드 리뷰해줘"
]
3. 실무 적용 예시
컨텍스트를 동적으로 구성하는 컨텍스트 매니저입니다.
from anthropic import Anthropic
from dataclasses import dataclass
from typing import Optional
@dataclass
class ContextConfig:
system_prompt: str
max_history_tokens: int = 4000
max_rag_tokens: int = 8000
max_tool_tokens: int = 2000
class ContextManager:
def __init__(self, config: ContextConfig):
self.config = config
self.client = Anthropic()
def build_context(
self,
user_message: str,
history: list[dict],
rag_results: list[str],
tools: Optional[list] = None
) -> dict:
"""최적화된 컨텍스트를 구성합니다."""
# 1. RAG 결과 우선순위 정렬 및 트리밍
rag_context = self._select_rag(rag_results, self.config.max_rag_tokens)
# 2. 대화 히스토리 압축
compressed_history = self._compress_history(history, self.config.max_history_tokens)
# 3. 시스템 프롬프트에 RAG 주입
enriched_system = f"""{self.config.system_prompt}
## 참고 문서
{rag_context}
"""
return {
"system": enriched_system,
"messages": compressed_history + [
{"role": "user", "content": user_message}
],
"tools": tools or []
}
def _select_rag(self, results: list[str], max_tokens: int) -> str:
"""토큰 한도 내에서 RAG 결과를 선택합니다."""
selected = []
total = 0
for result in results:
tokens = len(result) // 4 # 근사치
if total + tokens > max_tokens:
break
selected.append(result)
total += tokens
return "\n---\n".join(selected)
def _compress_history(self, history: list[dict], max_tokens: int) -> list[dict]:
"""토큰 한도 초과 시 오래된 대화를 요약합니다."""
total = sum(len(m["content"]) // 4 for m in history)
if total <= max_tokens:
return history
# 오래된 메시지 요약
to_summarize = history[:-4] # 최근 4개 메시지는 보존
recent = history[-4:]
summary_response = self.client.messages.create(
model="claude-3-haiku-20240307",
max_tokens=500,
messages=[{
"role": "user",
"content": f"다음 대화를 3문장으로 요약하세요:\n{to_summarize}"
}]
)
summary = summary_response.content[0].text
return [{"role": "assistant", "content": f"[이전 대화 요약] {summary}"}] + recent
4. 컨텍스트 엔지니어링 vs 유사 개념 비교
| 구분 | 컨텍스트 엔지니어링 | 프롬프트 엔지니어링 | RAG |
|---|---|---|---|
| 범위 | 컨텍스트 전체 설계 | 프롬프트 텍스트 최적화 | 외부 지식 검색 |
| 대상 | 정보 구조·선택·배치 | 지시 표현 방식 | 관련 문서 주입 |
| 복잡도 | 높음 (시스템적 접근) | 중간 | 중간 |
| 에이전트 적합성 | ✅ 매우 적합 | 기본 수준 | 지식 보완 |
| 비용 효율 | ✅ 불필요 토큰 제거 | 보통 | 추가 DB 비용 |
5. 마치며
컨텍스트 엔지니어링은 LLM 시스템의 성능을 프롬프트 수준에서 시스템 수준으로 끌어올리는 기술입니다. 에이전틱 AI 시대에는 단순한 프롬프트 작성보다 “AI에게 어떤 환경을 제공할 것인가”를 설계하는 역량이 더 중요해집니다. 프롬프트 캐싱(Prompt Caching)과 결합하면 성능과 비용을 동시에 최적화할 수 있습니다.
참고 자료
- Andrej Karpathy의 컨텍스트 엔지니어링 트윗 — “Context Engineering” 용어 대중화에 기여
- LangChain Context Management — 실무 컨텍스트 관리 구현 가이드
함께 읽으면 좋은 용어
이 개념과 함께 알아두면 이해가 깊어지는 관련 용어들입니다.
댓글 남기기