DeepSeek Thinking Mode: 켜기·끄기와 effort 설정
DeepSeek Thinking effort와 요청 형식별 켜기·끄기 설정을 설명한다. reasoning_content 처리, 추론 강도 매핑, 도구를 쓰는 멀티턴 대화의 400 오류 확인 방법을 안내한다.
핵심 요약
- Thinking Mode는 기본으로 켜져 있다. extra_body의 thinking.type으로 켜고 끈다.
- 실제 effort 단계는 low·high·max 셋이고, medium과 xhigh는 high로 적용된다.
- Thinking Mode에서 tools를 쓰면 이전 턴의 reasoning_content를 돌려보내야 한다. 누락하면 400 오류가 난다.
이 글의 목차
DeepSeek Thinking Mode는 기본으로 켜져 있다. Chat Completions에서는 extra_body={"thinking": {"type": "enabled"}} 또는 "disabled"로 켜고 끄고, 강도는 reasoning_effort로 정한다. 추론 내용은 답(content)과 따로 reasoning_content로 온다. 짧은 변환·분류에는 끄고, 코딩·계획·분석에는 켠다.
켜고 확인하기
DeepSeek API 사용법에서 키와 SDK를 준비한 같은 창에서 실행한다. 실행할 때마다 잔액이 조금씩 빠진다. (Thinking Mode 문서)
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["DEEPSEEK_API_KEY"], base_url="https://api.deepseek.com")
response = client.chat.completions.create(
model="deepseek-v4-pro",
messages=[{"role": "user", "content": "이진 탐색의 시간 복잡도가 O(log n)인 이유를 설명해줘."}],
reasoning_effort="high",
extra_body={"thinking": {"type": "enabled"}},
)
message = response.choices[0].message
print(message.content)
print("추론 필드 수신:", bool(getattr(message, "reasoning_content", None)))
답 아래 추론 필드 수신: True가 나오면 켜진 것이다. 답의 내용도 본다. 탐색 범위가 매번 절반으로 준다는 설명과 n / 2^k = 1에서 k = log₂ n이 된다는 관계가 있으면 맞다.
thinking은 OpenAI SDK의 표준 필드가 아니라서 extra_body로 보낸다. SDK가 모르는 필드를 그대로 실어 보내는 통로다.
끄려면 reasoning_effort 줄을 지우고 "type": "disabled"로 바꿔 다시 실행한다. 요청에 disabled가 전달됐는지와 응답 필드를 함께 확인한다. False는 그 응답의 추론 필드가 비어 있다는 뜻이므로, 그 값 하나만으로 설정 적용 여부를 단정하지 않는다.
요청 형식마다 필드 이름이 다르다. 섞어 쓰면 오류가 나거나 설정이 적용되지 않는다.
| 형식 | 끄기 | 강도 |
|---|---|---|
| OpenAI Chat Completions | thinking.type: "disabled" |
reasoning_effort |
| Anthropic | thinking.type: "disabled" |
output_config.effort |
| Responses | reasoning.effort: "none" |
reasoning.effort |
언제 켜고 언제 끄나
| 작업 | 추천 |
|---|---|
| 정해진 분류, 짧은 문장 변환, 이미 답이 있는 글의 형식 정리 | 끈 상태부터 비교 시험 |
| 대량 요청에서 응답 속도가 중요한 일 | 끔부터 시험 |
| 여러 조건을 함께 맞춰야 하는 코드 수정, 긴 계획, 복잡한 비교 | 켬 |
어느 쪽이 나은지는 같은 시험 문제 묶음으로 두 모드를 돌려 정답률, 출력 토큰, 응답 시간을 함께 비교해 정한다. 처음에는 켠 상태의 결과를 기준으로 두고, 꺼도 결과가 같은 작업부터 끄는 편이 안전하다.
effort 값
| 요청한 값 | 실제 적용 |
|---|---|
minimal, low |
low |
medium, high, xhigh |
high |
max, ultra |
max |
실제로 구분되는 단계는 low·high·max 셋이고 기본값은 high다. 추론 토큰도 출력 요금으로 계산된다. 강도를 올리면 추론 토큰과 응답 시간이 늘 수 있으니, 정답률이 오르는 만큼 비용을 감수할 가치가 있는지 본다. 틀린 답을 사람이 다시 고치는 시간도 비용에 넣어야 계산이 맞다.
Thinking Mode에서는 temperature, presence_penalty, frequency_penalty를 넣어도 오류는 안 나지만 효과가 없다. top_p는 적용되지만 최소 0.95이고, 더 낮게 넣으면 0.95로 올라간다. 추론을 끄면 top_p는 1.0으로 고정된다. 9월 29일 공식 문서 기준이다.
도구를 쓸 때 400 오류
Thinking Mode 요청에 tools를 넣었다면 이전 모든 턴의 reasoning_content를 그대로 돌려보내야 한다. 도구를 호출하지 않은 턴도 포함이다. 빠뜨리면 400 오류가 난다. (Thinking Mode의 도구 호출 안내)
요청에 tools가 |
reasoning_content |
|---|---|
| 없다 | 돌려보내지 않아도 된다. 보내도 무시된다 |
| 있다 | 이전 모든 턴의 것을 전부 돌려보낸다 |
- Thinking Mode의 도구 요청에서 이전 assistant 메시지를 다시 보낼 때는 그 메시지의
reasoning_content를 누락하지 않는다. - 필요한 필드만 골라 메시지를 새로 만드는 코드도 이 필드를 빠뜨리기 쉽다. 응답 메시지를 통째로
messages에 넣는 방식이 안전하다. - 도구 없이 쓰던 코드를 도구 호출로 바꿀 때 대화 기록 처리부터 확인한다.
스트리밍에서는 reasoning_content가 먼저, content가 나중에 온다. 둘을 구분하지 않고 이어 붙이면 추론 과정이 답처럼 화면에 나온다. 받는 필드를 나눠 추론은 따로 두거나 표시하지 않는다.
대화를 이어 갈 때는 아래처럼 받은 응답 메시지를 그대로 기록에 붙이고 다음 질문을 더한다. Thinking Mode의 도구 요청에서도 이 방식으로 assistant 메시지의 reasoning_content를 함께 남길 수 있다. 실제 도구 호출이 반환됐다면 다음 요청 전에 해당 tool_call_id의 실행 결과도 추가해야 한다.
messages.append(response.choices[0].message)
messages.append({"role": "user", "content": "방금 설명을 예시 코드로 보여줘."})
자주 묻는 질문
Flash 모델에서도 Thinking Mode를 쓸 수 있나?
쓸 수 있다. 현재 가격표는 deepseek-v4-pro와 deepseek-flash 모두 추론 모드와 비추론 모드를 지원한다고 안내한다. 같은 설정으로 두 모델을 비교해 보고 고른다.
답이 너무 느리다면?
먼저 reasoning_effort를 low로 낮춰 본다. 판단할 것이 거의 없는 작업이면 추론을 끈다. 추론을 켠 요청에서는 최종 답변 content보다 reasoning_content가 먼저 올 수 있다.
추론 과정을 사용자 화면에 보여 줘도 되나? 보여 줄 수는 있지만 정답이나 근거로 쓰지 않는다. 추론 텍스트에는 틀린 중간 단계가 섞일 수 있고, 사용자가 입력한 민감한 내용이 그대로 들어갈 수 있다. 로그에 남길 때도 필요한 만큼만 보관한다.
temperature를 넣었는데 결과가 그대로다.
정상이다. 추론 모드에서는 효과가 없다. 답의 다양성을 조절해야 하면 추론을 끄고 시험하거나, 요청문에서 원하는 형식과 범위를 더 구체적으로 적는다.
모델별 가격은 DeepSeek V4 정리에 있다.



첫 댓글을 남겨 보세요.
로그인은 계정 확인에만 사용하며 이메일 원문은 저장하거나 공개하지 않습니다.
댓글은 공개됩니다. 개인정보·광고·비방성 내용은 남기지 마세요. 운영 기준은이용 안내에서 확인할 수 있습니다.