Skip to content

🐣 小a的数学课

老z出了一道题:"一个水池,进水管 3 小时注满,出水管 5 小时排空,同时开,几小时注满?"

小a脑子一转,脱口而出:"8 小时!"

老z眉头一皱:"8?怎么算的?"

"3 加 5 嘛。"

"……3 加 5 是 8,但这俩管子一个进一个出,能直接加吗?"

小a愣住了。它又算了一遍,这次没急着答,而是在"脑子"里一步步推:进水每小时 1/3,出水每小时 1/5,同时开每小时净进 (1/3 - 1/5)……最后:"7.5 小时。"

老z笑了:"第二次对。区别在哪?第一次你脱口而出,第二次你把过程写出来了。 这,就是『想』和『不想』的差别。"


2.1 思维链:把推理过程"写"出来

小a第一次答错,不是不会算,是没算就答了。第二次它把中间步骤一步步推出来,就对了。

🧙 思维链(CoT,Chain of Thought)是什么?

思维链就是让模型把推理过程一步步写出来,而不是直接蹦答案。

  • 没有 CoT:看题 → 直接接出 "8"(接龙接错了)
  • 有 CoT:看题 → "进水每小时 1/3,出水每小时 1/5……" → 一步步接 → "7.5"

老z打比方:这就像心算 vs 在草稿纸上列竖式。心算容易错,列竖式把每一步落笔,准确率就上来了。

为什么思维链能提升准确率?

回到第 1 章——模型本质是接龙。一口气接出最终答案,等于让它"心算"一长串,中间任何一步错了,后面全错。

但如果让它一步步接,每一步只接一小段:

  • 每步的"接龙负担"变小 → 单步更准
  • 前一步的结论写进了上下文 → 后一步能基于它继续推
  • 错误被分摊到小步里,不至于一步错步步错

🐣 小a恍然:"所以我不是变聪明了,我是把一道大题拆成了一串小题,每道小题都容易些?"

🧙 "对。 CoT 的本质不是『让模型更聪明』,而是『把难题切碎,让接龙每一步都更稳』。"


2.2 思考越多,越准也越贵

"那既然一步步想更准,"小a试探着问,"我是不是每次都该把过程写得详详细细?"

老z摇头:"草稿纸也是要钱的。"

🧙 思考的代价

回忆第 1 章的计费——模型按 token 收费。思维链写出来的每一步过程,都是输出 token,都要花钱。

  • 不思考:输出 50 token 的答案 → 便宜,但可能错
  • 深思考:输出 500 token 的推理过程 + 50 token 的答案 → 准,但贵 10 倍

而且,思考 token 还会让回答变慢——模型得先把几百 token 的过程接完,才能接出最终答案。你等的时间也更长。

关键认知:思考不是免费的午餐。它用「钱」和「时间」换「准确率」。

这就有了一个工程权衡:什么时候该让模型多想,什么时候该让它快答?


2.3 思考强度:六档"草稿纸配额"

这就是 pi(和现代 LLM API)引入思考强度的原因——给你一个旋钮,控制模型投入多少"草稿纸"。

pi 给这个旋钮设计了固定档位——不能无级调节,只能像挡位一样一档一档拨。一共七档(六个思考档 + 一个"完全不思考"的 off),从"一点也不想"到"想个透彻":

强度含义比喻适合场景
off完全不思考脱口而出简单问答、闲聊
minimal极少思考心里默念一下翻译、改错别字
low浅想草稿纸上写两行简单代码、格式转换
medium中等思考列几步算式常规编程任务
high深度思考详细推导调试复杂 bug、架构设计
xhigh更深思考写满一页草稿数学证明、复杂推理
max最大化思考草稿纸写满还附页极难问题、研究性任务

🧙 怎么读这张表?

强度越高 → 模型花在"思考过程"上的 token 越多 → 越准,但越慢越贵。

pi 默认走的是**中等(medium)**的思考(它是来写代码的,得想清楚再动手)。但你可以调——简单任务调低省钱,硬骨头调高求准。

这个旋钮怎么用?

模型是否"会思考"、支持哪些强度,是模型的能力属性——这就像是模型出厂时自带的一张"能力说明书":

🧙 举个例子

你想让模型"深度思考",就在调用时给它指定一个思考强度(比如 high)。模型收到请求,就会先在心里把过程过一遍,再给你答案。

