提示技术系列——思维树
什么是提示技术?
提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”。
什么又是提示工程?
提示工程是指通过设计、优化和迭代输入到大语言模型(LLM)的提示(Prompt),系统性提升模型输出质量(如相关性、准确性、可控性)的实践领域。它是一个覆盖全流程的方法论,包括:
- 明确目标任务(如生成教学内容、问答、翻译);
- 设计提示结构(如指令、上下文、示例);
- 选择模型与参数(如温度、top_p);
- 验证与迭代(根据输出调整提示)。
其核心是“通过工程化方法控制大语言模型(LLM)的行为”。
概念
思维树(Tree of Thoughts,ToT)提示基于思维链(CoT)提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。
思维树维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,大模型能够自己对严谨推理过程的中间思维进行评估。大模型将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯。
核心思想:
-
多路探索,动态分支生成,灵活动态分支管理;
-
深度与广度探索,深度优先;
-
多轮评估与回溯机制。
概念图解
应用场景
- 数学与逻辑问题;(解决需要多不推理和验证的数学题目或逻辑谜题)
- 编程与算法设计;(编写代码解决具体问题时,探索不同的算法实现路径)
- 自然语言处理任务;(文本摘要、翻译、问答等涉及上下文的任务)
- 决策支持系统;(在商业决策、医疗诊断等领域提供基于证据的建议)
- 教育与培训;(设计个性化的学习计划、考试准备材料等)
- ……
案例实操
使用工具:扣子
实现方式:扣子工作流
完整工作流如下:
各个节点配置信息:
- 开始节点:
- 深度探索节点:
- 教学设计多分支生成节点:
- 评估分支节点:
- 找出评分最高的分支节点:
代码(选择的是 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
欢迎大家一起来学习与交流……