사내 문서 수십 개를 한 번에 분석시키는 기능을 만들다가 벽에 부딪혔다. 문서를 다 합쳐서 프롬프트에 넣었더니 prompt is too long 에러. 기본 컨텍스트가 200K 토큰인데, 문서를 다 밀어 넣으니 그걸 넘어버린 거다.
RAG로 쪼개서 관련 부분만 뽑아 넣는 게 정석이긴 하다. 근데 "문서 전체를 교차 참조해서 요약"하는 작업은 청킹하면 맥락이 끊겨서 결과가 뭉개진다. 그냥 통째로 넣고 싶었다.
베타 헤더 하나면 1M 토큰
Claude Sonnet 계열은 베타 헤더만 붙이면 컨텍스트가 100만 토큰까지 열린다. SDK에서는 betas 배열에 넣어주면 끝이다.
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const message = await client.beta.messages.create({
model: 'claude-sonnet-4-5',
max_tokens: 4096,
betas: ['context-1m-2025-08-07'],
messages: [
{
role: 'user',
content: `다음 문서들을 교차 참조해서 핵심만 요약해줘:\n\n${하나로_합친_문서들}`,
},
],
});
console.log(message.content[0].text);
messages.create가 아니라 beta.messages.create를 쓴다는 점만 주의하면 된다. 200K짜리 문서 묶음이 더 이상 에러를 안 뱉고 그냥 들어간다.
요금이 2배로 뛰는 구간이 있다
여기서 돈 얘기를 안 하고 넘어가면 나중에 청구서 보고 놀란다. 입력 토큰이 200K를 넘어가는 요청은 그 요청 전체가 더 비싼 요율로 과금된다. 200K 이하 구간의 2배 수준이라고 보면 된다.
즉 210K 토큰을 넣으면 넘친 10K만 비싼 게 아니라, 210K 전부가 프리미엄 요율로 계산된다. 그래서 나는 토큰 수를 미리 재서 분기를 태웠다.
const { input_tokens } = await client.beta.messages.countTokens({
model: 'claude-sonnet-4-5',
betas: ['context-1m-2025-08-07'],
messages,
});
// 200K 이하면 굳이 1M 모드로 비싸게 보낼 이유가 없다
const useLongContext = input_tokens > 200_000;
200K를 안 넘기는 요청까지 전부 1M 모드로 쏘면 손해다. 넘칠 때만 켜는 게 맞다.
정리
긴 문서를 통째로 넣어야 하는데 RAG 청킹이 맥락을 깨먹는 작업이라면 1M 컨텍스트가 답이다. 다만 공짜가 아니다. (1) beta.messages에 context-1m 헤더를 붙이고, (2) 200K 경계를 countTokens로 미리 재서 넘칠 때만 켜라. 이 두 가지만 지키면 "긴 문서 분석"과 "요금 폭탄" 사이에서 균형을 잡을 수 있다.