Prompt提示工程上手指南:基础原理及实践-思维树 (ToT)策略下的Prompt

前言

此篇文章已经是本系列的第五篇文章,之前我们已经将检索增强生成(RAG)策略,逐渐我们掌握的知识和技术都在不断提高,对于Prompt的技巧策略也不能只局限于局部运用而要适应LLM大模型的整体框架去进行改进休整。较为主流的LLM模型框架设计基于链式思考(CoT)、思维树 (ToT)和检索增强生成 (RAG)这三大框架我们现在要开始了解学习思维树 (ToT)。

如何建立一个[解决通用问题的语言模型]?如何能够让LLM能够深思熟虑的解决问题?我们人类通过搜索一个组合式问题空间来解决问题。这可以看作一棵树,其中节点表示部分解,分支对应修改它们的运算符。选择哪个分支是由启发式决定的,这些启发式帮助导航问题空间并引导问题解决者朝着解决方案的方向前进。正因如此思维树(ToT)可以被视为一种进化版的提示(prompt)策略,它扩展了这一概念并引入了更加复杂的思维结构,以更好地引导模型生成准确、连贯的输出。

博主承诺每篇文章我都会尽可能将简化涉及到垂直领域的专业知识,转化为大众小白可以读懂易于理解的知识,将繁杂的程序创建步骤逐个拆解,以逐步递进的方式由难转易逐渐掌握并实践,欢迎各位学习者关注博主,博主将不断创作技术实用前沿文章。

何为思维树 (ToT)?如何让AI"深思熟虑"?

想象一下你正在驾驶一辆汽车,没有地图的情况下如何进入正确的路口,找到最佳的路径?在这样的场景下,思维树就像是一张详细的道路地图。在这张地图上,不同的道路代表着不同的语义信息,而交叉口和路标则代表着不同的思维节点。当你提出一个问题或者输入一个请求时,就相当于输入了目的地,而思维树会根据你的输入在地图上找到最佳的路径,指引你达到目的地。

图片.png
与传统的导航系统相比,思维树更加智能和灵活。它不仅考虑了最短的路径,还会根据你的需求和语境来调整路线。比如,当你提出一个问题时,思维树会考虑到问题的不同方面,找到与之相关的多条路径,并提供多样化的答案。而当你改变了问题的表述或者提供了更多的信息时,思维树会相应地调整路线,提供更加准确的答案。思维树就像是一位智慧的导航系统,它能够帮助我们更好地理解和生成自然语言,为我们提供准确、连贯的信息输出。

ToT框架的核心概念是以树状结构来表示语义信息。这种结构不仅仅是一种数据形式,更是一种抽象概念,它使得模型可以更好地理解输入序列中的语义信息,并在生成输出时参考这些信息。这种结构的设计使得ToT框架能够更好地模拟人类的思维过程,从而生成更加自然、准确的文本。可以算得上是我们上篇文章介绍到的CoT的进阶版,ToT的具体回答框架包括以下四个问题:

  1. 举一反三,列举多路径通罗马
  2. 分布评估,集成方案,选择最优
  3. 启发性地评估状态,前后枚举追溯,全局最优
  4. 集成开搜,确定路径

图片.png

图 1:示意图展示了使用 LLMs 解决问题的各种方法。每个矩形框代表一个思考过程,它是一个连贯的语言序列,作为解决问题的中间步骤。

大家感兴趣不妨click :https://github.com/kyegomez/tree-of-thoughts,下面我们来深度理解该框架是如何将模型推理显著提高70%,又是如何使用到我们的AI-Prompt的?

ToT核心框架

ToT核心框架在论文里面讲解十分深入,为了让更多人明白,我们这里不会涉及到较为复杂的计算公式。有能力感兴趣的朋友可以自行阅览paper:https://arxiv.org/pdf/2305.10601.pdf。我们首先继续复习一下之前的CoT算法:

CoT方法中,模型的响应被指示逐步进行并呈现涉及的所有步骤。这样做减少了结果不准确的可能性,并使评估模型响应变得更容易。通过逐步展示处理过程,模型不仅提供了最终的答案或解决方案,而且还展示了达到这个答案的具体步骤。这种方法对于教育、解释复杂问题或在需要详细说明决策过程的情境中尤其有用。它允许用户跟踪模型的思考过程,理解模型是如何从问题描述到达最终结论的。

