乐于分享
好东西不私藏

跟我学 AI Agent : 第 16 课 — Reasoning Techniques:让Agent学会深度思考

跟我学 AI Agent : 第 16 课 — Reasoning Techniques:让Agent学会深度思考

模块: 模块六:高级工程实践 | 难度: ⭐⭐⭐ | 预计时长: 2.5 小时参考: Agentic Design Patterns: A Hands-On Guide to Building Intelligent Systemspi-mono API: thinkingLevel, thinkingBudgets


🧠 "给模型更多的思考时间,有时比用更大的模型更有效。"

开篇故事:两个候选人

你正在面试,问了一个复杂问题:"一个城市要减少交通拥堵,应该怎么做?"

候选人 A 立刻回答:"多修路、限号、发展公共交通。"——快速但浅薄。

候选人 B 说:"让我想想……首先分析拥堵的根因——是通勤集中、道路设计、还是公共交通不足?如果是通勤集中,可以考虑错峰上班、远程办公;如果是道路设计,看瓶颈点在哪里。然后看成功案例:伦敦收拥堵费减少了 15% 车流,东京靠铁路网实现了 70% 通勤率。最后要考虑副作用——限号可能促使家庭买第二辆车……"——慢但深入、系统、可追溯。

Agent 也一样。

一个直接给答案的 Agent 就像候选人 A——快但不可靠。一个能"思考"的 Agent 就像候选人 B——虽然多花了几秒钟,但答案的质量、透明度和可信度都高得多。

这一课专门讲的就是:如何让 Agent "思考"

💡 核心问题: 如何让 Agent 从"直觉反应"升级为"深度思考"?


推理扩展定律

在讲具体技术之前,先理解一个关键洞察:

一个较小的模型,在推理时获得更多的"思考预算",有时可以超越一个更大但使用简单推理策略的模型。

这就是推理扩展定律(Scaling Inference Law)。核心思路是:

不是用更大的模型,而是给模型更多"思考时间"传统模式:  用户提问 → 模型直接生成答案(一次通过)  特点: 快速、直觉式、不可审计推理增强模式:  用户提问 → 模型分解问题 → 逐步推理 → 探索多个方向 → 自我修正 → 最终答案  特点: 较慢、可审计、更准确

直觉理解:你让一个高中生用 2 小时做一道题,可能比一个大学生用 5 分钟做同一道题做得更好。


七大推理技术概览

从简单到复杂,有七个层级的推理技术:

层级
技术
核心思路
适用场景
基础
CoT
 (Chain-of-Thought)
一步一步想
数学、多步推理
基础
Self-Correction
自己审查、迭代改进
写作、代码生成
基础
PALM
 (Program-Aided)
让模型生成代码来计算
精确计算、数据处理
高级
ToT
 (Tree-of-Thought)
探索多条推理路径
战略规划、方案比较
高级
ReAct
 (Reasoning + Acting)
边思考边行动
信息检索、实时任务
协作
CoD/GoD
 (Chain/Graph of Debates)
多模型辩论
法律分析、争议性问题
深度
RLVR
 (强化学习推理)
自适应推理深度
o1/o3 类推理模型

实际开发中最常用的是三个:CoT、ReAct、ToT。下面重点讲这三个,其他的在后面用一张表带过。


CoT:思维链——让推理过程可见

什么是 CoT

CoT 的核心思想极其简单:不让模型直接给答案,而是先展示推理过程

没有 CoT:  用户: "商店打8折后是120元,原价是多少?"  模型: "150元"  ← 可能对,但看不到过程
有 CoT:  用户: "商店打8折后是120元,原价是多少?"  模型的思考过程:    Thought 1: 打8折意味着价格 × 0.8    Thought 2: 所以 原价 × 0.8 = 120    Thought 3: 原价 = 120 ÷ 0.8    Thought 4: 120 ÷ 0.8 = 150  最终答案: "原价是150元"

CoT 有两种实现方式:

方式
怎么做
效果
Few-shot CoT
在 Prompt 里给几个"思考示例"
效果好,但需要准备示例
Zero-shot CoT
只加一句 "Let's think step by step"
效果也不错,零成本

怎么用

不需要从零实现框架。在 pi-mono 中,只需要在 system prompt 里要求模型按格式输出:

const systemPrompt = `你是一个推理助手。回答问题时必须先展示思考过程。按以下格式输出:  Thought 1: [第一步推理]  Thought 2: [第二步推理]  ...  Final Answer: [最终答案]`;// 然后正常调用 Agentconst result = await agent.prompt("农场有鸡和兔共35只,脚共94只。鸡兔各多少?");

模型会自动按格式输出推理过程。

CoT 的价值

不只是"更准确"。更大的价值是可审计——你可以看到模型是怎么得出结论的。如果推理过程中某一步出错了,你能精确定位问题所在。


ReAct:推理与行动的交织

CoT 是 Agent 的"内心独白"——纯思考,不与外界交互。但很多时候 Agent 需要边思考边行动,这就是 ReAct。

