"LLM 추론 모드 (1/6) — 왜 '생각'에 비용이 드는가: 테스트타임 컴퓨트와 추론 토큰"

Claude의 low·medium·high·xhigh·max, OpenAI의 reasoning_effort. 이 시리즈는 그 다이얼이 정확히 무엇을 조절하는지, 왜 그렇게 동작하는지를 1차 자료로 해부한다. 1편은 그 모든 다이얼이 깔고 있는 한 가지 전제 — "생각에는 비용이 든다" — 를 먼저 세운다.

요즘 모델은 답을 바로 내지 않는다. Claude도 GPT도, 어려운 질문을 받으면 먼저 생각을 한 뭉치 쏟아낸 뒤에야 답을 시작한다. 화면에는 "thinking…" 또는 긴 침묵으로 보이는 그 구간이, 사실은 모델이 사용자에게 보여줄 답과는 별개로 토큰을 추가로 소비하는 구간이다. effort든 reasoning_effort든, 추론 모드라는 건 결국 이 추가 토큰을 얼마나 쓸지를 조절하는 손잡이다.

이 시리즈를 제대로 이해하려면 손잡이를 보기 전에 손잡이가 조절하는 대상을 알아야 한다. 그 대상이 테스트타임 컴퓨트(test-time compute)다.

한 문단 요약

추론 모델은 최종 답 이전에 사고 과정(chain-of-thought)을 토큰으로 풀어낸다. 이는 학습을 키우는 대신 추론 시점에 연산을 더 쓰는 방식 — 테스트타임 컴퓨트 — 이고, 다단계 추론·수학·코딩·에이전트 루프처럼 어려운 문제에서 정확도를 끌어올린다. 단, 이 사고 토큰은 출력 토큰으로 과금되고 지연을 늘린다. 그래서 모든 벤더가 "얼마나 생각할지"를 호출 단위로 조절하는 다이얼(Claude effort, OpenAI reasoning_effort)을 노출한다. 사고 과정 원문은 대개 사용자에게 반환되지 않는다(요약만 제공).


1. 추론 모델이란: 답 이전의 토큰

일반 모델은 입력을 받으면 곧바로 답 토큰을 하나씩 생성한다. 추론 모델은 그 사이에 한 단계를 더 넣는다. 답을 내기 전에 사고(thinking / reasoning) 토큰을 먼저 생성하고, 그 사고를 컨텍스트로 삼아 최종 답을 쓴다.

이 사고 토큰은 chain-of-thought(CoT) — 문제를 단계별로 쪼개 풀어가는 중간 추론 — 를 그대로 토큰열로 펼쳐 놓은 것이다. 사람이 어려운 문제를 풀 때 머릿속으로 또는 종이에 중간 계산을 적는 것과 같은 역할을, 모델은 토큰 생성으로 한다.

핵심은 이것이 공짜가 아니라는 점이다. 사고 토큰은 실제로 생성되는 토큰이고, 따라서 연산·시간·비용을 그대로 잡아먹는다. "더 생각하라"는 명령은 곧 "토큰을 더 써라"는 명령이다.

2. 테스트타임 컴퓨트 — 학습이 아니라 추론에 더 쓰기

모델 성능을 올리는 길은 크게 둘이다.

  • 학습 시점(train-time) 스케일링: 파라미터·데이터·학습 연산을 키운다. 모델 자체를 더 크고 똑똑하게 만든다. 비용은 학습할 때 한 번 든다.
  • 추론 시점(test-time) 스케일링: 모델은 그대로 두고, 질문 하나를 풀 때 추론에 더 많은 연산을 쓴다. 사고 토큰을 더 길게 생성하고, 여러 경로를 탐색하고, 스스로 검증하게 한다. 비용은 질문할 때마다 든다.

추론 모드가 조절하는 것은 후자다. 같은 모델을 두고도, 어떤 질문에는 사고를 짧게(또는 아예 생략) 하고 어떤 질문에는 길게 — 즉 호출마다 연산량을 다르게 배분할 수 있다. 모델을 갈아끼우지 않고 "이번 질문은 얼마나 어려운가"에 맞춰 연산을 조절하는 것이 이 다이얼의 본질이다.

테스트타임 컴퓨트의 양을 \(C_{\text{test}}\)라 하면, 어려운 문제에서는 대체로 \(C_{\text{test}}\)가 커질수록 정답률이 오른다 — 단, 무한히가 아니라 한계 효용이 줄어드는 곡선으로. 이 곡선의 모양이 이 시리즈 후반(6편)에서 비용·품질 트레이드오프의 핵심이 된다.

3. 왜 더 생각하면 더 잘하나 — 그리고 어디서 멈추나

추가 사고가 도움이 되는 곳과 안 되는 곳은 분명히 갈린다.

도움이 큰 작업 — 다단계 추론이 필요한 문제: - 수학·논리 문제 (중간 계산을 누적해야 답이 나온다) - 어려운 코딩·디버깅 (원인을 추적하고 가설을 검증해야 한다) - 에이전트 루프 (다음 도구 호출을 계획하고 결과를 해석해야 한다) - 긴 호흡의 분석 (여러 사실을 엮어 결론을 세워야 한다)

이런 작업은 답에 이르는 경로가 길다. 모델이 그 경로를 토큰으로 펼쳐 놓으면, 한 번에 정답으로 점프하려 할 때보다 실수가 줄어든다.

도움이 거의 없거나 오히려 해로운 작업 — 출력 공간이 좁은 문제: - 단순 분류·추출·포맷 변환 - 짧은 재작성, 단답형 조회

