Agent 推理模式 · 第 04 章 · 前沿(截至 2026-06-03)
推理模型时代:CoT 从 prompt 到权重
前三章的模式都是你手写的 prompt 或外挂脚手架。这一章讲一件改了游戏规则的事:2024 年起,CoT 被直接训进了模型权重。从此「在推理时多想」不再靠你写 exemplar 去诱发,而是模型出厂自带的行为;推理期算力换可靠性,从一句洞察变成一条被发表、被训练进去的 scaling 定律。
本章四个判断 · 读完要能脱稿讲
- CoT 从「你写的 prompt」变成「用 RL 训练出来的行为」——同一段串行推理,过去靠 exemplar 诱发,现在被优化进权重。
- test-time / inference-time scaling 是一条新 scaling 轴:正确率随「思考 token」上升,与预训练规模正交。
- 在推理模型上手写 few-shot CoT 反而掉分——已训练的内部链和你塞进去的显式例子相撞。
- 哪些模式留下、哪些退场:CoT 进权重、ReAct 留作编排、ToT 类外部搜索价值收缩;模式如今活在框架的显式图里,不在 prompt 里。
§4.1CoT 从 prompt 到权重
用 RL 训练出一条长的内部 CoT:模型在给出答案前,先自行生成一大段内部推理——这段链没人手写,是权重里长出来的。
第 1 章把 CoT 解释成「给固定深度的模型补串行计算步」:一次前向传播的深度是定死的,多写出来的中间 token 等于多借了几层串行算力。但在前三章里,这段中间 token 始终由你负责诱发——写 "let's think step by step",或塞几个 few-shot exemplar 当样板。推理模型(reasoning model,指出厂就会先想一长段再答的模型)把这件事接管了:同一套串行推理,改由 RL 直接优化进权重,触发它不再需要你写任何样板。
一年内的时间线:手写技巧 → 训练目标
把节点按月份排开,变化的速度本身就是论点。每一个都带具体日期:
逐个钉死日期与机制:
- OpenAI o1-preview(2024-09-12),完整版 o1(2024-12-05):第一个公开把「长内部 CoT」作为卖点的模型——答题前先想一长段,思考过程对用户隐藏,只放出摘要。
- DeepSeek-R1(2025-01,arXiv 2501.12948):用 GRPO(Group Relative Policy Optimization,一种不带 critic 网络的强化学习,靠一组采样答案彼此比较算优势,省掉了单独训一个价值模型)做 RL。配套的 R1-Zero 给出更硬的结论:推理能力可以从纯 RL、不做 SFT(监督微调)中涌现——不喂任何人工写的推理范例,模型也能自己长出 CoT。这是把「CoT 是训练出来的行为」从直觉变成可复现实验的一篇。
- o3-mini(2025-01-31)、o3 / o4-mini(2025-04-16):推理模型从旗舰下沉到更便宜、更快的档位,并带可调的「推理强度」档(low / medium / high)。
- Claude 3.7 Sonnet 扩展思考(extended thinking,2025-02-25):把「想多久」做成一个可设的预算——thinking token 预算可拉到 128K,且思考内容对开发者可见。这一步把 test-time compute 直接变成一个 API 旋钮。
- Gemini 2.5 thinking(2025-03),Deep Think 正式 GA(2025-08):第三家主流厂商把「先想再答」做成默认形态。
第 1 章的命题是:CoT 给固定深度的模型补上了串行计算步——中间 token 是「借来的算力层」。本章只改了一件事:这段串行推理现在被 RL 直接优化进权重。模型在 RL 里反复试不同长度、不同走法的思考链,最终把「遇到难题就先展开一长段推理」固化成一种条件反射。所以推理模型不需要你写 exemplar 去诱发链条——诱发器已经在权重里了。第 1 章解释的是为什么多写 token 有用,本章解释的是这套机制怎么从 prompt 搬进了训练目标。
R1-Zero 证明「纯 RL、无 SFT 也能涌现推理」。如果推理链能从纯 RL 里自己长出来,那训练时给模型的奖励信号最低限度需要是什么?(提示:RL 要能区分「这次想对了」和「想错了」。)
展开(先停 10 秒)
最低限度只需要一个可自动判定对错的最终答案——数学题对不对、代码过不过测试、答案是否命中标准解。有了这种可验证的 reward,RL 就能把「导向正确答案的思考走法」加权、把「导向错误的」压低,链条本身无须人工标注。这也解释了为什么早期推理模型在数学、代码这类有客观对错的领域最先突飞猛进:那里的 reward 信号最干净。开放式写作这类没有唯一正解的任务,reward 难定,推理训练的收益也更含糊。
§4.2test-time / inference-time scaling:新 scaling 轴
正确率随「思考 token」增加而上升,是一条与预训练规模正交的新 scaling 轴——多想,可以买。
第 1 章把「推理期算力换可靠性」当作贯穿全教程的视角抛出来。2024–2025 这条视角被正式做成了可测量的 scaling 关系:固定模型权重不动,只增加推理时允许花的算力(让它想更久、采更多样、搜更宽),正确率单调爬升。这条曲线和「把模型练得更大」那条正交——它是另一根可以独立往上推的轴。
这条轴有三层值得讲清的含义:
- 它是可买的:同一个模型,给它更高的思考预算,就能解之前解不动的题。Claude 3.7 的 128K thinking 预算、o3 的 low/medium/high 档,都是把这根轴做成了开发者能拨的旋钮——为难题多付 token,为简单题省 token。
- 它会趋平:曲线尾部边际收益递减,且 token 是真金白银的成本与延迟。无脑拉满预算不是免费的;§4.3 会讲到,对足够简单的任务,多想甚至有害。
- 它正交于预训练:把模型练得更大、和让模型想得更久,是两件可以分别投入的事。这就是为什么 2024 年后业界把「test-time scaling」与「pre-training scaling」并列成两根轴——这正是第 1 章那句「推理期算力换可靠性」被发表、被训练进去的版本。
图 4.2 的曲线尾部趋平。如果一个客服 agent 的任务有 80% 是「查订单状态」这类一步就能答的简单问句,把推理预算从 medium 拉到 high,整体正确率与成本会怎么变?
展开
整体正确率几乎不动、成本和延迟显著上涨。简单问句本就落在曲线已经趋平的那一段——它们一步就对,多给的思考 token 买不到额外正确率,只是白烧。更糟的是 §4.3 要讲的 overthinking:拉高预算后,模型对「查订单」这种琐事也展开冗长推理,反而更慢、偶尔还把简单答案想拐了。正确做法是按问句难度分流预算,而不是一刀切拉满。
§4.3还要不要手写 CoT / ReAct?(面试高频)
对推理模型,手写 few-shot CoT 多余、甚至反噬;但工具编排、成本控制、可审计输出这些场景里,手写模式仍是应用架构。
2022 式直觉是「加了 CoT / ReAct 一定更好」。这个直觉在推理模型上翻车了,而很多人没更新。2025 中到 2026 的共识是:对已经把推理训进权重的模型,你再手写 few-shot CoT,等于在它训练好的内部链外面又硬塞一套显式样板,两者相撞。下面分「该退场」和「仍要手写」两面,各给证据。
证据:在推理模型上,手写 few-shot CoT 会掉分
- 5-shot 反而更差:给 o1-preview 套 5 个 few-shot CoT exemplar,正确率低于极简(zero-shot / 直给)prompt。OpenAI 与 PromptHub 等指南据此明确建议:推理模型上别堆 few-shot,最少的指令往往最好。
- 显式样板与内部链冲突:模型已有一套训练好的推理走法,你塞进去的 exemplar 把它往另一条(人写的)路上拽,两套链打架,结果不如让它自己走。
- 简单任务上 overthink:在 <3 步就能答的简单任务上,推理模型容易把问题想复杂(overthinking),反而不如普通(非推理)模型又快又对。
- 感知 / 隐式规律任务上 CoT 拉低正确率:在某些靠直觉模式识别、而非显式推导的任务上,强行展开 CoT 会损害前沿模型——有研究测到 o1-preview 在某个语法分类任务上因显式推理掉了约 −36%。把本该一眼看出的规律硬拆成步骤,反而把对的直觉推翻了。
但这些场景里,手写模式仍然重要
「手写 CoT 退场」不等于「前三章白学」。模式没死,只是搬了家。四类场景仍需要你手写:
- 非推理模型:GPT-4o 级、以及更小/本地的模型,没把推理训进权重,仍明显受益于显式 CoT 和 few-shot。第 1 章的技巧对它们照样管用。
- 工具编排:ReAct / ReWOO 这类「推理↔行动↔观察」的循环,是应用架构,哪怕每一步的内核换成推理模型,外层的工具往返循环还是你来搭。这正是第 2 章 ReAct 接地的去向——它从「prompt 模板」升格成了「编排骨架」。
- 成本 / 延迟控制:ReWOO 式「先一次性规划好全部步骤、再批量执行」能减少模型往返、压低 token 与延迟,在预算敏感的系统里仍有价值。
- 结构化 / 可审计输出:当你需要每一步都留下可检查、可回放的痕迹(合规、调试、人工复核),显式的步骤化编排比一段藏在权重里的内部链更可控。
CoT 作为手写 prompt 在退场,作为模型架构在称王。退场的是「用 exemplar 诱发推理」这件事;称王的是「推理本身」,它进了权重。
把这一节放进规划视角会更立体:推理模型如何吸收规划、test-time compute 如何替代一部分外部规划结构,是同一现象在「控制流」轴上的版本,详见 agent-planning · 前沿。工具往返那一步具体怎么落成真实的 tool_use 调用,见 tool-use。
同事把一个跑在 GPT-4o 上、带 5-shot CoT exemplar 的 prompt,原样换成 o3 调用,发现某些题正确率不升反降。在不改任务的前提下,第一个该动的是什么?
展开
先删掉那 5 个 few-shot CoT exemplar,改成 zero-shot 直给、最少指令。掉分的典型原因正是 §4.3 的头条证据:显式样板和 o3 训练好的内部链相撞。4o 需要样板来诱发推理,o3 不需要——把为 4o 写的诱发器留在 o3 上,是在帮倒忙。删完若仍不稳,再考虑按难度调推理档、或对简单题分流到更轻的模型防 overthink,而不是把样板加回去。
§4.4框架把模式表达成显式图
模式如今活在编排层、不在 prompt 里:LangGraph 把模式建成状态机,ReAct / Reflexion / plan-execute 变成「图的形状」。
§4.3 说工具编排循环留了下来。它留在哪?留在框架里。当推理本身进了权重,前三章那些模式不再以 prompt 模板的形态存在,而是以控制流图的形态存在:节点是一步、边是步与步之间的跳转、共享 state 在节点间流动。LangGraph 是这一形态的代表。
具体到 LangGraph 怎么把模式建成显式图:
- 节点 = 步骤:每个节点是一段可执行单元(调一次模型、调一次工具、做一次评估)。
- 条件边在带类型的共享 state 上跳转:边不是写死的顺序,而是读当前 state 决定下一步去哪——这就是 ReAct 的「想完看 observation 再决定下一步」落成代码的样子。
- checkpoint 保住中途失败:state 可在每一步落盘,中途崩了能从断点续跑,不必从头再来。
- 模式 = 图的形状:ReAct 是一个带条件回边的循环;plan-execute 是先 fork 出多步、再 join 汇总;Reflexion 是「失败→反思写入记忆→带记忆重试」的跨回合回路;复杂流程拆成子图。同一张图就把第 2 章的 ReAct、Reflexion 和 plan-execute 都表达了。
# 讲解用伪代码,未本地验证。
# 把 ReAct「推理→行动→观察」循环表达成一张显式状态图(LangGraph 风格)。
# 内核可以是推理模型;外层这张图——节点、条件边、state——是你手搭的编排,
# 不在 prompt 里。这正是 §4.3「ReAct 留作编排」的代码形态。
from typing import TypedDict, Literal
class State(TypedDict): # 带类型的共享 state,在节点间流动
question: str
scratch: list[str] # 累积的 thought / observation
answer: str | None
def reason(state: State) -> State:
# 调用(内核可换成推理模型):产出下一步是调工具还是直接收尾
step = llm_decide_next(state["question"], state["scratch"])
state["scratch"].append(step.thought)
state["_route"] = step.kind # "act" 或 "finish"
state["_pending_tool"] = step.tool_call
return state
def act(state: State) -> State:
obs = run_tool(state["_pending_tool"]) # 接地:真实工具的真实返回
state["scratch"].append(f"observation: {obs}")
return state
def route(state: State) -> Literal["act", "finish"]:
return state["_route"] # 条件边:读 state 决定下一步去哪
# graph:reason → (条件边) → act → 回到 reason,直到 finish
graph = StateGraph(State)
graph.add_node("reason", reason)
graph.add_node("act", act)
graph.set_entry_point("reason")
graph.add_conditional_edges("reason", route, {"act": "act", "finish": "__end__"})
graph.add_edge("act", "reason") # 这条回边 = ReAct 的循环
app = graph.compile(checkpointer=...) # checkpoint:中途失败可从断点续跑
LangChain 1.0(2025-10) 弃用了旧的 create_react_agent,改为 create_agent + middleware:把 ReAct 这类循环做成可插拔的中间件层,进一步坐实「模式活在编排层、不在 prompt 里」。这与 agent-planning · 前沿 记的框架弃用是同一桩事。
同样把模式表达成图,为什么 ReAct 的图里一定有一条「act → reason」的回边,而 plan-execute 的图里主干却更接近一条「先 fork 多步、再 join」的无回边结构?
展开
因为两者的接地时机不同。ReAct 是交错式接地——每行动一步、拿到一个真实 observation,就得回去重新推理「下一步基于这个新事实该怎么走」,所以必须有回边把 observation 喂回 reason。plan-execute 是前置式规划——先一次性把步骤排好,再批量执行,执行阶段不依赖「看一步改一步」,主干自然是 fork/join 而非循环。回边的有无,正是第 2 章「交错 vs 前置」之分落在图结构上的痕迹。
§回看前三章:每个模式的命运
本章不推翻前三章,而是给它们各自的去向盖章。把三章的核心模式放进推理模型时代,命运各不相同:
| 来自 | 模式 / 论点 | 在推理模型时代的命运 |
|---|---|---|
| 第 1 章 | CoT=给固定深度模型补「串行计算深度」 | 进权重。同一段串行推理被 RL 训进权重;机制不变,触发方式从「你写 exemplar」变成「模型自带」。手写 few-shot CoT 在推理模型上退场。 |
| 第 2 章 | ReAct=把每步推理钉在外部 observation 上(接地) | 留作编排。接地这件事权重补不了——内部链再长也不接触外部世界。ReAct 从 prompt 模板升格成框架里的编排骨架(图的循环)。 |
| 第 3 章 | ToT / 外部树搜索=在外面显式生成-评估-回溯 | 价值收缩。模型内部自己就在搜(长链里隐式地试不同走法、回溯),外挂一层显式树搜索的边际收益变小;通用规划器场景已降级,留给少数需要可控、可审计搜索的场合。 |
一句话收口这张表:能被一段内部链替代的,进了权重(CoT、ToT 式内部搜索);不能被替代的,留在了外面(接地、工具往返、真正的并行)。这条分界线,就是判断「某个手写模式在推理模型上还活不活」的通用判据。
§本章 self-check
先合上教程,把答案写在纸上或编辑器里。写完再点开对照——直接点开等于把这一节再读一遍。
- 用一句话说清:从 o1(2024-09)到 DeepSeek-R1(2025-01),CoT 在「谁来负责诱发那段中间推理」这件事上发生了什么变化?R1-Zero 又额外证明了什么?
- test-time scaling 为什么被称作「与预训练规模正交的新轴」?这根轴尾部「趋平」对一个 80% 是简单问句的客服 agent 意味着什么实操结论?
- 给出一条证据说明「在推理模型上手写 few-shot CoT 会掉分」,并说清其机制(为什么样板和内部链会相撞)。
- (设计层)你要做一个用 o3 的客服 agent:需要查订单系统、发起退款、并对每一步留可审计痕迹。前三章你学过 CoT few-shot、Self-Consistency、ReAct、Plan-and-Execute、ToT。哪些保留为手写模式、哪些去掉交给权重?逐个说明理由。
答案(先做完再展开)
- 诱发者从你变成了模型自己:o1 起,那段中间推理由 RL 训进权重、出厂自带,不再靠你写 "step by step" 或 few-shot exemplar 去诱发。R1-Zero 额外证明:推理链能从纯 RL、无 SFT中涌现——不喂任何人工推理范例,模型也能自己长出 CoT。
- 因为「把模型练更大(预训练)」和「让模型想更久(推理时)」是两件可分别独立投入的事,固定权重只加推理算力,正确率也单调上升,所以是两根正交的轴。尾部趋平的实操结论:简单问句落在曲线已平的那段,拉高思考预算买不到正确率、只增成本与延迟,还会触发 overthink——应按难度分流预算,而非一刀切拉满。
- 证据:给 o1-preview 套 5-shot CoT,正确率低于极简 prompt(另:o1-preview 在某语法分类任务上因显式 CoT 掉约 −36%)。机制:模型已有一套训练好的内部推理走法,你塞进去的显式 exemplar 把它往人写的另一条路上拽,两套链相撞,结果不如让它自己走。
- 保留:ReAct(工具编排)——查订单 / 发退款是真实工具往返,必须外层手搭循环来接地,权重补不了;Plan-and-Execute / 显式步骤化——「每步留可审计痕迹」要的就是结构化、可回放的步骤,比藏在权重里的内部链可控。去掉:手写 few-shot CoT——o3 自带推理,样板只会相撞掉分,改 zero-shot 直给;Self-Consistency——成本高、且 o3 内部已在做隐式搜索,一般不必再外挂多采样投票(除非个别高价值难题);ToT 外部树搜索——模型内部已隐式搜,外挂通用树搜索边际收益小,去掉。一句话判据:接地 / 可审计 / 真并行的留外面,纯推理的交权重。
设计一个实验,验证 few-shot CoT 在某推理模型上是否真的掉分
别只引用「o1-preview 5-shot 更差」这个结论,自己设计一个能复现或证伪它的实验。至少写清:(1) 选哪个推理模型、对照哪个非推理模型;(2) 任务集怎么选——要覆盖「简单(<3 步)」「多步推理」「感知 / 隐式规律」三类,为什么这三类缺一不可;(3) 三个对照臂(zero-shot 直给 / 3-shot CoT / 5-shot CoT)怎么控制变量;(4) 用什么指标、怎么判定「掉分」在统计上成立而非噪声;(5) 你预期在哪一类任务上掉分最狠,为什么。
提示(卡住再展开)
关键设计点:任务集必须按难度分层报告,否则简单任务的 overthrink 掉分会和感知任务的 CoT 掉分混在一起、互相掩盖——这正是为什么三类缺一不可。控制变量上,三臂之间只动「few-shot 例子的数量与是否含显式推理」,task、温度、推理预算档全部锁死。判定「掉分」要跑足样本量并配显著性检验(如配对比较 + 置信区间),避免把采样噪声当效应。预期掉分最狠处:感知 / 隐式规律类——因为这类任务本该靠一眼识别的直觉,强行展开 CoT 会把对的直觉推翻(对应正文 −36% 那类现象),比单纯 overthinking 更伤。