什么是 ReAct

ReAct 的核心是一个循环:Thought → Action → Observation

用户: "北京和上海明天哪个更适合户外活动?"Thought: 用户想知道两个城市的天气对比。我应该分别查询。Action: 调用 get_weather("北京")Observation: "北京明天28°C,晴,AQI 65"Thought: 拿到了北京的数据。现在查上海。Action: 调用 get_weather("上海")Observation: "上海明天24°C,多云转阴,AQI 80"Thought: 对比两个城市的数据:  北京: 28°C 晴天 空气好  上海: 24°C 多云 空气一般  结论: 北京更适合户外活动Answer: 明天北京更适合户外活动——28°C晴天且空气质量良好...

ReAct vs 纯 CoT 的关键区别

用一个实际例子对比:

场景: "2024年诺贝尔物理学奖得主是谁?"纯 CoT:  Thought: 我需要回忆2024年诺贝尔物理学奖  Thought: 根据我的知识(可能过时),我猜测...  Thought: 答案是John Hopfield和Geoffrey Hinton  问题: 如果模型知识截止日期不对,可能编造答案 ❌ReAct:  Thought: 我需要搜索2024年诺贝尔物理学奖的最新信息  Action: search("2024 Nobel Prize Physics winner")  Observation: "John Hopfield and Geoffrey Hinton..."  Thought: 找到了,信息可靠  Answer: 2024年诺贝尔物理学奖授予...  优势: 通过工具获取实时信息,答案可靠 ✅

ReAct = CoT + 工具调用。 模型不再只靠自己"想",而是能主动去"查"。

在实际中使用

ReAct 是 Agent 最核心的操作模式。大多数 Agent 框架(包括 pi-mono)默认就用 ReAct 模式:

// pi-mono 中的 ReAct 模式(概念示意)const agent = newAgent({modelgetModel("claude-sonnet"),systemPrompt"你是一个智能助手,可以使用工具来回答问题。",tools: [searchTool, weatherTool, calculatorTool],});// Agent 会自动进入 Thought → Action → Observation 循环const result = await agent.prompt("帮我比较北京和上海明天的天气");

框架会自动处理循环逻辑。你需要做的是:定义好工具写好 system prompt设好 maxIterations(防止无限循环)。


ToT:思维树——探索多条路径

CoT 的问题

CoT 是线性的:一条路走到黑。如果中间某一步走错了,后面全错。

CoT(线性推理):  问题 → 思考A → 思考B → 思考C → 答案  (如果思考A错了,B和C也跟着错)

ToT 的解法

ToT(Tree-of-Thought)允许模型同时探索多条推理路径,评估每条路的质量,剪掉差的,选择好的。

ToT(树状推理):  问题    ├── 思路1: 假设X成立    │     ├── 验证X → 结论A ✅ (评分: 0.9)    │     └── 反例 → 矛盾 ❌ (回溯)    ├── 思路2: 假设Y成立    │     ├── 验证Y → 结论B ✅ (评分: 0.7)    │     └── 扩展 → 结论C ✅ (评分: 0.85)    └── 思路3: 假设Z成立          └── Z不成立 ❌ (剪枝)  最终选择评分最高的路径: 结论A

ToT 的四个核心操作:

操作
做什么
生成
从当前状态生成多个可能的下一步
评估
对每个候选步骤打分(0-1)
搜索
BFS(广度优先,全面探索)或 DFS(深度优先,快速验证)
回溯
当前路径分数太低时,返回上一个分支点

什么时候用 ToT

ToT 的代价是更多的 LLM 调用(每个分支点都要生成+评估)。所以只在以下场景使用:

  • • 方案比较:需要在多个方案中选择最优的
  • • 战略规划:需要考虑不同策略的后果
  • • 复杂推理:不存在唯一正确路径的问题

简单问题用 CoT 就够了,别过度设计。


对比实验:同一个问题,不同策略

用一个真实问题,看看不同推理策略的差异:

问题: "一家咖啡店月营收 5 万,租金 1.5 万,人力成本 1.2 万,材料成本是营收的 30%。它盈利吗?月利润多少?如何将月利润提升到 1 万?"

策略 1:直接回答(无推理)

Agent: 咖啡店是盈利的。月利润大约5000元。要提高利润,可以考虑增加客流量、提高客单价、降低材料成本。

❌ 计算错误,建议泛泛

策略 2:CoT(思维链)

Agent:Thought 1: 先计算各项成本  营收: 50,000  租金: 15,000  人力: 12,000  材料: 50,000 × 30% = 15,000Thought 2: 计算总成本和利润  总成本 = 15,000 + 12,000 + 15,000 = 42,000  利润 = 50,000 - 42,000 = 8,000Thought 3: 距离目标1万还差2,000Thought 4: 提升方案:  方案A: 提价10% → 营收55,000, 材料成本+1,500 → 利润 = 55,000-42,000-1,500 = 11,500 ✅  方案B: 降低材料成本到25% → 节省2,500 → 利润 = 8,000+2,500 = 10,500 ✅  方案C: 增加营收到57,143 → 材料增加2,143 → 利润 = 57,143-42,000-2,143 = 10,000 ✅Answer: 盈利。月利润8000元。建议方案B(降低材料成本到25%)最可行。