而这次实际花在"思考过程"上的 token 数,会单独记录在计费字段里(第 1 章讲过)——它是输出 token 的一部分,也就是说,"思考也算说话,也收费"。

🐣 小a注意到一个细节:"等等,如果模型根本不会思考呢?比如某个便宜模型没有 reasoning 能力,我硬调 high 会怎样?"

🧙 "好问题。 这就引出一个最容易踩的坑——『模型降智』。我们待会儿讲。"


2.4 Stop Reason:模型"想完"后的六种结局

模型思考完、生成完,会告诉调用方它为什么停下来——这就是 Stop Reason(停止原因)。别小看它,Agent 循环全靠它判断"下一步该干嘛"。

看 pi 是怎么给这些"结局"分类的:

🧙 举个具体场景

想象你在考场上答卷子,停下来交卷无非这么几种情况:还没写完(手还在动)、自然写完了、被铃声截断(还没答完时间到了)、想翻参考书(要去拿工具)、笔坏了出意外、被老师叫停。模型也一样——它停下来时,会明确告诉你它是哪一种

六个值,每个都有明确含义:

StopReason含义Agent 循环该干嘛
pending还没结束,生成中继续等
stop模型自然说完话了正常结束这一轮
length撞到 maxTokens 上限,被截断⚠️ 答案可能没说完,要处理
toolUse模型想调工具执行工具,把结果喂回去,继续循环
error出错了报错处理
aborted被用户中断停止

🧙 为什么 Stop Reason 这么重要?

Agent 循环(第 7 章会详讲):

prompt → 模型生成 → 【看 StopReason】→ 决定下一步
  • 看到 toolUse → "哦,模型要调工具" → 执行工具 → 把结果喂回去 → 让模型继续
  • 看到 stop → "模型说完了" → 这一轮结束
  • 看到 length → "被截断了" → 可能要让模型接着说,或提醒它精简

Stop Reason 是 Agent 循环的"方向盘"。 没有 it,循环根本不知道该停还是该继续。(pi 的 Agent 主循环怎么靠它驱动,我们在 Part II 第 18 章详讲。)

🐣 小a恍然:"所以如果模型该调工具却没调、直接 stop 了,任务就完不成?"

🧙 "正是。 这也是『降智』的一种表现——模型本该 toolUse,却错误地 stop 了。下面讲。"


2.5 事故现场:模型为什么"降智"

老z决定给小a看一个真实痛点——这章最有实战价值的一节。

🐣 现象:同一个模型,在 pi 里跑,明显不如官网聪明——不思考了、该调工具不调、看不懂图了。

🧙 根因有三条,都和『思考强度』『能力开关』有关:

根因①:思考能力没开

回忆 2.3:模型有个 reasoning 能力属性。如果这个属性是关闭的,pi 就不知道模型会思考,调用时就不会发 thinking 参数。

模型的真实能力:会思考(reasoning)
   ↓ 但配置里 reasoning = false
pi 以为:这模型不会思考
   ↓ 调用时
pi 不发 thinking 参数

模型收到请求,没被要求思考 → 直接答 → 显得"变笨了"

模型其实没笨,是配置让它"憋着没想"

根因②:思考强度映射错了

不同厂商的"思考"参数格式完全不同——家家有家家的叫法,pi 内部要认 10 种之多:

🧙 为什么这么多?

因为 OpenAI、Anthropic、DeepSeek、Qwen 各家发明"思考开关"的时间不一样、思路也不一样,字段名各写各的。有的用一个数字表示强度,有的用"开/关"布尔值,有的干脆嵌套一层结构。

大致有这么几类风格:

  • 强度档位型:像调音量,有 minimal/low/medium/high 这种程度词
  • 开关型:只有"思考 / 不思考"两个状态
  • 复合型:既要开关又要强度,两个参数一起发

10 种格式凑齐了上述所有花样。

如果 pi 把某厂商的思考强度映射错了(比如该发 high 却发了 low,或格式不对),模型就会"想了但没想够"。

根因③:被配置覆盖了

pi 允许用户用配置文件覆盖模型的默认能力(override 机制,Part II 第 20 章详讲)。如果 override 把一个强模型的能力改错了,模型就"降智"了。

怎么自查?

🧙 三步自查清单:

  1. 模型的 reasoning 字段是 true 吗?(不会思考的模型调高思考也没用)
  2. thinkingLevel 映射对了吗?(对照厂商文档)
  3. 有没有被 override 覆盖?(检查你的 models.json)

