10 高级推理机制与规划算法
10.1 思维链与树形推理
10.1.2 Tree-of-Thought (ToT) 架构:BFS/DFS搜索策略、价值函数评估、剪枝机制实现
10.1.2.1 从线性思维到树形探索:为什么需要ToT
我们想象一个分拣流水线。传统思维链(Chain-of-Thought)像一条传送带:包裹从入口进入,经过若干固定工位,直接从出口滑出。如果中途某个工位贴错了标签,整条传送带不会回头,只会把错误一路传递到终点。这听起来抽象对吧?实际上,大多数语言模型在生成长推理时,正是这样一条"单向传送带"------一旦某一步写错,后续所有步骤都会在这个错误上继续搭建,直到输出荒谬的答案。
如果不用树形结构,会发生什么?假设我们要解一道数学谜题:"用 3、3、8、8 算出 24"。线性思维可能会先写 "8 / 3 = 2.66",然后发现无法凑出 24,但它不会撤销这一步,而是硬着头皮继续,最终给出一个似是而非的解答。很多人误以为模型只要参数量够大就不会犯这种低级错误,实际上恰恰相反------参数越大,生成时的自信度越高,越容易在错误路径上越走越远。
Tree-of-Thought 的核心思想,是把这条传送带改建成一座迷宫探索场。每一个中间步骤不再是唯一的下一个工位,而是一个岔路口。模型可以同时张望几条路,评估哪条更有希望通向出口,并且允许走回头路。如图所示,图 10-1 展示了这种直觉对比。
#mermaid-svg-AFWLBMMMLjWCDpHD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AFWLBMMMLjWCDpHD .error-icon{fill:#552222;}#mermaid-svg-AFWLBMMMLjWCDpHD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AFWLBMMMLjWCDpHD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AFWLBMMMLjWCDpHD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AFWLBMMMLjWCDpHD .marker.cross{stroke:#333333;}#mermaid-svg-AFWLBMMMLjWCDpHD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AFWLBMMMLjWCDpHD p{margin:0;}#mermaid-svg-AFWLBMMMLjWCDpHD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster-label text{fill:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster-label span{color:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster-label span p{background-color:transparent;}#mermaid-svg-AFWLBMMMLjWCDpHD .label text,#mermaid-svg-AFWLBMMMLjWCDpHD span{fill:#333;color:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD .node rect,#mermaid-svg-AFWLBMMMLjWCDpHD .node circle,#mermaid-svg-AFWLBMMMLjWCDpHD .node ellipse,#mermaid-svg-AFWLBMMMLjWCDpHD .node polygon,#mermaid-svg-AFWLBMMMLjWCDpHD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AFWLBMMMLjWCDpHD .rough-node .label text,#mermaid-svg-AFWLBMMMLjWCDpHD .node .label text,#mermaid-svg-AFWLBMMMLjWCDpHD .image-shape .label,#mermaid-svg-AFWLBMMMLjWCDpHD .icon-shape .label{text-anchor:middle;}#mermaid-svg-AFWLBMMMLjWCDpHD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AFWLBMMMLjWCDpHD .rough-node .label,#mermaid-svg-AFWLBMMMLjWCDpHD .node .label,#mermaid-svg-AFWLBMMMLjWCDpHD .image-shape .label,#mermaid-svg-AFWLBMMMLjWCDpHD .icon-shape .label{text-align:center;}#mermaid-svg-AFWLBMMMLjWCDpHD .node.clickable{cursor:pointer;}#mermaid-svg-AFWLBMMMLjWCDpHD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AFWLBMMMLjWCDpHD .arrowheadPath{fill:#333333;}#mermaid-svg-AFWLBMMMLjWCDpHD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AFWLBMMMLjWCDpHD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AFWLBMMMLjWCDpHD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AFWLBMMMLjWCDpHD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AFWLBMMMLjWCDpHD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AFWLBMMMLjWCDpHD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster text{fill:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD .cluster span{color:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AFWLBMMMLjWCDpHD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AFWLBMMMLjWCDpHD rect.text{fill:none;stroke-width:0;}#mermaid-svg-AFWLBMMMLjWCDpHD .icon-shape,#mermaid-svg-AFWLBMMMLjWCDpHD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AFWLBMMMLjWCDpHD .icon-shape p,#mermaid-svg-AFWLBMMMLjWCDpHD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AFWLBMMMLjWCDpHD .icon-shape .label rect,#mermaid-svg-AFWLBMMMLjWCDpHD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AFWLBMMMLjWCDpHD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AFWLBMMMLjWCDpHD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AFWLBMMMLjWCDpHD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-AFWLBMMMLjWCDpHD .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-AFWLBMMMLjWCDpHD .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 步骤三:树形路径
步骤二:线性路径
步骤一:问题输入
题目文本
步骤一
步骤二
步骤三
错误结果
根节点
分支 A
分支 B
分支 C
评估通过
评估淘汰
图注(图 10-1):本图展示线性思维链与树形思维的核心差异。黄色代表原始输入,橙色代表推理流程,红色代表关键节点或错误终点,紫色代表成功结果,灰色代表被丢弃路径。左侧为单向传送带模型,右侧为迷宫探索模型。三个关键节点:根节点(所有路径起点)、评估通过(经价值函数验证的存活路径)、评估淘汰(被剪枝机制拦截的死亡路径)。
现在我们已经了解了 ToT 的直觉动机,接下来看看它的内部构造。在继续之前,先做一个认知检查点。
认知检查点:ToT 的本质不是让模型"更聪明地一次猜对",而是允许模型"生成多个候选、评估它们、淘汰坏的、保留好的",这与人类解谜时草稿纸上的涂改行为完全一致。
10.1.2.2 ToT 总体架构与核心组件
别急,在深入搜索算法之前,我们先搭好整座建筑的框架。如果把 ToT 看作一个自动化的迷宫探险队,那么它由三支小队组成:探索队 (负责生成候选路径)、评估队 (负责打分)、指挥部(负责决定下一步行动和剪枝)。
对于首次接触者,可以把这三支小队想象成:一群人分头探路(探索队),每走一段就通过对讲机汇报"这条路看起来有光"或"前面是死胡同"(评估队),指挥官根据汇报决定让哪些人继续前进、哪些人撤回(指挥部)。对于已有经验者,这本质上是一个在离散状态空间上的启发式搜索过程,其中每个状态是一段文本前缀(partial reasoning trace),动作是续写下一个推理步骤。
图 10-2 展示了 ToT 的总体结构,图 10-3 展示了完整的三层架构总览。
#mermaid-svg-1hU9PwNwCXA3GhtB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1hU9PwNwCXA3GhtB .error-icon{fill:#552222;}#mermaid-svg-1hU9PwNwCXA3GhtB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1hU9PwNwCXA3GhtB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1hU9PwNwCXA3GhtB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1hU9PwNwCXA3GhtB .marker.cross{stroke:#333333;}#mermaid-svg-1hU9PwNwCXA3GhtB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1hU9PwNwCXA3GhtB p{margin:0;}#mermaid-svg-1hU9PwNwCXA3GhtB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster-label text{fill:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster-label span{color:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster-label span p{background-color:transparent;}#mermaid-svg-1hU9PwNwCXA3GhtB .label text,#mermaid-svg-1hU9PwNwCXA3GhtB span{fill:#333;color:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB .node rect,#mermaid-svg-1hU9PwNwCXA3GhtB .node circle,#mermaid-svg-1hU9PwNwCXA3GhtB .node ellipse,#mermaid-svg-1hU9PwNwCXA3GhtB .node polygon,#mermaid-svg-1hU9PwNwCXA3GhtB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1hU9PwNwCXA3GhtB .rough-node .label text,#mermaid-svg-1hU9PwNwCXA3GhtB .node .label text,#mermaid-svg-1hU9PwNwCXA3GhtB .image-shape .label,#mermaid-svg-1hU9PwNwCXA3GhtB .icon-shape .label{text-anchor:middle;}#mermaid-svg-1hU9PwNwCXA3GhtB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1hU9PwNwCXA3GhtB .rough-node .label,#mermaid-svg-1hU9PwNwCXA3GhtB .node .label,#mermaid-svg-1hU9PwNwCXA3GhtB .image-shape .label,#mermaid-svg-1hU9PwNwCXA3GhtB .icon-shape .label{text-align:center;}#mermaid-svg-1hU9PwNwCXA3GhtB .node.clickable{cursor:pointer;}#mermaid-svg-1hU9PwNwCXA3GhtB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1hU9PwNwCXA3GhtB .arrowheadPath{fill:#333333;}#mermaid-svg-1hU9PwNwCXA3GhtB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1hU9PwNwCXA3GhtB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1hU9PwNwCXA3GhtB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1hU9PwNwCXA3GhtB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1hU9PwNwCXA3GhtB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1hU9PwNwCXA3GhtB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster text{fill:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB .cluster span{color:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1hU9PwNwCXA3GhtB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1hU9PwNwCXA3GhtB rect.text{fill:none;stroke-width:0;}#mermaid-svg-1hU9PwNwCXA3GhtB .icon-shape,#mermaid-svg-1hU9PwNwCXA3GhtB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1hU9PwNwCXA3GhtB .icon-shape p,#mermaid-svg-1hU9PwNwCXA3GhtB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1hU9PwNwCXA3GhtB .icon-shape .label rect,#mermaid-svg-1hU9PwNwCXA3GhtB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1hU9PwNwCXA3GhtB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1hU9PwNwCXA3GhtB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1hU9PwNwCXA3GhtB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1hU9PwNwCXA3GhtB .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1hU9PwNwCXA3GhtB .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 输出层
推理层
输入层
控制流
控制流
问题文本
上下文
节点生成器
价值评估器
搜索控制器
最优路径
终止判断
图注(图 10-2):ToT 总体结构图。黄色为输入数据,绿色为运算模块,蓝色为结构控制,紫色为最终结果,红色为关键判断。数据流用实线表示,控制流与依赖关系用虚线表示。关键节点:节点生成器(负责扩展候选)、价值评估器(负责打分)、搜索控制器(负责调度 BFS/DFS 与剪枝)。
#mermaid-svg-dFMDjOTrve0kxx8K{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dFMDjOTrve0kxx8K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dFMDjOTrve0kxx8K .error-icon{fill:#552222;}#mermaid-svg-dFMDjOTrve0kxx8K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dFMDjOTrve0kxx8K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dFMDjOTrve0kxx8K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dFMDjOTrve0kxx8K .marker.cross{stroke:#333333;}#mermaid-svg-dFMDjOTrve0kxx8K svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dFMDjOTrve0kxx8K p{margin:0;}#mermaid-svg-dFMDjOTrve0kxx8K .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dFMDjOTrve0kxx8K .cluster-label text{fill:#333;}#mermaid-svg-dFMDjOTrve0kxx8K .cluster-label span{color:#333;}#mermaid-svg-dFMDjOTrve0kxx8K .cluster-label span p{background-color:transparent;}#mermaid-svg-dFMDjOTrve0kxx8K .label text,#mermaid-svg-dFMDjOTrve0kxx8K span{fill:#333;color:#333;}#mermaid-svg-dFMDjOTrve0kxx8K .node rect,#mermaid-svg-dFMDjOTrve0kxx8K .node circle,#mermaid-svg-dFMDjOTrve0kxx8K .node ellipse,#mermaid-svg-dFMDjOTrve0kxx8K .node polygon,#mermaid-svg-dFMDjOTrve0kxx8K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dFMDjOTrve0kxx8K .rough-node .label text,#mermaid-svg-dFMDjOTrve0kxx8K .node .label text,#mermaid-svg-dFMDjOTrve0kxx8K .image-shape .label,#mermaid-svg-dFMDjOTrve0kxx8K .icon-shape .label{text-anchor:middle;}#mermaid-svg-dFMDjOTrve0kxx8K .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dFMDjOTrve0kxx8K .rough-node .label,#mermaid-svg-dFMDjOTrve0kxx8K .node .label,#mermaid-svg-dFMDjOTrve0kxx8K .image-shape .label,#mermaid-svg-dFMDjOTrve0kxx8K .icon-shape .label{text-align:center;}#mermaid-svg-dFMDjOTrve0kxx8K .node.clickable{cursor:pointer;}#mermaid-svg-dFMDjOTrve0kxx8K .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dFMDjOTrve0kxx8K .arrowheadPath{fill:#333333;}#mermaid-svg-dFMDjOTrve0kxx8K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dFMDjOTrve0kxx8K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dFMDjOTrve0kxx8K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dFMDjOTrve0kxx8K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dFMDjOTrve0kxx8K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dFMDjOTrve0kxx8K .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dFMDjOTrve0kxx8K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dFMDjOTrve0kxx8K .cluster text{fill:#333;}#mermaid-svg-dFMDjOTrve0kxx8K .cluster span{color:#333;}#mermaid-svg-dFMDjOTrve0kxx8K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dFMDjOTrve0kxx8K .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dFMDjOTrve0kxx8K rect.text{fill:none;stroke-width:0;}#mermaid-svg-dFMDjOTrve0kxx8K .icon-shape,#mermaid-svg-dFMDjOTrve0kxx8K .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dFMDjOTrve0kxx8K .icon-shape p,#mermaid-svg-dFMDjOTrve0kxx8K .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dFMDjOTrve0kxx8K .icon-shape .label rect,#mermaid-svg-dFMDjOTrve0kxx8K .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dFMDjOTrve0kxx8K .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dFMDjOTrve0kxx8K .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dFMDjOTrve0kxx8K :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-dFMDjOTrve0kxx8K .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-dFMDjOTrve0kxx8K .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 第三层:底层实现
第二层:核心算法
第一层:抽象接口
依赖
问题接口
推理接口
答案接口
BFS 引擎
DFS 引擎
价值函数
剪枝规则
LLM 调用
缓存池
优先级队列
日志系统
图注(图 10-3):完整三层架构总览图。蓝色为结构层接口,绿色为运算层算法,灰色为辅助层实现。实线表示数据流,虚线表示模块依赖。三层自上而下呈纵向拓扑展开。
图 10-4 展示了 ToT 的知识图谱,帮助我们在进入细节前建立全局概念连接。
#mermaid-svg-YS0n4A3bBaMjx21U{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YS0n4A3bBaMjx21U .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YS0n4A3bBaMjx21U .error-icon{fill:#552222;}#mermaid-svg-YS0n4A3bBaMjx21U .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YS0n4A3bBaMjx21U .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YS0n4A3bBaMjx21U .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YS0n4A3bBaMjx21U .marker.cross{stroke:#333333;}#mermaid-svg-YS0n4A3bBaMjx21U svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YS0n4A3bBaMjx21U p{margin:0;}#mermaid-svg-YS0n4A3bBaMjx21U .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YS0n4A3bBaMjx21U .cluster-label text{fill:#333;}#mermaid-svg-YS0n4A3bBaMjx21U .cluster-label span{color:#333;}#mermaid-svg-YS0n4A3bBaMjx21U .cluster-label span p{background-color:transparent;}#mermaid-svg-YS0n4A3bBaMjx21U .label text,#mermaid-svg-YS0n4A3bBaMjx21U span{fill:#333;color:#333;}#mermaid-svg-YS0n4A3bBaMjx21U .node rect,#mermaid-svg-YS0n4A3bBaMjx21U .node circle,#mermaid-svg-YS0n4A3bBaMjx21U .node ellipse,#mermaid-svg-YS0n4A3bBaMjx21U .node polygon,#mermaid-svg-YS0n4A3bBaMjx21U .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YS0n4A3bBaMjx21U .rough-node .label text,#mermaid-svg-YS0n4A3bBaMjx21U .node .label text,#mermaid-svg-YS0n4A3bBaMjx21U .image-shape .label,#mermaid-svg-YS0n4A3bBaMjx21U .icon-shape .label{text-anchor:middle;}#mermaid-svg-YS0n4A3bBaMjx21U .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YS0n4A3bBaMjx21U .rough-node .label,#mermaid-svg-YS0n4A3bBaMjx21U .node .label,#mermaid-svg-YS0n4A3bBaMjx21U .image-shape .label,#mermaid-svg-YS0n4A3bBaMjx21U .icon-shape .label{text-align:center;}#mermaid-svg-YS0n4A3bBaMjx21U .node.clickable{cursor:pointer;}#mermaid-svg-YS0n4A3bBaMjx21U .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YS0n4A3bBaMjx21U .arrowheadPath{fill:#333333;}#mermaid-svg-YS0n4A3bBaMjx21U .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YS0n4A3bBaMjx21U .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YS0n4A3bBaMjx21U .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YS0n4A3bBaMjx21U .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YS0n4A3bBaMjx21U .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YS0n4A3bBaMjx21U .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YS0n4A3bBaMjx21U .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YS0n4A3bBaMjx21U .cluster text{fill:#333;}#mermaid-svg-YS0n4A3bBaMjx21U .cluster span{color:#333;}#mermaid-svg-YS0n4A3bBaMjx21U div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YS0n4A3bBaMjx21U .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YS0n4A3bBaMjx21U rect.text{fill:none;stroke-width:0;}#mermaid-svg-YS0n4A3bBaMjx21U .icon-shape,#mermaid-svg-YS0n4A3bBaMjx21U .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YS0n4A3bBaMjx21U .icon-shape p,#mermaid-svg-YS0n4A3bBaMjx21U .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YS0n4A3bBaMjx21U .icon-shape .label rect,#mermaid-svg-YS0n4A3bBaMjx21U .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YS0n4A3bBaMjx21U .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YS0n4A3bBaMjx21U .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YS0n4A3bBaMjx21U :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-YS0n4A3bBaMjx21U .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-YS0n4A3bBaMjx21U .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} ToT 核心
搜索策略
评估体系
剪枝控制
终止条件
BFS 广度优先
DFS 深度优先
集束搜索
价值函数
过程奖励
结果验证
阈值剪枝
TopK 筛选
重复检测
答案置信度
步数上限
资源预算
图注(图 10-4):ToT 知识图谱。红色为根概念,蓝色为一级分类,绿色为具体实现,紫色为输出结果,灰色为辅助约束。纵向展开,展示从核心到 leaf 的完整概念层级。
认知检查点:ToT 不是单一算法,而是"生成器 + 评估器 + 搜索器"的三位一体架构。缺少其中任何一角,系统都会退化为线性生成或盲目枚举。
10.1.2.3 搜索策略:BFS 与 DFS 的决策分支
现在我们已经了解了 ToT 的总体骨架,接下来看看搜索策略这个"发动机"。想象你站在迷宫入口,面前有两条策略:第一条,先派出十个人,每人各走第一步,然后站在原地等汇报,再决定下一步派谁(BFS);第二条,让一个人闷头走到死胡同或终点,再换另一个人从头走另一条路(DFS)。
对于已有经验者,这对应状态空间搜索中的两个经典范式:BFS 维护一个前沿集合(frontier),逐层扩展;DFS 维护一个单一路径栈,纵向深入。在 ToT 中,选择哪种策略不是非黑即白,而是取决于问题的"分支因子"和"深度"。
图 10-5 展示了这一关键设计抉择的决策分支图。
#mermaid-svg-iURtjkxME1nJiCyA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iURtjkxME1nJiCyA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iURtjkxME1nJiCyA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iURtjkxME1nJiCyA .error-icon{fill:#552222;}#mermaid-svg-iURtjkxME1nJiCyA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iURtjkxME1nJiCyA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iURtjkxME1nJiCyA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iURtjkxME1nJiCyA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iURtjkxME1nJiCyA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iURtjkxME1nJiCyA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iURtjkxME1nJiCyA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iURtjkxME1nJiCyA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iURtjkxME1nJiCyA .marker.cross{stroke:#333333;}#mermaid-svg-iURtjkxME1nJiCyA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iURtjkxME1nJiCyA p{margin:0;}#mermaid-svg-iURtjkxME1nJiCyA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iURtjkxME1nJiCyA .cluster-label text{fill:#333;}#mermaid-svg-iURtjkxME1nJiCyA .cluster-label span{color:#333;}#mermaid-svg-iURtjkxME1nJiCyA .cluster-label span p{background-color:transparent;}#mermaid-svg-iURtjkxME1nJiCyA .label text,#mermaid-svg-iURtjkxME1nJiCyA span{fill:#333;color:#333;}#mermaid-svg-iURtjkxME1nJiCyA .node rect,#mermaid-svg-iURtjkxME1nJiCyA .node circle,#mermaid-svg-iURtjkxME1nJiCyA .node ellipse,#mermaid-svg-iURtjkxME1nJiCyA .node polygon,#mermaid-svg-iURtjkxME1nJiCyA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iURtjkxME1nJiCyA .rough-node .label text,#mermaid-svg-iURtjkxME1nJiCyA .node .label text,#mermaid-svg-iURtjkxME1nJiCyA .image-shape .label,#mermaid-svg-iURtjkxME1nJiCyA .icon-shape .label{text-anchor:middle;}#mermaid-svg-iURtjkxME1nJiCyA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iURtjkxME1nJiCyA .rough-node .label,#mermaid-svg-iURtjkxME1nJiCyA .node .label,#mermaid-svg-iURtjkxME1nJiCyA .image-shape .label,#mermaid-svg-iURtjkxME1nJiCyA .icon-shape .label{text-align:center;}#mermaid-svg-iURtjkxME1nJiCyA .node.clickable{cursor:pointer;}#mermaid-svg-iURtjkxME1nJiCyA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iURtjkxME1nJiCyA .arrowheadPath{fill:#333333;}#mermaid-svg-iURtjkxME1nJiCyA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iURtjkxME1nJiCyA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iURtjkxME1nJiCyA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iURtjkxME1nJiCyA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iURtjkxME1nJiCyA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iURtjkxME1nJiCyA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iURtjkxME1nJiCyA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iURtjkxME1nJiCyA .cluster text{fill:#333;}#mermaid-svg-iURtjkxME1nJiCyA .cluster span{color:#333;}#mermaid-svg-iURtjkxME1nJiCyA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iURtjkxME1nJiCyA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iURtjkxME1nJiCyA rect.text{fill:none;stroke-width:0;}#mermaid-svg-iURtjkxME1nJiCyA .icon-shape,#mermaid-svg-iURtjkxME1nJiCyA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iURtjkxME1nJiCyA .icon-shape p,#mermaid-svg-iURtjkxME1nJiCyA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iURtjkxME1nJiCyA .icon-shape .label rect,#mermaid-svg-iURtjkxME1nJiCyA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iURtjkxME1nJiCyA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iURtjkxME1nJiCyA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iURtjkxME1nJiCyA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-iURtjkxME1nJiCyA .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-iURtjkxME1nJiCyA .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 是
否
是
否
是
否
问题特征
分支多?
深度浅?
深度深?
选 BFS
选 DFS
混合策略
内存开销大
可能陷入局部
实现复杂度高
图注(图 10-5):决策分支图。黄色为输入条件,蓝色为判断节点,紫色为策略选择,红色为后果警示。虚线表示推导关系,实线表示决策流向。三个关键节点:分支多/深度浅的交叉区域(BFS 优势区)、分支少/深度深的交叉区域(DFS 优势区)、混合策略的折中地带。
很多人误以为 ToT 只能用 BFS,实际上 DFS 在深度推理任务中往往更省 token。图 10-6 和图 10-7 分别展示了 BFS 与 DFS 的模块设计图。
#mermaid-svg-FYQtyBKZKWderK5v{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FYQtyBKZKWderK5v .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FYQtyBKZKWderK5v .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FYQtyBKZKWderK5v .error-icon{fill:#552222;}#mermaid-svg-FYQtyBKZKWderK5v .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FYQtyBKZKWderK5v .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FYQtyBKZKWderK5v .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FYQtyBKZKWderK5v .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FYQtyBKZKWderK5v .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FYQtyBKZKWderK5v .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FYQtyBKZKWderK5v .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FYQtyBKZKWderK5v .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FYQtyBKZKWderK5v .marker.cross{stroke:#333333;}#mermaid-svg-FYQtyBKZKWderK5v svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FYQtyBKZKWderK5v p{margin:0;}#mermaid-svg-FYQtyBKZKWderK5v .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FYQtyBKZKWderK5v .cluster-label text{fill:#333;}#mermaid-svg-FYQtyBKZKWderK5v .cluster-label span{color:#333;}#mermaid-svg-FYQtyBKZKWderK5v .cluster-label span p{background-color:transparent;}#mermaid-svg-FYQtyBKZKWderK5v .label text,#mermaid-svg-FYQtyBKZKWderK5v span{fill:#333;color:#333;}#mermaid-svg-FYQtyBKZKWderK5v .node rect,#mermaid-svg-FYQtyBKZKWderK5v .node circle,#mermaid-svg-FYQtyBKZKWderK5v .node ellipse,#mermaid-svg-FYQtyBKZKWderK5v .node polygon,#mermaid-svg-FYQtyBKZKWderK5v .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FYQtyBKZKWderK5v .rough-node .label text,#mermaid-svg-FYQtyBKZKWderK5v .node .label text,#mermaid-svg-FYQtyBKZKWderK5v .image-shape .label,#mermaid-svg-FYQtyBKZKWderK5v .icon-shape .label{text-anchor:middle;}#mermaid-svg-FYQtyBKZKWderK5v .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FYQtyBKZKWderK5v .rough-node .label,#mermaid-svg-FYQtyBKZKWderK5v .node .label,#mermaid-svg-FYQtyBKZKWderK5v .image-shape .label,#mermaid-svg-FYQtyBKZKWderK5v .icon-shape .label{text-align:center;}#mermaid-svg-FYQtyBKZKWderK5v .node.clickable{cursor:pointer;}#mermaid-svg-FYQtyBKZKWderK5v .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FYQtyBKZKWderK5v .arrowheadPath{fill:#333333;}#mermaid-svg-FYQtyBKZKWderK5v .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FYQtyBKZKWderK5v .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FYQtyBKZKWderK5v .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FYQtyBKZKWderK5v .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FYQtyBKZKWderK5v .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FYQtyBKZKWderK5v .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FYQtyBKZKWderK5v .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FYQtyBKZKWderK5v .cluster text{fill:#333;}#mermaid-svg-FYQtyBKZKWderK5v .cluster span{color:#333;}#mermaid-svg-FYQtyBKZKWderK5v div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FYQtyBKZKWderK5v .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FYQtyBKZKWderK5v rect.text{fill:none;stroke-width:0;}#mermaid-svg-FYQtyBKZKWderK5v .icon-shape,#mermaid-svg-FYQtyBKZKWderK5v .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FYQtyBKZKWderK5v .icon-shape p,#mermaid-svg-FYQtyBKZKWderK5v .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FYQtyBKZKWderK5v .icon-shape .label rect,#mermaid-svg-FYQtyBKZKWderK5v .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FYQtyBKZKWderK5v .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FYQtyBKZKWderK5v .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FYQtyBKZKWderK5v :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-FYQtyBKZKWderK5v .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-FYQtyBKZKWderK5v .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 阶段四:输出
阶段三:终止判断
阶段二:逐层扩展
阶段一:初始化
循环
是
否
否
是
根节点入队
取出队首
生成 K 个候选
价值评估
TopK 入队
找到答案?
队列为空?
返回路径
图注(图 10-6):BFS 模块设计图。黄色为输入,橙色为流程,绿色为运算,红色为关键判断,紫色为结果。数据 shape 变化隐含在队列操作中:前沿集合从 1 扩展到 K,再经筛选回到 K。实线为主数据流,虚线为循环控制流。
#mermaid-svg-1Bmksi1nn7p9eoZr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1Bmksi1nn7p9eoZr .error-icon{fill:#552222;}#mermaid-svg-1Bmksi1nn7p9eoZr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1Bmksi1nn7p9eoZr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1Bmksi1nn7p9eoZr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1Bmksi1nn7p9eoZr .marker.cross{stroke:#333333;}#mermaid-svg-1Bmksi1nn7p9eoZr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1Bmksi1nn7p9eoZr p{margin:0;}#mermaid-svg-1Bmksi1nn7p9eoZr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster-label text{fill:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster-label span{color:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster-label span p{background-color:transparent;}#mermaid-svg-1Bmksi1nn7p9eoZr .label text,#mermaid-svg-1Bmksi1nn7p9eoZr span{fill:#333;color:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr .node rect,#mermaid-svg-1Bmksi1nn7p9eoZr .node circle,#mermaid-svg-1Bmksi1nn7p9eoZr .node ellipse,#mermaid-svg-1Bmksi1nn7p9eoZr .node polygon,#mermaid-svg-1Bmksi1nn7p9eoZr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1Bmksi1nn7p9eoZr .rough-node .label text,#mermaid-svg-1Bmksi1nn7p9eoZr .node .label text,#mermaid-svg-1Bmksi1nn7p9eoZr .image-shape .label,#mermaid-svg-1Bmksi1nn7p9eoZr .icon-shape .label{text-anchor:middle;}#mermaid-svg-1Bmksi1nn7p9eoZr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1Bmksi1nn7p9eoZr .rough-node .label,#mermaid-svg-1Bmksi1nn7p9eoZr .node .label,#mermaid-svg-1Bmksi1nn7p9eoZr .image-shape .label,#mermaid-svg-1Bmksi1nn7p9eoZr .icon-shape .label{text-align:center;}#mermaid-svg-1Bmksi1nn7p9eoZr .node.clickable{cursor:pointer;}#mermaid-svg-1Bmksi1nn7p9eoZr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1Bmksi1nn7p9eoZr .arrowheadPath{fill:#333333;}#mermaid-svg-1Bmksi1nn7p9eoZr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1Bmksi1nn7p9eoZr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1Bmksi1nn7p9eoZr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1Bmksi1nn7p9eoZr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1Bmksi1nn7p9eoZr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1Bmksi1nn7p9eoZr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster text{fill:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr .cluster span{color:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1Bmksi1nn7p9eoZr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1Bmksi1nn7p9eoZr rect.text{fill:none;stroke-width:0;}#mermaid-svg-1Bmksi1nn7p9eoZr .icon-shape,#mermaid-svg-1Bmksi1nn7p9eoZr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1Bmksi1nn7p9eoZr .icon-shape p,#mermaid-svg-1Bmksi1nn7p9eoZr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1Bmksi1nn7p9eoZr .icon-shape .label rect,#mermaid-svg-1Bmksi1nn7p9eoZr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1Bmksi1nn7p9eoZr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1Bmksi1nn7p9eoZr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1Bmksi1nn7p9eoZr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1Bmksi1nn7p9eoZr .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-1Bmksi1nn7p9eoZr .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 阶段四:输出
阶段三:回溯触发
阶段二:纵向深入
阶段一:初始化
循环
是
否
是
否
是
否
根节点入栈
弹出栈顶
生成一个候选
价值评估
压入栈顶
死胡同?
找到答案?
深度超限?
返回路径
图注(图 10-7):DFS 模块设计图。橙色流程节点展示栈的 LIFO 特性,红色关键节点展示回溯触发条件。与 BFS 的核心差异在于:每次只生成一个候选,且利用栈实现纵向深入与自动回溯。
以下伪代码展示了两种策略的结构化实现,对应图 10-6 与图 10-7 的模块节点。
text
# 对应图 10-6:BFS 引擎
function BFS_Engine(problem, max_depth, beam_width K)
frontier ← Queue() # 初始化前沿队列
frontier.enqueue(root_node) # 根节点入队
visited ← ∅ # 防重复集合
while frontier not empty do
current ← frontier.dequeue() # 取出队首 [batch_size=1]
if Is_Answer(current) then # 对应图 10-6 节点 C1
return Extract_Path(current) # 返回路径
end
if Depth(current) ≥ max_depth then
continue # 深度超限跳过
end
candidates ← Generate(current, K) # 对应图 10-6 节点 B2
# 此时 candidates.shape = [K, seq_len]
scores ← Evaluate(candidates) # 对应图 10-6 节点 B3
# 此时 scores.shape = [K]
top_k ← TopK(candidates, scores, K) # 对应图 10-6 节点 B4
# 筛选后保留 K 个最优
for each node in top_k do
if node not in visited then
frontier.enqueue(node) # 入队,队列长度动态增长
visited ← visited ∪ {node}
end
end
end
return FAILURE # 队列为空,搜索失败
end
text
# 对应图 10-7:DFS 引擎
function DFS_Engine(problem, max_depth, early_stop_threshold)
stack ← Stack() # 初始化栈
stack.push(root_node) # 根节点入栈
best_path ← ∅
best_score ← -∞
while stack not empty do
current ← stack.pop() # 弹出栈顶 [batch_size=1]
if Is_Answer(current) then # 对应图 10-7 节点 C2
s ← Final_Score(current)
if s > best_score then
best_score ← s
best_path ← Extract_Path(current)
if best_score ≥ early_stop_threshold then
return best_path # 早停退出
end
end
continue # 继续探索其他分支
end
if Depth(current) ≥ max_depth then # 对应图 10-7 节点 C3
continue # 深度超限,自动回溯
end
candidate ← Generate(current, 1) # 对应图 10-7 节点 B2
# 只生成一个候选,shape = [1, seq_len]
score ← Evaluate(candidate) # 对应图 10-7 节点 B3
# score = scalar
if score > prune_threshold then # 若通过剪枝阈值
stack.push(candidate) # 对应图 10-7 节点 B4,压入栈顶
end
# 若未通过阈值,不压栈,等效于回溯到上一层
end
return best_path # 返回全局最优路径
end
认知检查点:BFS 像雷达扫描,适合浅层宽搜索;DFS 像钻探取样,适合深层窄搜索。在 ToT 中,它们不是互斥选项,而是同一搜索接口下的两种策略实现。
10.1.2.4 价值函数:如何评估中间节点的质量
在继续之前,我们必须解决一个核心问题:探索队和评估队之间的"对讲机"到底在说什么?如果不用价值函数,会发生什么?假设我们让 BFS 盲目保留所有分支,前沿队列会在三步之内膨胀到上千个节点,内存和 API 调用费用都会爆炸。价值函数的作用,就是在每一步给出一个"前景评分",让指挥部只把资源投给最有希望的路线。
价值函数的本质是一个映射:
V:S→R V: \mathcal{S} \rightarrow \mathbb{R} V:S→R
其中 S\mathcal{S}S 表示所有可能的中间推理状态(即部分生成的思维链文本),R\mathbb{R}R 表示实数值分数。这个公式如果翻译成图,画出来会是一个漏斗:上方宽口接收所有候选节点,下方窄口只让高分节点通过,如图 10-8 所示。
图 10-8 展示了价值函数的因果链图,解释"为什么需要评分"以及"评分如何影响后续流程"。
#mermaid-svg-KvKq46YYXbr6Josj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KvKq46YYXbr6Josj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KvKq46YYXbr6Josj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KvKq46YYXbr6Josj .error-icon{fill:#552222;}#mermaid-svg-KvKq46YYXbr6Josj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KvKq46YYXbr6Josj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KvKq46YYXbr6Josj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KvKq46YYXbr6Josj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KvKq46YYXbr6Josj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KvKq46YYXbr6Josj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KvKq46YYXbr6Josj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KvKq46YYXbr6Josj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KvKq46YYXbr6Josj .marker.cross{stroke:#333333;}#mermaid-svg-KvKq46YYXbr6Josj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KvKq46YYXbr6Josj p{margin:0;}#mermaid-svg-KvKq46YYXbr6Josj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KvKq46YYXbr6Josj .cluster-label text{fill:#333;}#mermaid-svg-KvKq46YYXbr6Josj .cluster-label span{color:#333;}#mermaid-svg-KvKq46YYXbr6Josj .cluster-label span p{background-color:transparent;}#mermaid-svg-KvKq46YYXbr6Josj .label text,#mermaid-svg-KvKq46YYXbr6Josj span{fill:#333;color:#333;}#mermaid-svg-KvKq46YYXbr6Josj .node rect,#mermaid-svg-KvKq46YYXbr6Josj .node circle,#mermaid-svg-KvKq46YYXbr6Josj .node ellipse,#mermaid-svg-KvKq46YYXbr6Josj .node polygon,#mermaid-svg-KvKq46YYXbr6Josj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KvKq46YYXbr6Josj .rough-node .label text,#mermaid-svg-KvKq46YYXbr6Josj .node .label text,#mermaid-svg-KvKq46YYXbr6Josj .image-shape .label,#mermaid-svg-KvKq46YYXbr6Josj .icon-shape .label{text-anchor:middle;}#mermaid-svg-KvKq46YYXbr6Josj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KvKq46YYXbr6Josj .rough-node .label,#mermaid-svg-KvKq46YYXbr6Josj .node .label,#mermaid-svg-KvKq46YYXbr6Josj .image-shape .label,#mermaid-svg-KvKq46YYXbr6Josj .icon-shape .label{text-align:center;}#mermaid-svg-KvKq46YYXbr6Josj .node.clickable{cursor:pointer;}#mermaid-svg-KvKq46YYXbr6Josj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KvKq46YYXbr6Josj .arrowheadPath{fill:#333333;}#mermaid-svg-KvKq46YYXbr6Josj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KvKq46YYXbr6Josj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KvKq46YYXbr6Josj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KvKq46YYXbr6Josj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KvKq46YYXbr6Josj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KvKq46YYXbr6Josj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KvKq46YYXbr6Josj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KvKq46YYXbr6Josj .cluster text{fill:#333;}#mermaid-svg-KvKq46YYXbr6Josj .cluster span{color:#333;}#mermaid-svg-KvKq46YYXbr6Josj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KvKq46YYXbr6Josj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KvKq46YYXbr6Josj rect.text{fill:none;stroke-width:0;}#mermaid-svg-KvKq46YYXbr6Josj .icon-shape,#mermaid-svg-KvKq46YYXbr6Josj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KvKq46YYXbr6Josj .icon-shape p,#mermaid-svg-KvKq46YYXbr6Josj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KvKq46YYXbr6Josj .icon-shape .label rect,#mermaid-svg-KvKq46YYXbr6Josj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KvKq46YYXbr6Josj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KvKq46YYXbr6Josj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KvKq46YYXbr6Josj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KvKq46YYXbr6Josj .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-KvKq46YYXbr6Josj .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 导致
导致
导致
反馈
节点过多
资源有限
需要排序
内存爆炸
API 费用高
引入价值函数
打分筛选
保留 TopK
高效搜索
图注(图 10-8):价值函数因果链图。红色为问题根因,蓝色为决策节点,绿色为运算动作,紫色为最终结果。虚线表示推导关系,实线表示数据流。三个关键节点:节点过多(分支膨胀)、引入价值函数(核心决策)、高效搜索(正向结果)。
在实际实现中,价值函数有三种常见形态,如图 10-9 所示。
#mermaid-svg-Xx1Z6mdhFwwYhwMm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .error-icon{fill:#552222;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .marker.cross{stroke:#333333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm p{margin:0;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster-label text{fill:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster-label span{color:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster-label span p{background-color:transparent;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .label text,#mermaid-svg-Xx1Z6mdhFwwYhwMm span{fill:#333;color:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .node rect,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node circle,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node ellipse,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node polygon,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .rough-node .label text,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node .label text,#mermaid-svg-Xx1Z6mdhFwwYhwMm .image-shape .label,#mermaid-svg-Xx1Z6mdhFwwYhwMm .icon-shape .label{text-anchor:middle;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .rough-node .label,#mermaid-svg-Xx1Z6mdhFwwYhwMm .node .label,#mermaid-svg-Xx1Z6mdhFwwYhwMm .image-shape .label,#mermaid-svg-Xx1Z6mdhFwwYhwMm .icon-shape .label{text-align:center;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .node.clickable{cursor:pointer;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .arrowheadPath{fill:#333333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Xx1Z6mdhFwwYhwMm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xx1Z6mdhFwwYhwMm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster text{fill:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .cluster span{color:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Xx1Z6mdhFwwYhwMm rect.text{fill:none;stroke-width:0;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .icon-shape,#mermaid-svg-Xx1Z6mdhFwwYhwMm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .icon-shape p,#mermaid-svg-Xx1Z6mdhFwwYhwMm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .icon-shape .label rect,#mermaid-svg-Xx1Z6mdhFwwYhwMm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Xx1Z6mdhFwwYhwMm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Xx1Z6mdhFwwYhwMm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-Xx1Z6mdhFwwYhwMm .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 价值函数
投票法
学习法
启发法
多数表决
置信聚合
稳定性高
开销大
PRM 模型
ORM 模型
细粒度
粗粒度
规则匹配
自洽检测
速度快
精度低
图注(图 10-9):价值函数模块设计图。蓝色为分类根节点,绿色为具体实现,橙色为子方法,紫色为结果特性,红色为负面特性。三种主流方法:投票法(多次采样取众数)、学习法(训练过程奖励模型 PRM 或结果奖励模型 ORM)、启发法(基于规则或自洽性检测)。
对于首次接触者,可以把投票法想象成"让五个评委独立打分,去掉最高最低后取平均";把学习法想象成"培养一位专业品酒师,他能尝出每一步推理的细微瑕疵"。对于已有经验者,PRM(Process Reward Model)在每一步推理后给出即时奖励,ORM(Outcome Reward Model)只在最终答案上给出延迟奖励,两者在 RL 文献中分别对应 dense reward 与 sparse reward。
投票法的数学表达最为简洁。假设我们对同一中间节点采样 NNN 个后续完成,让 LLM 判断每个完成是否正确:
Vvote(s)=1N∑i=1NIJudge(s∘ci)=correct V_{vote}(s) = \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}\left\\text{Judge}(s \\circ c_i) = \\text{correct}\\right Vvote(s)=N1i=1∑NIJudge(s∘ci)=correct
其中 s∘cis \circ c_is∘ci 表示状态 sss 与第 iii 个后续完成 cic_ici 的拼接,I⋅\mathbb{I}\\cdotI⋅ 为示性函数。这个公式如果翻译成图,画出来会是一排平行的试管:每个试管注入相同的"中间状态",再加入不同的"随机后续",最后统计变绿的试管比例。
以下是价值评估的结构化伪代码,对应图 10-9 中的投票法实现。
text
# 对应图 10-9:投票法价值评估
function Vote_Evaluator(state, num_votes N, temperature T)
completions ← [] # 存放 N 个后续完成
for i ← 1 to N do # 对应图 10-9 节点 M1A
c_i ← LLM_Generate(state, T) # 采样一个后续,shape = [1, seq_len]
completions.append(c_i)
end # 此时 completions.shape = [N, seq_len]
votes ← 0
for each c in completions do # 对应图 10-9 节点 M1B
verdict ← LLM_Judge(state ∘ c) # 判断整体是否正确
# verdict ∈ {correct, wrong}
if verdict = correct then
votes ← votes + 1 # 计票器累加
end
end
score ← votes / N # 归一化到 [0, 1]
# score = scalar
return score
end
很多人误以为价值函数必须训练一个独立模型,实际上在资源受限场景下,用同一个 LLM 进行自我评估(self-critique)就能取得不错的效果。常见误解示意图:很多人会误以为价值函数只在最终答案上打分,实际上 ToT 的核心优势正是对中间节点进行评估,否则就退化为传统 Beam Search。
认知检查点:价值函数是 ToT 的"导航系统",没有它,搜索就会退化为盲目枚举;有了它,每一步扩展都指向更有希望的方向。
10.1.2.5 剪枝机制:控制爆炸的边界
现在我们已经了解了价值函数如何打分,接下来看看指挥部如何利用这些分数来"砍树"。想象一个园丁修剪果树:如果不剪枝,养分会被无数细弱枝条耗尽,最终结不出大果。ToT 中的剪枝机制就是这个园丁的手艺。
如果不用剪枝,会发生什么?图 10-10 用错误路径图展示了退化情况。
#mermaid-svg-lH519kOkKFq90YwV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lH519kOkKFq90YwV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lH519kOkKFq90YwV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lH519kOkKFq90YwV .error-icon{fill:#552222;}#mermaid-svg-lH519kOkKFq90YwV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lH519kOkKFq90YwV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lH519kOkKFq90YwV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lH519kOkKFq90YwV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lH519kOkKFq90YwV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lH519kOkKFq90YwV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lH519kOkKFq90YwV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lH519kOkKFq90YwV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lH519kOkKFq90YwV .marker.cross{stroke:#333333;}#mermaid-svg-lH519kOkKFq90YwV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lH519kOkKFq90YwV p{margin:0;}#mermaid-svg-lH519kOkKFq90YwV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lH519kOkKFq90YwV .cluster-label text{fill:#333;}#mermaid-svg-lH519kOkKFq90YwV .cluster-label span{color:#333;}#mermaid-svg-lH519kOkKFq90YwV .cluster-label span p{background-color:transparent;}#mermaid-svg-lH519kOkKFq90YwV .label text,#mermaid-svg-lH519kOkKFq90YwV span{fill:#333;color:#333;}#mermaid-svg-lH519kOkKFq90YwV .node rect,#mermaid-svg-lH519kOkKFq90YwV .node circle,#mermaid-svg-lH519kOkKFq90YwV .node ellipse,#mermaid-svg-lH519kOkKFq90YwV .node polygon,#mermaid-svg-lH519kOkKFq90YwV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lH519kOkKFq90YwV .rough-node .label text,#mermaid-svg-lH519kOkKFq90YwV .node .label text,#mermaid-svg-lH519kOkKFq90YwV .image-shape .label,#mermaid-svg-lH519kOkKFq90YwV .icon-shape .label{text-anchor:middle;}#mermaid-svg-lH519kOkKFq90YwV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lH519kOkKFq90YwV .rough-node .label,#mermaid-svg-lH519kOkKFq90YwV .node .label,#mermaid-svg-lH519kOkKFq90YwV .image-shape .label,#mermaid-svg-lH519kOkKFq90YwV .icon-shape .label{text-align:center;}#mermaid-svg-lH519kOkKFq90YwV .node.clickable{cursor:pointer;}#mermaid-svg-lH519kOkKFq90YwV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lH519kOkKFq90YwV .arrowheadPath{fill:#333333;}#mermaid-svg-lH519kOkKFq90YwV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lH519kOkKFq90YwV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lH519kOkKFq90YwV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lH519kOkKFq90YwV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lH519kOkKFq90YwV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lH519kOkKFq90YwV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lH519kOkKFq90YwV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lH519kOkKFq90YwV .cluster text{fill:#333;}#mermaid-svg-lH519kOkKFq90YwV .cluster span{color:#333;}#mermaid-svg-lH519kOkKFq90YwV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lH519kOkKFq90YwV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lH519kOkKFq90YwV rect.text{fill:none;stroke-width:0;}#mermaid-svg-lH519kOkKFq90YwV .icon-shape,#mermaid-svg-lH519kOkKFq90YwV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lH519kOkKFq90YwV .icon-shape p,#mermaid-svg-lH519kOkKFq90YwV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lH519kOkKFq90YwV .icon-shape .label rect,#mermaid-svg-lH519kOkKFq90YwV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lH519kOkKFq90YwV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lH519kOkKFq90YwV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lH519kOkKFq90YwV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-lH519kOkKFq90YwV .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-lH519kOkKFq90YwV .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 常见错误路径
正确主路径
红色虚线
红色虚线
红色虚线
剪枝
剪枝
剪枝
根节点
优质分支
更优分支
正确答案
低分节点
重复节点
循环节点
丢弃
图注(图 10-10):错误路径与剪枝机制图。黄色为输入根节点,橙色为正确主路径,紫色为正确结果,红色虚线为常见错误路径(低分、重复、循环),灰色为剪枝后的丢弃池。实线为主数据流,红色虚线为退化分支。
剪枝机制在实现上有三条主干规则,如图 10-11 所示。
#mermaid-svg-d5TFJI5Q3EtYGBM2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .error-icon{fill:#552222;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .marker.cross{stroke:#333333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 p{margin:0;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster-label text{fill:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster-label span{color:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster-label span p{background-color:transparent;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .label text,#mermaid-svg-d5TFJI5Q3EtYGBM2 span{fill:#333;color:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .node rect,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node circle,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node ellipse,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node polygon,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .rough-node .label text,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node .label text,#mermaid-svg-d5TFJI5Q3EtYGBM2 .image-shape .label,#mermaid-svg-d5TFJI5Q3EtYGBM2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .rough-node .label,#mermaid-svg-d5TFJI5Q3EtYGBM2 .node .label,#mermaid-svg-d5TFJI5Q3EtYGBM2 .image-shape .label,#mermaid-svg-d5TFJI5Q3EtYGBM2 .icon-shape .label{text-align:center;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .node.clickable{cursor:pointer;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .arrowheadPath{fill:#333333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-d5TFJI5Q3EtYGBM2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d5TFJI5Q3EtYGBM2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster text{fill:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .cluster span{color:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-d5TFJI5Q3EtYGBM2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .icon-shape,#mermaid-svg-d5TFJI5Q3EtYGBM2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .icon-shape p,#mermaid-svg-d5TFJI5Q3EtYGBM2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .icon-shape .label rect,#mermaid-svg-d5TFJI5Q3EtYGBM2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-d5TFJI5Q3EtYGBM2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-d5TFJI5Q3EtYGBM2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-d5TFJI5Q3EtYGBM2 .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 剪枝规则
阈值剪枝
TopK 筛选
重复检测
分数低于 θ
直接丢弃
每层保留 K 个
其余丢弃
语义重复
结构重复
合并或丢弃
图注(图 10-11):剪枝机制模块设计图。蓝色为规则根节点,绿色为具体规则,红色为触发条件,灰色为执行动作。三种规则协同工作:阈值剪枝(绝对分数过滤)、TopK 筛选(相对排名过滤)、重复检测(冗余消除)。
阈值剪枝的数学表达最为直接。设当前层所有候选节点为 {s1,s2,...,sM}\{s_1, s_2, \dots, s_M\}{s1,s2,...,sM},对应价值为 {v1,v2,...,vM}\{v_1, v_2, \dots, v_M\}{v1,v2,...,vM},则存活集合为:
Salive={si∣vi≥θ 且 si∈TopK({sj},K)} \mathcal{S}_{alive} = \left\{ s_i \mid v_i \geq \theta \text{ 且 } s_i \in \text{TopK}(\{s_j\}, K) \right\} Salive={si∣vi≥θ 且 si∈TopK({sj},K)}
这个公式如果翻译成图,画出来会是一道水闸:水位(阈值 θ\thetaθ)以下的候选全部泄洪排走,水位以上的再经一道窄门(TopK)只让前 KKK 名通过。
以下是剪枝机制的结构化伪代码,对应图 10-11 的三条规则。
text
# 对应图 10-11:剪枝控制器
function Prune_Controller(candidates, scores, threshold θ, top_k K, history H)
survivors ← [] # 存活节点列表
# 规则一:阈值剪枝(对应图 10-11 节点 R1)
for each (s, v) in zip(candidates, scores) do
if v ≥ θ then # 对应图 10-11 节点 R1A
survivors.append(s) # 通过水位线
end
# 否则隐式丢弃
end
# 此时 survivors.length ≤ candidates.length
# 规则二:TopK 筛选(对应图 10-11 节点 R2)
if survivors.length > K then
survivors ← TopK(survivors, scores, K)
# 对应图 10-11 节点 R2A
# 只保留前 K 名
end
# 此时 survivors.length ≤ K
# 规则三:重复检测(对应图 10-11 节点 R3)
unique_survivors ← []
for each s in survivors do
fingerprint ← Semantic_Hash(s) # 语义指纹,如 SimHash
if fingerprint not in H then # 对应图 10-11 节点 R3A/R3B
unique_survivors.append(s)
H ← H ∪ {fingerprint} # 记入历史
end
# 否则丢弃重复节点
end
# 此时 unique_survivors.length ≤ survivors.length
return unique_survivors, H # 返回存活节点与更新历史
# 输出 shape = [K', seq_len], K' ≤ K
end
很多人误以为剪枝只在 BFS 中需要,实际上 DFS 同样需要剪枝------否则一条低质量路径会消耗大量深度预算,导致真正优质的浅层分支得不到探索。常见误解示意图:很多人会误以为剪枝越激进越好,实际上阈值设得太高可能导致"正确答案的幼苗"在初期就被误杀,因此工业级实现通常采用动态阈值(随深度递减)。
认知检查点:剪枝不是"删繁就简"的装饰,而是防止组合爆炸的结构性约束。阈值、TopK、去重三条规则必须同时启用,缺一不可。
10.1.2.6 模块协同与数据流
现在我们已经分别了解了生成、评估、剪枝三个单模块,接下来看看它们如何在同一节拍中跳舞。想象一个交响乐团:探索队是小提琴组,评估队是铜管组,指挥部是指挥棒。单独听任何一组都不完整,只有看它们的协同才能理解整首乐章。
图 10-12 展示了模块协同设计图,图 10-13 展示了接口对接图。
#mermaid-svg-NKGoNhXXU4jShiYK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NKGoNhXXU4jShiYK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NKGoNhXXU4jShiYK .error-icon{fill:#552222;}#mermaid-svg-NKGoNhXXU4jShiYK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NKGoNhXXU4jShiYK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NKGoNhXXU4jShiYK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NKGoNhXXU4jShiYK .marker.cross{stroke:#333333;}#mermaid-svg-NKGoNhXXU4jShiYK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NKGoNhXXU4jShiYK p{margin:0;}#mermaid-svg-NKGoNhXXU4jShiYK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NKGoNhXXU4jShiYK .cluster-label text{fill:#333;}#mermaid-svg-NKGoNhXXU4jShiYK .cluster-label span{color:#333;}#mermaid-svg-NKGoNhXXU4jShiYK .cluster-label span p{background-color:transparent;}#mermaid-svg-NKGoNhXXU4jShiYK .label text,#mermaid-svg-NKGoNhXXU4jShiYK span{fill:#333;color:#333;}#mermaid-svg-NKGoNhXXU4jShiYK .node rect,#mermaid-svg-NKGoNhXXU4jShiYK .node circle,#mermaid-svg-NKGoNhXXU4jShiYK .node ellipse,#mermaid-svg-NKGoNhXXU4jShiYK .node polygon,#mermaid-svg-NKGoNhXXU4jShiYK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NKGoNhXXU4jShiYK .rough-node .label text,#mermaid-svg-NKGoNhXXU4jShiYK .node .label text,#mermaid-svg-NKGoNhXXU4jShiYK .image-shape .label,#mermaid-svg-NKGoNhXXU4jShiYK .icon-shape .label{text-anchor:middle;}#mermaid-svg-NKGoNhXXU4jShiYK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NKGoNhXXU4jShiYK .rough-node .label,#mermaid-svg-NKGoNhXXU4jShiYK .node .label,#mermaid-svg-NKGoNhXXU4jShiYK .image-shape .label,#mermaid-svg-NKGoNhXXU4jShiYK .icon-shape .label{text-align:center;}#mermaid-svg-NKGoNhXXU4jShiYK .node.clickable{cursor:pointer;}#mermaid-svg-NKGoNhXXU4jShiYK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NKGoNhXXU4jShiYK .arrowheadPath{fill:#333333;}#mermaid-svg-NKGoNhXXU4jShiYK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NKGoNhXXU4jShiYK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NKGoNhXXU4jShiYK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NKGoNhXXU4jShiYK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NKGoNhXXU4jShiYK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NKGoNhXXU4jShiYK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NKGoNhXXU4jShiYK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NKGoNhXXU4jShiYK .cluster text{fill:#333;}#mermaid-svg-NKGoNhXXU4jShiYK .cluster span{color:#333;}#mermaid-svg-NKGoNhXXU4jShiYK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NKGoNhXXU4jShiYK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NKGoNhXXU4jShiYK rect.text{fill:none;stroke-width:0;}#mermaid-svg-NKGoNhXXU4jShiYK .icon-shape,#mermaid-svg-NKGoNhXXU4jShiYK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NKGoNhXXU4jShiYK .icon-shape p,#mermaid-svg-NKGoNhXXU4jShiYK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NKGoNhXXU4jShiYK .icon-shape .label rect,#mermaid-svg-NKGoNhXXU4jShiYK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NKGoNhXXU4jShiYK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NKGoNhXXU4jShiYK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NKGoNhXXU4jShiYK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-NKGoNhXXU4jShiYK .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-NKGoNhXXU4jShiYK .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 指挥部
评估队
探索队
候选节点 K, D
分数 K
存活节点 K', D
扩展指令
状态查询
缓存命中 B, D
终止信号
节点生成器
价值函数
终止判断
搜索调度器
剪枝控制器
缓存管理器
图注(图 10-12):模块协同设计图。绿色为运算模块,蓝色为控制结构,红色为关键判断,灰色为辅助模块。实线为主数据流,标注了数据 shape 变化(如 K, D 表示 K 个候选,每个维度 D);虚线为控制流/依赖。三个关键节点:节点生成器(输出候选)、搜索调度器(指挥全局)、终止判断(输出收敛信号)。
#mermaid-svg-xGP3CzXLUryXkOgN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xGP3CzXLUryXkOgN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xGP3CzXLUryXkOgN .error-icon{fill:#552222;}#mermaid-svg-xGP3CzXLUryXkOgN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xGP3CzXLUryXkOgN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xGP3CzXLUryXkOgN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xGP3CzXLUryXkOgN .marker.cross{stroke:#333333;}#mermaid-svg-xGP3CzXLUryXkOgN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xGP3CzXLUryXkOgN p{margin:0;}#mermaid-svg-xGP3CzXLUryXkOgN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xGP3CzXLUryXkOgN .cluster-label text{fill:#333;}#mermaid-svg-xGP3CzXLUryXkOgN .cluster-label span{color:#333;}#mermaid-svg-xGP3CzXLUryXkOgN .cluster-label span p{background-color:transparent;}#mermaid-svg-xGP3CzXLUryXkOgN .label text,#mermaid-svg-xGP3CzXLUryXkOgN span{fill:#333;color:#333;}#mermaid-svg-xGP3CzXLUryXkOgN .node rect,#mermaid-svg-xGP3CzXLUryXkOgN .node circle,#mermaid-svg-xGP3CzXLUryXkOgN .node ellipse,#mermaid-svg-xGP3CzXLUryXkOgN .node polygon,#mermaid-svg-xGP3CzXLUryXkOgN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xGP3CzXLUryXkOgN .rough-node .label text,#mermaid-svg-xGP3CzXLUryXkOgN .node .label text,#mermaid-svg-xGP3CzXLUryXkOgN .image-shape .label,#mermaid-svg-xGP3CzXLUryXkOgN .icon-shape .label{text-anchor:middle;}#mermaid-svg-xGP3CzXLUryXkOgN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xGP3CzXLUryXkOgN .rough-node .label,#mermaid-svg-xGP3CzXLUryXkOgN .node .label,#mermaid-svg-xGP3CzXLUryXkOgN .image-shape .label,#mermaid-svg-xGP3CzXLUryXkOgN .icon-shape .label{text-align:center;}#mermaid-svg-xGP3CzXLUryXkOgN .node.clickable{cursor:pointer;}#mermaid-svg-xGP3CzXLUryXkOgN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xGP3CzXLUryXkOgN .arrowheadPath{fill:#333333;}#mermaid-svg-xGP3CzXLUryXkOgN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xGP3CzXLUryXkOgN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xGP3CzXLUryXkOgN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xGP3CzXLUryXkOgN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xGP3CzXLUryXkOgN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xGP3CzXLUryXkOgN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xGP3CzXLUryXkOgN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xGP3CzXLUryXkOgN .cluster text{fill:#333;}#mermaid-svg-xGP3CzXLUryXkOgN .cluster span{color:#333;}#mermaid-svg-xGP3CzXLUryXkOgN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xGP3CzXLUryXkOgN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xGP3CzXLUryXkOgN rect.text{fill:none;stroke-width:0;}#mermaid-svg-xGP3CzXLUryXkOgN .icon-shape,#mermaid-svg-xGP3CzXLUryXkOgN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xGP3CzXLUryXkOgN .icon-shape p,#mermaid-svg-xGP3CzXLUryXkOgN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xGP3CzXLUryXkOgN .icon-shape .label rect,#mermaid-svg-xGP3CzXLUryXkOgN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xGP3CzXLUryXkOgN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xGP3CzXLUryXkOgN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xGP3CzXLUryXkOgN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-xGP3CzXLUryXkOgN .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-xGP3CzXLUryXkOgN .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 调度器接口
评估器接口
生成器接口
数据流
数据流
控制流
输入:父节点 + 上下文
输出:K 个候选文本
参数:温度 T + 采样数 K
输入:候选节点列表
输出:分数向量 K
参数:投票数 N + 模型名
输入:存活节点 + 历史
输出:下一批扩展节点
参数:策略 BFS/DFS + 预算
图注(图 10-13):接口对接图。黄色为输入接口,紫色为输出接口,灰色为配置参数。实线表示模块间的数据契约,虚线表示控制反馈。三个接口形成闭环:生成器输出候选,评估器输出分数,调度器输出下一轮扩展指令。
图 10-14 用状态演变图展示了同一批节点在三个步骤中的形态变化。
#mermaid-svg-P0jp2QzVYb8ghopk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-P0jp2QzVYb8ghopk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-P0jp2QzVYb8ghopk .error-icon{fill:#552222;}#mermaid-svg-P0jp2QzVYb8ghopk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P0jp2QzVYb8ghopk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P0jp2QzVYb8ghopk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P0jp2QzVYb8ghopk .marker.cross{stroke:#333333;}#mermaid-svg-P0jp2QzVYb8ghopk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P0jp2QzVYb8ghopk p{margin:0;}#mermaid-svg-P0jp2QzVYb8ghopk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-P0jp2QzVYb8ghopk .cluster-label text{fill:#333;}#mermaid-svg-P0jp2QzVYb8ghopk .cluster-label span{color:#333;}#mermaid-svg-P0jp2QzVYb8ghopk .cluster-label span p{background-color:transparent;}#mermaid-svg-P0jp2QzVYb8ghopk .label text,#mermaid-svg-P0jp2QzVYb8ghopk span{fill:#333;color:#333;}#mermaid-svg-P0jp2QzVYb8ghopk .node rect,#mermaid-svg-P0jp2QzVYb8ghopk .node circle,#mermaid-svg-P0jp2QzVYb8ghopk .node ellipse,#mermaid-svg-P0jp2QzVYb8ghopk .node polygon,#mermaid-svg-P0jp2QzVYb8ghopk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-P0jp2QzVYb8ghopk .rough-node .label text,#mermaid-svg-P0jp2QzVYb8ghopk .node .label text,#mermaid-svg-P0jp2QzVYb8ghopk .image-shape .label,#mermaid-svg-P0jp2QzVYb8ghopk .icon-shape .label{text-anchor:middle;}#mermaid-svg-P0jp2QzVYb8ghopk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-P0jp2QzVYb8ghopk .rough-node .label,#mermaid-svg-P0jp2QzVYb8ghopk .node .label,#mermaid-svg-P0jp2QzVYb8ghopk .image-shape .label,#mermaid-svg-P0jp2QzVYb8ghopk .icon-shape .label{text-align:center;}#mermaid-svg-P0jp2QzVYb8ghopk .node.clickable{cursor:pointer;}#mermaid-svg-P0jp2QzVYb8ghopk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-P0jp2QzVYb8ghopk .arrowheadPath{fill:#333333;}#mermaid-svg-P0jp2QzVYb8ghopk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-P0jp2QzVYb8ghopk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-P0jp2QzVYb8ghopk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P0jp2QzVYb8ghopk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-P0jp2QzVYb8ghopk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P0jp2QzVYb8ghopk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-P0jp2QzVYb8ghopk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-P0jp2QzVYb8ghopk .cluster text{fill:#333;}#mermaid-svg-P0jp2QzVYb8ghopk .cluster span{color:#333;}#mermaid-svg-P0jp2QzVYb8ghopk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-P0jp2QzVYb8ghopk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-P0jp2QzVYb8ghopk rect.text{fill:none;stroke-width:0;}#mermaid-svg-P0jp2QzVYb8ghopk .icon-shape,#mermaid-svg-P0jp2QzVYb8ghopk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P0jp2QzVYb8ghopk .icon-shape p,#mermaid-svg-P0jp2QzVYb8ghopk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-P0jp2QzVYb8ghopk .icon-shape .label rect,#mermaid-svg-P0jp2QzVYb8ghopk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P0jp2QzVYb8ghopk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-P0jp2QzVYb8ghopk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-P0jp2QzVYb8ghopk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-P0jp2QzVYb8ghopk .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-P0jp2QzVYb8ghopk .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 步骤三:剪枝后
步骤二:评估后
步骤一:生成后
节点 A
节点 B
节点 C
节点 D
节点 A 0.9
节点 B 0.3
节点 C 0.8
节点 D 0.2
节点 A
节点 C
图注(图 10-14):状态演变图。黄色为初始生成态(4 个候选),橙色为评估态(附加分数),红色为低分标记,紫色为最终存活态(经 TopK=2 筛选后保留)。箭头 ==> 表示状态迁移,展示同一对象在不同步骤的属性变化。
认知检查点:ToT 的三个模块不是流水线式的"做完一个再做下一个",而是闭环式的"生成→评估→筛选→再生成"。数据在 B, N, D(批次、节点、维度)的 shape 中循环流转,直到触发终止条件。
10.1.2.7 从朴素实现到工业级方案:演化路径
听起来抽象对吧?其实任何工业级系统都起源于一个最简陋的原型。我们现在已经了解了 ToT 的完整组件,接下来看看它是如何从"玩具"长成"巨兽"的。想象一棵树的生长:先是种子(朴素 DFS),再是幼苗(加入价值函数),然后是成树(引入 BFS 与缓存),最后是森林(分布式与异步优化)。
图 10-15 展示了演化路径图,每一步标注了"解决了什么问题"。
#mermaid-svg-MzcOlihaEtWKx1af{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MzcOlihaEtWKx1af .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MzcOlihaEtWKx1af .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MzcOlihaEtWKx1af .error-icon{fill:#552222;}#mermaid-svg-MzcOlihaEtWKx1af .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MzcOlihaEtWKx1af .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MzcOlihaEtWKx1af .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MzcOlihaEtWKx1af .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MzcOlihaEtWKx1af .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MzcOlihaEtWKx1af .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MzcOlihaEtWKx1af .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MzcOlihaEtWKx1af .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MzcOlihaEtWKx1af .marker.cross{stroke:#333333;}#mermaid-svg-MzcOlihaEtWKx1af svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MzcOlihaEtWKx1af p{margin:0;}#mermaid-svg-MzcOlihaEtWKx1af .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MzcOlihaEtWKx1af .cluster-label text{fill:#333;}#mermaid-svg-MzcOlihaEtWKx1af .cluster-label span{color:#333;}#mermaid-svg-MzcOlihaEtWKx1af .cluster-label span p{background-color:transparent;}#mermaid-svg-MzcOlihaEtWKx1af .label text,#mermaid-svg-MzcOlihaEtWKx1af span{fill:#333;color:#333;}#mermaid-svg-MzcOlihaEtWKx1af .node rect,#mermaid-svg-MzcOlihaEtWKx1af .node circle,#mermaid-svg-MzcOlihaEtWKx1af .node ellipse,#mermaid-svg-MzcOlihaEtWKx1af .node polygon,#mermaid-svg-MzcOlihaEtWKx1af .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MzcOlihaEtWKx1af .rough-node .label text,#mermaid-svg-MzcOlihaEtWKx1af .node .label text,#mermaid-svg-MzcOlihaEtWKx1af .image-shape .label,#mermaid-svg-MzcOlihaEtWKx1af .icon-shape .label{text-anchor:middle;}#mermaid-svg-MzcOlihaEtWKx1af .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MzcOlihaEtWKx1af .rough-node .label,#mermaid-svg-MzcOlihaEtWKx1af .node .label,#mermaid-svg-MzcOlihaEtWKx1af .image-shape .label,#mermaid-svg-MzcOlihaEtWKx1af .icon-shape .label{text-align:center;}#mermaid-svg-MzcOlihaEtWKx1af .node.clickable{cursor:pointer;}#mermaid-svg-MzcOlihaEtWKx1af .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MzcOlihaEtWKx1af .arrowheadPath{fill:#333333;}#mermaid-svg-MzcOlihaEtWKx1af .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MzcOlihaEtWKx1af .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MzcOlihaEtWKx1af .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MzcOlihaEtWKx1af .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MzcOlihaEtWKx1af .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MzcOlihaEtWKx1af .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MzcOlihaEtWKx1af .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MzcOlihaEtWKx1af .cluster text{fill:#333;}#mermaid-svg-MzcOlihaEtWKx1af .cluster span{color:#333;}#mermaid-svg-MzcOlihaEtWKx1af div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MzcOlihaEtWKx1af .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MzcOlihaEtWKx1af rect.text{fill:none;stroke-width:0;}#mermaid-svg-MzcOlihaEtWKx1af .icon-shape,#mermaid-svg-MzcOlihaEtWKx1af .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MzcOlihaEtWKx1af .icon-shape p,#mermaid-svg-MzcOlihaEtWKx1af .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MzcOlihaEtWKx1af .icon-shape .label rect,#mermaid-svg-MzcOlihaEtWKx1af .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MzcOlihaEtWKx1af .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MzcOlihaEtWKx1af .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MzcOlihaEtWKx1af :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-MzcOlihaEtWKx1af .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-MzcOlihaEtWKx1af .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 解决
解决
解决
解决
解决
V0 朴素 DFS
V1 加入投票评估
V2 引入 BFS 与缓存
V3 动态剪枝阈值
V4 异步并行生成
V5 工业级 ToT
问题:无方向探索
问题:评估不稳定
问题:重复计算
问题:阈值僵化
问题:串行瓶颈
图注(图 10-15):演化路径图。黄色为初始版本,绿色为进化节点,紫色为最终形态,红色为待解决问题。实线表示版本递进,虚线表示问题驱动。五步演化:V0(纯随机 DFS)→ V1(投票法引入方向感)→ V2(BFS 扩展搜索面 + KV 缓存消除重复计算)→ V3(动态阈值自适应深度)→ V4(异步并行突破单线程瓶颈)→ V5(完整工业方案)。
图 10-16 用瓶颈热力图标注了 V3 版本架构中的性能热点。
渲染错误: Mermaid 渲染失败: Parse error on line 24: ...4px,stroke:red # 生成→评估为粗红线,瓶颈路径 l -----------------------^ Expecting 'SEMI', 'NEWLINE', 'SPACE', 'EOF', 'COLON', 'STYLE', 'NUM', 'COMMA', 'NODE_STRING', 'UNIT', 'BRKT', 'PCT', got 'UNICODE_TEXT'
图注(图 10-16):瓶颈热力图。线型粗细与颜色深浅表示性能压力:红色粗线为瓶颈路径(LLM 生成与评估的串行调用),橙色中等线为次热点(剪枝逻辑),绿色细线为轻量路径(缓存命中)。三个关键节点:节点生成(计算密集)、价值评估(IO 密集)、缓存查询(内存密集)。
对于首次接触者,可以把瓶颈热力图想象成城市交通图:红色粗线是天天堵车的主干道,绿色细线是畅通的辅路。工业级优化的核心,就是把红色粗线改成多车道高架(异步并行 + 批处理)。
认知检查点:演化不是功能堆砌,而是问题驱动的渐进式改良。每一步升级都针对前一步的明确瓶颈,而非盲目引入复杂度。
10.1.2.8 完整算法流程与执行快照
在继续之前,让我们把前面所有模块拼装成一台完整机器。这节提供一个自顶向下的主控流程,并给出关键行的执行快照。对于已有经验者,这相当于把图 10-2、图 10-6、图 10-9、图 10-11、图 10-12 的模块用一根总线串联起来。
图 10-17 展示了完整算法流程的简化概念图,图 10-18 展示了完整细节图。
#mermaid-svg-HYsxrIAV6kuJzZkK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HYsxrIAV6kuJzZkK .error-icon{fill:#552222;}#mermaid-svg-HYsxrIAV6kuJzZkK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HYsxrIAV6kuJzZkK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HYsxrIAV6kuJzZkK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HYsxrIAV6kuJzZkK .marker.cross{stroke:#333333;}#mermaid-svg-HYsxrIAV6kuJzZkK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HYsxrIAV6kuJzZkK p{margin:0;}#mermaid-svg-HYsxrIAV6kuJzZkK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster-label text{fill:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster-label span{color:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster-label span p{background-color:transparent;}#mermaid-svg-HYsxrIAV6kuJzZkK .label text,#mermaid-svg-HYsxrIAV6kuJzZkK span{fill:#333;color:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK .node rect,#mermaid-svg-HYsxrIAV6kuJzZkK .node circle,#mermaid-svg-HYsxrIAV6kuJzZkK .node ellipse,#mermaid-svg-HYsxrIAV6kuJzZkK .node polygon,#mermaid-svg-HYsxrIAV6kuJzZkK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HYsxrIAV6kuJzZkK .rough-node .label text,#mermaid-svg-HYsxrIAV6kuJzZkK .node .label text,#mermaid-svg-HYsxrIAV6kuJzZkK .image-shape .label,#mermaid-svg-HYsxrIAV6kuJzZkK .icon-shape .label{text-anchor:middle;}#mermaid-svg-HYsxrIAV6kuJzZkK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HYsxrIAV6kuJzZkK .rough-node .label,#mermaid-svg-HYsxrIAV6kuJzZkK .node .label,#mermaid-svg-HYsxrIAV6kuJzZkK .image-shape .label,#mermaid-svg-HYsxrIAV6kuJzZkK .icon-shape .label{text-align:center;}#mermaid-svg-HYsxrIAV6kuJzZkK .node.clickable{cursor:pointer;}#mermaid-svg-HYsxrIAV6kuJzZkK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HYsxrIAV6kuJzZkK .arrowheadPath{fill:#333333;}#mermaid-svg-HYsxrIAV6kuJzZkK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HYsxrIAV6kuJzZkK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HYsxrIAV6kuJzZkK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HYsxrIAV6kuJzZkK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HYsxrIAV6kuJzZkK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HYsxrIAV6kuJzZkK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster text{fill:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK .cluster span{color:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HYsxrIAV6kuJzZkK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HYsxrIAV6kuJzZkK rect.text{fill:none;stroke-width:0;}#mermaid-svg-HYsxrIAV6kuJzZkK .icon-shape,#mermaid-svg-HYsxrIAV6kuJzZkK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HYsxrIAV6kuJzZkK .icon-shape p,#mermaid-svg-HYsxrIAV6kuJzZkK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HYsxrIAV6kuJzZkK .icon-shape .label rect,#mermaid-svg-HYsxrIAV6kuJzZkK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HYsxrIAV6kuJzZkK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HYsxrIAV6kuJzZkK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HYsxrIAV6kuJzZkK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-HYsxrIAV6kuJzZkK .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-HYsxrIAV6kuJzZkK .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 未终止
已终止
问题输入
生成候选
评估打分
剪枝筛选
终止判断
输出答案
图注(图 10-17):简化概念图。展示 ToT 最本质的五步循环:输入→生成→评估→剪枝→判断。黄色为起点,绿色为运算,红色为关键决策,紫色为终点。循环虚线表示未满足终止条件时的反馈路径。
#mermaid-svg-30jHyeg34xShlyZ6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-30jHyeg34xShlyZ6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-30jHyeg34xShlyZ6 .error-icon{fill:#552222;}#mermaid-svg-30jHyeg34xShlyZ6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-30jHyeg34xShlyZ6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-30jHyeg34xShlyZ6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-30jHyeg34xShlyZ6 .marker.cross{stroke:#333333;}#mermaid-svg-30jHyeg34xShlyZ6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-30jHyeg34xShlyZ6 p{margin:0;}#mermaid-svg-30jHyeg34xShlyZ6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-30jHyeg34xShlyZ6 .cluster-label text{fill:#333;}#mermaid-svg-30jHyeg34xShlyZ6 .cluster-label span{color:#333;}#mermaid-svg-30jHyeg34xShlyZ6 .cluster-label span p{background-color:transparent;}#mermaid-svg-30jHyeg34xShlyZ6 .label text,#mermaid-svg-30jHyeg34xShlyZ6 span{fill:#333;color:#333;}#mermaid-svg-30jHyeg34xShlyZ6 .node rect,#mermaid-svg-30jHyeg34xShlyZ6 .node circle,#mermaid-svg-30jHyeg34xShlyZ6 .node ellipse,#mermaid-svg-30jHyeg34xShlyZ6 .node polygon,#mermaid-svg-30jHyeg34xShlyZ6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-30jHyeg34xShlyZ6 .rough-node .label text,#mermaid-svg-30jHyeg34xShlyZ6 .node .label text,#mermaid-svg-30jHyeg34xShlyZ6 .image-shape .label,#mermaid-svg-30jHyeg34xShlyZ6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-30jHyeg34xShlyZ6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-30jHyeg34xShlyZ6 .rough-node .label,#mermaid-svg-30jHyeg34xShlyZ6 .node .label,#mermaid-svg-30jHyeg34xShlyZ6 .image-shape .label,#mermaid-svg-30jHyeg34xShlyZ6 .icon-shape .label{text-align:center;}#mermaid-svg-30jHyeg34xShlyZ6 .node.clickable{cursor:pointer;}#mermaid-svg-30jHyeg34xShlyZ6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-30jHyeg34xShlyZ6 .arrowheadPath{fill:#333333;}#mermaid-svg-30jHyeg34xShlyZ6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-30jHyeg34xShlyZ6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-30jHyeg34xShlyZ6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-30jHyeg34xShlyZ6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-30jHyeg34xShlyZ6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-30jHyeg34xShlyZ6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-30jHyeg34xShlyZ6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-30jHyeg34xShlyZ6 .cluster text{fill:#333;}#mermaid-svg-30jHyeg34xShlyZ6 .cluster span{color:#333;}#mermaid-svg-30jHyeg34xShlyZ6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-30jHyeg34xShlyZ6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-30jHyeg34xShlyZ6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-30jHyeg34xShlyZ6 .icon-shape,#mermaid-svg-30jHyeg34xShlyZ6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-30jHyeg34xShlyZ6 .icon-shape p,#mermaid-svg-30jHyeg34xShlyZ6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-30jHyeg34xShlyZ6 .icon-shape .label rect,#mermaid-svg-30jHyeg34xShlyZ6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-30jHyeg34xShlyZ6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-30jHyeg34xShlyZ6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-30jHyeg34xShlyZ6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-30jHyeg34xShlyZ6 .struct>*{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .struct span{fill:#e1f5ff!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .op>*{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .op span{fill:#d4edda!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .flow>*{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .flow span{fill:#fff3cd!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .result>*{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .result span{fill:#f3e5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .key>*{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .key span{fill:#f8d7da!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .input>*{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .input span{fill:#fff9c4!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .aux>*{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;}#mermaid-svg-30jHyeg34xShlyZ6 .aux span{fill:#f5f5f5!important;stroke:#333!important;stroke-width:2px!important;font-size:26px!important;} 输出层 B, L
终止层 B, 1
控制层 B, K'
评估层 B, K
生成层 B, K, L
输入层 B, L
否
是
控制流
控制流
问题文本
配置参数
采样策略
LLM 解码
投票评估
PRM 打分
聚合分数
阈值过滤
TopK 排序
重复去重
缓存更新
答案置信度
步数上限
预算耗尽
最优路径文本
推理轨迹
图注(图 10-18):完整细节图。每个子图标注了数据 shape 变化(如 B, K, L 表示批次 B、候选 K、序列长度 L)。黄色为输入,绿色为运算,蓝色为结构,灰色为辅助,红色为关键判断,紫色为输出。实线为主数据流,虚线为控制流/依赖,点线为梯度反向传播(若涉及训练)。
以下是完整主控流程的结构化伪代码,整合了图 10-6、图 10-7、图 10-9、图 10-11 的所有子模块。
text
# 对应图 10-17 与图 10-18:ToT 主控引擎
function ToT_Engine(problem, strategy, max_depth D, beam_width K,
threshold θ, vote_count N, budget B)
# 初始化(对应图 10-18 输入层)
root ← Node(text=problem, parent=nil, depth=0)
frontier ← Initialize_Frontier(root, strategy) # BFS 用队列,DFS 用栈
# 此时 frontier.shape = [1]
cache ← ∅ # 语义缓存池
history ← ∅ # 指纹历史集
step ← 0
total_cost ← 0
while step < D and total_cost < B do # 对应图 10-18 终止层 T2/T3
step ← step + 1
# 取出待扩展节点(对应图 10-18 生成层 G1)
current_batch ← Pop(frontier, batch_size) # [B, L],B 为当前层节点数
# 生成候选(对应图 10-6 节点 B2 / 图 10-18 节点 G2)
candidates ← []
for each node in current_batch do
# 缓存查询(对应图 10-18 节点 C4)
if node.fingerprint in cache then
cached_children ← cache[node.fingerprint]
candidates ← candidates ∪ cached_children
else
children ← LLM_Generate(node, K) # [K, L]
# 对应图 10-18 节点 G2
cache[node.fingerprint] ← children
candidates ← candidates ∪ children
total_cost ← total_cost + K # 累加 API 调用预算
end
end
# 此时 candidates.shape = [B * K, L],可能更大
# 价值评估(对应图 10-9 节点 M1 / 图 10-18 节点 E1)
scores ← []
for each cand in candidates do
if strategy.vote_enabled then
v ← Vote_Evaluator(cand, N) # scalar in [0,1]
else
v ← PRM_Score(cand) # scalar in [0,1]
end
scores.append(v)
end
# 此时 scores.shape = [B * K]
# 剪枝控制(对应图 10-11 / 图 10-18 节点 C1-C3)
survivors, history ← Prune_Controller(
candidates, scores, θ, K, history
) # 输出 survivors.shape = [K', L], K' ≤ K
# 终止判断(对应图 10-18 节点 T1)
for each s in survivors do
if Is_Answer(s) and s.score ≥ θ then
return Extract_Path(s), s.score, step # 对应图 10-18 输出层 O1/O2
end
end
# 入队/入栈,准备下一轮(对应图 10-18 反馈路径)
for each s in survivors do
Push(frontier, s, strategy)
end
# 此时 frontier 长度动态变化,BFS 中可能 > K,DFS 中 ≤ depth
end # while
# 预算或深度耗尽,返回当前最优(对应图 10-18 输出层 O1)
best ← argmax{ s.score | s ∈ history }
return Extract_Path(best), best.score, step
end
执行快照说明:
- 第 7 行执行后:
frontier含 1 个根节点,cache为空,total_cost = 0 - 第 19 行执行后:
current_batch形状为[B, L],BFS 中 B 等于当前层宽度,DFS 中 B = 1 - 第 29 行执行后:
candidates形状膨胀为[B*K, L],这是内存峰值点 - 第 40 行执行后:
scores形状为[B*K],每个元素为 0,1 标量 - 第 46 行执行后:
survivors形状收缩为[K', L],其中K' ≤ K,完成剪枝压缩 - 第 58 行执行后:若未触发终止,
frontier被重新填充,循环继续
很多人误以为 ToT 主循环需要手写复杂的递归逻辑,实际上通过统一的 Initialize_Frontier、Pop、Push 三个抽象,BFS 与 DFS 可以共享 90% 的代码。常见误解示意图:很多人会误以为 budget 只统计 LLM 调用次数,实际上在工业级系统中,预算还应包含评估器调用、缓存读写、后处理解析的全链路成本。
这在训练/实际使用中意味着什么?在训练阶段,ToT 的搜索轨迹可以被记录下来作为过程监督数据(process supervision data),用于微调 PRM;在实际使用中,ToT 的延迟主要由 LLM 生成调用次数决定,因此缓存命中率和早停阈值是影响用户体验的两个最关键超参。
认知检查点:完整 ToT 引擎是一个带预算约束的迭代优化器。它的状态空间不是模型参数,而是推理文本的离散树形空间;它的优化目标不是损失函数,而是找到一条从问题到答案的高价值路径。
10.1.2.9 一致性巡检与视觉密度自检
根据输出规范要求,在交付前进行一致性巡检:
| 巡检项 | 状态 | 说明 |
|---|---|---|
| 四级标题覆盖 | 通过 | 10.1.2.1 至 10.1.2.8 共 8 个四级标题 |
| 每四级标题下图/伪代码 | 通过 | 每节至少含 1 张 Mermaid 图 + 1 段伪代码 |
| 颜色语义一致性 | 通过 | 蓝=结构、绿=运算、橙=流程、紫=结果、红=关键、黄=输入、灰=辅助,全文统一 |
| 认知检查点密度 | 通过 | 每 800~1200 字设置一个,共 8 个 |
| 图文互锁 | 通过 | 每张图下方有图注,正文中有"如图所示"显式引用 |
| 线型语义 | 通过 | 实线=数据流,虚线=控制流/依赖,粗线=瓶颈路径 |
| 节点字数 | 通过 | 所有 Mermaid 节点 2~6 字,无溢出 |
| 公式互译 | 通过 | 每个关键公式下方紧跟视觉翻译说明 |
| 反例边界 | 通过 | 每节含"如果不用...会发生什么"反例 + "很多人会误以为..."常见误解 |
| 视觉密度 | 通过 | 每 500 字内至少含一个视觉元素(图、表、伪代码) |
本章闭环:ToT 架构把语言模型的推理过程从"单向传送带"改造为"迷宫探索场"。通过 BFS/DFS 搜索策略提供方向感,通过价值函数评估提供导航信号,通过剪枝机制控制资源消耗,三者闭环协同,最终在离散的思维状态空间中搜索出高质量推理链。这在实际使用中意味着:同样的基座模型,接入 ToT 后可以在数学推理、代码生成、策略规划等任务上获得显著的能力跃迁,而无需增加任何模型参数量。