思维树(Tree of Thoughts,简称ToT)是一种面向大语言模型智能体的推理框架,它把传统的线性思维链扩展成可分支、可回溯的树状搜索结构。在ToT中,Agent不再一次性生成最终答案,而是把问题求解过程分解为一系列中间思考步骤,每一步都产生多个候选“思维”,这些思维作为决策树上的节点,经过评估后保留有潜力的分支继续扩展,从而在解空间中寻找最优路径。

ToT的基础结构与决策树建模
在ToT框架里,最核心的概念是“思维”和“状态”。状态表示当前问题求解到了哪一步,而思维是从当前状态出发、对下一步推进的自然语言描述。例如解决一个数学应用题时,一个思维可能是“先设未知数为x,再列方程”。框架会把每个状态衍生出的多个思维组织成树的子节点,从而构成一棵决策树。与普通的蒙特卡洛树不同,ToT的节点内容是大模型生成的自然语言片段,而不是棋类游戏里的落子坐标。
为了把问题映射到树上,通常需要定义四个组件:思维分解函数、思维生成器、状态评估器以及搜索算法。思维分解函数决定一个问题要切成几步;思维生成器在每一步基于当前状态产出k个候选思维;状态评估器给每个到达的状态打分,判断它离答案有多近;搜索算法如广度优先或深度优先,决定先扩哪一层、何时剪枝。下面给出一个简化的伪代码,展示如何初始化一棵树并做一层扩展:
# 思维树节点定义
class ToTNode:
def __init__(self, state, thoughts=None, parent=None):
self.state = state # 当前问题状态描述
self.thoughts = thoughts # 本节点对应的思维文本
self.parent = parent # 父节点引用
self.children = [] # 子节点列表
self.value = 0.0 # 状态评估分数
# 初始化根节点并生成第一层思维
root = ToTNode(state="题目:鸡兔同笼共35头,94脚,求鸡几只")
candidate_thoughts = generator.propose(root.state, k=3)
for t in candidate_thoughts:
child = ToTNode(state=root.state + " | 思维:" + t, thoughts=t, parent=root)
root.children.append(child)
上述结构让Agent能够显式地维护多条推理线索。当某条线索在后续评估中得分过低,就可以放弃它,把计算资源留给更有希望的路径。这种建模方式比单链推理更贴合人类解题时的“岔路思考”,也便于在程序中实现回溯机制。
状态评估与分支筛选机制
决策树若无限扩展会耗尽上下文和算力,因此ToT依赖评估器来筛选分支。常见的做法有两种:一种是让模型自身当评委,对每个状态输出“可行、可能、不可能”这类标签;另一种是用一个独立的提示词要求模型给状态打0到1之间的置信度分数。评估可以发生在每个思维生成之后,也可以只在树的某一层统一进行。经过评估,只保留分数排名前b的节点进入下一轮,这就是宽度限制(beam width)的基本思想。
为了让筛选更稳,不少实现会引入多次投票。比如对同一个状态让大模型投票三次,取多数意见作为该节点的价值。这样做能降低随机性带来的误判。下面的代码片段演示了如何用投票方式给节点打分,并只保留高分节点:
def evaluate_with_vote(node, voter_prompt, rounds=3):
scores = []
for i in range(rounds):
# 让模型判断该状态是否通向正确解
label = llm_call(voter_prompt.format(node.state))
if "可行" in label:
scores.append(1.0)
elif "可能" in label:
scores.append(0.5)
else:
scores.append(0.0)
node.value = sum(scores) / len(scores)
# 只保留 Beam Width = 2 的节点
evaluate_with_vote(root.children[0], voter_prompt)
evaluate_with_vote(root.children[1], voter_prompt)
evaluate_with_vote(root.children[2], voter_prompt)
survivors = sorted(root.children, key=lambda n: n.value, reverse=True)[:2]
分支筛选直接决定了搜索效率和成功率。如果评估器太宽松,树会膨胀;太严格,则可能过早剪掉正确路径。在实践中,往往需要根据任务难度动态调整beam width,并对接近终点的状态做更细的评估。相比于人类凭直觉放弃思路,ToT把这种筛选过程变成了可复现、可观测的程序逻辑。
搜索算法与最优路径求解
在树建好、评估器就位后,就要靠搜索算法把最优路径找出来。ToT论文里对比了几种经典方法:广度优先搜索(BFS)每层只留最好的b个节点,适合步骤少但每步分支多的任务;深度优先搜索(DFS)则一条路走到底再回溯,适合需要长链条推理的场景。此外还可以接入蒙特卡洛树搜索(MCTS),用模拟 rollout 的方式估计节点长期价值,不过开销也更大。
以BFS为例,每一轮先从当前活节点集合里取出所有节点,各自生成子思维,然后统一评估并截断到b个。当某个节点被评估为“已得出最终答案”或达到最大深度,就停止扩展。最后从叶子往回溯源到根,得到的思维序列就是Agent搜到的最优路径。下面给出一个BFS主循环的简化实现:
def bfs_search(root, max_depth=5, beam_width=2):
frontier = [root]
for depth in range(max_depth):
next_frontier = []
for node in frontier:
if is_solved(node.state):
return trace_path(node)
children = expand(node) # 生成并接子节点
for c in children:
evaluate_with_vote(c, voter_prompt)
next_frontier.extend(children)
next_frontier.sort(key=lambda n: n.value, reverse=True)
frontier = next_frontier[:beam_width]
return trace_path(frontier[0])
def trace_path(node):
path = []
while node:
path.append(node.thoughts)
node = node.parent
return list(reversed(path))
搜索算法选择会影响Agent的行为特质。BFS更保守,不易走偏但可能漏掉需绕远的答案;DFS敢深挖,却可能困在错误分支里。工程上常把二者结合,比如先用DFS探路,失败就回退到BFS层。ToT的真正价值,正是把“在决策树中搜索最优路径”这件事从模糊的提示词技巧,变成了有结构、可干预的系统能力,让Agent在复杂决策里不再裸奔。
Tree_of_ThoughtsLLM_Agentdecision_search修改时间:2026-08-15 14:06:31