Chain of thought vs reasoning models is a distinction that matters when you’re paying per token and measuring latency in production. Chain-of-thought (CoT) is a prompting technique that elicits step-by-step reasoning from any capable model. Reasoning models — OpenAI’s o1 series, DeepSeek-R1, QwQ — bake that behavior into the weights during training. They solve similar problems but with different economics, control surfaces, and failure modes.
What chain of thought actually does
Chain-of-thought prompting forces the model to generate intermediate reasoning tokens before producing a final answer. The canonical form appends “Let’s think step by step” or provides few-shot examples showing the desired reasoning pattern. The model then emits its reasoning trace as part of the completion, which you can parse, log, or discard.
# Zero-shot CoT
prompt = f"{user_question}\n\nLet's think step by step."
# Few-shot CoT with structured reasoning
examples = """
Q: If a train travels 60 mph for 2.5 hours, how far does it go?
Reasoning: Distance = speed × time = 60 × 2.5 = 150 miles.
Answer: 150 miles.
Q: {user_question}
Reasoning:"""
The reasoning tokens count against your context window and your bill. A 2,000-token reasoning trace costs the same as 2,000 tokens of final answer. You control the prompt, so you can constrain the reasoning format, inject domain-specific heuristics, or cut the trace short with stop sequences.
What reasoning models actually do
Reasoning models undergo an additional training phase — typically reinforcement learning on verifiable reasoning tasks — that teaches them to produce extended reasoning chains by default. You don’t prompt them to think step by step; they do it automatically, often behind a special <thinking> or <reasoning> token block that the API may or may not expose.
// Typical reasoning model request (OpenAI o1 style)
{
"model": "o1-preview",
"messages": [{"role": "user", "content": "Solve this physics problem..."}],
"max_completion_tokens": 8000 // includes hidden reasoning tokens
}
The reasoning trace is often hidden from you — OpenAI’s o1 models don’t return the reasoning tokens at all. DeepSeek-R1 and QwQ expose them. You pay for all of it regardless. The model decides how much reasoning to allocate, though some APIs now offer reasoning_effort knobs (low/medium/high).
Comparison across dimensions
| Dimension | Chain-of-thought prompting | Reasoning models (o1, R1, QwQ) |
|---|---|---|
| Control over reasoning | Full — you design the prompt, format, and constraints | Limited — model decides depth/structure; some APIs offer effort knobs |
| Visibility into trace | Complete — every token is in the completion | Variable — o1 hides it; R1/QwQ expose it |
| Token cost | Predictable — you see exactly what you’re paying for | Opaque — hidden reasoning tokens count toward max_completion_tokens |
| Latency | Single generation pass | Often 2-10× slower; reasoning is sequential and cannot be parallelized |
| Reliability on hard tasks | Depends on prompt quality and base model capability | Generally higher on math, code, logic — trained for it |
| Context efficiency | Reasoning consumes your context window | Reasoning consumes completion budget; may have separate reasoning budget |
| Model availability | Works on any instruction-tuned model (Llama, GPT-4o, Claude, etc.) | Limited to specific model families; fewer providers |
| Few-shot adaptability | High — swap examples per domain/task | Low — model’s reasoning style is fixed by training |
| Debuggability | High — inspect exact reasoning path | Low when trace is hidden; medium when exposed |
When to use chain of thought prompting
CoT shines when you need control, auditability, and cost predictability. If you’re building a system where the reasoning trace is part of the product — showing users why an answer was given, feeding traces to a verifier, or logging for compliance — CoT on a strong base model (GPT-4o, Claude 3.5 Sonnet, Llama 3.1 405B) is often the right call.
It also wins on latency-sensitive paths. A single forward pass on GPT-4o with a CoT prompt typically completes in 1-3 seconds. The same task on o1-preview can take 20-60 seconds. For interactive applications, that difference is often unacceptable.
Cost modeling is simpler with CoT. You know exactly how many reasoning tokens you’ll generate because you designed the prompt. With reasoning models, a single tricky prompt can balloon into thousands of hidden reasoning tokens. I’ve seen o1-preview burn 15,000 completion tokens on a problem that GPT-4o solved in 800 with a good CoT prompt.
# CoT with explicit budget control
def solve_with_budget(question, max_reasoning_tokens=1000):
prompt = f"""{question}
Think step by step, but keep your reasoning under {max_reasoning_tokens} tokens.
End with: ANSWER: <your final answer>"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
max_tokens=max_reasoning_tokens + 200,
temperature=0.1
)
return response.choices[0].message.content
Use CoT when:
- You need sub-5-second latency
- You want to enforce a specific reasoning format (JSON, structured steps, citations)
- You’re routing to different models per task and need consistent behavior
- The task benefits from few-shot examples you can curate per domain
When to use reasoning models
Reasoning models earn their keep on genuinely hard problems where the base model + CoT still fails. Multi-step math, competitive programming, complex logic puzzles, and tasks requiring backtracking or hypothesis testing. The RL training teaches them to self-correct, try alternative approaches, and persist through dead ends — behaviors that are extremely difficult to prompt reliably.
They also reduce prompt engineering surface area. You don’t need to craft few-shot examples or tune “think step by step” variations. The model just works. For teams without dedicated prompt engineers, this operational simplicity matters.
# Reasoning model with effort control (where supported)
response = client.chat.completions.create(
model="o1-mini",
messages=[{"role": "user", "content": hard_problem}],
max_completion_tokens=16000,
reasoning_effort="high" # o1 API parameter
)
Use reasoning models when:
- The task has a clear verifiable answer (code, math, logic) and base models + CoT fail
- You can tolerate 10-60 second latency
- You don’t need to inspect or constrain the reasoning process
- You’re building batch/async workflows where latency doesn’t block users
- You want to minimize prompt maintenance burden
Hybrid approaches
Production systems increasingly combine both. Route easy/medium tasks to a fast model with CoT. Escalate to a reasoning model only when the first attempt fails a verifier or confidence check.
async def solve_with_escalation(problem, verifier):
# Attempt 1: Fast CoT on GPT-4o
cot_result = await solve_with_cot(problem, model="gpt-4o")
if verifier(cot_result):
return cot_result
# Attempt 2: More thorough CoT with few-shot
cot_result = await solve_with_cot(problem, model="gpt-4o", few_shot=True)
if verifier(cot_result):
return cot_result
# Attempt 3: Reasoning model
return await solve_with_reasoning_model(problem, model="o1-mini")
This pattern keeps your p95 latency low while still handling the long tail of hard problems. The verifier can be another LLM call, a unit test suite, a static analyzer, or a simple heuristic (answer format matches expected schema).
Some teams also use reasoning models offline to generate high-quality CoT examples, then distill those into few-shot prompts for faster models. This is effectively model distillation — using o1 to teach GPT-4o or Llama how to reason on your specific task distribution.
Which to choose
Interactive user-facing features (chat, search, coding assistants): Chain-of-thought on GPT-4o, Claude 3.5 Sonnet, or Llama 3.1 405B. Latency budget forces this choice. Use structured CoT prompts with explicit format constraints.
Batch processing, eval pipelines, overnight jobs: Reasoning models. Latency doesn’t matter; correctness does. o1-mini and DeepSeek-R1 are cost-effective here.
Math-heavy workflows (financial modeling, engineering calculations): Reasoning models. The gap on multi-step quantitative reasoning is real and prompt engineering rarely closes it fully.
Code generation with test verification: Start with CoT + test execution loop. Escalate to reasoning model only after 2-3 failed repair attempts. The test loop catches most errors faster than a single slow reasoning call.
Regulated/auditable decisions (medical, legal, compliance): Chain-of-thought with full trace logging. You need to show the work. Hidden reasoning traces from o1 are a non-starter.
Multi-model routing systems: Implement both as separate arms. Route based on task classification (easy/medium/hard) and latency SLA. This is where a gateway that supports per-request model selection and automatic fallback — like n4n.ai — reduces the plumbing burden.
Prototyping unknown task distributions: Reasoning models first. They generalize better out of the box. Once you understand the failure modes, build CoT prompts for the common cases and reserve reasoning models for the edge cases.
The industry is converging on reasoning as a capability you invoke selectively, not a model type you commit to entirely. The smartest systems treat reasoning compute like a budget — spend it where the verification signal says it’s worth it.