"Context Engineering — 모델에게 무엇을 보여줄 것인가 (하네스 시리즈 2/6)"
시리즈 1/6에서 정의한 7가지 엔지니어링 문제 중 두 번째. 모델에게 무엇을 보여줄지 결정하는 일. 좋은 컨텍스트 → 좋은 답. 컨텍스트가 망가지면 GPT-5.5도 GPT-2처럼 답한다.
Part 1에서 Agent = Model + Harness 명제를 봤다. 이번 글은 그 하네스의 가장 중요한 한 축인 Context Engineering을 다룬다.
Context Engineering = "모델 입력에 무엇을 어떻게 채울지를 시스템적으로 설계하는 일." 단순히 길게 채우는 게 아니라 동적으로 조립한다.
이 글은 그 원리·기법·도구별 구현(Claude Code, Cursor, oMLX 등)을 다룬다.
시리즈 (6편)
- 하네스 엔지니어링이란 — 정의·역사·중요성
- Context Engineering ← 이 글
- Memory Systems — 세션/장기 메모리, 벡터 vs SQL
- Tools & Sandboxing — Tool spec, MCP, VM 격리
- Multi-Provider Routing — 비용/품질 라우팅, fallback
- Evaluation & Ops — Eval harness, observability, runner
1. 컨텍스트 윈도우 = 공유 예산
토큰 1개 ≈ 영어 0.75 단어. 128K 윈도우 = 약 96,000 단어. 100만 토큰 = 75만 단어 (장편소설 5권 분량).
이 예산을 다음이 함께 쓴다: - 시스템 프롬프트 - 검색된 문서 (RAG) - 대화 이력 - 모델의 출력 - 도구 호출 결과 (MCP 등)
핵심: "더 큰 컨텍스트 윈도우 = 더 좋은 결과"가 아니다. 예산을 어디에 쓰느냐가 결정.
2026년 주요 모델 컨텍스트
| 모델 | 컨텍스트 |
|---|---|
| GPT-5.5 | 1.05M tokens (272K 초과 시 2× 요율) |
| Claude Opus 4.7 | 200K (1M 옵션) |
| DeepSeek V4 | 1M tokens |
| Kimi K2.6 | 256K tokens |
| Qwen3.6-27B | 262K (YaRN으로 1M 확장 가능) |
100만 토큰이 표준화됐지만 — 다 채우는 게 답이 아니다.
2. 왜 "다 채우면 안 되는가" — Lost in the Middle
대규모 컨텍스트 연구의 일관된 결과:
모델은 컨텍스트의 첫 부분과 마지막 부분을 가장 잘 사용한다. 중간은 약하다 (Lost in the Middle 문제).
그래서 1M 토큰을 다 채우면: - TTFT (Time To First Token) 길어짐 (prefill 비용 ↑) - 비용 ↑ - 정확도 ↓ (중간 정보 묻힘) - 추론 burn-out: 50-step 워크플로우 × 20K 토큰/call = 1M 누적, 추론 질이 떨어짐
결론: 컨텍스트는 작게, 정확하게 채우는 게 항상 낫다.
3. 5가지 핵심 기법
3-1. Auto-Compact (자동 압축)
컨텍스트 사용률이 한계에 가까워지면 자동으로 옛 내용을 요약해서 자리 비움.
Claude Code: 토큰 사용률이 약 98%에 도달하면 자동 compact 실행. 옛 이력을 요약해 새 자리 만든다.
oMLX는 SSD KV 캐시로 또 다른 접근 — 압축이 아니라 외부 저장.
3-2. Hierarchical Processing (계층적 처리)
오래된 컨텍스트를 추상으로 변환: - Raw: "사용자가 X 파일에서 line 42를 수정했다 → ..." - 1단계 요약: "사용자가 X 파일 인증 로직 수정" - 2단계 요약: "이번 세션에서 인증 + 라우팅 작업"
수준이 깊을수록 정보 압축률 ↑, 세부 손실 ↑. 균형 필요.
3-3. Tool Output Limiting (도구 출력 제한)
도구 호출 결과가 컨텍스트를 빠르게 잡아먹는다.
Claude Code 기본값: MCP 도구 출력 25,000 토큰 한도, 10,000 토큰에서 경고. 서버가 명시적으로 허용하면 최대 500,000 문자까지 파일로 저장.
도구 결과를 전부 컨텍스트에 넣지 않고, 큰 결과는 디스크 저장 → 모델은 요약·인덱스만 본다.
3-4. Reference vs Inline (참조 vs 인라인)
코드 파일을 통째로 컨텍스트에 넣는 대신:
- 파일 경로만 시스템 프롬프트에
- 모델이 필요할 때 Read 도구로 그때그때 가져옴
이렇게 하면 컨텍스트가 동적으로 채워진다. 100K 파일을 매번 안 들고 다닌다.
3-5. CLAUDE.md / 프로젝트 컨텍스트 파일
지속적인 프로젝트 정보를 별도 파일에 두고 매 세션 자동 로드.
Claude Code: 프로젝트 루트의
CLAUDE.md를 모든 세션에서 자동 로드. 사용자 정의 명령, 코딩 컨벤션, 금지 패턴 명시.
이 파일은 Guides (Part 1 분류)에 해당하며, 휘발되지 않고 누적된다.
4. Claude Code의 5-Layer Compaction Pipeline
arXiv 2604.14228 ("Dive into Claude Code")에 따르면 Claude Code는 컨텍스트 관리를 5단 파이프라인으로 한다:
- Live conversation buffer — 직전 대화 그대로
- Recent tool results — 최근 도구 호출 결과 (제한적 보존)
- Compacted history — 옛 이력 요약본
- Project context — CLAUDE.md + 프로젝트 메타
- System primitives — 핵심 시스템 프롬프트
각 레이어는 서로 다른 압축률과 수명을 가진다. 1번이 가득 차면 옛것을 2~3번으로 evict, 거기서 또 가득 차면 요약.
단순 FIFO와 차이
일반 챗봇은 그냥 가장 오래된 메시지를 버린다. Claude Code는 요약하고 보존한다 — 정보 손실 최소화하면서 자리 확보.
5. MCP (Model Context Protocol) — 표준 도구 인터페이스
Anthropic이 2024년 11월에 공개한 MCP는 도구 호출의 표준 프로토콜이다. 2026년 현재 Claude Code, Cursor, OpenAI Codex CLI 모두 MCP 서버를 사용한다.
핵심 컨텍스트 영향
- MCP 서버는 외부 시스템 (DB, API, 파일시스템)을 도구로 노출
- 도구 호출 결과는 컨텍스트 윈도우로 들어간다 → 압박 발생
- Claude Code의 25K/500K 한도는 이 압박을 다스리는 메커니즘
잘 짠 MCP 서버 vs 나쁜 MCP 서버
- 좋은 서버: 결과를 요약해서 반환, 큰 데이터는 ID만 주고 별도 fetch
- 나쁜 서버: 50K 줄 SQL 결과를 통째로 토해서 컨텍스트 폭발
도구 작성자가 컨텍스트 엔지니어링을 공동 책임진다는 의미다.
6. 실전 패턴
6-1. 시스템 프롬프트 다이어트
- 안 좋은 예: "당신은 매우 도움이 되는, 친절하고, 협조적이며, 깊이 사고하는, 정확하고..."
- 좋은 예: "Goal-driven. State results directly. No filler."
설명적 미사여구 대신 행동 명령으로. 토큰 절약 + 모델이 명확한 행동 지침.
6-2. 진행 상태 외부화
긴 작업 중간 상태를 외부 파일(plan.md, tasks/)에 저장 → 컨텍스트 클리어 후 재로드.
CLAUDE.md 패턴: 모든 작업 끝에
tasks/sessions/에 스냅샷 저장. 다음 세션 자동 로드.
6-3. Sub-agent 격리
긴 검색·분석은 sub-agent에게 위임 → 결과만 받음. 메인 컨텍스트가 검색 과정 details로 오염되지 않음.
Claude Code의
Agent도구가 이 패턴.
6-4. RAG vs Long Context
- RAG: 100K 문서를 외부 인덱스에 두고 질의별로 5K만 가져옴
- Long Context: 100K를 그대로 컨텍스트에 채움
비교: | 항목 | RAG | Long Context | |---|---|---| | 비용 | 낮음 | 높음 (전체 prefill) | | 정확도 | 검색 품질에 의존 | 자체 attention | | 갱신 | 인덱스만 갱신 | 매번 다시 채움 | | 권장 | 정형 검색 | 한 번에 전체 추론 |
큰 모델 + 1M 컨텍스트가 표준화돼도 RAG는 비용 측면에서 우위가 사라지지 않는다.
7. 도구별 구현 비교
| 도구 | Auto-compact | Tool 결과 한도 | 프로젝트 컨텍스트 | 외부 메모리 |
|---|---|---|---|---|
| Claude Code | ✅ (~98%에서) | 25K/500K | CLAUDE.md | ✅ (Skills, MCP) |
| Cursor 3 | ✅ | — | .cursorrules | ✅ (cloud agent) |
| OpenClaw | ✅ | — | CLAUDE.md (호환) | ✅ (memcore) |
| Hermes | ✅ | — | 자체 | ✅ (FTS5 + vector) |
| oMLX | — (모델 레벨) | — | — | SSD KV cache |
oMLX는 모델이 아닌 추론 서버 레벨에서 KV cache를 SSD에 영속화 → 같은 시스템 프롬프트 반복 호출 시 prefill 비용 0에 가깝게.
8. Anti-patterns (자주 보는 실수)
8-1. "윈도우 큰 모델로 그냥 다 넣으면 됨"
1M 윈도우라도 다 채우면: - TTFT 폭발 (prefill 시간 ∝ N²) - 비용 폭발 (272K 초과 GPT-5.5는 2× 요율) - 중간 정보 손실 (Lost in the Middle)
8-2. "도구 결과 그대로 컨텍스트로"
SQL 50K 줄을 통째로 넣으면 다음 turn에 모든 토큰이 그걸 반복적으로 처리. 결과 요약 + 외부 저장 필수.
8-3. "CLAUDE.md에 다 넣자"
CLAUDE.md가 30K 토큰이면 매 세션 시작에 30K가 깎임. 핵심만 + 자주 안 쓰는 지식은 별도 docs/에 두고 필요 시 로드.
8-4. "대화 이력은 다 보존"
긴 대화는 압축 + 외부화. 챗봇 패러다임을 에이전트로 옮길 때 가장 흔한 실수.
정리
Context Engineering은 단순 윈도우 크기 게임이 아니다.
| 원칙 | 한 줄 |
|---|---|
| 작게 + 정확히 | 1M 채우는 것보다 5K 정확한 게 낫다 |
| 동적 조립 | 정적 prompt가 아닌 런타임 빌드 |
| 외부화 | 메모리·도구·파일을 컨텍스트 밖에 두고 그때 가져옴 |
| Auto-compact | 한계 도달 전 자동으로 압축 |
| Layer 분리 | 시스템·프로젝트·세션·도구 결과는 서로 다른 수명 |
핵심 한 문장: "컨텍스트 윈도우는 공유 예산이다. 모든 토큰은 비용을 가진다."
다음 편(3/6)은 컨텍스트 밖에서 정보를 보존하는 방법 — Memory Systems를 다룬다.
참고 자료 (1차 출처)
- "Dive into Claude Code": arxiv.org/abs/2604.14228 (Liu et al., 2026-04-14)
- Anthropic MCP 명세: modelcontextprotocol.io
- Lost in the Middle: arXiv:2307.03172
- Martin Fowler 하네스 글: martinfowler.com/articles/harness-engineering.html
댓글
댓글 쓰기