赞
踩
此篇文章已经是本系列的第五篇文章,之前我们已经将检索增强生成(RAG)策略,逐渐我们掌握的知识和技术都在不断提高,对于Prompt的技巧策略也不能只局限于局部运用而要适应LLM大模型的整体框架去进行改进休整。较为主流的LLM模型框架设计基于链式思考(CoT)、思维树 (ToT)和检索增强生成 (RAG)这三大框架我们现在要开始了解学习思维树 (ToT)。
如何建立一个[解决通用问题的语言模型]?如何能够让LLM能够深思熟虑的解决问题?我们人类通过搜索一个组合式问题空间来解决问题。这可以看作一棵树,其中节点表示部分解,分支对应修改它们的运算符。选择哪个分支是由启发式决定的,这些启发式帮助导航问题空间并引导问题解决者朝着解决方案的方向前进。正因如此思维树(ToT)可以被视为一种进化版的提示(prompt)策略,它扩展了这一概念并引入了更加复杂的思维结构,以更好地引导模型生成准确、连贯的输出。
博主承诺每篇文章我都会尽可能将简化涉及到垂直领域的专业知识,转化为大众小白可以读懂易于理解的知识,将繁杂的程序创建步骤逐个拆解,以逐步递进的方式由难转易逐渐掌握并实践,欢迎各位学习者关注博主,博主将不断创作技术实用前沿文章。
想象一下你正在驾驶一辆汽车,没有地图的情况下如何进入正确的路口,找到最佳的路径?在这样的场景下,思维树就像是一张详细的道路地图。在这张地图上,不同的道路代表着不同的语义信息,而交叉口和路标则代表着不同的思维节点。当你提出一个问题或者输入一个请求时,就相当于输入了目的地,而思维树会根据你的输入在地图上找到最佳的路径,指引你达到目的地。
与传统的导航系统相比,思维树更加智能和灵活。它不仅考虑了最短的路径,还会根据你的需求和语境来调整路线。比如,当你提出一个问题时,思维树会考虑到问题的不同方面,找到与之相关的多条路径,并提供多样化的答案。而当你改变了问题的表述或者提供了更多的信息时,思维树会相应地调整路线,提供更加准确的答案。思维树就像是一位智慧的导航系统,它能够帮助我们更好地理解和生成自然语言,为我们提供准确、连贯的信息输出。
ToT框架的核心概念是以树状结构来表示语义信息。这种结构不仅仅是一种数据形式,更是一种抽象概念,它使得模型可以更好地理解输入序列中的语义信息,并在生成输出时参考这些信息。这种结构的设计使得ToT框架能够更好地模拟人类的思维过程,从而生成更加自然、准确的文本。可以算得上是我们上篇文章介绍到的CoT的进阶版,ToT的具体回答框架包括以下四个问题:
图 1:示意图展示了使用 LLMs 解决问题的各种方法。每个矩形框代表一个思考过程,它是一个连贯的语言序列,作为解决问题的中间步骤。
大家感兴趣不妨click :https://github.com/kyegomez/tree-of-thoughts,下面我们来深度理解该框架是如何将模型推理显著提高70%,又是如何使用到我们的AI-Prompt的?
ToT核心框架在论文里面讲解十分深入,为了让更多人明白,我们这里不会涉及到较为复杂的计算公式。有能力感兴趣的朋友可以自行阅览paper:https://arxiv.org/pdf/2305.10601.pdf。我们首先继续复习一下之前的CoT算法:
CoT方法中,模型的响应被指示逐步进行并呈现涉及的所有步骤。这样做减少了结果不准确的可能性,并使评估模型响应变得更容易。通过逐步展示处理过程,模型不仅提供了最终的答案或解决方案,而且还展示了达到这个答案的具体步骤。这种方法对于教育、解释复杂问题或在需要详细说明决策过程的情境中尤其有用。它允许用户跟踪模型的思考过程,理解模型是如何从问题描述到达最终结论的。
ToT(Tree of Thoughts)被视为CoT(Chain of Thoughts)的升级版,主要是因为它在表示和利用语义信息方面更加强大和灵活。ToT采用树状结构来表示语义信息,而不是像CoT那样简单地采用线性链式结构。这意味着ToT可以更好地捕捉和表示语义之间的复杂关系,使得模型能够更加全面地理解和生成自然语言。由于树状结构的引入,ToT能够同时考虑到多个可能的思维路径,而不局限于单一的线性链式结构。它可以利用树状结构来对语义进行分层和组织,能够根据不同的语境和需求生成多样化的输出。
在ToT框架中,每个节点代表一个语义单元,例如一个概念、一个主题或者一个关键词。这些节点之间通过边连接,形成了一种复杂的关联网络。当模型接收到一个输入序列时,它会根据这个序列在ToT中寻找最相关的节点,并基于这些节点生成输出。
ToT框架的优势在于它能够同时考虑到多个可能的思维路径,并能够根据输入序列中的不同语义信息来动态调整生成输出的策略。这种能力使得ToT框架在生成文本时更加灵活、多样化,能够适应不同的语境和需求。
假设我们有一个基于思维树(ToT)的文本生成模型,我们想要使用这个模型来回答一个关于自然界的问题:“为什么天空是蓝色的?”
以上就为整个ToT框架对一个Prompt的拆解过程。ToT框架通常由多个子模型组成,这些子模型协同工作,以实现对输入序列的语义理解和生成输出的功能。
研究者在 24 点和 5x5 迷你填词游戏上进行了实验,结果表明了 AoT 方法的优越性 —— 其性能表现由于单 prompt 方法(如标准方法、CoT、CoT-SC),同时也能媲美利用外部机制的方法(如 ToT)。
可以明显看出,结合了 CoT/CoT-SC 的标准 prompt 设计方法明显落后于通过 LLM 使用的树搜索方法。
AoT 在迷你填词任务上的有效性,其填词成功率超过之前使用各种 prompt 技术的方法。但是,它比 ToT 差。一个重要的观察是 ToT 使用的查询量巨大,超过了 AoT 百倍以上。另一个让 AoT 逊于 ToT 的因素是算法示例中固有的回溯能力没有充分得到激活。如果能完全解锁该能力,会导致生成阶段显著延长。相比之下,ToT 的优势在于可以利用外部记忆来进行回溯。
现在部署ToT是比较方便的,前提确保你可以有自己训练好的大模型,或者是大模型的API,那么我们直接通过pip就可以部署:
pip install tree-of-thoughts-llm
也可以直接通过source进行clone安装:
git clone https://github.com/princeton-nlp/tree-of-thought-llm
cd tree-of-thought-llm
pip install -r requirements.txt
pip install -e . # install `tot` package
可以通过Demo进行测试,查看是否安装完成:
import argparse
from tot.methods.bfs import solve
from tot.tasks.game24 import Game24Task
args = argparse.Namespace(backend='gpt-4', temperature=0.7, task='game24', naive_run=False, prompt_sample=None, method_generate='propose', method_evaluate='value', method_select='greedy', n_generate_sample=1, n_evaluate_sample=3, n_select_sample=5)
task = Game24Task()
ys, infos = solve(args, task, 900)
print(ys[0])
如果成功的话就会输出:
10 - 4 = 6 (left: 5 6 6)
5 * 6 = 30 (left: 6 30)
30 - 6 = 24 (left: 24)
Answer: (5 * (10 - 4)) - 6 = 24
如果是想要配套OpenAI API开发使用的话,可以按照我这个代码格式:
import os from tree_of_thoughts import ToTAgent, MonteCarloSearch from dotenv import load_dotenv from swarms import Agent, OpenAIChat load_dotenv() # Get the API key from the environment api_key = os.environ.get("OPENAI_API_KEY") # Initialize an agent from swarms agent = Agent( agent_name="tree_of_thoughts", agent_description="This agent uses the tree_of_thoughts library to generate thoughts.", system_prompt=None, llm = OpenAIChat(), ) # Initialize the ToTAgent class with the API key model = ToTAgent( agent, strategy="cot", evaluation_strategy="value", enable_react=True, k=3, ) # Initialize the MonteCarloSearch class with the model tree_of_thoughts = MonteCarloSearch(model) # Define the initial prompt initial_prompt = """ Input: 2 8 8 14 Possible next steps: 2 + 8 = 10 (left: 8 10 14) 8 / 2 = 4 (left: 4 8 14) 14 + 2 = 16 (left: 8 8 16) 2 * 8 = 16 (left: 8 14 16) 8 - 2 = 6 (left: 6 8 14) 14 - 8 = 6 (left: 2 6 8) 14 / 2 = 7 (left: 7 8 8) 14 - 2 = 12 (left: 8 8 12) Input: use 4 numbers and basic arithmetic operations (+-*/) to obtain 24 in 1 equation Possible next steps: """ # Define the number of thoughts to generate num_thoughts = 1 max_steps = 3 max_states = 4 pruning_threshold = 0.5 # Generate the thoughts solution = tree_of_thoughts.solve( initial_prompt=initial_prompt, num_thoughts=num_thoughts, max_steps=max_steps, max_states=max_states, pruning_threshold=pruning_threshold, # sleep_time=sleep_time ) print(f"Solution: {solution}")
当然大家根据自己的实际场景调整即可。
展望未来,随着人工智能技术的不断发展,我们可以预见到更多类似ToT框架的新型AI技术将不断涌现。这些新技术将更加强大、智能,能够更好地理解和处理自然语言,为人们的生活和工作带来更多便利和可能性。ToT框架作为一种创新的AI技术,为我们提供了一种全新的思路和方法来处理自然语言。期待着未来AI技术的不断进步和发展,为我们的生活和工作带来更多的惊喜和改变。
以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。