블로그로 돌아가기

AI 입문가이드

추론 effort와 사고 토큰: 사고가 더 비싼 이유

사고 토큰은 출력으로 청구됩니다. effort 단계의 의미, 답변이 잘리지 않도록 max_tokens에 넣을 값, 청구서를 추정하는 방법을 설명합니다.

작성자: CheapTokens Team 게시됨읽는 시간 7분

채팅 카드: 한 줄 답변이 왜 이렇게 비쌌을까? 모델이 먼저 사고했고, 사고는 출력으로 청구되기 때문입니다
이 페이지의 내용
  1. 모델이 답변하기 전에 하는 일
  2. Effort: 사고를 조절하는 다이얼
  3. 빈 답변 함정: 사고는 max_tokens에 포함됩니다
  4. 긴 추론이 청구서에 미치는 영향
  5. 어떤 작업에 어떤 effort를 쓸까
  6. 오래된 요청 옮기기: 400 오류
  7. 에이전트와 긴 대화: 한 단계를 골라 유지하세요
  8. 자신의 요청으로 시도해 보세요

요청은 사실 확인 질문 하나였습니다. 답변은 세 줄이었습니다. 그런데 출력 카운터는 수천 토큰을 가리킵니다. 이는 버그가 아닙니다. 답변하기 전에 많은 모델이 숨겨진 스크래치패드에서 사고하는데, 그 사고 토큰은 출력 토큰으로 청구됩니다. effort 설정은 그 사고가 얼마나 일어날지를 결정하며, max_tokens는 이를 위한 여유를 남겨두어야 합니다. 그렇지 않으면 답변이 잘리거나 비어 있게 됩니다.

모델이 답변하기 전에 하는 일#

시험을 떠올려 보세요. 바로 답을 쓸 수도 있고, 먼저 한 페이지 분량의 연습장을 채울 수도 있습니다. 어려운 문제에서는 연습장이 더 나은 결과를 주는 경우가 많지만, 종이는 공짜가 아닙니다. 추론이 바로 그 연습장이며, 다른 모든 것과 마찬가지로 토큰으로 계산됩니다.

Anthropic의 확장 사고 문서(2026년 10월 23일 확인)에 따르면 사고 토큰은 청구되는 출력 토큰의 일부이며, 응답에서 그 수를 알려줍니다: usage.output_tokens_details.thinking_tokens. 응답이 다음과 같은 usage 블록과 함께 돌아온다고 가정해 봅시다(예시 숫자):

json
"usage": {
  "input_tokens": 480,
  "output_tokens": 2150,
  "output_tokens_details": { "thinking_tokens": 1900 }
}

2,150개의 출력 토큰에 대해 청구됩니다. 사고가 그중 1,900개를 차지했으므로, 실제로 읽는 텍스트는 2,150 − 1,900 = 250 토큰입니다. 사고 텍스트가 반환되지 않는 경우에도 마찬가지입니다. 여전히 계산됩니다. 입력과 출력의 차이를 먼저 명확히 알고 싶다면 입력 vs 출력 토큰부터 시작하세요.

Effort: 사고를 조절하는 다이얼#

Claude의 API에서 다이얼은 output_config.effort입니다. Anthropic의 effort 페이지(2026년 10월 23일 확인)에는 다섯 단계가 나열되어 있습니다: low, medium, high, xhigh, max. 초보자에게 중요한 세 가지 세부 사항이 있습니다:

  • 사고뿐만 아니라 모든 출력 토큰에 영향을 미칩니다: 텍스트, 도구 호출, 사고가 함께 영향을 받습니다.
  • 이는 행동 신호이지 엄격한 예산이 아닙니다. 낮은 effort는 일부 능력을 대가로 더 적은 토큰을 의미하며, 낮은 effort에서 Claude는 간단한 문제에서는 사고를 완전히 건너뛸 수 있습니다.
  • 기본값은 Claude Opus 5.5와 Claude Haiku 5.5에서 medium이고, 이 매개변수를 지원하는 대부분의 다른 모델에서는 high입니다. 기본값을 명시적으로 설정하는 것은 생략하는 것과 같습니다.