这些细节我们在附录 E.1『模型为什么降智』会展开讲排查方法。


2.6 一个直觉模型:思考强度的"性价比曲线"

老z给小a画了一张图,帮它建立直觉:

准确率

  |                      ___----  max/xhigh(贵,边际收益递减)
  |                ___--
  |           ___--       high(性价比甜点)
  |      __--
  |  __--                  medium(日常够用)
  | /                       low/minimal(简单任务)
  |________________________ off(完全不思考)
  ─────────────────────────→ 思考强度
  便宜/快                    贵/慢

🧙 三个直觉:

  1. 不是越强越好——曲线在高端变平了,max 比 high 准一点点,但贵很多。边际收益递减。
  2. 甜点在 high 附近——大多数复杂任务(写代码、debug)在 high 取得好的性价比。
  3. 简单任务别浪费——翻译、改格式这种,off 或 low 就够,调高了纯烧钱。

工程智慧:根据任务难度匹配思考强度,别一刀切。 pi 让你能调这个旋钮,就是为了"该省省、该花花"。


2.7 思维链的三种形态:从"喊它想"到"它天生想"

小a又发现一个问题:"您说让我把过程写出来。可有些模型我啥也没说,它就自己'想'半天才答;有些我让它想,它理都不理?"

老z笑了:"问得好。CoT 在现代模型里,已经演化出三种形态。"

🧙 CoT 的三种形态

形态谁触发"想"推理过程可见吗代表
显式 CoT你在 prompt 里喊它想可见(写在回答里)经典技巧
隐藏推理模型天生就想(训练出来的)不可见(内部草稿)DeepSeek-R1、o1 系
混合平时快答,难题自动切深度看厂商设计不少新一代模型

形态一:显式 CoT(你喊它想)

这是 2.1 讲的基础版,又分两种喊法:

  • 零样本(zero-shot):直接加一句"让我们一步一步地思考",模型就会列出步骤
  • 少样本(few-shot):在 prompt 里给一个"带推理步骤的示例",模型照葫芦画瓢

🧙 一句话:显式 CoT 是把"思考"当成一种 prompt 技巧——要不要想、怎么想,由你的提示词决定。

形态二:隐藏推理(它天生想)

老z话锋一转:"但近两年,模型自己进化了。"

🧙 隐藏推理(reasoning models)

新一代"推理模型"在训练时,就被要求先产生一大段内部思考,再给出最终答案。这段思考通常在内部完成,用户只看到结果(或一个简短摘要)。

  • 不用你喊"一步步想"——它默认就会想,想多深由模型自己判断
  • 代价更大:内部思考也是 token,照样计费、照样耗时(呼应 2.2)
  • 强项:数学、逻辑、复杂代码——"想清楚再答"的活

🐣 小a恍然:"所以『会思考』从『你教我的技巧』,变成了『出厂自带的能力』?"

🧙 "对。这就是近两年模型演化的一条主线。 显式 CoT 靠提示词『撬』出思考,隐藏推理把思考直接炼进了模型。对 agent 开发者来说,意义是:遇到推理模型,你基本不用费心编『让我们一步步想』,它自己会想;你要操心的是另一件事——怎么别让它想太狠、烧太多钱。 这就是下一节。"


2.8 思考预算:别让"想"烧光你的钱

"您说它'天生就想',"小a追问,"那它会不会想上瘾,一直想?"

老z点头:"会。推理模型的'想'是有预算的,你得学会管它。"

🧙 思考预算(thinking budget)

推理模型的内部思考,不是无限量的——调用时可以给它设一个 budget(预算,单位 token):

  • 预算设高 → 它能想很久 → 难题更准,但慢、贵
  • 预算设低 → 它想一会就得答 → 快、省,但复杂题可能想不够
  • 完全不设 → 模型自己定 → 可能"想过头",也可能偷懒

各家的控制方式不同:有的按 token 数设上限(如 Claude 的 budget_tokens),有的只有"思考强度档位"(就是 2.3 那套)。核心认知:思考是资源,要像预算一样管理。

小a皱眉:"那到底该给多少?"

