Extended Thinking
Extended Thinking은 Claude가 응답 전에 내부적으로 깊이 생각하도록 하는 기능입니다. 복잡한 수학 문제, 다단계 추론, 전략적 의사결정에서 훨씬 높은 정확도를 보입니다.
Claude Code에서의 Effort Level
Claude Code에서는 Extended Thinking을 Effort Level로 제어합니다. API의 budget_tokens를 직접 설정하는 대신, 간편한 3단계 시스템을 사용합니다:
| 레벨 | 동작 | 적합한 작업 |
|---|---|---|
low | 최소한의 사고, 빠른 응답 | 간단한 수정, 포맷팅 |
medium | 적절한 사고 시간 할당 (기본값) | 일반 코딩, 리뷰 |
high | 깊은 추론, 긴 사고 과정 | 복잡한 아키텍처, 버그 분석 |
Effort Level 설정 방법
# 1. /model 메뉴에서 좌우 화살표로 슬라이더 조절
/model
# 2. 환경변수로 설정
export CLAUDE_CODE_EFFORT_LEVEL=high
# 3. settings.json에서 영구 설정
# "effortLevel": "high"
Claude Code에서 Thinking 제어
- 토글:
Alt+T(macOS:Option+T) 또는/config에서 전역 활성화/비활성화 - 일회성 high effort: 프롬프트에
ultrathink키워드 포함 - 사고 과정 보기:
Ctrl+O로 verbose 모드 전환 시 내부 추론 과정 표시 - Fast Mode 조합: Fast Mode(
/fast) + low effort = 최대 속도, 표준 모드 + high effort = 최대 품질
Adaptive Reasoning 비활성화
기존 방식(고정 thinking budget)으로 돌아가려면: CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1 설정 후 MAX_THINKING_TOKENS로 고정 예산을 지정합니다.
API에서의 Extended Thinking
Claude Code가 아닌 Anthropic API를 직접 사용할 때는 thinking.budget_tokens 파라미터로 사고 예산을 직접 설정합니다.
Extended Thinking이란?
일반 응답 vs Extended Thinking 비교:
[일반 응답]
사용자 → Claude → 즉시 응답
[Extended Thinking]
사용자 → Claude → 🤔 내부 사고 과정 (thinking) → 최종 응답
사고 과정은 API 응답에 별도 블록으로 포함되어 디버깅에도 활용할 수 있습니다.
기본 사용법
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function thinkingQuery(problem: string): Promise<{
thinking: string;
answer: string;
}> {
const response = await client.messages.create({
model: "claude-opus-4-6", // Opus, Sonnet 모두 Extended Thinking 지원
max_tokens: 16000,
thinking: {
type: "enabled",
budget_tokens: 10000 // 사고에 사용할 최대 토큰
},
messages: [{ role: "user", content: problem }]
});
let thinking = "";
let answer = "";
for (const block of response.content) {
if (block.type === "thinking") {
thinking = block.thinking;
} else if (block.type === "text") {
answer = block.text;
}
}
return { thinking, answer };
}
// 사용
const result = await thinkingQuery(
"소수를 판별하는 가장 효율적인 알고리즘을 설계하고, " +
"시간복잡도를 분석한 후 TypeScript로 구현해줘."
);
console.log("💭 사고 과정:\n", result.thinking);
console.log("\n✅ 최종 답변:\n", result.answer);
적합한 사용 사례
1. 복잡한 알고리즘 설계
const algorithmProblem = `
다음 조건을 만족하는 스케줄링 알고리즘을 설계해줘:
- 100개 이상의 마이크로서비스 작업
- 각 작업은 의존성, 우선순위, 리소스 요구사항이 있음
- 최소한의 리소스로 최대 처리량 달성
- 데드락 방지
알고리즘 분석 + 의사코드 + 실제 구현 포함해줘.
`;
const { thinking, answer } = await thinkingQuery(algorithmProblem);
2. 아키텍처 의사결정
const architectureDecision = `
다음 조건에서 최적의 데이터베이스 아키텍처를 결정해줘:
- 일일 활성 사용자 100만 명
- 읽기 80% / 쓰기 20% 비율
- 실시간 피드 기능 필요
- 글로벌 서비스 (아시아, 유럽, 미국)
- 99.99% 가용성 요구사항
PostgreSQL, MongoDB, Cassandra, Redis 조합을 고려해서
트레이드오프 분석과 최종 권고안을 제시해줘.
`;
const result = await thinkingQuery(architectureDecision);
3. 보안 취약점 분석
const securityAnalysis = `
다음 인증 코드에서 가능한 모든 공격 벡터를 분석해줘:
\`\`\`typescript
async function login(username: string, password: string) {
const user = await db.query(
\`SELECT * FROM users WHERE username = '\${username}'\`
);
if (user && user.password === md5(password)) {
return generateToken(user.id);
}
}
\`\`\`
취약점마다 공격 시나리오와 수정 코드를 제시해줘.
`;
사고 예산(Budget) 설정
작업 복잡도에 따른 budget_tokens 가이드:
| 작업 유형 | 권장 budget_tokens |
|---|---|
| 단순 분석 | 1,000 ~ 3,000 |
| 중간 복잡도 | 5,000 ~ 10,000 |
| 복잡한 추론 | 15,000 ~ 30,000 |
| 매우 복잡한 문제 | 30,000 ~ 50,000 |
// 예산 최적화 래퍼
async function adaptiveThinking(
problem: string,
complexity: "low" | "medium" | "high" | "extreme"
): Promise<string> {
const budgets = {
low: 2000,
medium: 8000,
high: 20000,
extreme: 40000
};
const response = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: budgets[complexity] + 4096,
thinking: {
type: "enabled",
budget_tokens: budgets[complexity]
},
messages: [{ role: "user", content: problem }]
});
return response.content
.filter(b => b.type === "text")
.map(b => b.type === "text" ? b.text : "")
.join("");
}
사고 과정 활용하기
사고 과정을 디버깅과 품질 검증에 활용:
async function verifiedAnalysis(code: string) {
const { thinking, answer } = await thinkingQuery(
`다음 코드의 버그를 찾아줘:\n\`\`\`\n${code}\n\`\`\``
);
// 사고 과정에서 불확실성 감지
const isUncertain = thinking.toLowerCase().includes("잘 모르") ||
thinking.toLowerCase().includes("확실하지") ||
thinking.toLowerCase().includes("maybe") ||
thinking.toLowerCase().includes("not sure");
return {
answer,
confidence: isUncertain ? "low" : "high",
reasoning: thinking.slice(0, 500) + "..." // 요약본
};
}
멀티턴 대화에서 Thinking 활용
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
async function thinkingConversation() {
const messages: Anthropic.MessageParam[] = [];
// 1턴: 복잡한 설계 요청
messages.push({
role: "user",
content: "마이크로서비스 아키텍처 설계를 도와줘. 쇼핑몰 시스템이야."
});
const response1 = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: 12000,
thinking: { type: "enabled", budget_tokens: 8000 },
messages
});
// thinking 블록도 히스토리에 포함해야 함 (멀티턴 시)
messages.push({ role: "assistant", content: response1.content });
// 2턴: 후속 질문
messages.push({
role: "user",
content: "결제 서비스와 주문 서비스 간 통신은 어떻게 설계할까?"
});
const response2 = await client.messages.create({
model: "claude-opus-4-6",
max_tokens: 12000,
thinking: { type: "enabled", budget_tokens: 8000 },
messages
});
// 두 번째 답변 텍스트 추출
return response2.content
.filter(b => b.type === "text")
.map(b => b.type === "text" ? b.text : "")
.join("");
}
Extended Thinking 활용 팁
- 단순한 질문에는 사용 금지 — 비용과 지연 시간이 증가함
budget_tokens는max_tokens보다 작아야 함- 사고 과정을 저장해두면 나중에 결정 근거 추적 가능
- Opus 4.6, Sonnet 4.6 모두 Extended Thinking 지원 (Opus가 사고 품질 최고)
비용 주의
Extended Thinking의 사고 토큰은 출력 토큰 단가로 과금됩니다. Effort Level로 비용을 조절할 수 있으며, 프로덕션에서는 필요한 경우에만 활성화하세요.
다음 챕터: 프로덕션 배포 →
이 페이지에 오류가 있나요? 오류 제보하기 →