Prompt工程学习之思维树(TOT)
思维树
定义:思维树(Tree of Thoughts, ToT) 是一种先进的推理框架,它通过同时探索多条推理路径对思维链(Chain of Thought)** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤,评估这些步骤的可行性,并探索最有希望的路径。
Tree of Thoughts (ToT) 是一种大语言模型推理框架,通过树状结构探索多条推理路径,允许模型自我评估路径可行性并回溯调整,模拟人类解决复杂问题时的 “试错 - 评估 - 选择” 过程。
目标:解决传统 LLMs 逐 Token 单向决策的局限,提升在需要探索、战略前瞻或多步规划任务(如数学推理、创意写作、谜题)中的表现。
ToT 框架核心机制
- 核心思路:将问题解决视为树状搜索过程,通过生成 ** 连贯的中间思维单元(Thoughts)** 作为推理的中间步骤,而非单一 Token。
- 关键能力:多路径探索:同时生成多条推理路径(如不同的解题思路)。
- 自我评估:评估每条路径的可行性,选择最有希望的分支继续探索。
- 回溯决策:必要时回溯到之前的思维节点,调整后续策略(类似人类解题的试错过程)。与 Chain of Thought(CoT)的区别:
与COT的对比
CoT 仅生成单一推理链,而 ToT 支持并行探索多条链,并通过评估机制实现全局最优决策。
24点案例
使用数字4、9、10和13以及四种基本运算符(+、-、/、*),生成一个结果为24的表达式。
step1
输入:4, 9, 10, 13
可能的下一步操作:
- 4 + 9 = 13(剩余:13, 10, 13)
- 10 - 4 = 6(剩余:6, 9, 13)
- 13 - 10 = 3(剩余:4, 9, 3)
- 9 × 4 = 36(剩余:36, 10, 13)
- 10 ÷ 4 = 2.5(剩余:2.5, 9, 13)输入:4, 9, 10, 13
请给出可能得下一步操作输出:
4+9 = 13 (left: 13, 10, 13)
10-4 = 6 (left: 6, 9, 13)
13-9 = 4 (left: 4, 9, 10)
...
...step2
计算是否可以得到24
10 14: 10+14 = 24 sure
10 7 2: 7*2+10 = 24 sure
11 11: 11 + 11 = 22 impossible
输入第一组结果,请给出可能得结果
13, 10, 13:输出:
10 + 13 + 13 = 36 impossible
...
...计算是否可以得到24
10 14: 10+14 = 24 sure
10 7 2: 7*2+10 = 24 sure
11 11: 11 + 11 = 22 impossible
输入第一组结果,请给出可能得结果
6, 9, 13:输出:
6 * (13-9) = 24 sure
...
...
自动化代码示例
生成思维结点,以树状形式组织;沿着思维结点进行探索,评估结果;根据评估结果选择下一步操作
package com.example.tot24;import ai.spring.ai.client.ChatClient;
import ai.spring.ai.client.Generation;
import ai.spring.ai.client.Message;
import ai.spring.ai.client.chat.ChatResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;public class Tot24Application {// 思维树节点类static class TreeNode {private List<Double> numbers;private List<String> history;private List<TreeNode> children;private double score;private boolean terminal;}// 候选操作类static class CandidateOperation {private String operation;private List<Double> expectedNumbers;private String reason;private double score;private String explanation;}// 24点游戏求解器static class TwentyFourSolver {private static final double TARGET = 24.0;private static final double TOLERANCE = 1e-6;private static final int MAX_STEPS = 5;private static final int BEAM_WIDTH = 3;private final ChatClient chatClient;private final String modelName;private final String systemPrompt;public TwentyFourSolver(ChatClient chatClient, String modelName) {this.chatClient = chatClient;this.modelName = modelName;// 构建系统提示this.systemPrompt = """你是一个解决24点游戏的专家。给定4个1-13之间的数字,使用加、减、乘、除和括号,使最终计算结果为24。解决过程中,请遵循以下规则:1. 每个数字必须且只能使用一次2. 中间步骤的计算结果可以是分数3. 最终答案必须是精确的24当被要求生成下一步操作时,请提供JSON格式的候选操作列表(最多5个有希望的操作):[{"operation": "具体操作(如:4+5=9)","expected_numbers": [操作后的数字列表],"reason": "选择该操作的理由"},...]当被要求评估状态时,请提供JSON格式的评分和解释:{"score": 3,"explanation": "理由..."}评分标准:- 1分:当前数字组合不可能得到24- 2分:可能得到24,但难度高- 3分:有合理可能性得到24- 4分:非常有希望得到24- 5分:已得到24""";}public Optional<String> solve(List<Integer> numbers) {List<Double> initialNumbers = numbers.stream().map(Double::valueOf).collect(Collectors.toList());TreeNode root = new TreeNode(initialNumbers, new ArrayList<>());Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode currentNode = queue.poll();// 检查是否已解决if (currentNode.getNumbers().stream().anyMatch(n -> Math.abs(n - TARGET) < TOLERANCE)) {return Optional.of(formatSolution(currentNode));}// 生成候选操作List<CandidateOperation> candidates = generateCandidates(currentNode);// 评估候选操作evaluateCandidates(currentNode, candidates);// 选择最有希望的操作List<CandidateOperation> topCandidates = candidates.stream().sorted(Comparator.comparingDouble(CandidateOperation::getScore).reversed()).limit(BEAM_WIDTH).collect(Collectors.toList());// 创建子节点for (CandidateOperation candidate : topCandidates) {TreeNode childNode = new TreeNode(candidate.getExpectedNumbers(),new ArrayList<>(currentNode.getHistory()));childNode.getHistory().add(candidate.getOperation());childNode.setScore(candidate.getScore());currentNode.getChildren().add(childNode);// 如果分数足够高,继续探索if (candidate.getScore() >= 3) {queue.add(childNode);}}}return Optional.empty(); // 无解}private List<CandidateOperation> generateCandidates(TreeNode node) {String userPrompt = String.format("""当前状态:数字:%s历史:%s请生成最多5个有希望的下一步操作。""", node.getNumbers(), node.getHistory());String response = callLLM(userPrompt);try {// 解析JSON响应List<CandidateOperation> candidates = new ArrayList<>();// 实际应用中需要使用真正的JSON解析库// 这里简化处理,实际代码应使用Jackson等库return candidates;} catch (Exception e) {System.err.println("解析候选操作失败: " + e.getMessage());System.err.println("LLM响应: " + response);return Collections.emptyList();}}private void evaluateCandidates(TreeNode node, List<CandidateOperation> candidates) {for (CandidateOperation candidate : candidates) {String userPrompt = String.format("""当前状态:数字:%s历史:%s候选操作:%s操作后数字:%s请评分并解释。""", node.getNumbers(), node.getHistory(),candidate.getOperation(),candidate.getExpectedNumbers());String response = callLLM(userPrompt);try {// 解析JSON响应获取评分和解释// 实际应用中需要使用真正的JSON解析库// 这里简化处理double score = 3.0; // 默认值String explanation = "默认评估";candidate.setScore(score);candidate.setExplanation(explanation);} catch (Exception e) {System.err.println("解析评估结果失败: " + e.getMessage());System.err.println("LLM响应: " + response);candidate.setScore(2.0); // 保守评分}}}private String callLLM(String userPrompt) {Message systemMessage = new Message(systemPrompt, "system");Message userMessage = new Message(userPrompt, "user");ChatResponse response = chatClient.generate(List.of(systemMessage, userMessage), modelName);Generation generation = response.getGenerations().get(0);return generation.getContent();}private String formatSolution(TreeNode node) {StringBuilder sb = new StringBuilder();for (String step : node.getHistory()) {sb.append(step).append("\n");}return sb.toString();}}
}
参考
1.TOT 24点,https://learnprompting.org/docs/advanced/decomposition/tree_of_thoughts?srsltid=AfmBOor-YZUZ9nUIH-HpTtxJhTH-MHeQ_aQ6xp6to3gEveLlkqyttWq4
2.TOT,https://arxiv.org/abs/2305.10601
相关文章:
Prompt工程学习之思维树(TOT)
思维树 定义:思维树(Tree of Thoughts, ToT) 是一种先进的推理框架,它通过同时探索多条推理路径对思维链(Chain of Thought)** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

