---
title: 推理与 thinking
url: https://doc.liz6.com/ai/01-models-and-context/04-reasoning-and-thinking
locale: zh
area: ai
tags:
- ai
- 模型与上下文
date: 2026-06-30
modified: 2026-07-16
description: 让模型"先想再答"——在推理时多花算力做分解、试错、自检,而不是只靠预训练压进权重的直觉。adaptive thinking 和 effort 把思考深度从手填 token 数变成了语义档位。
---

# 推理与 thinking

> 让模型"先想再答"——在推理时多花算力做分解、试错、自检,而不是只靠预训练压进权重的直觉。adaptive thinking 和 effort 把思考深度从手填 token 数变成了语义档位。

## 概述

让模型"先想再答"——在**推理时(test-time)**多花算力做分解、试错、自检,而不是只靠预训练压进权重的直觉。这条线从 **Chain-of-Thought**(2022,让模型写出推理步骤就显著提升数学/推理准确率)走到**推理模型(reasoning models)**,再到 Claude 的 **adaptive thinking**:模型自己决定何时想、想多深。理解它,是把"又快又便宜"和"又准又稳"调对档位的关键——这也是 [上下文工程](/ai/01-models-and-context/01-context-engineering.md) 里 token 预算波动最大的一个变量。

核心直觉:**算力可以花在训练时,也可以花在推理时**。同一个模型,允许它在回答前先"想"一段,等价于在推理时投入更多计算去搜索、验证——对多步推理、agentic 长任务,这能换来实打实的正确率提升;对简单查询,则是纯浪费。所以现代做法不是"全程深想"或"全程不想",而是**按任务难度动态分配思考量**,并留一个总闸来权衡。

## 机制:thinking block 与它为什么有用

开启思考后,一次响应里先出现 **thinking block**(模型的内部推理),再出现 `text`(给用户的答案):

```mermaid
flowchart LR
    Q["输入"] --> TH["thinking block<br/>分解 → 试错 → 自检"]
    TH --> A["text block<br/>最终答案"]
```

为什么"想"能提升质量,可以拆成三个动作:

- **分解**:把难题拆成可逐个攻克的小步,降低单步出错率。
- **搜索/试错**:在思考里走几条路、比较,而不是一锤定音。
- **自检/验证**:对照约束回查自己的中间结论(尤其代码、数学)。

举个具体的:解"27 × 453",直接答容易错位;而 thinking 里会**分解**成 27×400 + 27×53,**试错**地把 27×53 再拆成 27×50+27×3,最后**自检**把 10800+1431=12231 回乘一遍核对。同样的三步发生在写代码(先列边界条件、试几种实现、再对照需求回查)与多步规划上——这正是 Chain-of-Thought 把推理"显式写出来"就显著提分的原因:把一步登天的概率赌注,换成几步各自高把握的小赌注。

代价同样实在:**多花 token、多等延迟**。所以"想多少"必须可控,这就是 effort 与 thinking 控制存在的理由。

## Claude 的思考控制(当前 API 行为)

现代 Claude(Opus 4.6+)用 **adaptive thinking**,不再手填思考预算:

```python
thinking = {"type": "adaptive", "display": "summarized"}   # 自适应 + 展示摘要
output_config = {"effort": "high"}                         # 总闸
```

### effort:深浅总闸

`effort ∈ {low, medium, high, xhigh, max}`(`xhigh` 是 Opus 4.7 起新增、介于 high 与 max 之间),默认 `high`:

| effort | 行为 | 用在 |
|--------|------|------|
| low | 工具调用更少更聚合、前言更短、最快最省 | 简单/低敏任务、延迟敏感 |
| medium | 平衡点 | 一般应用 |
| high | 更充分推理 | 多数 intelligence-sensitive 任务(推荐下限) |
| xhigh | coding/agentic 甜点(Claude Code 默认) | 长 coding、复杂 agent |
| max | 压到顶 | 正确性 ≫ 成本;注意易空转 |

`effort` 越高,模型越倾向多想、多探索、多调工具——这把"思考深度"从一个 token 数变成一个语义档位。

### thinking 的可见性:默认看不到原文

- **`display` 默认 `omitted`**(Opus 4.7/4.8、Fable 5):thinking block 仍在响应里,但 `thinking` 字段是**空字符串**。要给用户看推理就设 `display: "summarized"` 拿**摘要**。
- **原始思维链(raw CoT)从不返回**——能拿到的最多是摘要,不是逐字推理。
- **流式 UX 坑**:`omitted` 下,流看起来像"长时间停顿后才突然出字"(其实在思考)。要展示进度,显式设 `summarized`。

### 多轮里:thinking block 要原样回传

这是最容易踩的工程坑。多轮对话/agent 循环里,把上一轮的 thinking block 喂回时:

- **同一模型续话**:必须**原样回传**(含 `signature` 签名,甚至空文本块也照原样)。API 拒绝**被改动**的块,但不拒绝读过的块——展示摘要没问题,编辑/重构块会 400。
- **换模型**:换用其它模型时,API 会自动把上一代(如 Fable 5)的 thinking block **从 prompt 里丢弃**(通常静默、且丢弃发生在计价前,不计费);不要手动 strip 常规 thinking 块,否则可能触发顺序/签名 400。

### interleaved thinking 与 task budget

- **interleaved thinking**:adaptive 下,**工具调用之间**也会思考(边做边想),无需额外 header——这对 agent 循环尤其重要(每次拿到 tool_result 后再想)。
- **task budget**(beta `task-budgets-2026-03-13`):给整个 agent 循环一个 token 预算,**模型能看到倒计时并自我收尾**。它和 `max_tokens` 不同:

| | task_budget | max_tokens |
|---|---|---|
| 作用范围 | 整个 agentic 循环 | 单次响应 |
| 模型是否可见 | **可见**(看倒计时自我节制) | 不可见 |
| 性质 | 软建议 | 硬上限(截断) |
| 下限 | 20000 token | 1 |

## 该想还是不该想:把 effort 当一个要扫的维度

不要反射式拉满 `xhigh`/`max`。更强的模型有更高的智能上限,**起步用 `high`、在自己的 eval 集上扫 `medium`/`high`/`xhigh` 再定**——关系不是单调的:高 effort 在 agentic 任务上常**减少**回合数、反而更省;而某些任务 `medium` 同样好且更快(评估见 [评估与可观测](/ai/02-Agent/05-evaluation-and-observability.md))。

| 任务 | 起点 |
|------|------|
| 分类 / 抽取 / 简单查询 | low(甚至关思考) |
| 数学 / 多步推理 / 规划 | high |
| 长 agentic / coding | high ~ xhigh,配大 `max_tokens` 与流式 |
| 正确性压倒成本 | max(警惕空转) |

迁移提示:旧模型用 `temperature` 调"创造性"的思路,在新模型换成 effort 调"思考深度"——采样参数已移除(见 [Token 与采样](/ai/01-models-and-context/02-tokens-and-sampling.md))。

## 最佳实践

- **用 adaptive thinking,别手填 budget。** 现代 Claude 自适应想多深;手填 `budget_tokens` 在 Opus 4.7/4.8/Fable 5 上直接 400。
- **effort 起步 `high`,按 eval 扫档定。** 关系非单调——高 effort 在 agentic 上常减回合反更省,某些任务 `medium` 同样好且更快。
- **按任务给 effort 起点。** 分类/抽取→`low`;数学/规划→`high`;长 agentic/coding→`high`~`xhigh` 配大 `max_tokens` 与流式;正确性压倒成本→`max`(警惕空转)。
- **要给用户看推理就设 `display:"summarized"`。** 默认 `omitted` 下流像"长时间停顿后突然出字"。
- **多轮里 thinking block 原样回传。** 同模型续话含签名照原样;换模型让 API 自己丢,别手动 strip。
- **过度思考/探索先降 effort,别堆 prompt 约束。** `medium` 常是甜点。

## 权衡与失败模式(附 prompt 修法)

- **overthinking**:高 effort 在简单任务上空转烧 token → **先降 effort**(`medium` 常是甜点),别急着堆 prompt 约束。要按需抑制可加:*"思考会增加延迟,只在确实需要多步推理时才深想;拿得准就直接回答。"*
- **过度探索 / 过度委派**(agent 场景):高 effort 下更爱探索、爱开子 agent → 降 effort 或给明确边界。
- **思考被当成卡死**:`omitted` 时前端像没响应 → `display: "summarized"`。
- **多轮丢块**:手动改/删 thinking block 导致 400 → 同模型原样回传(含签名),换模型让 API 自己丢。
- **`thinking:{type:"disabled"}` 时啰嗦**:关思考时模型可能把推理写进可见正文 → 留 adaptive,或加 *"只输出最终答案,不要中间推理。"*

## 参考

- **Anthropic 官方文档**: Extended Thinking、Adaptive Thinking、Effort、Task Budgets、Migration Guide(platform.claude.com)
- **论文**: "Chain-of-Thought Prompting Elicits Reasoning in LLMs"(Wei 2022)

*Keywords: chain-of-thought, CoT, reasoning model, test-time compute, extended thinking, adaptive thinking, effort, low, medium, high, xhigh, max, thinking block, signature, display, summarized, omitted, raw CoT, interleaved thinking, task budget, max_tokens, multi-turn echo-back, budget_tokens deprecated, overthinking*
