Prompt工程学习之思维树(TOT)

news2025/6/9 23:44:13

思维树

定义思维树(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

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

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

相关文章

基于python大数据的水文数据分析可视化系统

博主介绍&#xff1a;高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实实在…

人工智能学习09-变量作用域

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

DJango知识-模型类

一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…

【Redis】笔记|第10节|京东HotKey实现多级缓存架构

缓存架构 京东HotKey架构 代码结构 代码详情 功能点&#xff1a;&#xff08;如代码有错误&#xff0c;欢迎讨论纠正&#xff09; 多级缓存&#xff0c;先查HotKey缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新…

基于规则的自然语言处理

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

使用MounRiver Studio Ⅱ软件写一个CH592F芯片的ADC采集程序,碰到的问题

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

简约商务年终工作总结报告PPT模版分享

简约精致扁平化商务通用动画PPT模版&#xff0c;简约大气素雅商务PPT模版&#xff0c;商务PPT模版&#xff0c;商业计划书PPT模版&#xff0c;IOS风商务通用PPT模版&#xff0c;公司介绍企业宣传PPT模版&#xff0c;创业融资PPT模版&#xff0c;创意低多边形PPT模版&#xff0c…

深度学习学习率优化方法——pytorch中各类warm up策略

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

分类数据集 - 场景分类数据集下载

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

leetcode.多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 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&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…

2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]安全研究员 1. 自我介绍 2. SQL二次注入原理 3. 二次注入修复方案 4. SQL注入绕WAF&#xff…

01-VMware16虚拟机详细安装

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

sql列中数据通过逗号分割的集合,按需求剔除部分值

前置 不会REGEXP 方法的需要在这里学习一下下 记sql字段逗号分隔&#xff0c;通过list查询 功能点 现有一个表格中一列存储的是标签的集合&#xff0c;通过逗号分割 入下&#xff1a; 其中tag_ids是逗号分割的标签&#xff0c;现在需要删除标签组中的一些标签&#xff0c;因…

下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构

导语&#xff1a; 在工业4.0深度演进的关键节点&#xff0c;传统设备管理面临数据孤岛、误诊率高、运维滞后三大致命瓶颈。本文解析基于边缘智能与数字孪生的新一代解决方案架构&#xff0c;并实测验证中讯烛龙PHM-X系统如何通过多模态感知→智能诊断→自主决策闭环&#xff0c…

深入理解JavaScript设计模式之闭包与高阶函数

目录 前言小序一场失败面试面试后的觉醒 闭包变量作用域&#xff1a;谁的地盘听谁的变量的生命周期&#xff1a;该走了&#xff0c;不该走的还在闭包的更多作用&#xff1a;不只是谈恋爱&#xff0c;还能干活&#xff01;1、封装私有变量&#xff1a;你的变量我来守护2、延长变…

springboot启动mapper找不到方法对应的xml

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

MQTT协议:物联网时代的通信基石

MQTT协议&#xff1a;物联网时代的通信基石 在当今快速发展的物联网&#xff08;IoT&#xff09;时代&#xff0c;设备之间的通信变得尤为重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议作为一种轻量级的消息传输协议&#xff0c;正逐渐成为物联…

Electron通信流程

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

华为云Flexus+DeepSeek征文|华为云Flexus服务器dify平台通过自然语言转sql并执行实现电商数据分析

目录 前言 1 华为云Flexus服务器部署Dify平台 1.1 华为云Flexus服务器一键部署Dify平台 1.2 设置账号登录Dify&#xff0c;进入平台 2 构建自然语言转SQL并执行的应用 2.1 创建应用并启动工作流设计 2.2 应用框架设计 2.3 自然语言转SQL模块详解 2.4 代码执行模块实现…