什么是提示技术?
提示技术是实现提示工程目标的具体技术手段,是提示工程中的“工具库”。
什么又是提示工程?
提示工程是指通过设计、优化和迭代输入到大语言模型(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.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
欢迎大家一起来学习与交流……