当前位置: 首页 > news >正文

提示技术系列——思维树

什么是提示技术?

        提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”

什么又是提示工程?

        提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程方法论,包括:

  • 明确目标任务(如生成教学内容、问答、翻译);
  • 设计提示结构(如指令、上下文、示例);
  • 选择模型与参数(如温度、top_p);
  • 验证与迭代(根据输出调整提示)。

其核心是“通过工程化方法控制大语言模型(LLM)的行为”


概念

        思维树(Tree of Thoughts,ToT)提示基于思维链(CoT)提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

        思维树维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,大模型能够自己对严谨推理过程的中间思维进行评估。大模型将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证回溯

核心思想:

  • 多路探索,动态分支生成,灵活动态分支管理;

  • 深度与广度探索,深度优先;

  • 多轮评估与回溯机制。

概念图解

应用场景

  1. 数学与逻辑问题;(解决需要多不推理和验证的数学题目或逻辑谜题)
  2. 编程与算法设计;(编写代码解决具体问题时,探索不同的算法实现路径)
  3. 自然语言处理任务;(文本摘要、翻译、问答等涉及上下文的任务)
  4. 决策支持系统;(在商业决策、医疗诊断等领域提供基于证据的建议)
  5. 教育与培训;(设计个性化的学习计划、考试准备材料等)
  6. ……

案例实操           

使用工具:扣子

实现方式:扣子工作流

完整工作流如下:

各个节点配置信息:

  • 开始节点:

  • 深度探索节点:

  • 教学设计多分支生成节点:

  • 评估分支节点:

  • 找出评分最高的分支节点:

代码(选择的是 Python)具体:

# 在这里,您可以通过 ‘args’  获取节点中的输入变量,并通过 'ret' 输出结果
# 'args' 和 'ret' 已经被正确地注入到环境中
# 下面是一个示例,首先获取节点的全部输入参数params,其次获取其中参数名为‘input’的值:
# params = args.params; 
# input = params.input;
# 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:
# ret: Output =  { "name": ‘小明’, "hobbies": [“看书”, “旅游”] };async def main(args: Args) -> Output:params = args.paramsbranches = params['b_list']b_max_score = params['b_max_score']import rematch = re.search(r"分支ID[::]\s*(\d+)", b_max_score)result = {}if match:best_branch_id = int(match.group(1))# 找到对应的分支matched_branches = [b for b in branches if b["branch_id"] == best_branch_id]if matched_branches:result = matched_branches[0]else:result = branches[0]else:result =  branches[0]# 构建输出对象ret: Output = {"key2": result}return ret{
}
  • 选择器节点:

  • 输出评分最高分支节点:

  • 生成完整教学设计节点:

  • 终止循环节点:

        无设置,直接拖进来连线即可。

  • 处理 context_tmp 节点:

  • 设置变量节点:

运行结果如下图:

       大家若有编程基础的话,可以参考下面的代码案例来实现与体验不同场景下使用思维树提示。

代码实现思维树提示

技术栈:Python;LangChain

代码引用包导入:

pip install langchain_deepseek==0.1.3;
pip install langchain_core==0.3.66;
pip install rich==14.0.0;

具体代码实现:

