Cmd+V 한 번이 AI 에이전트의 컨텍스트 윈도우(Context Window)에 미치는 비용 측정
요약
AI 에이전트 사용 시 무심코 수행하는 '붙여넣기(Paste)' 작업이 컨텍스트 윈도우를 얼마나 빠르게 소모하는지 정량적으로 분석합니다. 로그나 소스 코드 전체를 붙여넣는 행위가 모델의 기억력을 저하시키는 주요 원인임을 지적합니다.
핵심 포인트
- 단 한 번의 소스 파일 붙여넣기로 컨텍스트의 20%를 소모할 수 있음
- 파일 경로 전달(19토큰) 대비 전체 코드 붙여넣기(40,324토큰)는 비용 차이가 매우 큼
- 터미널 로그와 락파일 등은 토큰 소모가 매우 큰 주요 원인임
- 컨텍스트 과부하는 모델 성능 저하 및 이전 지침 망각을 유발함
요약 버전: 저는 단 한 번의 붙여넣기(paste)가 AI 에이전트에게 어떤 비용을 치르게 하는지 측정했습니다. 2,348줄짜리 소스 파일은 40,324 토큰(tokens)이며, 이는 200,000 토큰 윈도우(window)의 5분의 1을 단 한 번의 키 입력으로 날려버리는 양입니다. 해당 파일의 경로 자체는 19 토큰입니다. 이런 식으로 네 번만 붙여넣으면 에이전트는 한 시간 전에 내린 지침을 잊기 시작합니다. 마지막에는 제가 이 문제를 어떻게 해결했는지 보여드리겠습니다.
점점 멍청해지는 세션
이름을 붙여본 적이 없더라도, 여러분은 이런 상황을 알고 있을 것입니다.
아침에 세션을 시작합니다. 프로젝트를 설명하고, 제약 사항을 알려주며, 에이전트가 절대 건드려서는 안 될 두 가지를 말해줍니다. 잘 작동합니다. 답변은 날카롭고, 스키마(schema)를 기억하며, 여러분의 컨벤션(conventions)을 따릅니다.
두 시간 뒤, 똑같은 에이전트가 처음에 제외했던 바로 그 방식을 제안합니다. 이미 읽었던 파일을 다시 읽습니다. 프로젝트가 어떤 프레임워크(framework)를 사용하는지 묻습니다. 시스템이 충돌하거나 에러가 발생한 것도 아니고, 모델(model) 자체가 바뀐 것도 아닙니다. 그저 멍청해졌을 뿐입니다.
보통은 제공업체(provider)를 탓하곤 합니다. 하지만 저의 경우, 원인은 훨씬 더 지루했습니다. 바로 제 클립보드(clipboard)였습니다.
날카로웠던 세션과 멍청해진 세션 사이에, 저는 스택 트레이스(stack trace), 테스트 로그(test log), 설정 파일(config file), 그리고 락파일(lockfile)의 일부를 붙여넣었습니다. 당시에는 그 모든 것이 공짜처럼 느껴졌습니다. 하지만 사실은 그렇지 않았습니다.
붙여넣기의 실제 비용
저는 추측을 멈추고 직접 측정했습니다. 가공된 샘플이 아닌, 제 디스크에 있는 실제 파일 네 개를 사용했습니다:
git log --stat결과인 400줄의 터미널 로그(terminal log)- 2,348줄의 Swift 소스 파일
package-lock.json의 처음 800줄git help -a의 193줄 CLI 출력
토크나이저(Tokenizer): GPT-4o/5 제품군 인코딩인 o200k_base를 사용하는 tiktoken을 사용했습니다. 한 가지 주의할 점은, 이 수치가 증명하는 바에 제한을 줄 수 있다는 것입니다. Anthropic은 로컬 토크나이저를 제공하지 않으므로, 이는 Claude에 대한 측정이라기보다 근사치입니다. 저는 완전히 다른 어휘 집합인 cl100k_base로 모든 것을 두 번째로 계산해 보았는데, 로그에서는 6.5%, 소스 파일에서는 9.7%의 차이가 있었습니다. 규모(order of magnitude) 면에서는 유효할 만큼 충분히 근접한 수치입니다.
참조 윈도우(Reference window): 200,000 토큰.
| 샘플 | 글자 수 | 붙여넣었을 때의 토큰 수 | 200k 윈도우 점유율 | 윈도우가 가득 찰 때까지의 붙여넣기 횟수 |
|---|---|---|---|---|
| 터미널 로그, 400행 | 16,609 | 5,646 | 2.8% | 35 |
| ... |
표의 내용을 재구성하는 숫자는 대안적인 방법입니다. 동일한 Swift 파일에 대한 파일 경로(file path)는 다음과 같습니다:
/Users/name/projects/app/Sources/AppState.swift
19 토큰입니다. 동일한 파일이며 모델이 접근할 수 있는 동일한 정보임에도 불구하고, 두 전달 방식 사이에는 2,122배의 차이가 존재합니다. 에이전트는 스스로 파일을 열 수 있습니다. 심지어 필요한 부분만 읽을 수도 있는데, 붙여넣기(pasting) 방식으로는 이것이 불가능합니다.
로그는 가장 심각한 가해자이며, 가장 자주 붙여넣게 되는 대상입니다
토큰당 글자 수(Characters per token)는 터미널 로그의 경우 2.94, 소스 파일의 경우 4.20으로 나타났습니다.
토크나이저(Tokenizer)는 예측 가능한 텍스트를 잘 압축합니다. 산문(Prose)이 가장 잘 압축되고, 코드는 그보다 약간 덜하며, 로그는 거의 압축되지 않습니다. 로그는 해시(hash), 타임스탬프(timestamp), 절대 경로(absolute path), 긴 숫자들로 가득 차 있으며, 이 각각의 요소들이 수많은 작은 토큰으로 쪼개지기 때문입니다.
이는 우리 대부분의 작업 방식과 정반대입니다. 로그는 터미널 에이전트에 붙여넣는 가장 흔한 대상입니다. 무언가 고장 난 순간 바로 손에 쥐고 있는 것이 로그이기 때문입니다. 가장 자주 붙여넣는 자료가 글자당 비용이 가장 많이 듭니다.
돈이 핵심이 아닌 이유
현재의 입력 요율(input rates) 기준으로, 한 번의 붙여넣기는 다음과 같습니다:
| 샘플 | $3 / M input 기준 | $5 / M input 기준 |
|---|---|---|
| 터미널 로그, 400행 | $0.0169 | $0.0282 |
| ... |
12센트입니다. 12센트 때문에 파산할 사람은 아무도 없으며, 만약 여기서 읽기를 멈춘다면 잘못된 교훈을 얻게 되는 것입니다.
당신이 치르는 비용은 반복되는 '공간'입니다. 동일한 텍스트가 해당 세션의 이후 모든 요청과 함께 재전송되며, 윈도우가 가득 찰 때까지 윈도우 안에 머물게 됩니다. 그 후 압축(compaction)이 실행됩니다. 압축 프로세스는 당신이 5분 시점에 작성한 두 문장("마이그레이션(migrations)은 절대 건드리지 마세요, 클라이언트는 이전 스키마(old schema)를 사용 중입니다")이 40분 시점에 붙여넣은 400행짜리 로그보다 더 중요하다는 사실을 알 방법이 없습니다. 압축은 두 가지 모두를 똑같은 열의로 요약해 버립니다.
그것이 바로 성능이 저하된 세션입니다. 모델의 문제가 아니라, 관리(housekeeping)의 문제이며, 당신이 네 번의 키 입력으로 초래한 문제입니다.
수동으로 해결하기
해결책은 복잡하지 않으며, 특별한 도구도 필요하지 않습니다. 에이전트에게 내용(content) 대신 참조(reference)를 전달하십시오.
파일 참조를 사용하세요. Claude Code, Codex, Cursor 모두 @path/to/file 형식을 지원합니다.
복사하는 대신 리다이렉션(Redirect) 하세요:
npm test 2>&1 | pbcopy # 윈도우에 11,000 토큰(tokens) 유입
npm test > /tmp/test.log 2>&1 # 그 다음: read /tmp/test.log
모델이 확인하기 전에 필터링하십시오. 400행 전체가 필요한 경우는 드뭅니다. 당신에게 필요한 것은 실패한 부분입니다:
grep -n -A5 -B5 "FAIL\|Error" /tmp/test.log > /tmp/failures.log
이 방식은 일상적으로 5,000 토큰을 300 토큰으로 줄여줍니다.
그리고 락파일(lockfile)은 절대 붙여넣지 마세요. package-lock.json, Cargo.lock, pnpm-lock.yaml은 거대하며, grep 한 번으로 얻을 수 있는 정보 외에는 모델이 추론할 수 있는 내용이 전혀 들어있지 않습니다.
이 모든 방법은 작동합니다. 하지만 이 모든 방법은 모든 수동적인 규율(manual discipline)이 실패하는 것과 똑같은 방식으로 실패합니다. 새벽 1시, 빌드는 깨져 있고, 로그는 이미 클립보드에 들어 있으며, 리다이렉션을 타이핑하는 3초조차 아깝게 느껴질 때 말입니다. 당신은 붙여넣습니다. 당신은 항상 붙여넣습니다. 이것이 문제의 핵심을 한 문장으로 요약한 것입니다.
대신 내가 만든 것
그래서 나는 이 규율을 나 자신에게서 분리하여 클립보드로 옮겼습니다. 그것은 CtxVault라는 이름의 작은 macOS 메뉴 바 앱이 되었습니다.
이 앱은 당신이 복사하는 것을 감시합니다. 당신이 설정한 크기 임계값(size threshold)을 초과하는 모든 것은 복사하는 즉시 ~/CtxVault/에 파일로 기록됩니다. 그 후 터미널에서 Cmd+V를 누르면, 그곳에 입력되는 것은 내용이 아니라 해당 파일의 경로입니다. 에이전트는 파일이 필요할 때 파일을 읽으며, 필요한 부분만 읽습니다.
브라우저, 에디터, 채팅창 등 다른 곳에 붙여넣으면 이전과 정확히 동일한 원본 텍스트를 얻게 됩니다. 나머지 일과 중 복사 방식에는 아무런 변화가 없습니다.
내가 이것을 만드는 동안 중요했던 세부 사항들을, 사람들이 질문하는 순서대로 나열하면 다음과 같습니다:
Cmd+V를 두 번 탭하면, 텍스트를 인라인 (inline)으로 넣고 싶었던 순간들을 위해 실제 콘텐츠가 대신 붙여넣어집니다. 무엇인가가 기록되기 전에 비밀 정보(Secrets)가 감지되므로, API 키나 export KEY= 라인은 절대 볼트 (vault)에 도달하지 않습니다. 이 프로그램은 계정이나 텔레메트리 (telemetry) 없이 로컬 (local)에서 작동하며, 라이선스 서버와 업데이트 피드라는 정확히 두 개의 호스트 (host)와만 통신합니다. macOS 14 이상에서 실행되며, 구독 없이 한 기기에 대해 14.99 유로를 1회 결제하면 됩니다.
다운로드하거나 터미널 (terminal)을 통해 설치할 수 있습니다:
brew tap dms2323/ctxvault
brew install --cask ctxvault
이 포스트의 측정 작업이 이 프로그램이 존재하는 이유이며, 스크립트와 방법론을 포함한 전체 내용은 여기에서 확인할 수 있습니다: 붙여넣기의 비용은 얼마인가.
만약 여러분이 이와 다르게 측정했다면, 특히 제가 실행할 수 없었던 실제 Claude 토큰 수 (token count)를 기준으로 측정했다면, 여러분의 수치를 확인해 보고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기