✅ 计算准确,有方案对比

策略 3:ReAct(推理+工具)

Agent:Thought: 需要精确计算,我调用计算器Action: calculator("50000 - 15000 - 12000 - 50000*0.3")Observation: 8000Thought: 月利润8000,距目标差2000。查一下行业平均数据Action: search("咖啡店行业平均材料成本占比")Observation: 行业平均材料成本占比25-35%Thought: 当前30%在正常范围,降到25%可行Action: calculator("50000 - 15000 - 12000 - 50000*0.25")Observation: 10500Thought: 超过目标了。确认方案可行Answer: 月利润8000元,盈利。建议将材料成本从30%降至25%,月利润可达10500元。可通过优化采购渠道、减少损耗实现。

✅ 用工具确保计算准确,查行业数据增加说服力

对比总结

策略
计算准确
建议质量
耗时
Token 消耗
适用场景
直接回答
泛泛
0.5s
~200
简单闲聊
CoT
有方案对比
1.5s
~500
多步推理
ReAct
有行业数据支撑
3s
~800
需要精确计算和实时信息

其他推理技术速览

除了 CoT、ReAct、ToT,还有几个值得了解的技术:

技术
核心思路
什么时候用
Self-Correction
Agent 先生成初稿,再自我审查并迭代改进
写作、代码生成(已在 L07 Reflection 讲过)
PALM
让 LLM 生成代码来计算,而非直接猜答案
数学计算、数据处理(LLM 算术不靠谱时)
CoD
 (Chain of Debates)
多个 LLM 辩论同一问题,互相挑错
法律分析、争议性话题
RLVR
用强化学习训练模型自适应调整推理深度
o1/o3 类推理模型的底层技术
Deep Research
ReAct + ToT + Self-Correction 的终极组合
需要几分钟才能完成的深度研究任务

推理策略选择决策树

不是所有问题都需要最复杂的推理。按这个决策树选择:

问题简单吗?(一句话能回答)  ├── 是 → 直接回答  │     成本: $0.001, 延迟: 0.5s  └── 否 → 需要多步推理吗?        ├── 是 → 用 CoT        │     成本: $0.003, 延迟: 1.5s        └── 是 → 需要查实时信息或用工具吗?              ├── 是 → 用 ReAct              │     成本: $0.005-0.05, 延迟: 3-10s              └── 否 → 需要比较多个方案吗?                    ├── 是 → 用 ToT                    │     成本: $0.01, 延迟: 5s                    └── 否 → 用 Self-Correction                          成本: $0.005, 延迟: 2s

核心原则:简单问题用简单策略,复杂问题才用高级策略。对"你好"这样的问题跑 ToT,只是在浪费 Token。


要点总结

#
Takeaway
说明
1
推理扩展定律
用更多计算时间换更高质量答案,有时比用更大模型更有效
2
CoT 是基础
"Let's think step by step"——让推理过程可见、可审计
3
ReAct 是 Agent 核心
Thought → Action → Observation 循环,让 Agent 边思考边行动
4
ToT 探索多条路径
适合方案比较和战略规划,但成本更高
5
按复杂度选策略
简单问题用直接回答,复杂问题才用高级推理
6
设好上限
ReAct 设 maxIterations,ToT 设 maxDepth,防止无限循环

常见坑

坑1: 对所有问题都用最复杂的推理  现象: 简单的"你好"也走ToT,浪费时间和Token  解决: 先评估问题复杂度,再选择策略
坑2: CoT给了错误示例反而降低质量  现象: Few-shot示例有错误,模型学到了错误的推理方式  解决: 仔细审核示例,或用Zero-shot("think step by step")
坑3: ReAct循环不设上限  现象: Agent在Thought-Action-Observation循环中无限打转  解决: 设maxIterations限制,超过则强制终止
坑4: ToT搜索空间爆炸  现象: branchingFactor=5, depth=5 → 5^5=3125个节点  解决: 合理设置参数(通常3×3即可),使用剪枝阈值
坑5: Self-Correction越改越差  现象: 每次修正都偏离原意,最终答案和需求无关  解决: 设最大修正轮数(3轮),始终对照原始需求审查

进一步学习:

  • • OpenAI o1/o3 技术报告 — RLVR 在生产推理模型中的应用
  • • Google Deep Research — 推理技术的集大成应用
  • • DSPy — 声明式编程框架,自动优化推理链
  • • Tree of Thoughts: Deliberate Problem Solving with Large Language Models[1]

引用链接

[1] Tree of Thoughts: Deliberate Problem Solving with Large Language Models: https://lilianweng.github.io/posts/2023-07-20-tree-of-thoughts/

  • 课程源码:https://github.com/OmniTexts/learning-ai-agent