답이 사실상 하나로 정해진 작업에서는 더 생각해도 결과가 나아지지 않는다. 오히려 과도한 사고는 overthinking — 불필요하게 토큰을 태우고, 때로는 멀쩡한 답을 스스로 의심해 망치는 — 으로 이어진다. Anthropic의 effort 문서조차 구조화된 출력 작업에서 최고 설정(max)이 "overthinking으로 이어질 수 있다"고 명시한다.

그래서 추론 모드의 올바른 사용법은 "항상 최대로"가 아니라 작업 난이도에 다이얼을 맞추는 것이다. 이 원칙이 시리즈 내내 반복된다.

4. 추론 토큰의 비용: 출력 토큰으로 과금된다

여기가 다이얼이 단순한 품질 손잡이를 넘어 비용 손잡이가 되는 지점이다.

Claude의 사고 토큰도, OpenAI의 reasoning 토큰도 — 둘 다 출력 토큰(output tokens)으로 과금된다. 출력 토큰은 입력 토큰보다 단가가 훨씬 비싸다(예: Claude Opus 4.8은 100만 토큰당 입력 5달러 / 출력 25달러). 즉 사고를 늘린다는 것은 가장 비싼 토큰 종류를 더 쓴다는 뜻이다.

비용 구조를 정리하면:

구간 무엇 과금
입력 프롬프트·컨텍스트 입력 단가(저렴)
사고 thinking / reasoning 토큰 출력 단가(비쌈)
답변 사용자에게 보이는 응답 출력 단가(비쌈)

게다가 사고 토큰은 지연(latency)도 늘린다. 답의 첫 글자가 나오기 전에 사고를 다 끝내야 하므로, 높은 추론 설정은 응답이 시작되기까지의 시간(time-to-first-token)을 키운다. 비용과 지연이 함께 움직인다는 점이 추론 모드를 운영할 때 가장 먼저 체감하는 사실이다.

5. 생각은 보이지 않는다 — CoT 비공개와 요약

사고 토큰은 분명히 생성되고 분명히 과금되지만, 그 원문(raw chain-of-thought)은 대개 사용자에게 그대로 반환되지 않는다.

  • Claude: 현행 모델은 사고 과정 원문을 절대 반환하지 않는다. 대신 옵션으로 요약을 제공한다(thinking.displaysummarized로 두면 읽을 수 있는 요약, omitted이면 사고 블록의 텍스트가 비어 있음). 표시 여부와 무관하게 사고는 일어나고 동일하게 과금된다.
  • OpenAI: reasoning 토큰은 응답에 그대로 노출되지 않고(요약만 제공), 그럼에도 출력 토큰으로 청구된다.

왜 가리는가? 사고 과정 원문은 모델 행동을 그대로 드러내는 민감한 자료이고, 안전·오용 측면에서 노출 위험이 있기 때문이다. 사용자 입장에서 실무적으로 중요한 점은 둘이다 — (1) 비용은 보이지 않는 토큰까지 포함해 계산해야 하고, (2) 진행 상황을 UI에 보여주려면 요약을 명시적으로 켜야 한다(기본값은 가려진 쪽인 경우가 많다).

6. 그래서 '다이얼'이 생겼다 — effort / reasoning_effort

지금까지를 한 줄로: 사고는 품질을 올리지만 비용과 지연을 키우고, 작업에 따라 효용이 다르다. 그렇다면 당연한 결론은 — 사고량을 호출마다 조절할 수 있어야 한다는 것이다. 두 벤더가 정확히 그 손잡이를 노출한다.

  • Claude — effort: low / medium / high / xhigh / max. 특이하게도 사고량뿐 아니라 응답 전체 토큰(설명·도구 호출 포함)을 한 다이얼로 조절한다. 기본값은 high.
  • OpenAI — reasoning_effort: minimal / low / medium / high(GPT-5 기준, 세대에 따라 none·xhigh 추가). 기본값은 medium. 출력 길이는 별도의 verbosity 파라미터로 따로 조절한다.

두 설계가 같지 않다는 점 — Claude는 한 손잡이로 사고+출력을 함께, OpenAI는 사고와 출력을 분리 — 이 시리즈 후반 비교의 핵심이다.

이어지는 글

이 시리즈는 다이얼을 다음 순서로 분해한다.

  • 2편 — Claude의 Thinking: 고정 예산(budget_tokens)에서 adaptive thinking으로의 전환, 사고 블록과 display, 원문 비공개.
  • 3편 — Claude effort 완전 해부: low~max 각 레벨의 동작, 모델별 지원·기본값, 도구 호출·프리앰블·사고에 미치는 영향.
  • 4편 — Claude Code의 effort 실전: CLI 5단계, /effort와 환경변수, 세션 지속성, ultracode의 정체.
  • 5편 — OpenAI·Codex의 reasoning_effort: minimal~xhigh, GPT-5/5.5/5.2-codex 차이, config.toml 설정, verbosity와의 분리.
  • 6편 — 비교·트레이드오프·실전 가이드: Claude vs OpenAI 정리, 비용·지연·품질 곡선, 벤치마크 수치, 작업 난이도별 다이얼 매칭.

다음 글에서는 Claude의 Thinking이 고정 예산에서 모델이 스스로 정하는 adaptive로 어떻게 옮겨갔는지를 본다.


이 글은 Anthropic·OpenAI 공식 문서를 1차 자료로 정리했다. 구체적 파라미터 값·기본값·모델별 지원은 3~5편에서 표로 정리한다.

시리즈 전체 안내: 시리즈 목차

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"