import json
import logging
import os
import refrom dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_deepseek import ChatDeepSeek
from rich.console import Console# 加载环境变量
load_dotenv()
api_key = os.getenv("DEEPSEEK_API_KEY")# 初始化日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)# 初始化 DeepSeek 模型
llm = ChatDeepSeek(model="deepseek-chat",  # 可选模型:deepseek-chat(对话)/ deepseek-reasoner(推理)api_key=api_key,temperature=0.7  # 增加随机性以支持多路径探索(0-1,越高越具创造性)
)# ===== 动态分支生成函数 =====
def generate_branches(topic_name: str, context: dict = None):"""根据上下文动态生成多个分支"""prompt = PromptTemplate.from_template("""请为课文《{topic}》生成3个适合人教版课程标准的小学教学设计分支:{context}每个分支需包含:1. 教学目标方向(知识/能力/创新)2. 关键教学策略3. 创新活动设计输出格式要求:输出格式:[{{ "branch_id": 1,"direction": "知识导向","objectives": "...","strategies": ["...", "..."],"activities": ["...", "..."]}},...]请确保输出是一个有效的 JSON 格式,并且不要包含任何额外解释或文字。""")chain = prompt | llmres = chain.invoke({"topic": topic_name, "context": context or {}})return json.loads(res.content)# ===== 评估函数 =====
def evaluate_branches(topic_name: str, branches: list):# 确保 branch_id 唯一branch_ids = [b.get("branch_id") for b in branches]if len(set(branch_ids)) != len(branch_ids):logger.warning("检测到重复的 branch_id,请确保每个分支拥有唯一标识符。")"""评估所有分支并返回最佳分支"""prompt = PromptTemplate.from_template("""评估以下教学设计分支(课文:《{topic}》):{branches}评分标准(1-5分):- 知识覆盖度:____- 方法可行性:____- 创新性:____- 情感价值:____输出要求:- 给出评分最高的分支ID与评分(格式如:分支ID:2)- 并说明理由""")chain = prompt | llmtry:res = chain.invoke({"topic": topic_name, "branches": json.dumps(branches, ensure_ascii=False)})except Exception as e:logger.error(f"调用模型时发生错误:{e}")return branches[0]# 使用更灵活的正则表达式提取分支IDmatch = re.search(r"分支ID[::]\s*(\d+)", res.content)if match:best_branch_id = int(match.group(1))# 找到对应的分支matched_branches = [b for b in branches if b["branch_id"] == best_branch_id]if matched_branches:logger.info(f"成功找到最佳分支:ID={best_branch_id}")return matched_branches[0]else:logger.warning(f"未找到 ID 为 {best_branch_id} 的分支,默认返回第一个分支。")return branches[0]else:logger.warning("未能从模型响应中解析出有效分支ID,默认返回第一个分支。")return branches[0]# ===== 完整设计生成函数 =====
def generate_full_design(topic_name: str, selected_branch: dict):print(f"[bold]最终选定分支:{json.dumps(selected_branch, ensure_ascii=False)}[/bold]")"""基于选定分支生成完整教学设计"""prompt = PromptTemplate.from_template("""根据选定的教学设计分支:{branch}为课文《{topic}》生成完整教学方案:要求:1. 包含60分钟详细教学过程(标注时间分配)2. 明确教学重难点(用★ 标注创新点)3. 至少包含2个创新教学活动4. 包含3种不同评估方式5. 教学目标2-3个6. 教学准备:老师准备;学生准备;7. 跟进教学目标与教学过程综合考虑,决定是否布置课后作业完整的教学方案输出格式要求:1. 使用 markdown 格式2. 内容中不要使用表情符号,以及其他不符合人教版课程标准的符合""")chain = prompt | llmres = chain.invoke({"topic": topic_name, "branch": json.dumps(selected_branch)})return res# ===== ToT 主流程 =====
def run_tot_process(topic_name: str, max_depth: int = 3):"""递归执行ToT流程"""console_log = Console()def _recursive_tot(current_depth: int, context: dict = None):console_log.print(f"\n{'=' * 30} 深度 {current_depth} {'=' * 30}")current_context = context or {}  # 保证 context 是字典console_log.print(f"[bold]当前上下文:{json.dumps(current_context, ensure_ascii=False)}[/bold]")# 1. 生成分支branches = generate_branches(topic_name, current_context)console_log.print(f"[bold]生成的分支数:{len(branches)}[/bold]")# 2. 评估分支best_branch = evaluate_branches(topic_name, branches)console_log.print(f"[green]选定最佳分支ID:{best_branch['branch_id']}[/green]")# 3. 深化设计(如果达到最大深度)if current_depth >= max_depth:final_design = generate_full_design(topic_name, best_branch)return final_design# 4. 递归继续探索return _recursive_tot(current_depth + 1, {**current_context,"selected_branch": best_branch})return _recursive_tot(1)# ===== 执行示例 =====
if __name__ == "__main__":topic = "语文园地一"console = Console()console.print(f"\n{'=' * 50}\n《{topic}》教学设计\n{'=' * 50}")result = run_tot_process(topic)if result.content is not None:console.print(result.content)else:console.print(result)