단계는 모델별로 재보정되므로, 한 모델의 high은 다른 모델의 high과 같은 양의 사고가 아니며, 모든 모델이 모든 단계를 받아들이는 것은 아닙니다. 공개된 한 영상에서는 누군가 Claude Opus 5.5의 모든 effort 단계를 동일한 모션 그래픽 작업에 실행하고 그림을 비교했습니다. 더 많은 사고가 무엇을 얻는지 보는 좋은 방법입니다. 하지만 여러분의 청구서를 알려주지는 않습니다. 여러분의 작업은 그들의 작업과 다르기 때문입니다.

간단한 질문에 대한 요청으로, effort를 낮춘 경우:

json
{
  "model": "claude-opus-5-5",
  "max_tokens": 4000,
  "output_config": { "effort": "low" },
  "messages": [
    { "role": "user", "content": "What is the capital of Australia?" }
  ]
}

빈 답변 함정: 사고는 max_tokens에 포함됩니다#

이것이 잘못되는 방식은 다음과 같습니다. 두 문장짜리 답변을 기대해서 max_tokens을 300으로 설정합니다. 모델이 사고를 시작하고, 스크래치패드에 300을 다 쓰고, 한도에 도달해 멈춥니다. 빈 응답이나 단어 중간에 끝나는 문장을 받게 되고, 중지 이유는 max_tokens이라고 표시됩니다.

문서는 명확합니다: max_tokens은 사고와 응답 텍스트를 합친 전체 출력에 대한 하드 한도이며, 사고 내용이 반환되지 않더라도 사고는 계산됩니다. high effort 이상에서는 Anthropic이 큰 값을 설정하라고 권장합니다.

실제로는:

  1. 원하는 답변의 길이를 정합니다.
  2. 사고를 위한 넉넉한 여유를 더합니다. low 이상에서는 몇천 토큰이 합리적인 시작점입니다.
  3. 첫 실행 후 중지 이유를 확인합니다. 여전히 max_tokens이라고 표시되면 한도를 높입니다. 답변이 완전하면 낮출 수 있습니다.

잘림 자체와 finish_reason, 컨텍스트 윈도우에 대해서는 AI 답변이 문장 중간에 멈추는 이유에서 다룹니다.

긴 추론이 청구서에 미치는 영향#

하루 2,000건의 티켓을 처리하는 지원 봇을 운영한다고 가정해 봅시다. 각 티켓은 입력이 약 500 토큰입니다. 짧고 직접적인 답변은 출력이 약 400 토큰입니다. 같은 티켓을 길고 숨겨진 추론으로 처리하면 출력이 약 4,000 토큰입니다. 이는 예시를 위한 가정입니다. 자신의 숫자는 요청이 사용하는 토큰 수를 참고하세요.

하루 기준으로 2,000 × 500 = 1,000,000 입력 토큰이고, 출력은 2,000 × 400 = 800,000 토큰 또는 2,000 × 4,000 = 8,000,000 토큰입니다. 티켓을 읽는 사람은 어느 쪽이든 같은 두 줄을 봅니다. 달라진 것은 출력량뿐이며, 추론이 부풀리는 쪽이 바로 출력입니다.

지원 봇의 일일 비용, 입력 1,000,000 토큰, 짧은 답변 vs 긴 추론(실시간 가격)
  • MiniMax-M2.7, 긴 추론(출력 8,000,000)$1.25
  • DeepSeek-V4-Flash, 긴 추론(출력 8,000,000)$0.815
  • MiniMax-M2.7, 짧은 답변(출력 800,000)$0.17
  • DeepSeek-V4-Flash, 짧은 답변(출력 800,000)$0.095

계산은 숨겨진 추론을 청구하는 모든 모델에서 동일합니다: 출력 토큰 × 출력 가격. DeepSeek-V4-Flash의 경우 그 가격은 1M 출력 토큰당 $0.10이며, 출력 쪽이 OpenRouter의 참조 가격보다 저렴합니다. 또한 380K 컨텍스트로 한 번에 최대 32,768 토큰까지 답변하므로 큰 max_tokens도 들어갑니다. 가격은 모델별로 고정되어 있고 피크 시간이 없으며, 위 표는 실시간 가격 목록에서 다시 계산됩니다. 모든 가격은 가격 페이지에 있습니다. DeepSeek 페이지에는 모델 세부 정보가 있습니다.

