
컨텍스트 정제는 이해하기 전까지 추상적으로 들리는 개념 중 하나입니다. 하지만 이해하고 나면, 지금까지의 모든 AI 상호작용에서 이미 이를 경험해왔다는 것을 깨닫게 됩니다. AI 에이전트와 워크플로를 구축하는 개발자에게 컨텍스트 정제를 이해하는 것은 방향을 잃는 에이전트와 임무에 집중하는 에이전트의 차이를 만듭니다.
정의
컨텍스트 정제는 AI 모델이 가장 최근의 입력만이 아니라, 상호작용 전반에 걸쳐 누적된 컨텍스트를 기반으로 이해, 출력 또는 동작을 조정하는 프로세스입니다.
더 정확히 말하면: 대화 초기의 컨텍스트가 이후 응답에 영향을 미치는 메커니즘이며, 에이전트가 누적된 컨텍스트를 의도적으로 활용하거나 초기화하도록 설계하는 방법입니다.
프롬프트 엔지니어링보다 중요한 이유
프롬프트 엔지니어링은 올바른 출력을 얻기 위한 올바른 입력을 만드는 데 집중합니다. 컨텍스트 정제는 여러 턴에 걸쳐 모델의 동작에 영향을 미치는 전체 정보 상태를 관리하는 것입니다.
실제 차이점:
| 프롬프트 엔지니어링 | 컨텍스트 정제 |
|---|---|
| "이 프롬프트를 어떻게 표현할까?" | "이 시점에서 모델은 어떤 컨텍스트를 갖고 있나?" |
| 단일 턴 최적화 | 다중 턴 상태 관리 |
| 단어 선택과 구조 | 정보 아키텍처 |
| 개별 요청 품질 | 시스템 수준 동작 품질 |
둘 다 중요합니다. 하지만 AI 시스템이 더 에이전트적으로 변화함에 따라 — 여러 단계에 걸쳐 결정을 내리면서 — 컨텍스트 정제가 더 중요한 기술이 됩니다.
컨텍스트가 AI 동작에 미치는 영향
대규모 언어 모델은 세션 간 메모리가 없지만, 컨텍스트 윈도우 내에서는 모든 것이 누적되어 모델의 동작에 영향을 줍니다:
- 최신성 편향: 최근 정보가 오래된 컨텍스트보다 더 큰 비중을 차지함
- 모순: 나중의 컨텍스트가 이전 지시를 덮어쓸 수 있음 (좋게도, 나쁘게도)
- 페르소나 지속성: 컨텍스트 초기에 확립된 역할 정의가 지속됨
- 오류 전파: 다단계 작업 초기의 실수가 수정되지 않으면 누적됨
이것이 명확한 컨텍스트로 시작한 잘 설계된 에이전트가, 혼란스럽고 모순된 컨텍스트를 누적한 에이전트와 다르게 동작하는 이유입니다 — 같은 모델을 사용하더라도.
개발자를 위한 컨텍스트 정제 기법
1. 컨텍스트 시딩
메인 작업이 시작되기 전에 올바른 컨텍스트 확립하기:
# 메인 작업 프롬프트 전에 설정:
context = """
Project: E-commerce platform in TypeScript/Next.js
Patterns: Functional programming, immutable state
Constraints: No class components, use zustand for state
Error handling: Use Result types from src/types/result.ts
Testing: Jest with React Testing Library
"""
response = client.messages.create(
messages=[
{"role": "user", "content": context + "\n\n" + main_task}
]
)
2. 점진적 컨텍스트 로딩
모든 컨텍스트를 처음부터 로드하는 것 대신, 필요에 따라 점진적으로 컨텍스트를 로드하기:
class ContextManager:
def __init__(self, model):
self.model = model
self.context_items = []
def add_context(self, item: str, priority: int = 5):
self.context_items.append({"content": item, "priority": priority})
def get_active_context(self, max_tokens: int = 4000) -> str:
# 우선순위로 정렬하여 가장 높은 항목 먼저 포함
sorted_items = sorted(self.context_items, key=lambda x: -x['priority'])
active = []
total = 0
for item in sorted_items:
item_tokens = len(item['content']) // 4 # 대략적인 추정
if total + item_tokens > max_tokens:
break
active.append(item['content'])
total += item_tokens
return "\n\n".join(active)
3. 컨텍스트 체크포인트
긴 에이전트 워크플로에서 드리프트를 방지하기 위해 정기적으로 컨텍스트를 요약하고 초기화하기:
async def run_agent_with_checkpoints(task: str, steps: list):
context_summary = ""
for i, step in enumerate(steps):
# 단계 실행
result = await agent.run(
task=step,
context=context_summary
)
# 3단계마다 컨텍스트 체크포인트 생성
if i % 3 == 2:
context_summary = await agent.run(
task="Summarize the key facts, decisions made, and current state in 200 words",
context=result
)
return result
4. 컨텍스트 격리
이전 컨텍스트에 영향받지 않고 모델이 추론해야 할 때:
# 격리된 추론을 위한 새로운 컨텍스트 시작
isolated_response = client.messages.create(
system="You are a code reviewer with no prior context about this project.",
messages=[
{"role": "user", "content": f"Review this function:\n\n{code}"}
]
)
멀티 에이전트 시스템에서의 컨텍스트 정제
여러 에이전트가 협력할 때, 컨텍스트 관리는 조정 문제가 됩니다:
에이전트 A (리서처)
↓ 전달: 구조화된 JSON 형태의 리서치 결과
에이전트 B (라이터)
↓ 전달: 초안 + "결정 사항" 요약
에이전트 C (리뷰어)
↓ 전달: 리뷰 노트 + "수락/거절" 결정
에이전트 D (퍼블리셔)
각 인수인계는 올바른 컨텍스트를 전달할 기회(에이전트 B가 에이전트 A의 작업을 이어받을 수 있게), 너무 많이 전달할 기회(에이전트 B가 작업을 반복하게 됨), 또는 너무 적게 전달할 기회(에이전트 B가 중요한 결정을 잃게 됨)입니다.
모범 사례: 파이프라인의 각 에이전트는 다음을 받아야 합니다:
- 자신의 구체적인 작업
- 이 시점에 이르게 된 결정사항 (완전한 심의가 아닌)
- 작업에 적용되는 제약 조건
- 명확한 출력 형식 요건
AnyCap 워크플로에서의 컨텍스트 정제
AnyCap의 스킬 시스템은 컨텍스트 정제를 염두에 두고 설계되었습니다. 각 스킬은 다음을 받습니다:
- 구조화된 작업 브리프
- 관련 워크스페이스 컨텍스트 (에이전트의 현재 상태에서)
- 기능별 파라미터
즉, 각 기능이 전체 프로젝트 컨텍스트를 다시 이해할 필요 없이 AnyCap 기능들을 연결할 수 있습니다:
# 에이전트가 한 번 컨텍스트 확립
anycap skill run anycap-deepresearch \
-m "Research competitive landscape for AI video generation APIs"
# 이후 기능들은 원시 컨텍스트가 아닌 구조화된 출력으로 작업
anycap image generate \
--prompt "Comparison diagram: Kling vs Seedance vs Veo3 feature matrix, clean table style" \
--model nano-banana-2
# 각 기능은 필요한 컨텍스트만 얻음, 그 이상도 이하도 아님
핵심 요점
- 컨텍스트 정제는 누적된 컨텍스트의 관리 — 개별 프롬프트 품질만이 아닌
- 컨텍스트는 긴 세션에서 드리프트됨 — 체크포인트와
/compact를 활용해 관리하기 - 점진적 로딩이 한꺼번에 쏟아붓는 것보다 낫다 — 필요할 때 컨텍스트 추가하기
- 멀티 에이전트 시스템에는 명시적인 컨텍스트 인수인계 프로토콜이 필요 — 컨텍스트가 자동으로 흐른다고 가정하지 않기
- 격리는 하나의 기법 — 더 나은 추론을 위해 때로는 새로운 컨텍스트가 필요