🧙 三个工程建议:

  1. 简单任务:压预算或干脆关掉——翻译、改格式,想多了纯烧钱
  2. 复杂任务:给足但设上限——避免它"自我怀疑打转",在草稿里无限纠结
  3. 超时要能终止——agent 场景尤其重要,模型想太久,用户会等疯(这就是为什么 2.4 的 aborted 和 agent 循环的 maxTurns 都存在)

进阶:有些模型还支持"强制思考 / 让它自己决定"的模式切换——想不想、想多深,是调用方跟模型商量着定的。管理思考,是管理 LLM 成本的一个隐藏维度,agent 框架会帮你统一成一套参数(2.3 那个 reasoning 旋钮就是干这个的)。

🐣 小a记下:思考是资源不是免费午餐——显式 CoT 是"喊它想",隐藏推理是"它天生想",而思考预算是你管它"别想太多"的闸门。


本章小结

🐣 小a的第二课

老z让小a总结今天学的:

┌──────────────── 我怎么"想"问题?────────────────┐
│                                                │
│  • 思维链(CoT)= 把推理过程一步步写出来        │
│    —— 像"草稿纸列竖式",比心算准               │
│                                                │
│  • 思考强度 = 控制"草稿纸配额"的旋钮           │
│    —— off / minimal / low / medium /           │
│       high / xhigh / max(共七档)              │
│                                                │
│  • 思考越多 → 越准,但越慢越贵                 │
│    —— 边际收益递减,甜点在 high 附近           │
│                                                │
│  • Stop Reason = 模型"想完"的六种结局          │
│    pending / stop / length / toolUse /         │
│    error / aborted                             │
│    —— Agent 循环靠它判断下一步                │
│                                                │
│  • 模型降智的三条根因:                        │
│    ① 思考能力没开  ② 强度映射错  ③ 被覆盖     │
│                                                │
│  • CoT 三种形态:                               │
│    显式(喊它想)/ 隐藏推理(天生想)/ 混合      │
│                                                │
│  • 思考预算:想是资源,设上限才不烧钱          │
└────────────────────────────────────────────────┘

核心概念回顾:

概念一句话怎么理解它
思维链 CoT把推理过程写出来,分摊接龙负担就像模型给自己写的"草稿"——你看到的是结论,背后其实是它一步步列出来的过程
思考强度控制思考投入的旋钮(off~max)像调音量的旋钮:从"静音"到"全开",共七档,你决定它想多少再开口
reasoning 参数调用时指定想要的思考强度你下订单时勾选的那一栏:"这次给我想深一点"或"别磨蹭,直接答"
思考的代价思考 token 也收费、也耗时思考过程也是模型"说"出来的话,跟最终答案一样按字收费、花时间生成
Stop Reason模型停下来的原因(6 种)模型交卷时附的一张小纸条,写明"写完了/超时了/要查资料/出错了"
降智根因能力没开 / 映射错 / 被覆盖模型其实没变笨,是"翻译"它的能力时出了岔子,把会思考的它当成了不会
CoT 三种形态显式(喊它想)/ 隐藏推理(天生想)/ 混合近两年模型演化主线:思考从"提示词技巧"变成了"出厂能力"
思考预算给内部思考设 token 上限简单任务压预算、复杂任务设上限,避免"想过头烧钱"

课后实验

  1. 感受思维链:找一个会思考的模型(如 Claude),问它一道稍难的数学题。先不让它展示过程(如果可以关思考),再让它展示。对比两次的准确率。
  2. 调思考强度:如果用的工具支持,用同一道题分别跑 off / medium / high,观察:准确率变化、耗时变化、token 消耗变化。感受"边际收益递减"。
  3. 观察 Stop Reason:用任何能看原始响应的工具调一次 LLM,找到响应里的 stop_reason / finish_reason 字段,看它是什么值。试着触发 length(让它生成超长内容)和 toolUse(让它调函数)。
  4. 对比三种形态:同一道难题,分别用"普通模型 + '让我们一步步想'"和"推理模型(如 DeepSeek-R1)"跑,观察:谁更准、谁更慢、谁更贵。
  5. 玩思考预算:如果工具支持,给推理模型设高预算和低预算各跑一次难题,对比准确率与耗时。体会"预算设多少"是个工程权衡。

下一章:小a只会接龙、只会思考,但它一次只能伺候一家厂商。老z说:"OpenAI、Anthropic、Google 三家话都不通,你怎么同时打工?" 这就是巴别塔危机。→ 第 3 章 · 巴别塔危机