
模块: 模块六:高级工程实践 | 难度: ⭐⭐⭐ | 预计时长: 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 | |||
| Self-Correction | |||
| PALM | |||
| ToT | |||
| ReAct | |||
| CoD/GoD | |||
| RLVR |
实际开发中最常用的是三个: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 | ||
| Zero-shot CoT |
怎么用
不需要从零实现框架。在 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({model: getModel("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不成立 ❌ (剪枝) 最终选择评分最高的路径: 结论AToT 的四个核心操作:
| 生成 | |
| 评估 | |
| 搜索 | |
| 回溯 |
什么时候用 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元。可通过优化采购渠道、减少损耗实现。✅ 用工具确保计算准确,查行业数据增加说服力
对比总结
其他推理技术速览
除了 CoT、ReAct、ToT,还有几个值得了解的技术:
| Self-Correction | ||
| PALM | ||
| CoD | ||
| RLVR | ||
| Deep Research |
推理策略选择决策树
不是所有问题都需要最复杂的推理。按这个决策树选择:
问题简单吗?(一句话能回答) ├── 是 → 直接回答 │ 成本: $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。
要点总结
常见坑
坑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
夜雨聆风