图片.png

ToT(Tree of Thoughts)被视为CoT(Chain of Thoughts)的升级版,主要是因为它在表示和利用语义信息方面更加强大和灵活。ToT采用树状结构来表示语义信息,而不是像CoT那样简单地采用线性链式结构。这意味着ToT可以更好地捕捉和表示语义之间的复杂关系,使得模型能够更加全面地理解和生成自然语言。由于树状结构的引入,ToT能够同时考虑到多个可能的思维路径,而不局限于单一的线性链式结构。它可以利用树状结构来对语义进行分层和组织,能够根据不同的语境和需求生成多样化的输出。

在ToT框架中,每个节点代表一个语义单元,例如一个概念、一个主题或者一个关键词。这些节点之间通过边连接,形成了一种复杂的关联网络。当模型接收到一个输入序列时,它会根据这个序列在ToT中寻找最相关的节点,并基于这些节点生成输出。

图片.png

ToT框架的优势在于它能够同时考虑到多个可能的思维路径,并能够根据输入序列中的不同语义信息来动态调整生成输出的策略。这种能力使得ToT框架在生成文本时更加灵活、多样化,能够适应不同的语境和需求。

ToT框架推理流程

假设我们有一个基于思维树(ToT)的文本生成模型,我们想要使用这个模型来回答一个关于自然界的问题:“为什么天空是蓝色的?”

  1. 输入问题:首先,我们将问题“为什么天空是蓝色的?”输入到思维树模型中。
  2. 思维树搜索:思维树模型开始搜索树状结构,寻找与问题相关的节点。这些节点可以是关于光学、大气科学、颜色原理等方面的概念。
  3. 多路径选择:思维树发现了与问题相关的多个思维路径。例如,它可能找到与大气散射相关的节点、光谱原理相关的节点、以及颜色感知机制相关的节点。
  4. 整合信息:模型将从不同路径中获取的信息整合起来,形成一个综合的理解。它会考虑到大气中气体分子对太阳光的散射过程,以及不同波长的光在大气中的传播和吸收情况。
  5. 生成答案:基于综合的理解,思维树模型生成了一个关于天空为什么是蓝色的解释。这个解释可能会涉及到太阳光中不同波长的光被散射后,蓝色光的波长相对较短,更容易被大气中的气体分子散射到我们的视线中,从而导致天空呈现出蓝色。

图片.png

以上就为整个ToT框架对一个Prompt的拆解过程。ToT框架通常由多个子模型组成,这些子模型协同工作,以实现对输入序列的语义理解和生成输出的功能。

图片.png

  1. 语义理解:ToT框架首先对输入的文本进行语义理解。这个过程涉及到将自然语言转换为计算机能够理解的形式。通常,ToT框架会使用一系列预训练的语义表示模型,如BERT、GPT等,来对输入文本进行编码和表示,从而捕捉到输入文本中的语义信息。
  2. 构建思维树:基于对输入文本的语义表示,ToT框架会构建一个思维树,以表示文本中的不同思维路径和关系。这个过程通常涉及到树状结构的设计和构建算法。思维树中的每个节点代表一个语义单元,如概念、主题或关键词,而边表示节点之间的关联关系。

图片.png

  1. 路径选择:在生成输出文本时,ToT框架会根据输入文本和构建的思维树选择合适的思维路径。这个过程通常涉及到路径搜索算法,以确定最相关和最合适的思维路径。ToT框架可以考虑到多个可能的思维路径,并根据输入文本的不同语义信息动态调整路径选择策略。
  2. 整合信息:选择了合适的思维路径后,ToT框架会从不同路径中获取信息,并将其整合起来,形成一个综合的理解。这个过程涉及到信息融合和加权的算法,以确保生成的输出文本能够考虑到多个因素和可能性。
  3. 生成输出:最后,ToT框架根据整合的信息生成输出文本。这个过程涉及到文本生成模型和算法,通常采用生成式模型,如GPT,来生成连贯、自然的文本。ToT框架会根据整合的信息和选择的思维路径来指导文本生成过程,以生成准确、多样化的输出。