基于python大数据的水文数据分析可视化系统
博主介绍:高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在…...

人工智能学习09-变量作用域
人工智能学习概述—快手视频 人工智能学习09-变量作用域—快手视频...

DJango知识-模型类
一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...
结构性-代理模式
动态代理主要是为了处理重复创建模板代码的场景。 使用示例 public interface MyInterface {String doSomething(); }public class MyInterfaceImpl implements MyInterface{Overridepublic String doSomething() {return "接口方法dosomething";} }public class M…...

【Redis】笔记|第10节|京东HotKey实现多级缓存架构
缓存架构 京东HotKey架构 代码结构 代码详情 功能点:(如代码有错误,欢迎讨论纠正) 多级缓存,先查HotKey缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新…...
Java中Git基础操作详解(clone、commit、push、branch)
Git是Java开发者必备的版本控制工具,以下是核心操作的详细说明及示例: 一、Git基础概念 仓库(Repository):存储代码的目录,包含所有版本历史。提交(Commit)…...

基于规则的自然语言处理
基于规则的自然语言处理 规则方法形态还原(针对英语、德语、法语等)中文分词切分歧义分词方法歧义字段消歧方法分词带来的问题 词性标注命名实体分类机器翻译规则方法的问题 规则方法 以规则形式表示语言知识,强调人对语言知识的理性整理&am…...

