本文目录导读:

你提到的 “ToT树搜索” 大概率是指 Tree of Thoughts(思维树),这是一种在大型语言模型(LLM,如 GPT-4)推理过程中的高级提示策略。
它不是传统算法中的“树搜索”(如 AlphaGo 的蒙特卡洛树搜索),而是将大语言模型当作“节点”和“评估器”来执行树状搜索,以解决复杂推理问题(如数学题、逻辑谜题、代码生成)。
核心概念:ToT vs. 传统 CoT(思维链)
- CoT(思维链): 让模型一步步写出推理过程(“续写”)。
- 问题: 一旦走错一步,后面全错,无法回溯。
- ToT(思维树): 让模型在多个“思维路径”上进行搜索。
- 模型在每一步生成多个可能(分支)。
- 模型(或外部函数)评估每个分支的“前景”(是走向答案还是死胡同)。
- 采用 BFS(广度优先搜索) 或 DFS(深度优先搜索) 策略,剪枝不好的分支,探索好的分支。
基本流程(以解决24点游戏为例)
- 分解思维步骤: 将问题分解为多个中间步骤(24点游戏:每一步选两个数字做一次运算)。
- 生成候选: 在每个步骤,让 LLM 生成 k 个可能的下一步想法(候选节点)。
- 评估价值: 让 LLM 自我评估每个候选节点“离目标有多远”(评分 1-10,或给出“确定能赢/可能能赢/不可能”的判断)。
- 搜索策略:
- BFS: 保留每一层评分最高的部分节点,继续扩展。
- DFS: 沿着最可能的路径深入,如果遇到死胡同(评分低),则回溯到上层。
- 决策: 当搜索树达到目标节点(得到24点)或达到最大深度时,输出最终答案。
关键优势
- 探索与利用: 系统性地探索多种可能性,而不是“一条路走到黑”。
- 可回溯: 如果某条推理路线不合理,可以回溯,重新选择方向。
- 自我评估: 利用 LLM 自身的评判能力(如“这对吗?下一步怎么走”),充当搜索的启发式函数。
- 增量式构建: 适合需要中间步骤验证的任务(如数学、规划、创意写作)。
典型应用场景
- 数学推理: 24 点、数学应用题(GSM8K)。
- 逻辑推理: 纵横填字谜、家庭关系推理。
- 创意写作: 写故事时,首先生成多个大纲(树的第一层),评估每个大纲的潜力,再继续深入扩展最有潜力的。
- 编程: 先生成多个设计方案,评估可行性,再编写详细代码。
与其他“树搜索”的区别
- 蒙特卡洛树搜索(MCTS): 常用于游戏(如 AlphaGo),通过随机模拟来评估节点,需要大量模拟,ToT 用的是 LLM 自身的直接评估,计算成本相对较低(但仍比普通提示高)。
- *A 搜索:** 需要事先定义好的启发式函数,而 ToT 的启发式函数动态地由 LLM 生成。
实际挑战
- 成本高: 每次搜索都要调用 LLM 多次(生成候选 + 评估),token 消耗极大。
- 评估偏差: 让 LLM 自我评估可能不准确(“它觉得自己能赢,其实做错了”)。
- 搜索空间控制: 需要仔细设置分支数(k)、深度(d) 和剪枝阈值,不然搜索会爆炸。
如果你想在你的项目里实现一个简化的 ToT:
(以 Python 伪代码为例)
def tree_of_thoughts(problem, llm, max_steps, k=3):
# 0. 初始状态
root = {"steps": [], "state": problem}
# 数据结构: 队列 / 栈 (取决于搜索策略)
candidates = [root]
for step in range(max_steps):
new_candidates = []
for node in candidates:
# 1. 生成 k 个候选
next_thoughts = llm.generate_next(node["state"], k=k)
for thought in next_thoughts:
new_node = node.copy()
new_node["steps"].append(thought)
new_node["state"] = update_state(node["state"], thought)
# 2. 评估
score = llm.evaluate(new_node)
new_node["score"] = score
new_candidates.append(new_node)
# 3. 剪枝: 保持评分最高的 k 个
candidates = sorted(new_candidates, key=lambda x: x["score"], reverse=True)[:k]
# 4. 检查是否有终止
if any(llm.is_solved(node) for node in candidates):
return candidates[0]["steps"]
# 返回最优路径
return candidates[0]