Claude Code의 32K 토큰 출력 한계에 부딪혔을 때 — 긴 오디오 브리핑 대본 생성 삽질기
문제 상황
매일 아침 시장 브리핑 리포트와 뉴스를 합쳐 오디오 브리핑 대본을 자동 생성하는 워크플로를 구축하고 있었습니다. 시장 지표, 주요 이슈 7~8건, 뉴스 요약까지 포함하면 입력 데이터만 상당한 분량이고, 여기에 자연스러운 오디오 대본 형태로 변환하면 출력은 더 길어집니다.
Claude Code에 브리핑 리포트 원문을 넣고 대본 생성을 요청했더니, 동일한 에러가 3회 연속 발생했습니다.
API Error: Claude's response exceeded the 32000 output token maximum.
To configure this behavior, set the CLAUDE_CODE_MAX_OUTPUT_TOKENS environment variable.
같은 프롬프트, 같은 데이터로 3번 시도했지만 결과는 동일했습니다. Claude Code는 출력 도중 32,000 토큰 한계에 도달하면 응답 자체를 버리고 에러만 반환합니다. 부분 결과조차 받을 수 없다는 점이 핵심 문제였습니다.
원인 분석
Claude Code는 내부적으로 CLAUDE_CODE_MAX_OUTPUT_TOKENS 환경 변수를 통해 단일 응답의 최대 출력 토큰 수를 제어합니다. 기본값은 32,000 토큰(약 24,000자 한글 기준)입니다.
오디오 브리핑 대본의 경우 다음 요소가 토큰을 빠르게 소모합니다.
| 구성 요소 | 예상 토큰 |
|---|---|
| 인사말 + 시장 개요 | ~1,000 |
| 주요 이슈 7건 × 상세 분석 | ~21,000 |
| 블룸버그 뉴스 요약 | ~8,000 |
| 마무리 + 전환 멘트 | ~2,000 |
| 합계 | ~32,000+ |
시장 지표, 수혜/피해 종목 분석, 투자 전략까지 포함한 대본은 32K를 초과할 수밖에 없는 구조였습니다. API 레벨에서 응답이 잘리는 것이 아니라, Claude Code가 사전에 설정된 한계를 초과하면 응답 전체를 폐기하고 에러를 던지는 방식이므로 부분 결과도 얻을 수 없습니다.
해결 방법
방법 1: 환경 변수로 출력 한계 상향
가장 직접적인 방법은 CLAUDE_CODE_MAX_OUTPUT_TOKENS 값을 늘리는 것입니다.
# 일회성 실행
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000 claude
# 또는 셸 프로필에 영구 설정
echo 'export CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000' >> ~/.zshrc
source ~/.zshrc
다만 이 방법에는 제약이 있습니다. 모델 자체의 최대 출력 토큰(Opus/Sonnet 기준 약 64K~128K)을 넘길 수 없고, 토큰이 많아질수록 응답 시간과 비용이 증가합니다. 또한 Claude Code의 컨텍스트 윈도우 관리에도 영향을 줄 수 있습니다.
방법 2: 분할 생성 패턴 (Chunked Generation)
긴 대본을 한 번에 생성하는 대신, 섹션별로 나누어 생성하는 패턴입니다. 이 방법이 실무에서 더 안정적입니다.
## 프롬프트 구조 — Before (실패)
"다음 브리핑 리포트와 뉴스를 바탕으로 오디오 브리핑 대본을 작성하세요."
→ 전체 데이터를 한 번에 입력, 전체 대본을 한 번에 요청
→ 32K 초과 → 에러
## 프롬프트 구조 — After (성공)
1단계: "다음 시장 지표로 오프닝 멘트를 작성하세요." (1K 토큰)
2단계: "다음 이슈 1~3번에 대한 분석 대본을 작성하세요." (10K 토큰)
3단계: "다음 이슈 4~7번에 대한 분석 대본을 작성하세요." (10K 토큰)
4단계: "다음 블룸버그 뉴스 요약과 클로징 멘트를 작성하세요." (8K 토큰)
자동화 스크립트로 구현하면 다음과 같은 형태가 됩니다.
const sections = [
{ name: 'opening', prompt: buildOpeningPrompt(marketData) },
{ name: 'issues-1', prompt: buildIssuePrompt(issues.slice(0, 3)) },
{ name: 'issues-2', prompt: buildIssuePrompt(issues.slice(3)) },
{ name: 'closing', prompt: buildClosingPrompt(bloombergNews) },
];
const results = [];
for (const section of sections) {
const result = await generateScript(section.prompt);
results.push(result);
}
const fullScript = results.join('\n\n');
방법 3: 요약 후 생성 (Two-Pass)
입력 데이터가 지나치게 방대할 때는 2단계 접근이 효과적입니다.
Pass 1: 원본 데이터 → 핵심 포인트 추출 (구조화된 JSON)
Pass 2: 핵심 포인트 → 오디오 대본 생성
// Pass 1: 핵심 포인트 추출
const keyPoints = await claude('다음 리포트에서 오디오 브리핑에 필요한 핵심 포인트만 JSON으로 추출하세요.', rawReport);
// Pass 2: 대본 생성 (입력이 줄었으므로 출력도 줄어듦)
const script = await claude('다음 핵심 포인트를 5분 분량 오디오 대본으로 작성하세요.', keyPoints);
실전에서 얻은 교훈
동일한 에러로 3회 연속 실패한 경험에서 배운 점을 정리합니다.
같은 요청을 반복하지 마세요. 토큰 한계 에러는 입력/출력 구조의 문제이므로, 동일한 프롬프트를 다시 보내도 결과는 같습니다. 첫 번째 실패 후 바로 전략을 바꿔야 합니다.
출력 길이를 사전에 추정하세요. 한글 기준 1토큰 ≈ 0.70.8자 정도로 계산하면, 32K 토큰은 대략 A4 1520페이지 분량입니다. 이를 초과할 것 같으면 처음부터 분할 전략을 적용하는 것이 시간을 절약합니다.
환경 변수는 근본 해결이 아닙니다. CLAUDE_CODE_MAX_OUTPUT_TOKENS를 올리는 것은 임시 방편일 뿐, 토큰 한계는 항상 존재합니다. 분할 생성 패턴을 기본 전략으로 두는 것이 확장성 있는 접근입니다.
핵심 정리
✅ CLAUDE_CODE_MAX_OUTPUT_TOKENS 환경 변수로 한계 상향 가능
✅ 분할 생성 패턴: 섹션별로 나누어 생성 후 합치기
✅ Two-Pass 전략: 요약 추출 → 대본 생성으로 토큰 절약
❌ 같은 프롬프트를 반복 시도하는 것은 시간 낭비
❌ 부분 결과를 기대할 수 없음 (32K 초과 시 전체 폐기)
긴 출력이 필요한 작업을 Claude Code로 자동화할 때, 토큰 한계는 반드시 마주치는 벽입니다. 핵심은 "한 번에 다 생성"에서 "나누어 생성 후 합치기"로 사고를 전환하는 것입니다.