使用MounRiver Studio Ⅱ软件写一个CH592F芯片的ADC采集程序,碰到的问题
MounRiver Studio Ⅱ 默认是不开启浮点计算的,所以有些浮点功能不能用,碰到问题是 while (1) {DelayMs (100);tmp Read_Temperature (0);sprintf (tempBuffer, "temp:%.2f\r\n", tmp); // 格式化温度值到字符串。使用%f要开启相应的…...

简约商务年终工作总结报告PPT模版分享
简约精致扁平化商务通用动画PPT模版,简约大气素雅商务PPT模版,商务PPT模版,商业计划书PPT模版,IOS风商务通用PPT模版,公司介绍企业宣传PPT模版,创业融资PPT模版,创意低多边形PPT模版,…...

深度学习学习率优化方法——pytorch中各类warm up策略
warm-up具体原理以及为什么这么做在之前的博客有介绍,这里直接介绍如何直接使用pytorch中的warm-up策略,在pytorch中对于warm-up所有支持的方法都有描述,可以直接阅读1。 深度学习中各类学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)原理及其…...

分类数据集 - 场景分类数据集下载
数据集介绍:自然场景分类数据集,真实场景高质量图片数据;适用实际项目应用:自然场景下场景分类项目,以及作为通用场景分类数据集场景数据的补充;数据集类别:buildings、forest、glacier、mounta…...