总结与思考

        前文概念中提到思维树(ToT)是基于思维链(CoT)提示总结而来的,虽然两者都强调“分步思考”,但在结构、控制力、灵活性和适用场景上有显著区别。为此,

它们的对比分析:

维度

链式思考(CoT)提示

思维树(ToT)提示

定义

引导模型输出中间推理步骤,形成一条线性推理路径

构建多分支的“思维树”,探索多种可能的推理路径

核心机制

单条路径推理(顺序执行)

多路径并行探索 + 评估选择最优解

是否支持多路径

否,仅一条推理路径

是,构建多个分支进行比较

是否可回溯

否,无法中途修正

是,可在不同路径间切换或回退

是否模块化处理

否,整体性强

是,可对每个节点单独处理

可控性

中等

高,可精细控制每一步

是否支持外部评估机制

否,依赖模型自生成

是,可引入评分器、评估模块

资源消耗

低至中等

高(多次调用+评估)

可解释性

强,展示完整推理过程

更强,展示多个推理路径及选择依据

一句话总结它们:

链式思考(CoT)是让模型“一步步想清楚一件事”
思维树(ToT)是让模型“尝试多种思路,并选出最好的那一个”

好了,到此。


提示技术系列,接下来分享:自动提示工程师(APE);主动提示(Active-Prompt);方向性刺激提示等等

为了方便大家学习,这里给出专栏链接:https://blog.csdn.net/quf2zy/category_12995183.html

欢迎大家一起来学习与交流……

http://www.lryc.cn/news/578262.html

相关文章:

  • 使用Verilog设计模块输出中位数,尽可能较少资源使用
  • Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
  • python环境快速搭建
  • Clickhouse源码分析-TTL执行流程
  • 直播 APP 开发需要多少成本
  • (LeetCode 面试经典 150 题) 135. 分发糖果 (贪心)
  • 【Springai】 2指定模型的三种方式(Ollama)
  • 【SpringAI】3.结构化输出,初级版
  • Spring Boot + ONNX Runtime模型部署
  • springboot中多个定时任务(@Scheduled)如何互不影响
  • 大数据(4)-spark
  • Webpack优化详解
  • Unity性能优化-渲染模块(1)-CPU侧(2)-DrawCall优化(2)GPUInstancing
  • 浪潮和曙光服务器的ipmi配置教程
  • 图灵完备之路(数电学习三分钟)----开关与延迟线
  • Ubuntu更换Home目录所在硬盘的过程
  • Pyhton-EXCEL与Mysql数据对比
  • 从设计到开发一个小程序页面
  • 鸿蒙NEXT-鸿蒙三层架构搭建,嵌入HMRouter,实现便捷跳转,新手攻略。(2/3)
  • HTML之常用基础标签
  • JavaScript异步编程的五种方式
  • 力扣 hot100 Day30
  • Spring生态:云原生与AI的革新突破
  • 七天学会SpringCloud分布式微服务——06——Sentinel
  • 从零到一通过Web技术开发一个五子棋
  • CSDN博客大搬家(本地下载markdown合适和图片本地化)
  • Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第四篇 风格化字体大揭秘:从线稿到涂鸦,ControlNet让文字焕发新生
  • 【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图
  • 文心大模型正式开源,开启AI普惠新时代
  • vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件