직접 보내볼 요청이 있습니다. 단순 요약 작업이므로 긴 추론이 필요 없고, 한도에 여유가 충분합니다:

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "max_tokens": 2000,
    "messages": [
      {"role": "user", "content": "Summarize in one sentence: A token is a small piece of text that a model reads and writes, and APIs bill by the token."}
    ]
  }'

응답에서 usage.completion_tokens는 출력 쪽에서 지불하는 금액이고, finish_reason은 stop이어야 합니다. length이라고 표시되면 한도가 답변을 잘랐습니다. 키 발급과 첫 호출: 문서.

어떤 작업에 어떤 effort를 쓸까#

  • 사실, 한 줄 요약, 레이블. 가장 낮은 effort. 글 시작 부분의 사례입니다. 연습장이 필요 없습니다.
  • 일상적인 글쓰기, 짧은 설명, 간단한 편집. 모델의 기본값. 답변 비용을 확인한 후에만 변경하세요.
  • 까다로운 버그, 다단계 계획, 수학 문제. high 이상, 그리고 큰 max_tokens. 여기서는 추가 사고가 핵심입니다.

확실하지 않으면 같은 프롬프트를 두 단계로 실행하고, 답변을 비교하고, output_tokens를 비교하세요. 더 저렴한 답변이 같은 품질이면 그 단계가 정답입니다.

오래된 요청 옮기기: 400 오류#

오래된 코드는 토큰 예산으로 사고를 제어했습니다. Claude 4.7 및 이후 모델(Opus 5.5, Sonnet 5.5, Haiku 5.5, Fable 5.1)에서는 그 형식이 400 오류로 거부됩니다. 적응형 사고로 전환하고 effort로 깊이를 설정합니다:

json
// before: returns 400 on newer models
"thinking": { "type": "enabled", "budget_tokens": 8000 }

// after
"thinking": { "type": "adaptive" },
"output_config": { "effort": "medium" }
왼쪽은 이전 사고 예산, 오른쪽은 effort를 사용한 적응형 사고
Anthropic 문서 기준, 2026년 10월 23일 확인, 이동 전후의 동일한 요청

함정이 하나 더 있습니다: Opus 5.5에서는 적응형 사고가 항상 켜져 있고, thinking: { "type": "disabled" }는 모든 effort 단계에서 400을 반환합니다. Haiku 5.5는 high effort 이하에서 사고를 비활성화할 수 있습니다. Opus 5.5에서 사고를 줄이고 싶다면 끄는 대신 effort를 낮추세요.

에이전트와 긴 대화: 한 단계를 골라 유지하세요#

프롬프트가 캐시된 경우, 요청 간에 최상위 effort를 변경하면 해당 대화의 캐시 중단점이 무효화됩니다. 에이전트 루프나 긴 대화에서는 처음부터 한 단계를 선택하세요. 일부 모델은 캐시를 유지하는 베타 버전의 메시지별 effort를 제공하는데, 기본기를 갖춘 후에는 살펴볼 가치가 있습니다. 긴 대화에는 두 번째 비용 요인이 있으며, 긴 대화가 더 비싼 이유에서 다룹니다.

자신의 요청으로 시도해 보세요#

  1. 실제 프롬프트를 한 번 보내고 usage을 읽으세요: 출력 토큰이 몇 개인지, 그중 사고가 몇 개인지.
  2. effort를 한 단계 낮추고 다시 보내세요. 답변과 개수를 비교하세요.
  3. max_tokens를 원하는 답변에 사고 여유를 더한 값으로 설정하고, 중지 이유를 확인하세요.

그런 다음 자신의 토큰 수를 가격 페이지의 실시간 가격 표에 넣으면 월간 추정치를 얻을 수 있습니다.