图片.png
图片.png

研究者在 24 点和 5x5 迷你填词游戏上进行了实验,结果表明了 AoT 方法的优越性 —— 其性能表现由于单 prompt 方法(如标准方法、CoT、CoT-SC),同时也能媲美利用外部机制的方法(如 ToT)。

图片.png
可以明显看出,结合了 CoT/CoT-SC 的标准 prompt 设计方法明显落后于通过 LLM 使用的树搜索方法。

图片.png
AoT 在迷你填词任务上的有效性,其填词成功率超过之前使用各种 prompt 技术的方法。但是,它比 ToT 差。一个重要的观察是 ToT 使用的查询量巨大,超过了 AoT 百倍以上。另一个让 AoT 逊于 ToT 的因素是算法示例中固有的回溯能力没有充分得到激活。如果能完全解锁该能力,会导致生成阶段显著延长。相比之下,ToT 的优势在于可以利用外部记忆来进行回溯。

图片.png

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 ,有问题大家随时留言讨论 ,我们下期见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

提升数据质量的三大要素:清洗prompt、数据溯源、数据增强(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了,分六个项目组,每个项目组都是全职带兼职,且都会每周确定任务/目标/计划,然后各项目组各自做任务拆解,有时同组内任务多时 则2-4人一组 方便并行和讨论,每周文档…

Vue3实现pdf本地预览功能

一、先直接看看效果吧 放大后 缩小后 也可以分页显示 二、选用vue-pdf-embed和vue3-pdfjs的原因 选用这两个的插件是因为如果实现pdf预览其实使用iframe标签就可以的,但是使用iframe标签实现的比较臭,vue-pdf-embed是能够自定义样式的,更…

如何使用hugging face的模型库?

Hugging Face 是一个流行的自然语言处理 (NLP) 模型库和社区,提供了大量预训练模型、工具和资源,使得 NLP 的开发者和研究人员能够快速高效地构建和应用各种文本相关应用。在这里,我将向您介绍如何在 1 天内快速熟悉 Hugging Face 的基本功能…

分析系统性能问题从哪里入手?

本人十年大厂经验,整理技术资料不易, 完整详细文章关注公众号,后续还会有免费学习资料 1. 高性能架构的三个核心优化手段 负载均衡:通过分发用户请求到多个服务器,降低单一服务器的负载压力。 应用层负载均衡&#xf…

Python零基础从小白打怪升级中~~~~~~~TCP网络编程

TCP网络编程 一、什么是TCP协议 TCP( Transmission control protocol )即传输控制协议,是一种面向连接、可靠的数据传输协议,它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 :数据传输之前客户端和…

Stable Diffusion AI绘画宝典:从新手到高手,一图胜千言!

在这个数字化时代的浪潮中,人工智能技术以其惊人的创造力和创新性席卷全球。党的二十大报告把“实施科教兴国战略,强化现代化建设人才支撑”作为战略举措进行系统阐述,彰显我国不断发展新动能、新优势的决心和气魄。 Stable Diffusion是一款…

Vue3 + Element-Plus 使用 Table 预览图片发生元素遮挡

Vue3 Element-Plus 使用 Table 预览图片发生元素遮挡 问题代码问题重现解决方法最终效果 问题代码 <el-table-column label"视频" align"center"><template #default"scope" style"display: flex;"><div style"…

碾压LoRA!Meta CMU | 提出高效大模型微调方法:GaLore,内存可减少63.3%

引言 大模型训练通常会遇到内存资源的限制。目前常用的内存减少方法低秩适应&#xff08;LoRA&#xff09;&#xff0c;通过引入低秩&#xff08;low-rank&#xff09;适配器来更新模型的权重&#xff0c;而不是直接更新整个权重矩阵。然而&#xff0c;这种方法在预训练和微调…

消息队列和分布式消息队列

文章目录 分析系统现状不足中间件消息队列什么是消息队列&#xff1f;应用场景消息队列的模型为什么不直接传输&#xff0c;而要用消息队列&#xff1f;为什么要用消息队列&#xff1f;消息队列的缺点&#xff1f; 分布式消息队列分布式消息队列的优势&#xff1f;消息队列应用…

LeetCode55题:跳跃游戏(原创)

【题目描述】 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&am…

Oracle 19c补丁升级(Windows)

文章目录 一、打补丁前备份检查1、补丁包获取2、备份数据包以及数据库软件3、检查OPatch版本 二、补丁升级1、更新OPatch2、关闭监听以及服务3、补丁升级过程4、启动监听以及服务 三、数据库补丁应用 一、打补丁前备份检查 1、补丁包获取 补丁包&#xff1a; 百度网盘链接&am…

甘特图使用小诀窍,项目把控游刃有余

在项目管理过程中,掌握甘特图的使用技巧可以让你事半功倍,高效规划和监控项目进度。作为一种视觉化的工具,甘特图直观地展示了任务的开始和结束时间、持续时间以及任务之间的依赖关系,有助于预测和优化资源分配。掌握以下几个小诀窍,你就能驾驭甘特图,游刃有余地把控整个项目。…

运营商三要素验证API接口怎么对接

运营商三要素验证API接口又叫手机三要素验证API接口、运营商实名认证接口&#xff0c;这个接口是验证姓名、身份证号、手机号三者是否一致&#xff0c;返回验证结果&#xff0c;如果一致则说明三者信息匹配&#xff0c;可以有效确认当前注册用户的身份信息&#xff0c;那么运营…

山姆·奥特曼是如何成为亿万富豪的?

2017年夏天&#xff0c;Superhuman公司首席执行官拉胡尔沃拉&#xff08;Rahul Vohra&#xff09;开始疯狂向投资者一一发消息&#xff0c;缘由是他的初创公司尝试了谷歌浏览器Chrome的一项即将推出的更新。由于一个看似无害的代码更改&#xff0c;Superhuman的智能电子邮件服务…

【环境】原则

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 一、培养项目系统性思维 1.1 系统性思维 1.2 系统性思维的价值 1.3 建模和推演&数字孪生 二、项目的复杂性和如何驾驭复杂性 2.1 复杂性的三个维度 2.2 如何驾驭复杂性 三、…

vs配置opencv找不到opencv_world480d.dll的问题

如下图所示 博主附加依赖项加了&#xff0c;但是运行程序的时候就是跳出来找不到opencv_world480d.dll。 最后是在电脑环境变量中添加了opencv安装后cv15文件夹中的bin目录的路径得以解决。 【此电脑】→【属性】→【高级系统设置】→【环境变量】→【系统变量】→【PATH】…

【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一

目录 引言 1 -> C语言传统的处理错误的方式 2 -> C异常概念 3 -> 异常的使用 3.1 -> 异常的抛出和捕获 3.2 -> 异常的重新抛出 3.3 -> 异常规范 4 -> 自定义异常体系 5 -> C标准库的异常体系 6 -> 异常的优缺点 引言 在C编程中&#xff…

冯喜运:4.16中东对抗风暴下,黄金原油市场何去何从?

黄金行情走势分析&#xff1a;4小时图布林道开始收口&#xff0c;昨日下探至下轨附近&#xff0c;也是此前的起涨低点2320启稳上升&#xff0c;十字K线配合单阳拉起&#xff0c;重新去摸高上轨。目前4小时图处于摸高当中。周线和日线留意多空转换&#xff0c;摸高之后是强势延续…

Codeforces Round 926 (Div. 2) ---- E. Sasha and the Happy Tree Cutting ----题解

E. Sasha and the Happy Tree Cutting&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 现在有一颗树&#xff0c;然后给出了k对路径&#xff0c;然后要求路径上至少有一个结点是被染色了的&#xff0c;如果这k对路径没有共用边&#xff0c;那我们至少需要染色k条边。…

Docker安装及开启远程访问

这几天有人问我docker是怎么开启远程服务的&#xff1f; 正好之前我做过这件事情&#xff0c;并且写了相关的笔记&#xff0c;现在整理为一篇博客发出来。 安装Docker 首先更新一下自己的yum版本 yum update安装一下所需要的软件包 yum install -y yum-utils device-mappe…