AI 的“推理效果”到底是怎么实现的?从 CoT、ReAct 到流式思考过程
如果你用过现在比较新的 AI 产品,应该都见过这样的效果。
你问:
小明有 10 个苹果,送给小红 3 个,
又买了 5 个,现在有多少个?
AI 不会马上甩给你一句:
12 个。
而是先出现:
正在思考……
然后可能看到:
分析题目中的数量变化……
初始有 10 个苹果,
送出 3 个后剩余 7 个,
之后又买了 5 个……
最后再显示:
最终答案:12 个苹果。
这种效果我们一般会称为:
Reasoning,也就是大模型推理。
但是这里有一个特别容易搞混的问题:
页面上看到的“思考过程”,和模型内部真正发生的推理,并不一定是同一个东西。
所以这一篇我们不讨论某一个具体模型怎么接入,而是把 AI 的“推理效果”从原理到工程实现完整讲明白。
一、先搞明白:什么叫大模型推理?
最普通的大模型回答问题,可以简单理解成:
问题
↓
大模型
↓
答案
例如:
用户:
1 + 1 等于多少?
模型:
2
这种任务非常简单,模型几乎可以直接得到答案。
但如果问题变成:
一个商品原价 800 元,
先涨价 20%,
然后在涨价后的基础上打八折,
最终价格是多少?
模型就需要处理多个步骤。
可以把解决过程抽象成:
理解问题
↓
拆解问题
↓
计算中间结果
↓
检查结果
↓
得到最终答案
这就是我们常说的:
Reasoning
也就是:
模型不是直接输出结果,而是在得到结果之前进行一定程度的多步骤计算、规划、搜索、验证或反思。
早期大语言模型主要通过 Prompt 引导产生这种能力;后来越来越多模型直接在训练阶段强化推理能力,让模型在回答之前拥有专门的推理计算过程。
二、最经典的推理方式:Chain of Thought
说到大模型推理,第一个绕不开的概念就是:
Chain of Thought
简称:
CoT
中文通常叫:
思维链 / 思维链推理。
它的核心思想非常简单:
不要让模型一步跳到答案,而是把复杂问题拆成多个中间步骤。
经典的 Chain-of-Thought 工作表明,让模型生成中间推理步骤能够显著改善一些算术、常识和符号推理任务的表现。(arXiv )
例如普通回答可能是:
问题:
小明有 10 个苹果,
送出去 3 个,
然后又买了 5 个,
现在有多少个?
答案:
12 个。
加入 CoT 以后:
第一步:
小明原来有 10 个苹果。
第二步:
送出去 3 个。
10 - 3 = 7
第三步:
又买了 5 个。
7 + 5 = 12
最终答案:
12 个。
整个过程变成:
问题
↓
步骤 1
↓
步骤 2
↓
步骤 3
↓
最终答案
这就是最基础的推理。
三、为什么“多想几步”可能会更准确?
因为复杂问题经常不是:
问题 → 答案
这么简单。
而是:
问题
↓
子问题 A
↓
子问题 B
↓
子问题 C
↓
答案
例如让 AI 编写一个登录系统。
如果直接让模型:
给我写一个登录系统
模型很可能想到哪里写到哪里。
而一个更合理的推理过程可能是:
分析需求
↓
设计用户表
↓
设计登录接口
↓
密码校验
↓
Token 生成
↓
权限验证
↓
异常处理
↓
最终代码
当模型能够先规划、再执行时,在复杂任务上的表现通常会更加稳定。
这也是为什么现在很多推理模型会花更多计算量在回答之前。
四、市面上常见的大模型推理方法
现在大模型领域里的“推理”,已经远远不只有 CoT。
常见思路可以这样理解:
| 方法 | 核心思想 | 适合场景 |
|---|---|---|
| CoT | 一步一步推理 | 数学、逻辑、代码 |
| Self-Consistency | 多想几种答案,再投票 | 数学、推理题 |
| ReAct | 一边思考,一边使用工具 | Agent、搜索、查数据库 |
| ToT | 同时探索多条推理路线 | 规划、复杂决策 |
| Self-Refine | 回头检查并修改自己的答案 | 写作、代码、复杂任务 |
| Verifier | 单独验证推理步骤或答案 | 数学、代码、安全场景 |
| Tool-Augmented Reasoning | 使用搜索、代码、数据库辅助推理 | 实际业务 AI |
| Test-Time Compute | 给模型更多推理计算量 | 高难度问题 |
下面分别看看。
五、Self-Consistency:一次想不准,那就多想几次
普通 CoT:
问题
↓
一条推理路线
↓
答案
但有一个问题。
如果:
第二步想错了
那么后面很可能全部错。
所以有人提出一个很直观的办法:
同一个问题,让模型走多条不同的推理路线。
例如:
→ 推理路线 A → 42
问题 → → 推理路线 B → 42
→ 推理路线 C → 39
→ 推理路线 D → 42
最终:
42 出现 3 次
39 出现 1 次
选择:
42
这种方法叫:
Self-Consistency
它不是简单使用贪心生成的一条推理路径,而是采样多个推理路径,再选择最一致的答案。原始论文在多个数学和常识推理基准上观察到了明显提升。(arXiv )
简单理解:
一个 AI 想一次
升级成:
让 AI 想好几遍
↓
比较结果
↓
选最靠谱的
当然代价也很明显:
请求次数 ↑
Token ↑
延迟 ↑
成本 ↑
所以一般用于:
复杂数学
高价值决策
代码验证
高难度推理
而不会拿它回答:
你好
这种简单问题。
六、ReAct:一边思考,一边行动
如果你准备学习 AI Agent,那么:
ReAct
是一个非常重要的概念。
它的名字来自:
Reasoning + Acting
也就是:
推理 + 行动
ReAct 的核心不是:
想完以后再干活
而是:
想一下
↓
做一个动作
↓
看看结果
↓
再想一下
↓
再行动
ReAct 论文把 reasoning 与 action 交错起来,让模型能够根据工具或环境返回的信息不断更新计划。(arXiv )
例如用户问:
今天北京天气怎么样?
适不适合跑步?
模型自己并不知道今天的实时天气。
于是整个过程可能变成:
用户问题
↓
需要知道北京实时天气
↓
调用天气 API
↓
得到:
22℃,小雨,空气质量良好
↓
重新分析
↓
有降雨,不太适合户外跑步
↓
最终回答
这就是:
Reason
↓
Action
↓
Observation
↓
Reason
↓
Action
以后我们做:
Agent
MCP
Function Calling
搜索 Agent
数据库 Agent
自动化 Agent
本质上大量都会用到这种思想。
七、Tree of Thoughts:不要只想一条路
CoT 基本是一条直线:
A
↓
B
↓
C
↓
D
但是现实中的复杂问题,可能有很多解决路线。
例如:
怎么从上海去北京?
我们可以考虑:
→ 高铁
→ 飞机
问题 → → 开车
→ 夜间卧铺
然后再分别评估:
时间
费用
舒适度
天气
距离
这就形成了一棵树。
所以出现了:
Tree of Thoughts
简称:
ToT
ToT 不再局限于单一路径,而允许模型探索多个候选“thought”,评估它们,并在需要时继续搜索或者回退。(arXiv )
简单理解:
路线 A
↗
问题 → 路线 B
↘
路线 C
模型会:
生成候选方案
↓
评估候选方案
↓
淘汰差方案
↓
继续展开好方案
↓
得到答案
这种方式尤其适合:
复杂规划
解谜
策略问题
代码架构
多方案决策
当然代价也非常明显:
很烧 Token。
所以真实项目一般不会所有问题都使用 ToT。
八、Self-Refine:让 AI 自己检查 AI
还有一种非常容易理解的方式:
Self-Refine
也就是:
先回答,再检查,再修改。
流程类似:
问题
↓
第一次回答
↓
检查答案
↓
发现问题
↓
修改答案
↓
再次检查
↓
最终答案
Self-Refine 的研究思路就是让模型生成初始结果,然后产生反馈,再依据反馈反复改进,不一定需要额外训练另一个模型。(arXiv )
例如让 AI 写代码。
第一次:
生成代码
然后再让它检查:
有没有空指针?
有没有并发问题?
有没有 SQL 注入?
有没有资源泄漏?
发现:
可能存在空指针异常
于是:
重新修改代码
最终再输出。
这种方式在实际开发中非常常见。
九、Verifier:一个负责做题,一个负责检查
Self-Refine 是:
自己检查自己
还可以进一步:
一个模型负责生成答案
另一个模型负责检查答案
例如:
问题
↓
Generator
↓
候选答案
↓
Verifier
↓
正确?
↓
否
↓
重新生成
这种思想在数学、代码生成和高可靠任务中非常常见。
研究中也有专门针对“最终结果监督”和“中间步骤监督”的比较;例如 process supervision 会对中间步骤进行反馈,而不仅仅判断最后答案对不对。(arXiv )
简单理解:
一个学生做题
+
一个老师批改
肯定比:
学生写完直接交卷
更加稳。
十、Tool Reasoning:现在真正实用的一种推理
现代 AI 真正强大的地方,越来越不是:
模型知道一切
而是:
模型知道什么时候需要工具
例如用户说:
帮我分析今天苹果公司的股票表现。
模型本身的训练数据不一定包含今天的数据。
于是:
分析问题
↓
需要实时行情
↓
调用股票 API
↓
得到价格
↓
需要相关新闻
↓
调用搜索
↓
获得新闻
↓
综合分析
↓
最终回答
这种方式其实就是:
LLM
+
工具
+
推理
也是现代 Agent 最核心的一种模式。
十一、现在的“Reasoning Model”又是什么?
前面很多技术,本质上属于:
Prompt Engineering
例如告诉普通模型:
请一步一步分析问题
但现在越来越多模型会在训练阶段专门针对推理任务进行强化。
于是出现了:
Reasoning Model
可以简单理解成:
模型本身就被训练成在回答复杂问题之前投入额外计算进行推理。
此时:
用户问题
↓
模型内部进行推理计算
↓
得到答案
开发者甚至不一定需要写:
请一步一步思考
模型自己就知道:
这个问题比较难
需要多想一会
一些现代 API 甚至允许控制:
reasoning effort
也就是:
少想一点
普通思考
多想一点
更多推理计算一般意味着:
质量可能提高
同时:
延迟增加
计算量增加
Token / 成本增加
现在主流模型厂商都在往“根据问题复杂度动态决定推理量”的方向发展。例如 Anthropic 当前文档描述了 adaptive thinking,由模型结合任务复杂度与 effort 来决定需要多少思考;OpenAI 的 API 也提供 reasoning effort 一类控制方式。(Claude Platform Docs )
十二、一个特别重要的区别:推理 ≠ 把内部思维全部展示出来
这个地方很容易被误解。
很多人看到:
正在思考……
就认为:
页面上出现的文字,就是模型脑子里真正完整的内部推理。
实际上并不一定。
现代 AI 系统通常可以分成:
模型内部推理
↓
可公开的推理摘要
↓
最终回答
也就是说:
内部 Chain of Thought
和:
用户看到的 Reasoning
可能不是同一个东西。
例如 OpenAI 明确说明,其原始 chain-of-thought 不直接展示给用户,同时 API 可以提供 reasoning summary,用自然语言概括模型推理中的有用信息。(OpenAI )
所以工程设计中更推荐展示:
正在分析问题……
已确定需要查询订单信息……
正在检查计算结果……
根据查询结果,结论如下……
而不是强行要求:
把你脑子里面每一个 Token 的内部思维全部打印出来
这两件事是完全不同的。
十三、因此,一个成熟的“推理效果”应该有三层
我们在开发 AI 产品时,可以把整个系统分成三层:
第一层:模型推理层
↓
第二层:后端事件层
↓
第三层:前端展示层
模型层负责:
思考
规划
工具调用
验证
生成答案
后端不要直接把各种厂商不同的格式扔给前端。
而是统一转换成:
reasoning
action
observation
answer
done
最终前端只负责:
reasoning → 显示“思考过程”
action → 显示“正在调用工具”
answer → 显示正式回答
done → 结束动画
这样架构会干净很多。
十四、设计一个统一的推理事件
例如在 Spring Boot 中,可以定义:
public record AiStreamEvent(
String type,
String content
) {
}
我们规定几个类型:
reasoning
answer
action
observation
done
例如后端可能流式返回:
{
"type": "reasoning",
"content": "正在分析用户的问题"
}
然后:
{
"type": "action",
"content": "正在查询天气信息"
}
然后:
{
"type": "observation",
"content": "北京今天有小雨"
}
最后:
{
"type": "answer",
"content": "今天有小雨,不太建议进行长时间户外跑步。"
}
最终:
{
"type": "done",
"content": ""
}
这样前端根本不用知道:
OpenAI
DeepSeek
Claude
Gemini
Qwen
后端用的到底是哪一家模型。
前端只认识:
AiStreamEvent
这才是比较合理的工程设计。
十五、为什么推荐 SSE,而不是直接返回 HTML?
很多简单 Demo 喜欢直接返回:
<br>
<hr>
当然能用。
但正式项目不推荐这样设计。
例如后端返回:
思考内容<br>
思考内容<br>
<hr>
最终答案
实际上把:
数据
和:
页面展示
绑死了。
更加推荐:
后端负责返回数据
前端负责决定怎么展示
例如:
SSE
↓
JSON Event
↓
Vue / React
↓
页面渲染
后端:
{
"type": "reasoning",
"content": "正在分析问题"
}
Vue 决定:
灰色字体
折叠区域
而:
{
"type": "answer",
"content": "最终答案"
}
Vue 决定:
正常 Markdown
这样以后想改 UI,根本不需要修改 Java 后端。
十六、最终页面可以怎么设计?
一个现在比较常见的 AI 页面,可以设计成:
用户:
帮我分析一下 Redis 为什么这么快?
AI:
▶ 已思考 3 秒
正在分析 Redis 的数据存储方式……
正在比较内存访问和磁盘访问……
正在整理单线程事件循环的影响……
--------------------------------
Redis 快主要有几个原因:
1. 数据主要存储在内存
2. 高效的数据结构
3. IO 多路复用
4. 避免大量线程上下文切换
……
还可以默认把推理区域折叠:
▶ 查看思考过程
用户真正关心的仍然是:
最终答案
需要的时候再展开:
推理摘要
体验会更好。
十七、如果模型本身没有 Reasoning 能力怎么办?
依然可以实现类似体验。
可以让普通模型生成:
公开分析摘要
+
最终答案
例如 System Prompt 规定输出协议:
请对问题进行分析。
你需要返回两部分:
<reasoning>
这里输出简短、可公开的分析摘要,
只包含解决问题所需要的关键步骤。
</reasoning>
<answer>
这里输出最终回答。
</answer>
模型可能返回:
<reasoning>
这个问题主要需要比较 Redis 的存储位置、
数据结构以及网络模型。
</reasoning>
<answer>
Redis 性能高主要有以下几个原因……
</answer>
后端解析:
<reasoning>
转换成:
type = reasoning
解析:
<answer>
转换成:
type = answer
于是一样可以做出:
思考区域
+
最终答案
不过一定要搞清楚:
这属于模型生成的“解释过程”,并不代表你拿到了模型完整的内部 Chain of Thought。
这个区别在真正做产品时非常重要。
十八、推理效果真正难的地方其实不是 UI
前端显示:
正在思考……
其实非常简单。
真正困难的是:
什么时候应该推理?
应该推理多久?
什么时候需要调用工具?
什么时候需要重新规划?
什么时候应该验证答案?
什么时候应该停止?
这才是现代 AI Agent 真正研究的问题。
一个成熟系统可能是:
用户问题
↓
判断任务复杂度
↓
简单任务?
├── 是 → 直接回答
│
└── 否
↓
生成计划
↓
是否需要工具?
├── 是 → 调用工具
│ ↓
│ 获取结果
│ ↓
│ 重新推理
│
└── 否
↓
继续推理
↓
验证答案
↓
最终回答
这时候 AI 已经从:
ChatBot
逐渐变成:
Agent
十九、从 ChatBot 到 Agent,本质上发生了什么?
最简单的聊天机器人:
Prompt
↓
LLM
↓
Answer
加入推理:
Prompt
↓
Reasoning
↓
Answer
加入工具:
Prompt
↓
Reasoning
↓
Tool
↓
Reasoning
↓
Answer
加入记忆:
Memory
↓
Prompt
↓
Reasoning
↓
Tool
↓
Reasoning
↓
Answer
↓
Memory
再加入规划和循环:
用户目标
↓
Planner
↓
Reasoning
↓
Action
↓
Observation
↓
Reasoning
↓
是否完成?
↙ ↘
否 是
↓ ↓
继续 Final Answer
到这里,实际上就已经进入:
AI Agent
的世界了。
二十、把整个“推理效果”串起来
最终,一个比较完整的 AI 推理系统可以理解成:
用户提出问题
↓
判断问题复杂度
↓
选择推理策略
↓
┌───────────────────┐
│ CoT │
│ Self-Consistency │
│ ReAct │
│ ToT │
│ Self-Refine │
│ Tool Reasoning │
└───────────────────┘
↓
模型进行推理
↓
必要时调用工具
↓
获得外部信息
↓
重新推理
↓
验证结果
↓
生成可公开推理摘要
↓
SSE 流式返回
↓
前端显示“正在思考”
↓
显示推理摘要
↓
显示最终答案
这样再来看所谓的:
AI 推理效果
就会发现,它绝对不只是:
getReasoningContent()
这么简单。
真正完整的推理包含三个部分:
模型怎么思考
↓
后端怎么组织推理事件
↓
前端怎么展示推理状态
这三个部分组合起来,才形成我们现在看到的:
“AI 思考了一会,然后给出了答案”的完整产品体验。
二十一、最后总结
学习 AI 推理时,可以先记住这样一条演化路线:
普通生成
↓
Chain of Thought
↓
Self-Consistency
↓
Tree of Thoughts
↓
Self-Refine
↓
ReAct
↓
Tool Calling
↓
Reasoning Model
↓
Agent
其中:
CoT
解决的是:
让模型分步骤思考
Self-Consistency 解决:
多想几次,减少单一路径错误
ToT 解决:
同时探索多种方案
Self-Refine 解决:
自己检查和修改
ReAct 解决:
一边推理,一边使用工具
而现代 Reasoning Model 更进一步:
推理能力直接进入模型训练和推理阶段
最终再配合:
SSE
+
结构化事件
+
Vue / React
我们就可以实现用户真正看到的:
正在思考……
↓
正在分析问题……
↓
正在调用工具……
↓
正在验证结果……
↓
思考完成
↓
最终答案
所以,“推理效果”真正值得学习的,并不是某一家模型返回了哪个字段。
而是理解:
大模型如何把复杂任务拆开、探索、行动、验证,再由工程系统把这些过程组织成用户能够理解的交互体验。
理解这一层以后,后面继续学习:
ChatMemory
RAG
Function Calling
MCP
ReAct Agent
Multi-Agent
Agent Workflow
就会发现,它们其实都在围绕同一件事情展开:
让 AI 不再只是“回答一句话”,而是能够真正地分析问题、执行任务,并最终解决问题。