提示技术系列(七)——思维树

什么是提示技术?

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

什么又是提示工程?

        提示工程是指通过设计、优化和迭代输入到大语言模型(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.params
    branches = params['b_list']
    b_max_score = params['b_max_score']
    import re
    match = 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 re

from 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 | llm
    res = 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 | llm
    try:
        res = chain.invoke({"topic": topic_name, "branches": json.dumps(branches, ensure_ascii=False)})
    except Exception as e:
        logger.error(f"调用模型时发生错误:{e}")
        return branches[0]

    # 使用更灵活的正则表达式提取分支ID
    match = 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 | llm
    res = 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.youkuaiyun.com/quf2zy/category_12995183.html

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值