leetcode.多数元素
169. 多数元素 - 力扣(LeetCode) import java.util.HashMap;public class LeetCode169 {public int majorityElement(int[] nums) {int count nums.length;int res count/2;Scanner scanner new Scanner(System.in);HashMap<Integer,Integer> …...

Server - 使用 Docker 配置 PyTorch 研发环境
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/148421901 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 建议使…...

2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]安全研究员 1. 自我介绍 2. SQL二次注入原理 3. 二次注入修复方案 4. SQL注入绕WAFÿ…...
Vue:Form正则校验
目录 1. 只能输入正整数或正小数(保留三位小数) 1. 只能输入正整数或正小数(保留三位小数) cc: [{required: true, message: "钻杆长度不能为空", trigger: "blur" },{pattern: /^\d(\.\d{1,3})?$/, message: 只能输入正整数或正小数(保留三位小数), tri…...
如何处理React中表单的双向数据绑定?
在前端开发中,双向数据绑定(Two-way Data Binding)是指视图(View)与数据模型(Model)之间保持同步:当模型发生变化时,视图会自动更新;当视图(用户输…...
时间序列预测的机器学习方法:从基础到实战
时间序列预测是机器学习中一个重要且实用的领域,广泛应用于金融、气象、销售预测、资源规划等多个行业。本文将全面介绍时间序列预测的基本概念、常用方法,并通过Python代码示例展示如何构建和评估时间序列预测模型。 1. 时间序列预测概述 时间序列是按…...

01-VMware16虚拟机详细安装
官网地址:https://www.vmware.com/cn.html 1.1 打开下载好的 .exe 文件, 双击安装。 1.2 点击下一步 1.3 先勾选我接受许可协议中的条款,然后点击下一步 1.4 自定义安装路径,注意这里的文件路径尽量不要包含中文,完成…...

sql列中数据通过逗号分割的集合,按需求剔除部分值
前置 不会REGEXP 方法的需要在这里学习一下下 记sql字段逗号分隔,通过list查询 功能点 现有一个表格中一列存储的是标签的集合,通过逗号分割 入下: 其中tag_ids是逗号分割的标签,现在需要删除标签组中的一些标签,因…...

下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构
导语: 在工业4.0深度演进的关键节点,传统设备管理面临数据孤岛、误诊率高、运维滞后三大致命瓶颈。本文解析基于边缘智能与数字孪生的新一代解决方案架构,并实测验证中讯烛龙PHM-X系统如何通过多模态感知→智能诊断→自主决策闭环,…...
unipp---HarmonyOS 应用开发实战
HarmonyOS 应用开发实战指南 1. 开篇:为什么选择 HarmonyOS? 最近在开发鸿蒙应用时,发现很多开发者都在问:为什么要选择 HarmonyOS?这里分享一下我的看法: 生态优势 华为手机用户基数大,市场潜…...
Go 语言中switch case条件分支语句
1. 基本语法 package main import "fmt" func main() {var extname ".css"switch extname {case ".html":fmt.Println("text/html")case ".css":fmt.Println("text/css") // text/csscase ".js":fmt.…...
ai流式文字返回前端和php的处理办法
PHP后端 php端主要是用到ob_flush和flush,头改为流式。 基本代码 代码如下: <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...

深入理解JavaScript设计模式之闭包与高阶函数
目录 前言小序一场失败面试面试后的觉醒 闭包变量作用域:谁的地盘听谁的变量的生命周期:该走了,不该走的还在闭包的更多作用:不只是谈恋爱,还能干活!1、封装私有变量:你的变量我来守护2、延长变…...
【Unity】R3 CSharp 响应式编程 - 使用篇(二)
一、通用的事件监听用法 using System;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Common{public class CommonObservable : MonoBehaviour{// 默认会调用1次public SerializableReactiveProperty<int> serializableReactiveProperty;…...

springboot启动mapper找不到方法对应的xml
数据源配置 目录结构 idea中mapper.java 可以找到对应的mapper.xml文件 启动却找不到 因为mapper.db1会被识别为文件名 而非目录结构 调整为这种...

MQTT协议:物联网时代的通信基石
MQTT协议:物联网时代的通信基石 在当今快速发展的物联网(IoT)时代,设备之间的通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)协议作为一种轻量级的消息传输协议,正逐渐成为物联…...
vite ts 配置使用@ 允许js
1.vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { fileURLToPath, URL } from node:url import setup_extend from vite-plugin-vue-setup-extend// https://vite.dev/config/ export default defineConfig({plugins: …...

Electron通信流程
前言 今天讲Electron框架的通信流程,首先我们需要知道为什么需要通信。这得益于Electron的多进程模型,它主要模仿chrome的多进程模型如下图: 作为应用开发者,我们将控制两种类型的进程:主进程和渲染器进程 。 …...