
AI와의 대화가 길어지면 왜 대화가 겉도는가 ― 컨텍스트 윈도우(Context Window)와 문맥 압축(Compaction) 실전 가이드
요약
AI와의 긴 대화에서 발생하는 문맥 상실 원인인 컨텍스트 윈도우와 토큰의 개념을 설명합니다. 컨텍스트 윈도우가 넓어져도 'Lost in the Middle' 현상이나 'Context Rot' 문제로 인해 성능이 저하될 수 있음을 경고합니다.
핵심 포인트
- 컨텍스트 윈도우는 AI가 한 번에 처리할 수 있는 토큰의 상한선임
- AI는 기억하는 것이 아니라 매번 전체 문맥을 다시 읽는 방식임
- 문맥이 길어질수록 중간 정보를 놓치는 'Lost in the Middle' 현상 발생
- 입력이 길어질수록 모델의 정확도가 떨어지는 'Context Rot' 문제 존재
AI와의 대화, 길어지면 갑자기 대화가 겉도는 느낌을 받지 않으시나요? 처음에는 그렇게 명석했는데, 막바지에 다다르면 "그건 아까 말했잖아", "왜 전제를 빼먹는 거야?" 같은 상황이 늘어납니다. 이건 AI가 게으름을 피우는 것도, 당신의 전달 방식이 잘못된 것도 아닙니다. 원리를 알면 제대로 대처할 수 있습니다. 오늘은 그 부분을, 사전 지식이 전혀 없는 분들을 대상으로 첫걸음부터 차근차근 안내해 보겠습니다.
애초에 "컨텍스트 윈도우(Context Window)"란 무엇인가요
이 부분을 건너뛰면 전체 내용이 모호해지므로, 우선 용어부터 짚고 넘어가겠습니다. 이미 알고 계신 분들은 읽지 않고 넘어가셔도 좋습니다.
먼저 "LLM (대규모 언어 모델)". ChatGPT나 Claude의 내부 엔진으로, 대략 말하자면 "다음에 올 것 같은 단어를 끊임없이 예측하는 장치"입니다. 똑똑해 보이지만, 실제로 하는 일은 "지금까지의 문장을 읽고, 그 뒤에 이어질 법한 가장 그럴싸한 단어를 내놓는 것"의 반복입니다. 이것만 먼저 머릿속에 넣어두세요.
다음은 "토큰 (Token)". AI는 문장을 있는 그대로 읽는 것이 아니라, 작은 덩어리로 나누어 처리합니다. 이 나누는 단위가 토큰입니다. 일본어라면 대략 1글자~수 글자에 1토큰, 영어라면 단어의 일부가 1토큰 정도라는 감각으로 이해하면 될 것 같습니다. 이것이 왜 중요하냐면, AI의 "읽을 수 있는 양"도 "비용"도 글자 수가 아니라 이 토큰 수로 결정되기 때문입니다.
그리고 본론인 "컨텍스트 윈도우 (Context Window)". 이것은 AI가 한 번에 시야에 담을 수 있는 토큰의 상한선입니다. 책상의 넓이라고 생각하세요. 당신이 보낸 질문도, 시스템의 지시도, 지금까지의 대화 내용도, AI가 사용한 도구의 결과도, 전부 이 책상 위에 종이로 늘어놓고 AI는 그것을 매번 다시 읽은 뒤에 대답합니다.
여기가 가장 중요한 오해 포인트인데, AI는 "기억"하고 있는 것이 아닙니다. 인간처럼 "아까 한 이야기, 기억하고 있어"가 아니라, 매번 백지상태에서 책상 위에 놓인 종이를 전부 다시 읽고 있을 뿐입니다. 그래서 책상 밖으로 넘쳐 흘러나온 종이는 AI에게 있어 처음부터 존재하지 않는 것과 같습니다.
그렇게 생각하면, 긴 대화에서 AI가 "잊어버리는" 것은 성격 문제나 태만함이 아니라, 그저 책상에서 종이가 흘러넘친 것뿐입니다. 이를 이해하면 스스로를 자책할 필요도 없고, 대처법도 보이게 됩니다.
"그럼 책상을 넓히면 되잖아"라고 생각하시겠죠. 2026년 시점에서 책상은 엄청나게 넓어져 있습니다. Claude는 표준으로 약 20만 토큰, 베타 버전에서는 100만 토큰. Gemini는 100만~200만 토큰, GPT 계열도 100만 토큰을 넘습니다. 책 한 권은커녕 여러 권도 책상에 올릴 수 있는 시대입니다.
하지만 여기에 함정이 있었습니다.
창을 넓히는 것이 해결책은 아니었다
단순하게 생각하면 책상이 넓으면 넓을수록 똑똑해질 것 같지 않나요? 자료를 전부 붙여넣고 "이거 전부 읽고 대답해"가 통할 것 같습니다. 그런데 연구 결과는 이를 명확히 부정하고 있습니다.
첫 번째는 "Lost in the Middle (중간에서 길을 잃다)"라는 유명한 연구입니다 (Liu 등, 2023년). 긴 문맥 속에 중요한 정보를 하나 섞어 넣고, 위치를 바꿔가며 AI에게 찾게 하는 실험을 했습니다. 결과적으로 문맥의 앞부분이나 뒷부분에 둔 정보는 제대로 사용할 수 있었지만, 중간에 둔 정보는 통째로 놓쳤습니다. 성적이 U자 곡선을 그린 것입니다. 게다가 이는 "장문 대응"을 내세우는 모델에서도 일어났습니다. 책상이 넓어도 중간 부분은 사각지대가 되기 쉽다는 뜻입니다.
두 번째는 더 최근의 "Context Rot (문맥의 부패)"라는 연구입니다 (Chroma Research, 2025년). 18개의 주요 모델을 대상으로 입력을 점점 길게 하면서 정확도를 측정했더니, 모든 모델에서 입력이 길어질수록 성능이 서서히 떨어졌습니다. 예외는 없었습니다.
여기서 얻을 수 있는 교훈은 심플합니다. "창에 들어온다"와 "제대로 사용할 수 있다"는 별개라는 것입니다. 100만 토큰이 들어간다고 해서, 100만 토큰을 채워 넣는다고 100만 토큰만큼 똑똑해지는 것은 아닙니다. 오히려 반대로 둔해지는 경우도 있습니다.
직관적인 이유도 어렵지 않습니다. 정보가 늘어나면 비슷하지만 무관한 노이즈도 함께 늘어나기 때문입니다. AI의 "주의 (Attention, 어디를 볼 것인가)"는 유한하므로, 노이즈가 많을수록 희석됩니다. 어질러진 책상에서 물건을 찾지 못하는 것과 마찬가지로, 넓은 책상을 어지럽히면 오히려 더 찾기 힘들어집니다.
그러니까 목표는 "창을 가득 채우는 것"이 아니라, "창을 깨끗하게 유지하는 것"입니다. AI에게 전달하는 정보를 양으로 승부하는 것이 아니라, 질로 설계하는 것. 최근에는 이러한 발상을 "컨텍스트 엔지니어링 (Context Engineering, 문맥 설계)"이라고 부릅니다. Anthropic이 "프롬프트 엔지니어링 (Prompt Engineering) 다음에 올 기술"이라고 말하는 바로 그것입니다. 솔직히 저는 이 "다음"이라는 표현이 매우 적절하다고 생각합니다. 뛰어난 지시문을 쓰는 능력보다, AI의 책상 위에 무엇을 올리고 무엇을 치울지를 결정하는 능력이 앞으로 더 중요해질 것 같다는 느낌이 듭니다.
대책 지도: 버리기 · 요약하기 · 외부로 내보내기 · 나누기
그렇다면 책상을 깨끗하게 유지하기 위해 구체적으로 무엇을 해야 할까요? 할 일은 크게 4가지로 정리할 수 있습니다. 먼저 지도를 머릿속에 넣어둡시다.
| 전략 | 하는 일 | 효과적인 시점 | 한 줄 요약 |
|---|---|---|---|
| 버리기 (Prune) | 오래되거나 무관하거나 중복된 종이를 책상에서 치움 | 도구의 실행 결과가 쌓이기 시작할 때 | 가장 저렴하고 빠름 |
| ... |
이 4가지는 사실 Anthropic이 "장기 태스크 (Long-term Task)에서 사용하는 수법"으로 꼽은 기둥과 거의 일치합니다. 그들은 "compaction (압축)", "structured note-taking (구조화된 메모 작성)", "multi-agent (멀티 에이전트)"를 3대 기둥으로 꼽고 있습니다. 저는 거기에 "애초에 버리기"를 더해 4가지로 구성했습니다.
수치도 구체적이라 흥미로운데, Anthropic은 2025년 9월에 "context editing (컨텍스트 편집)"이라는 메커니즘을 선보였습니다. 이는 책상 위에 쌓인 오래된 도구의 실행 결과 등을 자동으로 살며시 치워주는 기능입니다. 그들의 내부 평가에 따르면, 이 자동 정리 기능을 도입하는 것만으로 성적이 약 29% 향상되었고, 외부 메모 메커니즘과 결합했을 때는 약 39% 향상되었다고 합니다. 게다가 100턴(turn) 이상 주고받는 긴 검색 태스크에서는 토큰 (Token) 소비량을 무려 84%나 줄일 수 있었다고 합니다. 정리는 지능에도, 지갑에도 도움이 되는 셈이죠.
지금부터는 이 4가지를 순서대로, 직접 실행할 수 있는 형태로 풀어보겠습니다. 코드는 모두 복사해서 바로 실행할 수 있는 수준으로 작성했으니, 분위기라도 따라와 보세요.
직접 해보기 ①: 문맥 압축 (Compaction) 구현하기
먼저 효과가 큰 "요약하기 = Compaction"부터 시작하겠습니다.
Compaction의 정의는 이렇습니다. 책상이 가득 차려고 하면, 지금까지의 대화를 요약하여 그 요약본만 가지고 새로운 깨끗한 책상에서 다시 시작하는 기술입니다. Claude Code를 사용해 본 적이 있다면, /compact라는 명령어가 바로 이것입니다. 대화 이력을 꽉 압축하여 새로운 세션으로 이어줍니다.
구현의 핵심은 "최근 내용은 원문 그대로 남기고, 그 이전 내용은 요약하여 접는다"입니다. 왜냐하면 최근의 상호작용은 신선도가 생명이기 때문입니다. 요약하면 세세한 뉘앙스가 사라지므로, 지금 막 대화하고 있는 부분까지 요약해 버리면 정확도가 급격히 떨어집니다. 따라서 "최근 N번의 왕복은 그대로 유지하고, 오래된 부분만 요약"하는 이단계 전략을 취합니다.
먼저, 책상의 사용률을 대략적으로 측정하는 함수부터 시작합니다.
// 토큰 수를 대략적으로 추정 (정확히 측정하려면 각 사의 tokenizer를 사용)
// 일본어가 섞인 경우 "대략 1토큰 ≒ 1.8자" 정도로 거칠게 계산
function estimateTokens(text: string): number {
...
왜 "글자 수 ÷ 1.8" 같은 대충 만든 추정치를 써도 되나요?
정확한 토큰 수는 각 모델이 보유한 "토크나이저 (Tokenizer, 문장을 토큰으로 나누는 사전)"를 거치지 않으면 알 수 없습니다. 일본어, 영어, 기호, 코드에 따라 토큰이 나뉘는 방식이 다르기 때문입니다. 실제 서비스에서 비용이나 한도를 엄격하게 관리하고 싶다면, 각 사가 공식적으로 제공하는 토크나이저(Anthropic의 count_tokens에 해당하는 API나 OpenAI 계열의 tiktoken 등)로 측정하는 것이 정답입니다. 다만 "슬슬 책상이 꽉 차려나?"를 판단하는 용도라면, 글자 수 ÷ 1.8 정도의 거친 추정치로도 신호를 보내기에는 충분합니다. 우선 대충 측정해서 작동시키고, 정밀도가 필요해지면 진짜로 교체하면 됩니다.
다음은 본체입니다. 사용률이 임계값을 넘으면 오래된 부분만 AI에게 요약하게 하여 접습니다.
// 최근 keepRecent 번의 왕복은 남기고, 그 이전은 하나의 요약 메시지로 접음
async function compact(
messages: Message[],
...
핵심은 요약의 내용을 운에 맡기지 않는 것입니다. "무엇을 남기고 무엇을 버릴 것인가"를 요약 프롬프트 (Prompt) 측에서 지정합니다 (프롬프트 예시는 나중에 제시하겠습니다). 결정 사항, 제약 조건, 미해결 과제(Homework)는 남기고, 잡담이나 시행착오의 중간 과정은 버리는 식입니다. 이 부분을 설계하면 압축(Compaction)을 하더라도 대화가 길을 잃지 않습니다.
실습 ②: 외부 메모와 서브 에이전트 (Sub-agent) 분할
압축만 하다 보면 요약을 할 때마다 정보가 조금씩 깎여 나갑니다. 그래서 "외부로 내보내기"를 병행합니다.
생각하는 방식은 간단합니다. 정해진 사실을 책상 위에 계속 올려두지 않고, 외부 창고(파일이나 DB)에 기록해 두었다가 필요할 때만 꺼내 쓰는 것입니다. AI에게 "중요한 결정은 여기에 적어둬"라고 부탁하고, 적고 나면 본문에서는 지웁니다. 이것이 구조화된 메모 작성 (Structured note-taking)입니다. Claude Code가 작업 중에 메모를 남겨두는 것도 같은 발상입니다.
// 대화에서 "나중에 유용할 사실"만 외부 메모로 대피시키고, 본문에서는 삭제함
type Note = { key: string; value: string; savedAt: string };
const store: Note[] = []; // 실제로는 파일이나 DB에 저장함
...
책상에 전부 올려두는 것이 아니라, "지금 이 순간과 관계있는 메모"만 되돌립니다. 이렇게 하면 Lost in the Middle (중간에 놓치기) 리스크도 줄어듭니다.
덧붙여서, 그 Lost in the Middle 대책 자체도 코드로 하나 만들어 두겠습니다. 중요한 정보를 중간에 파묻히지 않게 하고, 앞부분과 뒷부분으로 몰아넣는 재정렬입니다.
// 중요도가 높은 정보를 "앞"과 "뒤"로 몰아넣음 (중간의 사각지대를 피함)
function reorderForAttention<T>(items: T[], importance: (x: T) => number): T[] {
const sorted = [...items].sort((a, b) => importance(b) - importance(a));
...
마지막은 "나누기 = 서브 에이전트 (Sub-agent)"입니다. 하나의 AI에게 조사와 구현을 모두 시키면 책상이 금방 어질러집니다. 그래서 예를 들어 "라이브러리 A 조사", "라이브러리 B 조사"를 별도의 AI 세션으로 분리하여, 각자 원하는 만큼 책상을 사용하게 하고, 돌아올 때는 요약만 가져오게 하는 방식입니다. 부모의 책상에는 요약만 올라오기 때문에 깔끔하게 유지할 수 있습니다.
// 자식 에이전트는 자신의 창에서 충분히 조사하고, 부모에게는 "요약만" 반환함
async function runSubAgent(
task: string,
...
다만, 나누는 것이 공짜는 아닙니다. AI를 여러 개 구동하는 만큼 토큰과 시간도 늘어나며, 돌아온 결과를 어떻게 통합하고 어디서 채택 여부를 판단할지는 인간(또는 부모 에이전트)이 쥐고 있어야 합니다. 편리하지만 만능은 아니라는 점을 염두에 두어야 합니다.
AI에게 "문맥을 정리하게 만드는" 프롬프트 3종
메커니즘을 이해했다면, 이제 AI 스스로 정리를 돕게 할 수 있습니다. 바로 사용할 수 있는 프롬프트 3개를 소개합니다.
첫 번째. Compaction의 내용을 운에 맡기지 않기 위한, 인수인계용 요약 프롬프트입니다.
지금까지의 대화를 다른 세션으로 인수인계하기 위한 요약으로 만들어주세요.
다음 4가지만 남기고, 그 외의 것(잡담, 시행착오의 중간 과정)은 버려주세요.
1. 확정된 결정 사항 (왜 그렇게 결정했는지 이유도 한 줄로)
...
두 번째. 책상이 어질러졌을 때 무엇을 내려놓아야 할지 AI가 골라내게 하는 트리아지 (Triage)입니다. 주의할 점은 최종적으로 "버리겠다"고 결정하는 것은 인간이라는 것입니다. AI에게는 후보를 뽑는 단계까지만 맡깁니다.
현재 문맥(대화 + 자료) 중에서 이미 불필요해졌을 가능성이 높은 것을 나열해주세요.
- 오래되어 현재 화제와 무관한 것
- 동일한 내용의 중복
...
세 번째. 중요 정보가 중간에 파묻혀 있지 않은지 점검하는 배치 리뷰 (Placement review)입니다.
앞으로 AI에게 전달할 자료의 순서를 리뷰해주세요.
이 태스크의 결론을 좌우할 "최우선 정보"가 문맥의 중간에 파묻혀 있지는 않습니까?
- 최우선 정보 Top 3를 꼽고, 현재 그것이 "앞부분, 중간, 뒷부분" 중 어디에 있는지 알려주세요
...
이 3가지의 공통점은 "AI에게 재료를 내놓게 하고, 결정은 인간이 한다"는 형태라는 점입니다. 정리를 통째로 맡겨버리면 중요한 것까지 접혀버리는 사고가 발생합니다. 이 부분은 직접 제어해야 할 영역입니다.
함정과 인간이 계속 쥐고 있어야 할 것
실제로 실행해 보면 빠지기 쉬운 지뢰들을 미리 정리해 두겠습니다.
| 함정 | 발생하는 현상 | 대책 |
|---|---|---|
| 많이 넣으면 똑똑해질 것이라 생각함 | Context Rot (문맥 부패)로 인해 오히려 성능 저하 | |
| ... |
마지막 행은 가장 중요하므로 별도로 분리하겠습니다.
퇴각 라인(Retreat Line)을 정해두는 것도 안심할 수 있는 방법입니다. 압축을 해도 대화가 미궁에 빠지는 것을 해결할 수 없다면, 무리하게 연명하지 말고 일단 요점을 직접 손으로 써서 새로운 세션(Session)을 다시 만드는 것이 더 빠릅니다. 긴 세션을 고집스럽게 이어가는 것보다, 깨끗한 책상에서 재시작하는 것이 결국에는 "고마워요"라는 말이 절로 나오게 만드는 경우가 많거든요.
인간과 AI의 역할 분담도 대략적인 선을 그어 두겠습니다.
| 영역 | 인간이 쥐고 있을 것 | AI에게 맡길 것 |
|---|---|---|
| 무엇을 남길 것인가 (What) | 결정하기 | 후보 제시하기 |
| ... |
요컨대, "무엇을·왜"는 인간이 쥐고, "어떻게"를 AI에게 넘기는 것입니다. 이 구분은 문맥 관리뿐만 아니라 AI 활용 전반에 유효한 방식이라고 생각합니다.
요약: 문맥을 버리는 용기는 미래의 자신에게 주는 선물
내용이 길어졌으니 핵심만 요약하겠습니다.
AI가 긴 대화에서 신뢰할 수 없게 되는 것은 성격이나 태만 때문이 아니라, 책상(Context Window, 컨텍스트 윈도우)에서 종이가 넘쳐흐르거나 중간 부분이 사각지대가 되었기 때문입니다. 따라서 "책상을 넓히는 것"이 아니라 "책상을 깨끗하게 유지하는 것"이 정답이며, 이를 위해 버리기, 요약하기, 외부로 내보내기, 나누기의 4가지를 사용해야 합니다.
직접 해보며 느낀 점은, 이것이 결국 "모든 것을 껴안지 않는 기술"이라는 것입니다. 정보도, 태스크(Task)도, 인생도, 모든 것을 책상 위에 계속 올려두기만 하면 부패합니다. 무엇을 남기고 무엇을 놓아줄지 결정하는 것 자체가 설계(Design) 그 자체일지도 모릅니다. 버리는 것은 패배가 아니라, 오히려 앞으로 나아가기 위한 기술이라고 생각합니다.
또한, 요약이나 외부 메모는 미래의 자신에게 남기는 쪽지이기도 합니다. 오늘 결정된 사항을 10줄 정도로 잘 압축해 두면, 내일의 나도, 내일의 AI 세션도 그것을 읽고 "미리 해줘서 고마워요"라고 느끼게 될 것입니다. 반대로 아무것도 남기지 않고 책상을 어지럽힌 채 종료하면, 미래의 나는 "어라, 이게 무슨 이야기였지?"부터 다시 시작해야 합니다. 어느 쪽이 더 친절한지는 명확하겠죠.
그리고 이러한 "문맥을 깨끗하게 유지하는 설계 능력"은 한 번 익히면 사라지지 않습니다. 도구가 바뀌어도, 모델의 책상이 넓어져도 계속 유효합니다. 쌓여가는 자산이 되는 것이죠.
마지막으로, 오늘부터 실천할 수 있는 4가지 단계를 남겨둡니다.
- 다음에 긴 AI 채팅을 할 때, 후반부에 대화가 맞지 않는다면 "이것은 책상에서 넘쳐흐른 것이구나"라고 깨닫는 것부터 시작하기
- 흐름이 끊기는 시점에 인수인계 요약 프롬프트(이 글의 첫 번째 글)를 딱 한 번만 시도해 보기
- "결정된 사항"을 5줄 정도로 좋으니 외부 메모에 적어보기
- 되돌릴 수 없는 작업(Irreversible operation)만큼은 요약에 의존하지 않고 가공되지 않은 사실(Raw facts)로 판단하기를 자신만의 규칙으로 삼기
전부 한꺼번에 하지 않아도 괜찮습니다. 오늘 밤은 딱 하나만 해보세요. 그것만으로도 내일의 당신은 조금 더 수월해질 것입니다. 그런 작은 발걸음을 응원합니다.
참고 링크
- Lost in the Middle: How Language Models Use Long Contexts (Liu et al., 2023 / arXiv:2307.03172): https://arxiv.org/abs/2307.03172
- Context Rot: How Increasing Input Tokens Impacts LLM Performance (Chroma Research, 2025): https://research.trychroma.com/context-rot
- Effective context engineering for AI agents (Anthropic, 2025): https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents
- Compaction / context editing (Claude API Docs): https://platform.claude.com/docs/en/build-with-claude/compaction
- How Claude Code works (Claude Code Docs): https://code.claude.com/docs/en/how-claude-code-works
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기