08 如何使用LLaMA 3进行多轮推理的搜索增强?
你好,我是Tyler!
在上一节中,我们深入探讨了如何利用 LLaMA 3 增强思维链的频率。尽管我们发现频率增强可以在一定程度上提高思维链的有效性,但这种方法存在系统性不足的问题,可能无法充分挖掘思维链的潜力。为了解决这些问题,我们引入了一种更高级的推理方法——“树状思维链”(Tree of Thought,简称 ToT)。
什么是树状思维链?
树状思维链常常被误解为对思维链(Chain of Thought,CoT)的简单树状扩展,然而,这种看法忽略了树状思维链的本质和独特性。实际上,树状思维链不仅是思维链的延展,而是引入了一种全新的思维模式,具有显著的区别和优势。
首先,思维链是一种逐步推理的方法,通过线性链的形式展开,每一步推理紧密相连,逐步接近问题的解决方案。这种方法有效地组织了推理过程,但其局限性在于只能按照单一方向推进,难以全面探索所有可能的思维路径。
你在上一节学习的自一致性(Self-Consistency)方法是一种在思维链中进行朴素分支扩展的策略。它通过生成多个不同的推理路径,并将这些路径的结果进行汇总,以提高最终答案的一致性。虽然自一致性方法在某种程度上增强了推理的可靠性,但仍然局限于对现有路径的汇总,而非系统性地探索不同的思维路径。
与此不同,树状思维链通过树状结构让模型在每一步推理中同时探索多个方向。这样,模型可以更全面地考虑各种可能性,从而得出更优的答案。虽然自一致性也是一种通过生成不同路径提升答案一致性的方法,但它仍局限于汇总路径,缺乏系统性。而树状思维链则能更深入地探索所有可能的路径。
树状思维链的适用范围
讨论树状思维链时,一个常见的误解是认为它仅适用于特定论文中提到的24点问题(该问题涉及通过加、减、乘、除等运算将四个数字计算出24)。由于论文中常用此问题作为示例,一些人可能误以为树状思维链的应用范围仅限于此。
实际上,树状思维链的应用远超24点问题。它的核心在于能够在一个定义明确的“问题空间”中进行系统化的搜索。问题空间指的是所有可能解或步骤的集合,通过探索这些解或步骤,ToT 能够找到最优解。
具体来说,问题空间包括所有潜在的状态和可能的转换路径,每一个状态可以通过不同的操作或决策到达其他状态。树状思维链通过系统地遍历这些状态和路径,进行有效的搜索,确保所有可能的解都被考虑,从而找到最佳的解决方案。
这种系统化的搜索过程确保了树状思维链能够处理各种复杂的问题,只要这些问题可以被形式化为一个问题空间。这使得树状思维链能够广泛应用于多个领域,包括但不限于路径规划、游戏决策、复杂推理和战略规划等场景。
例如,在路径规划问题中,问题空间可能是所有可能的路径,而树状思维链可以系统地探索这些路径以找到最短路径。在游戏决策中,问题空间可以是所有可能的游戏状态和移动,树状思维链可以帮助找到最佳策略。
因此,在树状思维链中,“树”不仅仅是一个普通层次结构,而是一个搜索树。树中的每个节点代表一个具体的思维步骤,而每个节点的分支则代表在该步骤后可能采取的不同推理路径。通过这种结构,我们能够全面、系统地探索所有潜在思维路径,从而显著提高最终推理结果的质量。这种方法确保推理过程的多样性与深度,使我们能够更好地应对复杂、多维度的问题。
树状思维链的应用:解决24点问题
为了更好地理解树状思维链的应用,让我们看一个具体的例子——24点游戏。这是一种数学挑战,目标是通过基本运算(加、减、乘、除)将四个给定数字计算出结果为24。我们将利用树状思维链系统地探索解决这一问题的所有可能路径。
树状思维链的关键在于探索所有可能推理路径,并且每一步推理都产生分支,代表不同可能的运算。对于24点问题,我们可以将所有可能运算步骤视作一个树状结构,其中每个节点代表一个可能的运算结果,而每个分支表示一种运算操作。
假设我们有四个数字:4, 7, 8, 8,接下来我们通过树状结构系统探索这些数字的运算组合。
第一步:选择两个数字进行运算
从数字集合中选择两个数字进行运算,生成一个新数字。接下来继续使用剩余的数字进行计算,直到所有数字被使用完。
例如,我们选择 8
和 4
,进行减法运算:
- 当前树的节点代表这个运算结果
4
,树的下一层将继续探索剩下的数字7
和8
。
第二步:对剩下的数字进行运算
选择 7
和 8
进行运算:
- 这时树结构的另一层节点代表
15
,我们可以进一步将这两个结果结合起来,继续计算。
第三步:将前两步结果结合
结合前面的结果 4
和 15
,进行乘法运算:
- 这不是我们要的结果,于是我们回溯,探索其他运算组合。
第四步:继续探索其他可能路径
通过递归的树状思维链方法,我们会探索所有可能的运算组合。假设我们尝试了另一组操作:
选择 8
和 4
进行除法运算:
剩余数字 7
和 8
,进行减法:
最后,将 2
和 1
进行乘法运算:
结果不是24,因此继续探索其他路径。
以此类推,直到搜索到答案。
树状思维链中的树搜索过程
树状思维链(ToT)算法允许我们系统性地生成和评估所有可能的运算路径,以找到解决24点问题的最优解。每个节点和分支代表一个计算步骤,这种方法确保所有可能路径都被充分探索,从而显著提高找到正确答案的概率。
在“树状思维链”(ToT)算法中,树搜索过程可以分为以下几个主要步骤:
- 初始化树节点:树的根节点代表问题的起始状态。在24点游戏的例子中,这可以是游戏的初始数字。
- 生成子节点:从当前节点(思维步骤)开始,生成所有可能的下一个思维步骤或操作。这些操作可以是不同的数学运算或其他逻辑操作。每一个新生成的思维步骤都成为当前节点的子节点。
- 扩展树:对于每个子节点,继续生成其子节点,直到达到预定的搜索深度或找到有效的解决方案。在24点游戏中,这相当于在每一步生成新的可能数字状态,并继续操作,直到找到正确的解。
- 评估节点:对每个节点的思维链进行评估,计算其有效性或质量。这通常通过某种评分机制来实现,比如计算节点是否能达到24点目标。
- 选择最佳路径:在树的所有可能路径中,选择最优的路径,这通常基于评估结果。
树状思维链的实现步骤(代码来自论文原实现)
在实际应用中,树状思维链的算法可以分为以下几个主要步骤:
- 初始化树节点
定义树的根节点,即任务的初始状态。
- 生成子节点
def get_proposals(task, x, y):
propose_prompt = task.propose_prompt_wrap(x, y)
proposals = gpt(propose_prompt, n=1, stop=None)[0].split('\n')
return [y + _ + '\n' for _ in proposals]
get_proposals
函数生成当前节点的所有子节点,每个子节点代表一种可能的思维链路径。
- 扩展树
def solve_task(task):
print(f"处理任务: {task.__class__.__name__}")
initial_numbers = task.steps
proposals = get_proposals(task, initial_numbers, '')
values = get_values(task, initial_numbers, proposals, n_evaluate_sample=N_EVALUATE_SAMPLE)
best_proposals = sorted(zip(proposals, values), key=lambda x: x[1], reverse=True)[:N_SELECT_SAMPLE]
return best_proposals
solve_task
函数扩展树,生成所有可能的路径(子节点),并对每个路径进行评估。
- 评估节点
def get_values(task, x, ys, n_evaluate_sample, cache_value=True):
values = []
local_value_cache = {}
for y in ys:
if y in local_value_cache:
value = 0
else:
value = get_value(task, x, y, n_evaluate_sample, cache_value=cache_value)
local_value_cache[y] = value
values.append(value)
return values
get_values
函数评估了每个思维链路径的有效性,对树中每个节点进行评分。
- 选择最佳路径
在所有可能的路径中,选择评分最高的路径,即选择最佳节点作为解决方案。
总结
学到这里,我们来做个总结吧。
在本节课中,我们深入探讨了树状思维链(ToT)作为一种新型的推理模式,并对其与传统的思维链(Chain of Thought, CoT)进行了对比。不同于线性推进的CoT,ToT通过树状结构同时探索多条推理路径,从而能够更全面、更深入地挖掘推理的潜力。
ToT不仅是对自一致性(Self-Consistency)的扩展,更是一种全新的探索思维模式,它在每一步推理过程中能够并行考虑多个路径。在广泛的应用场景中,例如路径规划和游戏决策,ToT展示了其解决复杂问题的潜力。
ToT的核心优势包括:
- 多方向探索:利用树状结构,同时评估多个思维路径,避免了CoT单一线性路径的局限。
- 系统化搜索:在复杂问题空间中系统地遍历各种可能路径,确保找到最优解。
通过经典的24点问题作为例子,我们展示了如何利用树状思维链逐步搜索运算路径来找到解决方案,体现了ToT在基于大语言模型的启发式搜索中的强大推理和问题解决能力。
希望你能够掌握这种思想,在日常应用中对问题空间进行建模,并采用高效的搜索方法,以提高解决问题的效率。
思考题
- 为什么说 ToT 不是 CoT 的简单树状扩展?
- 你认为 ToT 和 GPT-4o1 草莓模型的关系是什么?
欢迎你把思考后的结果分享到留言区,也欢迎你把这节课的内容分享给其他朋友,我们下节课再见!
- 术子米德 👍(3) 💬(1)
疑问:CoT ToT,是否非Llama专属?如果是大模型共享的方法,跟课程主题对起来,总有点变扭啊
2024-11-03 - 漠北 👍(3) 💬(0)
希望能结合例子给出完整prompt拆解和状态转移过程细节
2024-10-30 - 靠谱的派大星 👍(0) 💬(0)
我是不是可以理解成,COT、SC、TOT是一种思维方式或者行为逻辑,不是模型本身独有的特质,更像是赋予并且加强并特地的训练模型的这种表达能力,来追求结果的准确性,在经过训练的模型上进行预测会更贴切问题的答案,同时提问时也可以通过提示词的方式让模型使用这种思维方式,但带来的是不是token成本的增加,在软件开发中是不是要考虑成本和收益的比例
2025-01-15 - 逐書寄年 👍(0) 💬(0)
挺簡單易懂的例子 可是衍伸而來的問題就會是: 1. 如果確保我們有辦法列舉出所有問題空間內的實例(instance)? 2. 問題空間的大小如何評估? 3. 同2,如何評估在給定問題空間大小下,使用大型語言模型的運算成本?
2025-01-06