시험을 앞두고 어려운 수학 문제를 풀 때를 생각해보자. 답만 바로 적는 학생보다 풀이 과정을 종이에 써가며 단계별로 정리하는 학생이 더 정확한 답을 낸다. 중간에 실수를 발견하면 되돌아가 수정할 수도 있고, 복잡한 계산을 나눠서 처리할 수 있기 때문이다. Extended Thinking은 AI 모델에 이 "풀이 과정 종이"를 제공하는 기술이다.
일반적인 AI 응답은 입력을 받는 순간 바로 출력을 생성하기 시작한다. 마치 시험장에서 문제를 읽자마자 답을 말하는 것과 같다. Extended Thinking이 활성화되면 모델은 응답을 출력하기 전에 내부적으로 추론 과정(thinking block)을 거친다. 이 공간에서는 가설을 세우고, 검증하고, 틀리면 방향을 바꾸고, 여러 접근법을 비교한다. 최종 답변은 이 내부 검토를 마친 후에야 생성된다.
일상적인 질문("오늘 날씨 어때?", "이 문장 번역해줘")에는 굳이 필요 없다. 하지만 증명이 필요한 수학 문제, 수십 개의 조건이 얽힌 코드 버그, 상충하는 근거들을 비교해야 하는 논리 추론에서는 Extended Thinking이 정확도를 눈에 띄게 끌어올린다. 사람이 "잠깐, 다시 생각해보자"라고 하는 것을 AI가 구조적으로 수행하는 방식이라고 이해하면 된다.
Extended Thinking은 Chain-of-Thought(CoT) 프롬프팅의 구조적 발전형이다. 기존 CoT는 사용자가 프롬프트에 "단계별로 생각해라(Let's think step by step)"라고 명시해야 했고, 생성된 추론 텍스트가 그대로 사용자에게 노출됐다. Extended Thinking은 이 과정을 모델 아키텍처 수준에서 내재화했다.
내부 동작 구조는 다음과 같다.
[입력 토큰]
↓
[Thinking Block 생성] ← budget_tokens 한도 내에서 자유 추론
↓ (사용자에게 선택적으로 공개 가능)
[Thinking Summary] ← 내부 추론의 압축 표현
↓
[최종 응답 생성]
Thinking Block은 일반 응답 토큰과 별도로 계산되며, 모델은 이 공간에서 자기 수정(self-revision)이 가능하다. 중요한 점은 thinking block 내부에서 생성된 텍스트가 다음 레이어의 어텐션 입력으로 들어간다는 것이다. 즉 단순히 텍스트를 더 생성하는 게 아니라, 이전 추론 단계의 결과가 이후 추론에 실질적인 컨텍스트로 작용한다.
API 호출 방식은 다음과 같다.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=16000,
thinking={
"type": "enabled",
"budget_tokens": 10000 # thinking에 할당할 최대 토큰
},
messages=[{
"role": "user",
"content": "다음 미분방정식의 일반해를 구하고 증명하라: dy/dx = y·ln(y)/x"
}]
)
# thinking block과 text block이 분리된 content 배열로 반환
for block in response.content:
if block.type == "thinking":
print("내부 추론:", block.thinking)
elif block.type == "text":
print("최종 답변:", block.text)
budget_tokens는 thinking block에 허용할 최대 토큰 수이다. 모델이 반드시 전부 소진하는 건 아니며, 문제 복잡도에 따라 실제 사용량이 결정된다. 최솟값은 1,024이며 모델별로 상한이 다르다. @Claude 3.7 Sonnet은 최대 128,000 thinking 토큰을 지원한다.
스트리밍 사용 시에는 thinking block이 먼저 스트리밍되고, 완료 후 text block이 스트리밍된다. 단, thinking block이 진행 중일 때는 중간에 text block이 삽입되지 않는다. 멀티턴 대화에서는 이전 턴의 thinking block을 그대로 유지해 재전송해야 캐싱 이점을 얻을 수 있다.
주요 벤치마크 결과
Extended Thinking 활성화 전후 성능 차이는 특히 고난도 추론 과제에서 두드러진다.
| 벤치마크 | Claude 3.7 Sonnet (표준) | Claude 3.7 Sonnet (Extended Thinking) | OpenAI o1 |
|---|---|---|---|
| GPQA Diamond | 68.5% | 84.8% | 78.3% |
| AIME 2024 | 55.0% | 80.0% | 83.3% |
| SWE-bench Verified | 62.3% | 70.3% | 48.9% |
| MATH-500 | 85.2% | 96.2% | 94.8% |
| HumanEval | 88.7% | 93.2% | 90.2% |
GPQA Diamond(대학원 수준 과학 문제)에서 16.3%p 향상, MATH-500에서 11%p 향상은 단순한 프롬프트 개선으로는 달성하기 어려운 수치다.
OpenAI o1/o3와의 비교
OpenAI의 o1/o3 시리즈와 Anthropic의 Extended Thinking은 같은 "추론 모델(Reasoning Model)" 패러다임에 속하지만 구현 철학이 다르다.
| 항목 | OpenAI o1/o3 | Claude Extended Thinking |
|---|---|---|
| 추론 가시성 | 요약만 제공 (실제 CoT 비공개) | thinking block 원문 접근 가능 |
| 활성화 방식 | 별도 모델(o1, o3) | 기존 모델에 파라미터로 활성화 |
| 비용 구조 | 별도 가격 책정 | thinking 토큰 추가 과금 |
| 컨텍스트 통합 | 추론 전용 모드 | 일반 Claude 기능과 통합 |
| streaming | 지원 | 지원 (thinking → text 순서) |
OpenAI o1은 내부 추론 과정을 사용자에게 직접 노출하지 않는다는 점에서 블랙박스 성격이 강하다. Claude의 Extended Thinking은 thinking block 내용을 API 응답에 포함해 개발자가 모델의 추론 경로를 디버깅하고 분석할 수 있다. 이는 신뢰성 검증이 중요한 엔터프라이즈 환경에서 유리하다.
장점
복잡한 다단계 문제에서 오류 전파(error propagation)가 줄어든다. 일반 응답은 앞에서 한번 틀리면 이후 전체가 틀어지는 경향이 있는데, thinking block 내에서 자기 수정이 일어나면서 이런 연쇄 오류가 억제된다.
thinking block 내용을 분석하면 모델이 어떤 경로로 답에 도달했는지 추적할 수 있다. 의료, 법률, 금융처럼 결론뿐 아니라 근거가 중요한 분야에서 감사(audit) 용도로 활용 가능하다.
기존 Claude API와 동일한 인터페이스를 유지하므로 마이그레이션 비용이 낮다. 시스템 프롬프트, 도구 사용(tool use), 멀티턴 대화 모두 Extended Thinking과 조합해 사용할 수 있다.
한계
가장 큰 제약은 비용이다. thinking 토큰은 입력 토큰과 동일하게 과금된다. budget_tokens를 10,000으로 설정했을 때 실제 사용량이 8,000이면 8,000 토큰이 추가 청구된다. 단순 질의에 Extended Thinking을 남용하면 비용이 불필요하게 증가한다.
응답 지연(latency)도 증가한다. thinking이 완료될 때까지 최종 응답이 시작되지 않으므로, 짧은 응답이 필요한 실시간 인터페이스에는 적합하지 않다. streaming을 사용하면 thinking 진행 상황을 먼저 보여주는 방식으로 UX를 완화할 수 있다.
thinking block 내에서 생성된 내용은 최종 답변과 모순될 수 있다. 드문 경우지만, thinking에서 도달한 결론과 실제 응답이 일치하지 않는 "추론-응답 불일치" 현상이 보고된다. 이를 검증하려면 thinking block과 최종 응답을 함께 분석하는 파이프라인이 필요하다.
streaming 중 thinking block은 수정(edit)이 불가하다. 멀티턴에서 이전 thinking block을 변경해 재전송하면 캐시가 깨지며 전체 재계산이 발생한다.
budget_tokens 설정 전략
문제 유형별 권장 범위는 다음과 같다.
| 문제 유형 | 권장 budget_tokens | 비고 |
|---|---|---|
| 단순 정보 조회 | 사용 안 함 | 비용 낭비 |
| 중간 복잡도 코드 작성 | 2,000 ~ 5,000 | 논리 오류 감소 |
| 고난도 알고리즘 / 수학 | 8,000 ~ 16,000 | AIME 수준 |
| 장문 문서 분석 + 추론 | 10,000 ~ 32,000 | 컨텍스트 길이 고려 |
| 최고 난도 (연구 수준) | 32,000 ~ 128,000 | 비용 주의 |
budget_tokens를 높게 잡아도 단순 문제라면 모델이 조기 종료하므로, 어려운 작업에는 넉넉하게 설정하는 것이 안전하다. 단, 비용 한도가 있다면 동적으로 조정하는 로직을 구현하는 것이 현실적이다.
실제 적용 서비스 및 모델
@Claude Code는 Extended Thinking을 내부적으로 활용해 복잡한 코드베이스 분석과 다단계 리팩토링 계획을 수립한다. 단순 자동완성이 아닌 전체 아키텍처를 고려한 변경 제안이 필요할 때 thinking 예산이 자동으로 할당된다.
@Claude 3.7 Sonnet은 Extended Thinking을 공식 지원한 최초의 Anthropic 모델이다. 2025년 초 출시 당시 SWE-bench에서 당시 최고 수준인 70.3%를 기록했으며, 이 성능의 상당 부분이 Extended Thinking 덕분인 것으로 분석됐다.
@Claude 4 Sonnet에서는 thinking 효율이 개선되어 동일 budget_tokens 대비 더 깊은 추론이 가능해졌다. 특히 멀티스텝 도구 호출(tool use)과 Extended Thinking의 조합에서 이전 세대 대비 유의미한 성능 향상이 확인됐다.
비용 최적화 패턴
def smart_thinking(prompt: str, complexity: str) -> dict:
budget_map = {
"simple": None, # thinking 비활성화
"medium": 4000,
"hard": 16000,
"research": 64000
}
thinking_config = None
budget = budget_map.get(complexity)
if budget:
thinking_config = {"type": "enabled", "budget_tokens": budget}
kwargs = {
"model": "claude-sonnet-4-5",
"max_tokens": (budget or 0) + 4000,
"messages": [{"role": "user", "content": prompt}]
}
if thinking_config:
kwargs["thinking"] = thinking_config
return client.messages.create(**kwargs)
문제 복잡도를 사전에 분류하는 라우팅 레이어를 두면 비용을 크게 절감할 수 있다. 간단한 질의에는 Extended Thinking 없이, 복잡한 추론에만 높은 budget을 배정하는 계층적 접근이 프로덕션에서 권장된다.